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