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