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: 24 ClearDataCommandTest() {} 25 ClearDataCommand command_; 26 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: 40 ClearEventHandler() { 41 ResetReceivedEvents(); 42 } 43 bool ReceievedClearSuccessEvent() { return received_clear_success_event_; } 44 bool ReceievedClearFailedEvent() { return received_clear_failed_event_; } 45 void ResetReceivedEvents() { 46 received_clear_success_event_ = false; 47 received_clear_failed_event_ = false; 48 } 49 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 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 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