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