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

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: Fix race condition 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
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"
7 #include "chrome/browser/sync/glue/data_type_manager_mock.h" 8 #include "chrome/browser/sync/glue/data_type_manager_mock.h"
8 #include "chrome/browser/sync/profile_sync_service_mock.h" 9 #include "chrome/browser/sync/profile_sync_service_mock.h"
9 #include "chrome/browser/sync/sessions/session_state.h" 10 #include "chrome/browser/sync/sessions/session_state.h"
10 #include "chrome/common/chrome_notification_types.h" 11 #include "chrome/common/chrome_notification_types.h"
11 #include "chrome/test/base/testing_browser_process_test.h" 12 #include "chrome/test/base/testing_browser_process_test.h"
12 #include "testing/gmock/include/gmock/gmock.h" 13 #include "testing/gmock/include/gmock/gmock.h"
13 #include "testing/gtest/include/gtest/gtest.h" 14 #include "testing/gtest/include/gtest/gtest.h"
14 15
15 using ::testing::_; 16 using ::testing::_;
16 using ::testing::Eq; 17 using ::testing::Eq;
(...skipping 17 matching lines...) Expand all
34 Mock::VerifyAndClear(manager()); 35 Mock::VerifyAndClear(manager());
35 Mock::VerifyAndClear(&service_); 36 Mock::VerifyAndClear(&service_);
36 preferred_types_.insert(syncable::BOOKMARKS); 37 preferred_types_.insert(syncable::BOOKMARKS);
37 preferred_types_.insert(syncable::PREFERENCES); 38 preferred_types_.insert(syncable::PREFERENCES);
38 preferred_types_.insert(syncable::AUTOFILL); 39 preferred_types_.insert(syncable::AUTOFILL);
39 40
40 ON_CALL(service_, GetPreferredDataTypes(_)). 41 ON_CALL(service_, GetPreferredDataTypes(_)).
41 WillByDefault(SetArgumentPointee<0>(preferred_types_)); 42 WillByDefault(SetArgumentPointee<0>(preferred_types_));
42 } 43 }
43 44
44 void ReturnEmptyProgressMarkersInSnapshot() {
45 ReturnNonEmptyProgressMarkersInSnapshot(syncable::ModelTypeSet());
46 }
47
48 void ReturnNonEmptyProgressMarkersInSnapshot(
49 const syncable::ModelTypeSet& for_types) {
50 std::string download_progress_markers[syncable::MODEL_TYPE_COUNT];
51 for (syncable::ModelTypeSet::const_iterator it = for_types.begin();
52 it != for_types.end(); ++it) {
53 download_progress_markers[*it] = "foobar";
54 }
55
56 snap_.reset(new SyncSessionSnapshot(SyncerStatus(), ErrorCounters(),
57 0, false, syncable::ModelTypeBitSet(), download_progress_markers,
58 false, false, 0, 0, 0, false, sessions::SyncSourceInfo(), 0,
59 base::Time::Now()));
60 EXPECT_CALL(service_, GetLastSessionSnapshot())
61 .WillOnce(Return(snap_.get()));
62 }
63
64 void SendConfigureDone(DataTypeManager::ConfigureStatus status, 45 void SendConfigureDone(DataTypeManager::ConfigureStatus status,
65 const syncable::ModelTypeSet& types) { 46 const syncable::ModelTypeSet& requested_types,
47 const syncable::ModelTypeSet& purged_types) {
66 if (status == DataTypeManager::OK) { 48 if (status == DataTypeManager::OK) {
67 DataTypeManager::ConfigureResult result(status, types); 49 DataTypeManager::ConfigureResult result(
50 status, requested_types, purged_types);
68 NotificationService::current()->Notify( 51 NotificationService::current()->Notify(
69 chrome::NOTIFICATION_SYNC_CONFIGURE_DONE, 52 chrome::NOTIFICATION_SYNC_CONFIGURE_DONE,
70 Source<DataTypeManager>(&manager_), 53 Source<DataTypeManager>(&manager_),
71 Details<const DataTypeManager::ConfigureResult>(&result)); 54 Details<const DataTypeManager::ConfigureResult>(&result));
72 } else { 55 } else {
73 DataTypeManager::ConfigureResult result( 56 DataTypeManager::ConfigureResult result(
74 status, 57 status,
75 types, 58 requested_types,
59 purged_types,
76 syncable::ModelTypeSet(), 60 syncable::ModelTypeSet(),
77 FROM_HERE); 61 FROM_HERE);
78 NotificationService::current()->Notify( 62 NotificationService::current()->Notify(
79 chrome::NOTIFICATION_SYNC_CONFIGURE_DONE, 63 chrome::NOTIFICATION_SYNC_CONFIGURE_DONE,
80 Source<DataTypeManager>(&manager_), 64 Source<DataTypeManager>(&manager_),
81 Details<const DataTypeManager::ConfigureResult>(&result)); 65 Details<const DataTypeManager::ConfigureResult>(&result));
82 } 66 }
67 message_loop_.RunAllPending();
83 } 68 }
84 69
85 ProfileSyncService* service() { return &service_; } 70 ProfileSyncService* service() { return &service_; }
86 DataTypeManagerMock* manager() { return &manager_; } 71 DataTypeManagerMock* manager() { return &manager_; }
87 const syncable::ModelTypeSet& preferred_types() { return preferred_types_; } 72 const syncable::ModelTypeSet& preferred_types() { return preferred_types_; }
88 void RemovePreferredType(syncable::ModelType type) { 73 void RemovePreferredType(syncable::ModelType type) {
89 preferred_types_.erase(type); 74 preferred_types_.erase(type);
90 Mock::VerifyAndClear(&service_); 75 Mock::VerifyAndClear(&service_);
91 ON_CALL(service_, GetPreferredDataTypes(_)). 76 ON_CALL(service_, GetPreferredDataTypes(_)).
92 WillByDefault(SetArgumentPointee<0>(preferred_types_)); 77 WillByDefault(SetArgumentPointee<0>(preferred_types_));
93 } 78 }
94 private: 79 private:
95 scoped_ptr<SyncSessionSnapshot> snap_; 80 scoped_ptr<SyncSessionSnapshot> snap_;
81 MessageLoop message_loop_;
96 syncable::ModelTypeSet preferred_types_; 82 syncable::ModelTypeSet preferred_types_;
97 NiceMock<ProfileSyncServiceMock> service_; 83 NiceMock<ProfileSyncServiceMock> service_;
98 NiceMock<DataTypeManagerMock> manager_; 84 NiceMock<DataTypeManagerMock> manager_;
99 }; 85 };
100 86
101 // Test that in the normal case a migration does transition through each state 87 // Test that in the normal case a migration does transition through each state
102 // and wind up back in IDLE. 88 // and wind up back in IDLE.
103 TEST_F(BackendMigratorTest, Sanity) { 89 TEST_F(BackendMigratorTest, Sanity) {
104 BackendMigrator migrator(service(), manager()); 90 BackendMigrator migrator(service(), manager());
105 syncable::ModelTypeSet to_migrate, difference; 91 syncable::ModelTypeSet to_migrate, difference;
106 to_migrate.insert(syncable::PREFERENCES); 92 to_migrate.insert(syncable::PREFERENCES);
107 difference.insert(syncable::AUTOFILL); 93 difference.insert(syncable::AUTOFILL);
108 difference.insert(syncable::BOOKMARKS); 94 difference.insert(syncable::BOOKMARKS);
109 95
110 EXPECT_CALL(*manager(), state()) 96 EXPECT_CALL(*manager(), state())
111 .WillOnce(Return(DataTypeManager::CONFIGURED)); 97 .WillOnce(Return(DataTypeManager::CONFIGURED));
112 EXPECT_CALL(*manager(), Configure(_, sync_api::CONFIGURE_REASON_MIGRATION)); 98 EXPECT_CALL(*manager(), Configure(_, sync_api::CONFIGURE_REASON_MIGRATION))
99 .Times(2);
113 100
114 migrator.MigrateTypes(to_migrate); 101 migrator.MigrateTypes(to_migrate);
115 EXPECT_EQ(BackendMigrator::DISABLING_TYPES, migrator.state()); 102 EXPECT_EQ(BackendMigrator::DISABLING_TYPES, migrator.state());
116 103
117 SendConfigureDone(DataTypeManager::OK, difference); 104 SendConfigureDone(DataTypeManager::OK, difference, to_migrate);
118 EXPECT_EQ(BackendMigrator::WAITING_FOR_PURGE, migrator.state());
119
120 ReturnEmptyProgressMarkersInSnapshot();
121 EXPECT_CALL(*manager(), Configure(preferred_types(),
122 sync_api::CONFIGURE_REASON_MIGRATION));
123 migrator.OnStateChanged();
124 EXPECT_EQ(BackendMigrator::REENABLING_TYPES, migrator.state()); 105 EXPECT_EQ(BackendMigrator::REENABLING_TYPES, migrator.state());
125 106
126 SendConfigureDone(DataTypeManager::OK, preferred_types()); 107 SendConfigureDone(DataTypeManager::OK, preferred_types(),
108 syncable::ModelTypeSet());
127 EXPECT_EQ(BackendMigrator::IDLE, migrator.state()); 109 EXPECT_EQ(BackendMigrator::IDLE, migrator.state());
128 } 110 }
129 111
130 // Test that in the normal case with Nigori a migration transitions through 112 // Test that in the normal case with Nigori a migration transitions through
131 // each state and wind up back in IDLE. 113 // each state and wind up back in IDLE.
132 TEST_F(BackendMigratorTest, MigrateNigori) { 114 TEST_F(BackendMigratorTest, MigrateNigori) {
133 BackendMigrator migrator(service(), manager()); 115 BackendMigrator migrator(service(), manager());
134 syncable::ModelTypeSet to_migrate, difference; 116 syncable::ModelTypeSet to_migrate, difference;
135 to_migrate.insert(syncable::NIGORI); 117 to_migrate.insert(syncable::NIGORI);
136 difference.insert(syncable::AUTOFILL); 118 difference.insert(syncable::AUTOFILL);
137 difference.insert(syncable::BOOKMARKS); 119 difference.insert(syncable::BOOKMARKS);
138 120
139 EXPECT_CALL(*manager(), state()) 121 EXPECT_CALL(*manager(), state())
140 .WillOnce(Return(DataTypeManager::CONFIGURED)); 122 .WillOnce(Return(DataTypeManager::CONFIGURED));
141 123
142 EXPECT_CALL(*manager(), ConfigureWithoutNigori(_, 124 EXPECT_CALL(*manager(), ConfigureWithoutNigori(_,
143 sync_api::CONFIGURE_REASON_MIGRATION)); 125 sync_api::CONFIGURE_REASON_MIGRATION));
144 126
145 migrator.MigrateTypes(to_migrate); 127 migrator.MigrateTypes(to_migrate);
146 EXPECT_EQ(BackendMigrator::DISABLING_TYPES, migrator.state()); 128 EXPECT_EQ(BackendMigrator::DISABLING_TYPES, migrator.state());
147 129
148 SendConfigureDone(DataTypeManager::OK, difference); 130 SendConfigureDone(DataTypeManager::OK, difference, to_migrate);
149 EXPECT_EQ(BackendMigrator::WAITING_FOR_PURGE, migrator.state());
150
151 ReturnEmptyProgressMarkersInSnapshot();
152 EXPECT_CALL(*manager(), Configure(preferred_types(),
153 sync_api::CONFIGURE_REASON_MIGRATION));
154 migrator.OnStateChanged();
155 EXPECT_EQ(BackendMigrator::REENABLING_TYPES, migrator.state()); 131 EXPECT_EQ(BackendMigrator::REENABLING_TYPES, migrator.state());
156 132
157 SendConfigureDone(DataTypeManager::OK, preferred_types()); 133 SendConfigureDone(DataTypeManager::OK, preferred_types(),
134 syncable::ModelTypeSet());
158 EXPECT_EQ(BackendMigrator::IDLE, migrator.state()); 135 EXPECT_EQ(BackendMigrator::IDLE, migrator.state());
159 } 136 }
160 137
161 138
162 // Test that the migrator waits for the data type manager to be idle before 139 // Test that the migrator waits for the data type manager to be idle before
163 // starting a migration. 140 // starting a migration.
164 TEST_F(BackendMigratorTest, WaitToStart) { 141 TEST_F(BackendMigratorTest, WaitToStart) {
165 BackendMigrator migrator(service(), manager()); 142 BackendMigrator migrator(service(), manager());
166 syncable::ModelTypeSet to_migrate; 143 syncable::ModelTypeSet to_migrate;
167 to_migrate.insert(syncable::PREFERENCES); 144 to_migrate.insert(syncable::PREFERENCES);
168 145
169 EXPECT_CALL(*manager(), state()) 146 EXPECT_CALL(*manager(), state())
170 .WillOnce(Return(DataTypeManager::CONFIGURING)); 147 .WillOnce(Return(DataTypeManager::CONFIGURING));
171 EXPECT_CALL(*manager(), Configure(_, _)).Times(0); 148 EXPECT_CALL(*manager(), Configure(_, _)).Times(0);
172 migrator.MigrateTypes(to_migrate); 149 migrator.MigrateTypes(to_migrate);
173 EXPECT_EQ(BackendMigrator::WAITING_TO_START, migrator.state()); 150 EXPECT_EQ(BackendMigrator::WAITING_TO_START, migrator.state());
174 151
175 Mock::VerifyAndClearExpectations(manager()); 152 Mock::VerifyAndClearExpectations(manager());
176 EXPECT_CALL(*manager(), state()) 153 EXPECT_CALL(*manager(), state())
177 .WillOnce(Return(DataTypeManager::CONFIGURED)); 154 .WillOnce(Return(DataTypeManager::CONFIGURED));
178 EXPECT_CALL(*manager(), Configure(_, sync_api::CONFIGURE_REASON_MIGRATION)); 155 EXPECT_CALL(*manager(), Configure(_, sync_api::CONFIGURE_REASON_MIGRATION));
179 SendConfigureDone(DataTypeManager::OK, syncable::ModelTypeSet()); 156 SendConfigureDone(DataTypeManager::OK, syncable::ModelTypeSet(),
157 syncable::ModelTypeSet());
180 158
181 EXPECT_EQ(BackendMigrator::DISABLING_TYPES, migrator.state()); 159 EXPECT_EQ(BackendMigrator::DISABLING_TYPES, migrator.state());
182 } 160 }
183 161
184 // Test that the migrator can cope with a migration request while a migration 162 // Test that the migrator can cope with a migration request while a migration
185 // is in progress. 163 // is in progress.
186 TEST_F(BackendMigratorTest, RestartMigration) { 164 TEST_F(BackendMigratorTest, RestartMigration) {
187 BackendMigrator migrator(service(), manager()); 165 BackendMigrator migrator(service(), manager());
188 syncable::ModelTypeSet to_migrate1, to_migrate2, bookmarks; 166 syncable::ModelTypeSet to_migrate1, to_migrate2, to_migrate_union, bookmarks;
189 to_migrate1.insert(syncable::PREFERENCES); 167 to_migrate1.insert(syncable::PREFERENCES);
190 to_migrate2.insert(syncable::AUTOFILL); 168 to_migrate2.insert(syncable::AUTOFILL);
169 to_migrate_union.insert(syncable::PREFERENCES);
170 to_migrate_union.insert(syncable::AUTOFILL);
191 bookmarks.insert(syncable::BOOKMARKS); 171 bookmarks.insert(syncable::BOOKMARKS);
192 172
193 EXPECT_CALL(*manager(), state()) 173 EXPECT_CALL(*manager(), state())
194 .WillOnce(Return(DataTypeManager::CONFIGURED)); 174 .WillOnce(Return(DataTypeManager::CONFIGURED));
195 EXPECT_CALL(*manager(), Configure(_, sync_api::CONFIGURE_REASON_MIGRATION)) 175 EXPECT_CALL(*manager(), Configure(_, sync_api::CONFIGURE_REASON_MIGRATION))
196 .Times(1); 176 .Times(2);
197 migrator.MigrateTypes(to_migrate1); 177 migrator.MigrateTypes(to_migrate1);
198 178
199 EXPECT_EQ(BackendMigrator::DISABLING_TYPES, migrator.state()); 179 EXPECT_EQ(BackendMigrator::DISABLING_TYPES, migrator.state());
200 migrator.MigrateTypes(to_migrate2); 180 migrator.MigrateTypes(to_migrate2);
201 181
202 syncable::ModelTypeSet difference1; 182 syncable::ModelTypeSet difference1;
203 std::set_difference(preferred_types().begin(), preferred_types().end(), 183 std::set_difference(preferred_types().begin(), preferred_types().end(),
204 to_migrate1.begin(), to_migrate1.end(), 184 to_migrate1.begin(), to_migrate1.end(),
205 std::inserter(difference1, difference1.end())); 185 std::inserter(difference1, difference1.end()));
206 186
207 Mock::VerifyAndClearExpectations(manager()); 187 Mock::VerifyAndClearExpectations(manager());
208 EXPECT_CALL(*manager(), state()) 188 EXPECT_CALL(*manager(), Configure(_, sync_api::CONFIGURE_REASON_MIGRATION))
209 .WillOnce(Return(DataTypeManager::CONFIGURED)); 189 .Times(2);
210 EXPECT_CALL(*manager(), Configure(bookmarks, 190 SendConfigureDone(DataTypeManager::OK, difference1, to_migrate1);
211 sync_api::CONFIGURE_REASON_MIGRATION));
212 SendConfigureDone(DataTypeManager::OK, difference1);
213 EXPECT_EQ(BackendMigrator::DISABLING_TYPES, migrator.state()); 191 EXPECT_EQ(BackendMigrator::DISABLING_TYPES, migrator.state());
214 192
215 SendConfigureDone(DataTypeManager::OK, bookmarks); 193 SendConfigureDone(DataTypeManager::OK, bookmarks, to_migrate_union);
216 EXPECT_EQ(BackendMigrator::WAITING_FOR_PURGE, migrator.state()); 194 EXPECT_EQ(BackendMigrator::REENABLING_TYPES, migrator.state());
217 } 195 }
218 196
219 // Test that an external invocation of Configure(...) during a migration results 197 // Test that an external invocation of Configure(...) during a migration results
220 // in a migration reattempt. 198 // in a migration reattempt.
221 TEST_F(BackendMigratorTest, InterruptedWhileDisablingTypes) { 199 TEST_F(BackendMigratorTest, InterruptedWhileDisablingTypes) {
222 BackendMigrator migrator(service(), manager()); 200 BackendMigrator migrator(service(), manager());
223 syncable::ModelTypeSet to_migrate; 201 syncable::ModelTypeSet to_migrate;
224 syncable::ModelTypeSet difference; 202 syncable::ModelTypeSet difference;
225 to_migrate.insert(syncable::PREFERENCES); 203 to_migrate.insert(syncable::PREFERENCES);
226 difference.insert(syncable::AUTOFILL); 204 difference.insert(syncable::AUTOFILL);
227 difference.insert(syncable::BOOKMARKS); 205 difference.insert(syncable::BOOKMARKS);
228 206
229 EXPECT_CALL(*manager(), state()) 207 EXPECT_CALL(*manager(), state())
230 .WillOnce(Return(DataTypeManager::CONFIGURED)); 208 .WillOnce(Return(DataTypeManager::CONFIGURED));
231 EXPECT_CALL(*manager(), Configure(difference, 209 EXPECT_CALL(*manager(), Configure(difference,
232 sync_api::CONFIGURE_REASON_MIGRATION)); 210 sync_api::CONFIGURE_REASON_MIGRATION));
233 migrator.MigrateTypes(to_migrate); 211 migrator.MigrateTypes(to_migrate);
234 EXPECT_EQ(BackendMigrator::DISABLING_TYPES, migrator.state()); 212 EXPECT_EQ(BackendMigrator::DISABLING_TYPES, migrator.state());
235 213
236 Mock::VerifyAndClearExpectations(manager()); 214 Mock::VerifyAndClearExpectations(manager());
237 EXPECT_CALL(*manager(), state())
238 .WillOnce(Return(DataTypeManager::CONFIGURED));
239 EXPECT_CALL(*manager(), Configure(difference, 215 EXPECT_CALL(*manager(), Configure(difference,
240 sync_api::CONFIGURE_REASON_MIGRATION)); 216 sync_api::CONFIGURE_REASON_MIGRATION));
241 SendConfigureDone(DataTypeManager::OK, preferred_types()); 217 SendConfigureDone(DataTypeManager::OK, preferred_types(),
218 syncable::ModelTypeSet());
242 219
243 EXPECT_EQ(BackendMigrator::DISABLING_TYPES, migrator.state()); 220 EXPECT_EQ(BackendMigrator::DISABLING_TYPES, migrator.state());
244 } 221 }
245 222
246 // Test that spurious OnStateChanged events don't confuse the migrator while 223 // Test that spurious OnConfigureDone events don't confuse the
247 // it's waiting for disabled types to have been purged from the sync db. 224 // migrator while it's waiting for disabled types to have been purged
225 // from the sync db.
248 TEST_F(BackendMigratorTest, WaitingForPurge) { 226 TEST_F(BackendMigratorTest, WaitingForPurge) {
249 BackendMigrator migrator(service(), manager()); 227 BackendMigrator migrator(service(), manager());
250 syncable::ModelTypeSet to_migrate, difference; 228 syncable::ModelTypeSet to_migrate, difference;
251 to_migrate.insert(syncable::PREFERENCES); 229 to_migrate.insert(syncable::PREFERENCES);
252 to_migrate.insert(syncable::AUTOFILL); 230 to_migrate.insert(syncable::AUTOFILL);
253 difference.insert(syncable::BOOKMARKS); 231 difference.insert(syncable::BOOKMARKS);
254 232
255 EXPECT_CALL(*manager(), state()) 233 EXPECT_CALL(*manager(), state())
256 .WillOnce(Return(DataTypeManager::CONFIGURED)); 234 .WillOnce(Return(DataTypeManager::CONFIGURED));
257 EXPECT_CALL(*manager(), Configure(_, sync_api::CONFIGURE_REASON_MIGRATION)); 235 EXPECT_CALL(*manager(), Configure(_, sync_api::CONFIGURE_REASON_MIGRATION))
236 .Times(2);
237
258 migrator.MigrateTypes(to_migrate); 238 migrator.MigrateTypes(to_migrate);
259 SendConfigureDone(DataTypeManager::OK, difference); 239 EXPECT_EQ(BackendMigrator::DISABLING_TYPES, migrator.state());
260 EXPECT_EQ(BackendMigrator::WAITING_FOR_PURGE, migrator.state());
261 240
262 ReturnNonEmptyProgressMarkersInSnapshot(to_migrate); 241 SendConfigureDone(DataTypeManager::OK, difference, syncable::ModelTypeSet());
263 migrator.OnStateChanged(); 242 EXPECT_EQ(BackendMigrator::DISABLING_TYPES, migrator.state());
264 EXPECT_EQ(BackendMigrator::WAITING_FOR_PURGE, migrator.state());
265 243
266 syncable::ModelTypeSet prefs; 244 syncable::ModelTypeSet prefs;
267 prefs.insert(syncable::PREFERENCES); 245 prefs.insert(syncable::PREFERENCES);
268 ReturnNonEmptyProgressMarkersInSnapshot(prefs); 246 SendConfigureDone(DataTypeManager::OK, difference, prefs);
269 migrator.OnStateChanged(); 247 EXPECT_EQ(BackendMigrator::DISABLING_TYPES, migrator.state());
270 EXPECT_EQ(BackendMigrator::WAITING_FOR_PURGE, migrator.state());
271 248
272 syncable::ModelTypeSet bookmarks; 249 SendConfigureDone(DataTypeManager::OK, difference, to_migrate);
273 bookmarks.insert(syncable::BOOKMARKS);
274 ReturnNonEmptyProgressMarkersInSnapshot(bookmarks);
275 EXPECT_CALL(*manager(), Configure(preferred_types(),
276 sync_api::CONFIGURE_REASON_MIGRATION));
277 migrator.OnStateChanged();
278 EXPECT_EQ(BackendMigrator::REENABLING_TYPES, migrator.state()); 250 EXPECT_EQ(BackendMigrator::REENABLING_TYPES, migrator.state());
279 } 251 }
280 252
281 TEST_F(BackendMigratorTest, MigratedTypeDisabledByUserDuringMigration) { 253 TEST_F(BackendMigratorTest, MigratedTypeDisabledByUserDuringMigration) {
282 BackendMigrator migrator(service(), manager()); 254 BackendMigrator migrator(service(), manager());
283 syncable::ModelTypeSet to_migrate; 255 syncable::ModelTypeSet to_migrate;
284 to_migrate.insert(syncable::PREFERENCES); 256 to_migrate.insert(syncable::PREFERENCES);
285 257
286 EXPECT_CALL(*manager(), state()) 258 EXPECT_CALL(*manager(), state())
287 .WillOnce(Return(DataTypeManager::CONFIGURED)); 259 .WillOnce(Return(DataTypeManager::CONFIGURED));
288 EXPECT_CALL(*manager(), Configure(_, sync_api::CONFIGURE_REASON_MIGRATION)); 260 EXPECT_CALL(*manager(), Configure(_, sync_api::CONFIGURE_REASON_MIGRATION))
261 .Times(2);
289 migrator.MigrateTypes(to_migrate); 262 migrator.MigrateTypes(to_migrate);
290 263
291 RemovePreferredType(syncable::PREFERENCES); 264 RemovePreferredType(syncable::PREFERENCES);
292 SendConfigureDone(DataTypeManager::OK, preferred_types()); 265 SendConfigureDone(DataTypeManager::OK, preferred_types(), to_migrate);
293 EXPECT_EQ(BackendMigrator::WAITING_FOR_PURGE, migrator.state());
294
295 Mock::VerifyAndClearExpectations(manager());
296 ReturnEmptyProgressMarkersInSnapshot();
297 EXPECT_CALL(*manager(), Configure(preferred_types(),
298 sync_api::CONFIGURE_REASON_MIGRATION));
299 migrator.OnStateChanged();
300
301 EXPECT_EQ(BackendMigrator::REENABLING_TYPES, migrator.state()); 266 EXPECT_EQ(BackendMigrator::REENABLING_TYPES, migrator.state());
302 SendConfigureDone(DataTypeManager::OK, preferred_types()); 267 SendConfigureDone(DataTypeManager::OK, preferred_types(),
268 syncable::ModelTypeSet());
303 EXPECT_EQ(BackendMigrator::IDLE, migrator.state()); 269 EXPECT_EQ(BackendMigrator::IDLE, migrator.state());
304 } 270 }
305 271
306 TEST_F(BackendMigratorTest, ConfigureFailure) { 272 TEST_F(BackendMigratorTest, ConfigureFailure) {
307 BackendMigrator migrator(service(), manager()); 273 BackendMigrator migrator(service(), manager());
308 syncable::ModelTypeSet to_migrate; 274 syncable::ModelTypeSet to_migrate;
309 to_migrate.insert(syncable::PREFERENCES); 275 to_migrate.insert(syncable::PREFERENCES);
310 276
311 EXPECT_CALL(*manager(), state()) 277 EXPECT_CALL(*manager(), state())
312 .WillOnce(Return(DataTypeManager::CONFIGURED)); 278 .WillOnce(Return(DataTypeManager::CONFIGURED));
313 EXPECT_CALL(*manager(), Configure(_, sync_api::CONFIGURE_REASON_MIGRATION)) 279 EXPECT_CALL(*manager(), Configure(_, sync_api::CONFIGURE_REASON_MIGRATION))
314 .Times(1); 280 .Times(1);
315 migrator.MigrateTypes(to_migrate); 281 migrator.MigrateTypes(to_migrate);
316 SendConfigureDone(DataTypeManager::ABORTED, syncable::ModelTypeSet()); 282 SendConfigureDone(DataTypeManager::ABORTED, syncable::ModelTypeSet(),
283 syncable::ModelTypeSet());
317 EXPECT_EQ(BackendMigrator::IDLE, migrator.state()); 284 EXPECT_EQ(BackendMigrator::IDLE, migrator.state());
318 } 285 }
319 286
320 }; // namespace browser_sync 287 }; // namespace browser_sync
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698