• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 // Copyright (c) 2010 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4 
5 #include "chrome/browser/sync/engine/clear_data_command.h"
6 #include "chrome/browser/sync/protocol/autofill_specifics.pb.h"
7 #include "chrome/browser/sync/protocol/bookmark_specifics.pb.h"
8 #include "chrome/browser/sync/protocol/preference_specifics.pb.h"
9 #include "chrome/browser/sync/protocol/sync.pb.h"
10 #include "chrome/browser/sync/syncable/directory_manager.h"
11 #include "chrome/test/sync/engine/proto_extension_validator.h"
12 #include "chrome/test/sync/engine/syncer_command_test.h"
13 #include "chrome/test/sync/sessions/test_scoped_session_event_listener.h"
14 
15 namespace browser_sync {
16 
17 using sessions::TestScopedSessionEventListener;
18 using syncable::FIRST_REAL_MODEL_TYPE;
19 using syncable::MODEL_TYPE_COUNT;
20 
21 // A test fixture for tests exercising ClearDataCommandTest.
22 class ClearDataCommandTest : public SyncerCommandTest {
23  protected:
ClearDataCommandTest()24   ClearDataCommandTest() {}
25   ClearDataCommand command_;
26 
OnShouldStopSyncingPermanently()27   virtual void OnShouldStopSyncingPermanently() {
28     on_should_stop_syncing_permanently_called_ = true;
29   }
30 
31  protected:
32   bool on_should_stop_syncing_permanently_called_;
33 
34  private:
35   DISALLOW_COPY_AND_ASSIGN(ClearDataCommandTest);
36 };
37 
38 class ClearEventHandler : public SyncEngineEventListener {
39  public:
ClearEventHandler()40   ClearEventHandler() {
41     ResetReceivedEvents();
42   }
ReceievedClearSuccessEvent()43   bool ReceievedClearSuccessEvent() { return received_clear_success_event_; }
ReceievedClearFailedEvent()44   bool ReceievedClearFailedEvent() { return received_clear_failed_event_; }
ResetReceivedEvents()45   void ResetReceivedEvents() {
46     received_clear_success_event_ = false;
47     received_clear_failed_event_ = false;
48   }
49 
OnSyncEngineEvent(const SyncEngineEvent & event)50   virtual void OnSyncEngineEvent(const SyncEngineEvent& event) {
51     if (event.what_happened == SyncEngineEvent::CLEAR_SERVER_DATA_FAILED) {
52       received_clear_failed_event_ = true;
53     } else if (event.what_happened ==
54       SyncEngineEvent::CLEAR_SERVER_DATA_SUCCEEDED) {
55         received_clear_success_event_ = true;
56     }
57   }
58 
59  private:
60   bool received_clear_success_event_;
61   bool received_clear_failed_event_;
62 };
63 
TEST_F(ClearDataCommandTest,ClearDataCommandExpectFailed)64 TEST_F(ClearDataCommandTest, ClearDataCommandExpectFailed) {
65   syncable::ScopedDirLookup dir(syncdb()->manager(), syncdb()->name());
66   ASSERT_TRUE(dir.good());
67 
68   ConfigureMockServerConnection();
69   scoped_ptr<ClearEventHandler> handler(new ClearEventHandler());
70   TestScopedSessionEventListener reg(context(), handler.get());
71 
72   dir->set_store_birthday(mock_server()->store_birthday());
73   mock_server()->SetServerNotReachable();
74   on_should_stop_syncing_permanently_called_ = false;
75 
76   command_.Execute(session());
77 
78   // Expect that the client sent a clear request, received failure,
79   // fired a failure event, but did not disable sync.
80   //
81   // A failure event will be bubbled back to the user's UI, and the
82   // user can press "clear" again.
83   //
84   // We do not want to disable sync in the client because the user may
85   // incorrectly get the impression that their private data has been cleared
86   // from the server (from the fact that their data is gone on the client).
87   //
88   // Any subsequent GetUpdates/Commit requests or attempts to enable sync
89   // will cause the server to attempt to resume the clearing process (within
90   // a bounded window of time)
91   const sync_pb::ClientToServerMessage& r = mock_server()->last_request();
92   EXPECT_TRUE(r.has_clear_user_data());
93 
94   EXPECT_TRUE(handler.get()->ReceievedClearFailedEvent());
95 
96   EXPECT_FALSE(handler.get()->ReceievedClearSuccessEvent());
97   EXPECT_FALSE(on_should_stop_syncing_permanently_called_);
98 }
99 
TEST_F(ClearDataCommandTest,ClearDataCommandExpectSuccess)100 TEST_F(ClearDataCommandTest, ClearDataCommandExpectSuccess) {
101   syncable::ScopedDirLookup dir(syncdb()->manager(), syncdb()->name());
102   ASSERT_TRUE(dir.good());
103 
104   ConfigureMockServerConnection();
105   scoped_ptr<ClearEventHandler> handler(new ClearEventHandler());
106   TestScopedSessionEventListener reg(context(), handler.get());
107 
108   dir->set_store_birthday(mock_server()->store_birthday());
109   mock_server()->SetClearUserDataResponseStatus(
110       sync_pb::ClientToServerResponse::SUCCESS);
111   on_should_stop_syncing_permanently_called_ = false;
112 
113   command_.Execute(session());
114 
115   // Expect that the client sent a clear request, fired off the success event
116   // in response, and disabled sync
117   const sync_pb::ClientToServerMessage& r = mock_server()->last_request();
118   EXPECT_TRUE(r.has_clear_user_data());
119 
120   EXPECT_TRUE(handler->ReceievedClearSuccessEvent());
121   EXPECT_TRUE(on_should_stop_syncing_permanently_called_);
122 
123   EXPECT_FALSE(handler->ReceievedClearFailedEvent());
124 }
125 
126 }  // namespace browser_sync
127 
128