Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(608)

Side by Side Diff: chrome/browser/sync/backend_migrator_unittest.cc

Issue 7655055: [Sync] Make BackendMigrator not wait for full sync cycles (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Address more comments Created 9 years, 3 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
« no previous file with comments | « chrome/browser/sync/backend_migrator.cc ('k') | chrome/browser/sync/engine/sync_scheduler.h » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2011 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "chrome/browser/sync/backend_migrator.h" 5 #include "chrome/browser/sync/backend_migrator.h"
6 6
7 #include "base/message_loop.h"
8 #include "base/tracked_objects.h"
7 #include "chrome/browser/sync/glue/data_type_manager_mock.h" 9 #include "chrome/browser/sync/glue/data_type_manager_mock.h"
10 #include "chrome/browser/sync/internal_api/write_transaction.h"
8 #include "chrome/browser/sync/profile_sync_service_mock.h" 11 #include "chrome/browser/sync/profile_sync_service_mock.h"
12 #include "chrome/browser/sync/protocol/sync.pb.h"
9 #include "chrome/browser/sync/sessions/session_state.h" 13 #include "chrome/browser/sync/sessions/session_state.h"
14 #include "chrome/browser/sync/syncable/directory_manager.h"
10 #include "chrome/common/chrome_notification_types.h" 15 #include "chrome/common/chrome_notification_types.h"
16 #include "chrome/test/sync/engine/test_user_share.h"
11 #include "testing/gmock/include/gmock/gmock.h" 17 #include "testing/gmock/include/gmock/gmock.h"
12 #include "testing/gtest/include/gtest/gtest.h" 18 #include "testing/gtest/include/gtest/gtest.h"
13 19
14 using ::testing::_; 20 using ::testing::_;
15 using ::testing::Eq; 21 using ::testing::Eq;
16 using ::testing::Mock; 22 using ::testing::Mock;
17 using ::testing::NiceMock; 23 using ::testing::NiceMock;
18 using ::testing::Return; 24 using ::testing::Return;
19 using ::testing::SetArgumentPointee; 25 using ::testing::SetArgumentPointee;
20 26
21 namespace browser_sync { 27 namespace browser_sync {
22 28
23 using sessions::ErrorCounters; 29 using sessions::ErrorCounters;
24 using sessions::SyncerStatus; 30 using sessions::SyncerStatus;
25 using sessions::SyncSessionSnapshot; 31 using sessions::SyncSessionSnapshot;
26 32
27 class BackendMigratorTest : public testing::Test { 33 class BackendMigratorTest : public testing::Test {
28 public: 34 public:
29 BackendMigratorTest() { } 35 BackendMigratorTest() { }
30 virtual ~BackendMigratorTest() { } 36 virtual ~BackendMigratorTest() { }
31 37
32 virtual void SetUp() { 38 virtual void SetUp() {
39 test_user_share_.SetUp();
33 Mock::VerifyAndClear(manager()); 40 Mock::VerifyAndClear(manager());
34 Mock::VerifyAndClear(&service_); 41 Mock::VerifyAndClear(&service_);
35 preferred_types_.insert(syncable::BOOKMARKS); 42 preferred_types_.insert(syncable::BOOKMARKS);
36 preferred_types_.insert(syncable::PREFERENCES); 43 preferred_types_.insert(syncable::PREFERENCES);
37 preferred_types_.insert(syncable::AUTOFILL); 44 preferred_types_.insert(syncable::AUTOFILL);
38 45
39 ON_CALL(service_, GetPreferredDataTypes(_)). 46 ON_CALL(service_, GetPreferredDataTypes(_)).
40 WillByDefault(SetArgumentPointee<0>(preferred_types_)); 47 WillByDefault(SetArgumentPointee<0>(preferred_types_));
48
49 migrator_.reset(
50 new BackendMigrator(
51 "Profile0", test_user_share_.user_share(), service(), manager()));
52 SetUnsyncedTypes(syncable::ModelTypeSet());
41 } 53 }
42 54
43 void ReturnEmptyProgressMarkersInSnapshot() { 55 virtual void TearDown() {
44 ReturnNonEmptyProgressMarkersInSnapshot(syncable::ModelTypeSet()); 56 migrator_.reset();
57 test_user_share_.TearDown();
45 } 58 }
46 59
47 void ReturnNonEmptyProgressMarkersInSnapshot( 60 // Marks all types in |unsynced_types| as unsynced and all other
48 const syncable::ModelTypeSet& for_types) { 61 // types as synced.
49 std::string download_progress_markers[syncable::MODEL_TYPE_COUNT]; 62 void SetUnsyncedTypes(const syncable::ModelTypeSet& unsynced_types) {
50 for (syncable::ModelTypeSet::const_iterator it = for_types.begin(); 63 sync_api::WriteTransaction trans(FROM_HERE,
51 it != for_types.end(); ++it) { 64 test_user_share_.user_share());
52 download_progress_markers[*it] = "foobar"; 65 for (int i = syncable::FIRST_REAL_MODEL_TYPE;
66 i < syncable::MODEL_TYPE_COUNT; ++i) {
67 syncable::ModelType type = syncable::ModelTypeFromInt(i);
68 sync_pb::DataTypeProgressMarker progress_marker;
69 if (unsynced_types.count(type) == 0) {
70 progress_marker.set_token("dummy");
71 }
72 trans.GetLookup()->SetDownloadProgress(type, progress_marker);
53 } 73 }
54
55 snap_.reset(new SyncSessionSnapshot(SyncerStatus(), ErrorCounters(),
56 0, false, syncable::ModelTypeBitSet(), download_progress_markers,
57 false, false, 0, 0, 0, false, sessions::SyncSourceInfo(), 0,
58 base::Time::Now()));
59 EXPECT_CALL(service_, GetLastSessionSnapshot())
60 .WillOnce(Return(snap_.get()));
61 } 74 }
62 75
63 void SendConfigureDone(DataTypeManager::ConfigureStatus status, 76 void SendConfigureDone(DataTypeManager::ConfigureStatus status,
64 const syncable::ModelTypeSet& types) { 77 const syncable::ModelTypeSet& requested_types) {
65 if (status == DataTypeManager::OK) { 78 if (status == DataTypeManager::OK) {
66 DataTypeManager::ConfigureResult result(status, types); 79 DataTypeManager::ConfigureResult result(status, requested_types);
67 NotificationService::current()->Notify( 80 NotificationService::current()->Notify(
68 chrome::NOTIFICATION_SYNC_CONFIGURE_DONE, 81 chrome::NOTIFICATION_SYNC_CONFIGURE_DONE,
69 Source<DataTypeManager>(&manager_), 82 Source<DataTypeManager>(&manager_),
70 Details<const DataTypeManager::ConfigureResult>(&result)); 83 Details<const DataTypeManager::ConfigureResult>(&result));
71 } else { 84 } else {
72 DataTypeManager::ConfigureResult result( 85 DataTypeManager::ConfigureResult result(
73 status, 86 status,
74 types, 87 requested_types,
75 syncable::ModelTypeSet(), 88 syncable::ModelTypeSet(),
76 FROM_HERE); 89 FROM_HERE);
77 NotificationService::current()->Notify( 90 NotificationService::current()->Notify(
78 chrome::NOTIFICATION_SYNC_CONFIGURE_DONE, 91 chrome::NOTIFICATION_SYNC_CONFIGURE_DONE,
79 Source<DataTypeManager>(&manager_), 92 Source<DataTypeManager>(&manager_),
80 Details<const DataTypeManager::ConfigureResult>(&result)); 93 Details<const DataTypeManager::ConfigureResult>(&result));
81 } 94 }
95 message_loop_.RunAllPending();
82 } 96 }
83 97
84 ProfileSyncService* service() { return &service_; } 98 ProfileSyncService* service() { return &service_; }
85 DataTypeManagerMock* manager() { return &manager_; } 99 DataTypeManagerMock* manager() { return &manager_; }
86 const syncable::ModelTypeSet& preferred_types() { return preferred_types_; } 100 const syncable::ModelTypeSet& preferred_types() { return preferred_types_; }
101 BackendMigrator* migrator() { return migrator_.get(); }
87 void RemovePreferredType(syncable::ModelType type) { 102 void RemovePreferredType(syncable::ModelType type) {
88 preferred_types_.erase(type); 103 preferred_types_.erase(type);
89 Mock::VerifyAndClear(&service_); 104 Mock::VerifyAndClear(&service_);
90 ON_CALL(service_, GetPreferredDataTypes(_)). 105 ON_CALL(service_, GetPreferredDataTypes(_)).
91 WillByDefault(SetArgumentPointee<0>(preferred_types_)); 106 WillByDefault(SetArgumentPointee<0>(preferred_types_));
92 } 107 }
108
93 private: 109 private:
94 scoped_ptr<SyncSessionSnapshot> snap_; 110 scoped_ptr<SyncSessionSnapshot> snap_;
111 MessageLoop message_loop_;
95 syncable::ModelTypeSet preferred_types_; 112 syncable::ModelTypeSet preferred_types_;
96 NiceMock<ProfileSyncServiceMock> service_; 113 NiceMock<ProfileSyncServiceMock> service_;
97 NiceMock<DataTypeManagerMock> manager_; 114 NiceMock<DataTypeManagerMock> manager_;
115 TestUserShare test_user_share_;
116 scoped_ptr<BackendMigrator> migrator_;
117 };
118
119 class MockMigrationObserver : public MigrationObserver {
120 public:
121 virtual ~MockMigrationObserver() {}
122
123 MOCK_METHOD0(OnMigrationStateChange, void());
98 }; 124 };
99 125
100 // Test that in the normal case a migration does transition through each state 126 // Test that in the normal case a migration does transition through each state
101 // and wind up back in IDLE. 127 // and wind up back in IDLE.
102 TEST_F(BackendMigratorTest, Sanity) { 128 TEST_F(BackendMigratorTest, Sanity) {
103 BackendMigrator migrator(service(), manager()); 129 MockMigrationObserver migration_observer;
130 migrator()->AddMigrationObserver(&migration_observer);
131 EXPECT_CALL(migration_observer, OnMigrationStateChange()).Times(4);
132
104 syncable::ModelTypeSet to_migrate, difference; 133 syncable::ModelTypeSet to_migrate, difference;
105 to_migrate.insert(syncable::PREFERENCES); 134 to_migrate.insert(syncable::PREFERENCES);
106 difference.insert(syncable::AUTOFILL); 135 difference.insert(syncable::AUTOFILL);
107 difference.insert(syncable::BOOKMARKS); 136 difference.insert(syncable::BOOKMARKS);
108 137
109 EXPECT_CALL(*manager(), state()) 138 EXPECT_CALL(*manager(), state())
110 .WillOnce(Return(DataTypeManager::CONFIGURED)); 139 .WillOnce(Return(DataTypeManager::CONFIGURED));
111 EXPECT_CALL(*manager(), Configure(_, sync_api::CONFIGURE_REASON_MIGRATION)); 140 EXPECT_CALL(*manager(), Configure(_, sync_api::CONFIGURE_REASON_MIGRATION))
141 .Times(2);
112 142
113 migrator.MigrateTypes(to_migrate); 143 migrator()->MigrateTypes(to_migrate);
114 EXPECT_EQ(BackendMigrator::DISABLING_TYPES, migrator.state()); 144 EXPECT_EQ(BackendMigrator::DISABLING_TYPES, migrator()->state());
115 145
146 SetUnsyncedTypes(to_migrate);
116 SendConfigureDone(DataTypeManager::OK, difference); 147 SendConfigureDone(DataTypeManager::OK, difference);
117 EXPECT_EQ(BackendMigrator::WAITING_FOR_PURGE, migrator.state()); 148 EXPECT_EQ(BackendMigrator::REENABLING_TYPES, migrator()->state());
118 149
119 ReturnEmptyProgressMarkersInSnapshot(); 150 SetUnsyncedTypes(syncable::ModelTypeSet());
120 EXPECT_CALL(*manager(), Configure(preferred_types(), 151 SendConfigureDone(DataTypeManager::OK, preferred_types());
121 sync_api::CONFIGURE_REASON_MIGRATION)); 152 EXPECT_EQ(BackendMigrator::IDLE, migrator()->state());
122 migrator.OnStateChanged();
123 EXPECT_EQ(BackendMigrator::REENABLING_TYPES, migrator.state());
124 153
125 SendConfigureDone(DataTypeManager::OK, preferred_types()); 154 migrator()->RemoveMigrationObserver(&migration_observer);
126 EXPECT_EQ(BackendMigrator::IDLE, migrator.state());
127 } 155 }
128 156
129 // Test that in the normal case with Nigori a migration transitions through 157 // Test that in the normal case with Nigori a migration transitions through
130 // each state and wind up back in IDLE. 158 // each state and wind up back in IDLE.
131 TEST_F(BackendMigratorTest, MigrateNigori) { 159 TEST_F(BackendMigratorTest, MigrateNigori) {
132 BackendMigrator migrator(service(), manager());
133 syncable::ModelTypeSet to_migrate, difference; 160 syncable::ModelTypeSet to_migrate, difference;
134 to_migrate.insert(syncable::NIGORI); 161 to_migrate.insert(syncable::NIGORI);
135 difference.insert(syncable::AUTOFILL); 162 difference.insert(syncable::AUTOFILL);
136 difference.insert(syncable::BOOKMARKS); 163 difference.insert(syncable::BOOKMARKS);
137 164
138 EXPECT_CALL(*manager(), state()) 165 EXPECT_CALL(*manager(), state())
139 .WillOnce(Return(DataTypeManager::CONFIGURED)); 166 .WillOnce(Return(DataTypeManager::CONFIGURED));
140 167
141 EXPECT_CALL(*manager(), ConfigureWithoutNigori(_, 168 EXPECT_CALL(*manager(), ConfigureWithoutNigori(_,
142 sync_api::CONFIGURE_REASON_MIGRATION)); 169 sync_api::CONFIGURE_REASON_MIGRATION));
143 170
144 migrator.MigrateTypes(to_migrate); 171 migrator()->MigrateTypes(to_migrate);
145 EXPECT_EQ(BackendMigrator::DISABLING_TYPES, migrator.state()); 172 EXPECT_EQ(BackendMigrator::DISABLING_TYPES, migrator()->state());
146 173
174 SetUnsyncedTypes(to_migrate);
147 SendConfigureDone(DataTypeManager::OK, difference); 175 SendConfigureDone(DataTypeManager::OK, difference);
148 EXPECT_EQ(BackendMigrator::WAITING_FOR_PURGE, migrator.state()); 176 EXPECT_EQ(BackendMigrator::REENABLING_TYPES, migrator()->state());
149 177
150 ReturnEmptyProgressMarkersInSnapshot(); 178 SetUnsyncedTypes(syncable::ModelTypeSet());
151 EXPECT_CALL(*manager(), Configure(preferred_types(),
152 sync_api::CONFIGURE_REASON_MIGRATION));
153 migrator.OnStateChanged();
154 EXPECT_EQ(BackendMigrator::REENABLING_TYPES, migrator.state());
155
156 SendConfigureDone(DataTypeManager::OK, preferred_types()); 179 SendConfigureDone(DataTypeManager::OK, preferred_types());
157 EXPECT_EQ(BackendMigrator::IDLE, migrator.state()); 180 EXPECT_EQ(BackendMigrator::IDLE, migrator()->state());
158 } 181 }
159 182
160 183
161 // Test that the migrator waits for the data type manager to be idle before 184 // Test that the migrator waits for the data type manager to be idle before
162 // starting a migration. 185 // starting a migration.
163 TEST_F(BackendMigratorTest, WaitToStart) { 186 TEST_F(BackendMigratorTest, WaitToStart) {
164 BackendMigrator migrator(service(), manager());
165 syncable::ModelTypeSet to_migrate; 187 syncable::ModelTypeSet to_migrate;
166 to_migrate.insert(syncable::PREFERENCES); 188 to_migrate.insert(syncable::PREFERENCES);
167 189
168 EXPECT_CALL(*manager(), state()) 190 EXPECT_CALL(*manager(), state())
169 .WillOnce(Return(DataTypeManager::CONFIGURING)); 191 .WillOnce(Return(DataTypeManager::CONFIGURING));
170 EXPECT_CALL(*manager(), Configure(_, _)).Times(0); 192 EXPECT_CALL(*manager(), Configure(_, _)).Times(0);
171 migrator.MigrateTypes(to_migrate); 193 migrator()->MigrateTypes(to_migrate);
172 EXPECT_EQ(BackendMigrator::WAITING_TO_START, migrator.state()); 194 EXPECT_EQ(BackendMigrator::WAITING_TO_START, migrator()->state());
173 195
174 Mock::VerifyAndClearExpectations(manager()); 196 Mock::VerifyAndClearExpectations(manager());
175 EXPECT_CALL(*manager(), state()) 197 EXPECT_CALL(*manager(), state())
176 .WillOnce(Return(DataTypeManager::CONFIGURED)); 198 .WillOnce(Return(DataTypeManager::CONFIGURED));
177 EXPECT_CALL(*manager(), Configure(_, sync_api::CONFIGURE_REASON_MIGRATION)); 199 EXPECT_CALL(*manager(), Configure(_, sync_api::CONFIGURE_REASON_MIGRATION));
200 SetUnsyncedTypes(syncable::ModelTypeSet());
178 SendConfigureDone(DataTypeManager::OK, syncable::ModelTypeSet()); 201 SendConfigureDone(DataTypeManager::OK, syncable::ModelTypeSet());
179 202
180 EXPECT_EQ(BackendMigrator::DISABLING_TYPES, migrator.state()); 203 EXPECT_EQ(BackendMigrator::DISABLING_TYPES, migrator()->state());
181 } 204 }
182 205
183 // Test that the migrator can cope with a migration request while a migration 206 // Test that the migrator can cope with a migration request while a migration
184 // is in progress. 207 // is in progress.
185 TEST_F(BackendMigratorTest, RestartMigration) { 208 TEST_F(BackendMigratorTest, RestartMigration) {
186 BackendMigrator migrator(service(), manager()); 209 syncable::ModelTypeSet to_migrate1, to_migrate2, to_migrate_union, bookmarks;
187 syncable::ModelTypeSet to_migrate1, to_migrate2, bookmarks;
188 to_migrate1.insert(syncable::PREFERENCES); 210 to_migrate1.insert(syncable::PREFERENCES);
189 to_migrate2.insert(syncable::AUTOFILL); 211 to_migrate2.insert(syncable::AUTOFILL);
212 to_migrate_union.insert(syncable::PREFERENCES);
213 to_migrate_union.insert(syncable::AUTOFILL);
190 bookmarks.insert(syncable::BOOKMARKS); 214 bookmarks.insert(syncable::BOOKMARKS);
191 215
192 EXPECT_CALL(*manager(), state()) 216 EXPECT_CALL(*manager(), state())
193 .WillOnce(Return(DataTypeManager::CONFIGURED)); 217 .WillOnce(Return(DataTypeManager::CONFIGURED));
194 EXPECT_CALL(*manager(), Configure(_, sync_api::CONFIGURE_REASON_MIGRATION)) 218 EXPECT_CALL(*manager(), Configure(_, sync_api::CONFIGURE_REASON_MIGRATION))
195 .Times(1); 219 .Times(2);
196 migrator.MigrateTypes(to_migrate1); 220 migrator()->MigrateTypes(to_migrate1);
197 221
198 EXPECT_EQ(BackendMigrator::DISABLING_TYPES, migrator.state()); 222 EXPECT_EQ(BackendMigrator::DISABLING_TYPES, migrator()->state());
199 migrator.MigrateTypes(to_migrate2); 223 migrator()->MigrateTypes(to_migrate2);
200 224
201 syncable::ModelTypeSet difference1; 225 syncable::ModelTypeSet difference1;
202 std::set_difference(preferred_types().begin(), preferred_types().end(), 226 std::set_difference(preferred_types().begin(), preferred_types().end(),
203 to_migrate1.begin(), to_migrate1.end(), 227 to_migrate1.begin(), to_migrate1.end(),
204 std::inserter(difference1, difference1.end())); 228 std::inserter(difference1, difference1.end()));
205 229
206 Mock::VerifyAndClearExpectations(manager()); 230 Mock::VerifyAndClearExpectations(manager());
207 EXPECT_CALL(*manager(), state()) 231 EXPECT_CALL(*manager(), Configure(_, sync_api::CONFIGURE_REASON_MIGRATION))
208 .WillOnce(Return(DataTypeManager::CONFIGURED)); 232 .Times(2);
209 EXPECT_CALL(*manager(), Configure(bookmarks, 233 SetUnsyncedTypes(to_migrate1);
210 sync_api::CONFIGURE_REASON_MIGRATION));
211 SendConfigureDone(DataTypeManager::OK, difference1); 234 SendConfigureDone(DataTypeManager::OK, difference1);
212 EXPECT_EQ(BackendMigrator::DISABLING_TYPES, migrator.state()); 235 EXPECT_EQ(BackendMigrator::DISABLING_TYPES, migrator()->state());
213 236
237 SetUnsyncedTypes(to_migrate_union);
214 SendConfigureDone(DataTypeManager::OK, bookmarks); 238 SendConfigureDone(DataTypeManager::OK, bookmarks);
215 EXPECT_EQ(BackendMigrator::WAITING_FOR_PURGE, migrator.state()); 239 EXPECT_EQ(BackendMigrator::REENABLING_TYPES, migrator()->state());
216 } 240 }
217 241
218 // Test that an external invocation of Configure(...) during a migration results 242 // Test that an external invocation of Configure(...) during a migration results
219 // in a migration reattempt. 243 // in a migration reattempt.
220 TEST_F(BackendMigratorTest, InterruptedWhileDisablingTypes) { 244 TEST_F(BackendMigratorTest, InterruptedWhileDisablingTypes) {
221 BackendMigrator migrator(service(), manager());
222 syncable::ModelTypeSet to_migrate; 245 syncable::ModelTypeSet to_migrate;
223 syncable::ModelTypeSet difference; 246 syncable::ModelTypeSet difference;
224 to_migrate.insert(syncable::PREFERENCES); 247 to_migrate.insert(syncable::PREFERENCES);
225 difference.insert(syncable::AUTOFILL); 248 difference.insert(syncable::AUTOFILL);
226 difference.insert(syncable::BOOKMARKS); 249 difference.insert(syncable::BOOKMARKS);
227 250
228 EXPECT_CALL(*manager(), state()) 251 EXPECT_CALL(*manager(), state())
229 .WillOnce(Return(DataTypeManager::CONFIGURED)); 252 .WillOnce(Return(DataTypeManager::CONFIGURED));
230 EXPECT_CALL(*manager(), Configure(difference, 253 EXPECT_CALL(*manager(), Configure(difference,
231 sync_api::CONFIGURE_REASON_MIGRATION)); 254 sync_api::CONFIGURE_REASON_MIGRATION));
232 migrator.MigrateTypes(to_migrate); 255 migrator()->MigrateTypes(to_migrate);
233 EXPECT_EQ(BackendMigrator::DISABLING_TYPES, migrator.state()); 256 EXPECT_EQ(BackendMigrator::DISABLING_TYPES, migrator()->state());
234 257
235 Mock::VerifyAndClearExpectations(manager()); 258 Mock::VerifyAndClearExpectations(manager());
236 EXPECT_CALL(*manager(), state())
237 .WillOnce(Return(DataTypeManager::CONFIGURED));
238 EXPECT_CALL(*manager(), Configure(difference, 259 EXPECT_CALL(*manager(), Configure(difference,
239 sync_api::CONFIGURE_REASON_MIGRATION)); 260 sync_api::CONFIGURE_REASON_MIGRATION));
261 SetUnsyncedTypes(syncable::ModelTypeSet());
240 SendConfigureDone(DataTypeManager::OK, preferred_types()); 262 SendConfigureDone(DataTypeManager::OK, preferred_types());
241 263
242 EXPECT_EQ(BackendMigrator::DISABLING_TYPES, migrator.state()); 264 EXPECT_EQ(BackendMigrator::DISABLING_TYPES, migrator()->state());
243 } 265 }
244 266
245 // Test that spurious OnStateChanged events don't confuse the migrator while 267 // Test that spurious OnConfigureDone events don't confuse the
246 // it's waiting for disabled types to have been purged from the sync db. 268 // migrator while it's waiting for disabled types to have been purged
269 // from the sync db.
247 TEST_F(BackendMigratorTest, WaitingForPurge) { 270 TEST_F(BackendMigratorTest, WaitingForPurge) {
248 BackendMigrator migrator(service(), manager());
249 syncable::ModelTypeSet to_migrate, difference; 271 syncable::ModelTypeSet to_migrate, difference;
250 to_migrate.insert(syncable::PREFERENCES); 272 to_migrate.insert(syncable::PREFERENCES);
251 to_migrate.insert(syncable::AUTOFILL); 273 to_migrate.insert(syncable::AUTOFILL);
252 difference.insert(syncable::BOOKMARKS); 274 difference.insert(syncable::BOOKMARKS);
253 275
254 EXPECT_CALL(*manager(), state()) 276 EXPECT_CALL(*manager(), state())
255 .WillOnce(Return(DataTypeManager::CONFIGURED)); 277 .WillOnce(Return(DataTypeManager::CONFIGURED));
256 EXPECT_CALL(*manager(), Configure(_, sync_api::CONFIGURE_REASON_MIGRATION)); 278 EXPECT_CALL(*manager(), Configure(_, sync_api::CONFIGURE_REASON_MIGRATION))
257 migrator.MigrateTypes(to_migrate); 279 .Times(2);
280
281 migrator()->MigrateTypes(to_migrate);
282 EXPECT_EQ(BackendMigrator::DISABLING_TYPES, migrator()->state());
283
258 SendConfigureDone(DataTypeManager::OK, difference); 284 SendConfigureDone(DataTypeManager::OK, difference);
259 EXPECT_EQ(BackendMigrator::WAITING_FOR_PURGE, migrator.state()); 285 EXPECT_EQ(BackendMigrator::DISABLING_TYPES, migrator()->state());
260
261 ReturnNonEmptyProgressMarkersInSnapshot(to_migrate);
262 migrator.OnStateChanged();
263 EXPECT_EQ(BackendMigrator::WAITING_FOR_PURGE, migrator.state());
264 286
265 syncable::ModelTypeSet prefs; 287 syncable::ModelTypeSet prefs;
266 prefs.insert(syncable::PREFERENCES); 288 prefs.insert(syncable::PREFERENCES);
267 ReturnNonEmptyProgressMarkersInSnapshot(prefs); 289 SetUnsyncedTypes(prefs);
268 migrator.OnStateChanged(); 290 SendConfigureDone(DataTypeManager::OK, difference);
269 EXPECT_EQ(BackendMigrator::WAITING_FOR_PURGE, migrator.state()); 291 EXPECT_EQ(BackendMigrator::DISABLING_TYPES, migrator()->state());
270 292
271 syncable::ModelTypeSet bookmarks; 293 SetUnsyncedTypes(to_migrate);
272 bookmarks.insert(syncable::BOOKMARKS); 294 SendConfigureDone(DataTypeManager::OK, difference);
273 ReturnNonEmptyProgressMarkersInSnapshot(bookmarks); 295 EXPECT_EQ(BackendMigrator::REENABLING_TYPES, migrator()->state());
274 EXPECT_CALL(*manager(), Configure(preferred_types(),
275 sync_api::CONFIGURE_REASON_MIGRATION));
276 migrator.OnStateChanged();
277 EXPECT_EQ(BackendMigrator::REENABLING_TYPES, migrator.state());
278 } 296 }
279 297
280 TEST_F(BackendMigratorTest, MigratedTypeDisabledByUserDuringMigration) { 298 TEST_F(BackendMigratorTest, MigratedTypeDisabledByUserDuringMigration) {
281 BackendMigrator migrator(service(), manager());
282 syncable::ModelTypeSet to_migrate; 299 syncable::ModelTypeSet to_migrate;
283 to_migrate.insert(syncable::PREFERENCES); 300 to_migrate.insert(syncable::PREFERENCES);
284 301
285 EXPECT_CALL(*manager(), state()) 302 EXPECT_CALL(*manager(), state())
286 .WillOnce(Return(DataTypeManager::CONFIGURED)); 303 .WillOnce(Return(DataTypeManager::CONFIGURED));
287 EXPECT_CALL(*manager(), Configure(_, sync_api::CONFIGURE_REASON_MIGRATION)); 304 EXPECT_CALL(*manager(), Configure(_, sync_api::CONFIGURE_REASON_MIGRATION))
288 migrator.MigrateTypes(to_migrate); 305 .Times(2);
306 migrator()->MigrateTypes(to_migrate);
289 307
290 RemovePreferredType(syncable::PREFERENCES); 308 RemovePreferredType(syncable::PREFERENCES);
309 SetUnsyncedTypes(to_migrate);
291 SendConfigureDone(DataTypeManager::OK, preferred_types()); 310 SendConfigureDone(DataTypeManager::OK, preferred_types());
292 EXPECT_EQ(BackendMigrator::WAITING_FOR_PURGE, migrator.state()); 311 EXPECT_EQ(BackendMigrator::REENABLING_TYPES, migrator()->state());
293 312 SetUnsyncedTypes(syncable::ModelTypeSet());
294 Mock::VerifyAndClearExpectations(manager());
295 ReturnEmptyProgressMarkersInSnapshot();
296 EXPECT_CALL(*manager(), Configure(preferred_types(),
297 sync_api::CONFIGURE_REASON_MIGRATION));
298 migrator.OnStateChanged();
299
300 EXPECT_EQ(BackendMigrator::REENABLING_TYPES, migrator.state());
301 SendConfigureDone(DataTypeManager::OK, preferred_types()); 313 SendConfigureDone(DataTypeManager::OK, preferred_types());
302 EXPECT_EQ(BackendMigrator::IDLE, migrator.state()); 314 EXPECT_EQ(BackendMigrator::IDLE, migrator()->state());
303 } 315 }
304 316
305 TEST_F(BackendMigratorTest, ConfigureFailure) { 317 TEST_F(BackendMigratorTest, ConfigureFailure) {
306 BackendMigrator migrator(service(), manager());
307 syncable::ModelTypeSet to_migrate; 318 syncable::ModelTypeSet to_migrate;
308 to_migrate.insert(syncable::PREFERENCES); 319 to_migrate.insert(syncable::PREFERENCES);
309 320
310 EXPECT_CALL(*manager(), state()) 321 EXPECT_CALL(*manager(), state())
311 .WillOnce(Return(DataTypeManager::CONFIGURED)); 322 .WillOnce(Return(DataTypeManager::CONFIGURED));
312 EXPECT_CALL(*manager(), Configure(_, sync_api::CONFIGURE_REASON_MIGRATION)) 323 EXPECT_CALL(*manager(), Configure(_, sync_api::CONFIGURE_REASON_MIGRATION))
313 .Times(1); 324 .Times(1);
314 migrator.MigrateTypes(to_migrate); 325 migrator()->MigrateTypes(to_migrate);
326 SetUnsyncedTypes(syncable::ModelTypeSet());
315 SendConfigureDone(DataTypeManager::ABORTED, syncable::ModelTypeSet()); 327 SendConfigureDone(DataTypeManager::ABORTED, syncable::ModelTypeSet());
316 EXPECT_EQ(BackendMigrator::IDLE, migrator.state()); 328 EXPECT_EQ(BackendMigrator::IDLE, migrator()->state());
317 } 329 }
318 330
319 }; // namespace browser_sync 331 }; // namespace browser_sync
OLDNEW
« no previous file with comments | « chrome/browser/sync/backend_migrator.cc ('k') | chrome/browser/sync/engine/sync_scheduler.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698