blob: eea258990de129e4604941ae3408480bd8738688 [file] [log] [blame]
[email protected]b486b462012-02-11 00:11:421// Copyright (c) 2012 The Chromium Authors. All rights reserved.
[email protected]dc556252011-04-20 01:59:352// 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/backend_migrator.h"
6
[email protected]1a425fc2011-09-01 23:11:597#include "base/message_loop.h"
8#include "base/tracked_objects.h"
[email protected]dc556252011-04-20 01:59:359#include "chrome/browser/sync/glue/data_type_manager_mock.h"
10#include "chrome/browser/sync/profile_sync_service_mock.h"
[email protected]432115822011-07-10 15:52:2711#include "chrome/common/chrome_notification_types.h"
[email protected]002d39192012-07-03 01:30:5612#include "sync/internal_api/public/base/model_type_test_util.h"
[email protected]406203d2012-06-17 01:07:1913#include "sync/internal_api/public/test/test_user_share.h"
14#include "sync/internal_api/public/write_transaction.h"
[email protected]1bcf30e2012-03-10 01:06:4115#include "sync/protocol/sync.pb.h"
[email protected]15732672012-06-20 18:58:2616#include "sync/syncable/directory.h" // TODO(tim): Remove. Bug 131130.
[email protected]dc556252011-04-20 01:59:3517#include "testing/gmock/include/gmock/gmock.h"
18#include "testing/gtest/include/gtest/gtest.h"
19
20using ::testing::_;
21using ::testing::Eq;
22using ::testing::Mock;
23using ::testing::NiceMock;
24using ::testing::Return;
[email protected]dc556252011-04-20 01:59:3525
26namespace browser_sync {
27
[email protected]65f173552012-06-28 22:43:5828using syncer::sessions::SyncSessionSnapshot;
[email protected]dc556252011-04-20 01:59:3529
[email protected]b486b462012-02-11 00:11:4230class SyncBackendMigratorTest : public testing::Test {
[email protected]dc556252011-04-20 01:59:3531 public:
[email protected]b486b462012-02-11 00:11:4232 SyncBackendMigratorTest() { }
33 virtual ~SyncBackendMigratorTest() { }
[email protected]dc556252011-04-20 01:59:3534
35 virtual void SetUp() {
[email protected]1a425fc2011-09-01 23:11:5936 test_user_share_.SetUp();
[email protected]dc556252011-04-20 01:59:3537 Mock::VerifyAndClear(manager());
38 Mock::VerifyAndClear(&service_);
[email protected]a4a147652012-07-03 23:41:3239 preferred_types_.Put(syncer::BOOKMARKS);
40 preferred_types_.Put(syncer::PREFERENCES);
41 preferred_types_.Put(syncer::AUTOFILL);
[email protected]dc556252011-04-20 01:59:3542
[email protected]71229fa82011-12-10 01:00:5443 ON_CALL(service_, GetPreferredDataTypes()).
44 WillByDefault(Return(preferred_types_));
[email protected]1a425fc2011-09-01 23:11:5945
46 migrator_.reset(
47 new BackendMigrator(
[email protected]32d7c332012-04-23 19:44:0948 "Profile0", test_user_share_.user_share(), service(), manager(),
49 base::Closure()));
[email protected]a4a147652012-07-03 23:41:3250 SetUnsyncedTypes(syncer::ModelTypeSet());
[email protected]dc556252011-04-20 01:59:3551 }
52
[email protected]1a425fc2011-09-01 23:11:5953 virtual void TearDown() {
54 migrator_.reset();
55 test_user_share_.TearDown();
[email protected]dc556252011-04-20 01:59:3556 }
57
[email protected]1a425fc2011-09-01 23:11:5958 // Marks all types in |unsynced_types| as unsynced and all other
59 // types as synced.
[email protected]a4a147652012-07-03 23:41:3260 void SetUnsyncedTypes(syncer::ModelTypeSet unsynced_types) {
[email protected]65f173552012-06-28 22:43:5861 syncer::WriteTransaction trans(FROM_HERE,
[email protected]1a425fc2011-09-01 23:11:5962 test_user_share_.user_share());
[email protected]a4a147652012-07-03 23:41:3263 for (int i = syncer::FIRST_REAL_MODEL_TYPE;
64 i < syncer::MODEL_TYPE_COUNT; ++i) {
65 syncer::ModelType type = syncer::ModelTypeFromInt(i);
[email protected]1a425fc2011-09-01 23:11:5966 sync_pb::DataTypeProgressMarker progress_marker;
[email protected]71229fa82011-12-10 01:00:5467 if (!unsynced_types.Has(type)) {
[email protected]1a425fc2011-09-01 23:11:5968 progress_marker.set_token("dummy");
69 }
[email protected]30aebeb92012-02-28 05:27:1570 trans.GetDirectory()->SetDownloadProgress(type, progress_marker);
[email protected]dc556252011-04-20 01:59:3571 }
[email protected]dc556252011-04-20 01:59:3572 }
73
[email protected]de7d78c72011-07-26 23:41:5074 void SendConfigureDone(DataTypeManager::ConfigureStatus status,
[email protected]a4a147652012-07-03 23:41:3275 syncer::ModelTypeSet requested_types) {
[email protected]de7d78c72011-07-26 23:41:5076 if (status == DataTypeManager::OK) {
[email protected]1a425fc2011-09-01 23:11:5977 DataTypeManager::ConfigureResult result(status, requested_types);
[email protected]32d7c332012-04-23 19:44:0978 migrator_->OnConfigureDone(result);
[email protected]de7d78c72011-07-26 23:41:5079 } else {
[email protected]65f173552012-06-28 22:43:5880 std::list<syncer::SyncError> errors;
[email protected]631b193f2011-10-06 08:07:4681 DataTypeManager::ConfigureResult result(
82 status,
83 requested_types,
[email protected]46220c22012-05-23 23:26:5084 errors,
[email protected]a4a147652012-07-03 23:41:3285 syncer::ModelTypeSet());
[email protected]32d7c332012-04-23 19:44:0986 migrator_->OnConfigureDone(result);
[email protected]de7d78c72011-07-26 23:41:5087 }
[email protected]b8f50ce2012-11-17 12:37:5788 message_loop_.RunUntilIdle();
[email protected]dc556252011-04-20 01:59:3589 }
90
91 ProfileSyncService* service() { return &service_; }
92 DataTypeManagerMock* manager() { return &manager_; }
[email protected]a4a147652012-07-03 23:41:3293 syncer::ModelTypeSet preferred_types() { return preferred_types_; }
[email protected]1a425fc2011-09-01 23:11:5994 BackendMigrator* migrator() { return migrator_.get(); }
[email protected]a4a147652012-07-03 23:41:3295 void RemovePreferredType(syncer::ModelType type) {
[email protected]71229fa82011-12-10 01:00:5496 preferred_types_.Remove(type);
[email protected]dc556252011-04-20 01:59:3597 Mock::VerifyAndClear(&service_);
[email protected]71229fa82011-12-10 01:00:5498 ON_CALL(service_, GetPreferredDataTypes()).
99 WillByDefault(Return(preferred_types_));
[email protected]dc556252011-04-20 01:59:35100 }
[email protected]1a425fc2011-09-01 23:11:59101
[email protected]dc556252011-04-20 01:59:35102 private:
103 scoped_ptr<SyncSessionSnapshot> snap_;
[email protected]1a425fc2011-09-01 23:11:59104 MessageLoop message_loop_;
[email protected]a4a147652012-07-03 23:41:32105 syncer::ModelTypeSet preferred_types_;
[email protected]dc556252011-04-20 01:59:35106 NiceMock<ProfileSyncServiceMock> service_;
107 NiceMock<DataTypeManagerMock> manager_;
[email protected]65f173552012-06-28 22:43:58108 syncer::TestUserShare test_user_share_;
[email protected]1a425fc2011-09-01 23:11:59109 scoped_ptr<BackendMigrator> migrator_;
110};
111
112class MockMigrationObserver : public MigrationObserver {
113 public:
114 virtual ~MockMigrationObserver() {}
115
116 MOCK_METHOD0(OnMigrationStateChange, void());
[email protected]dc556252011-04-20 01:59:35117};
118
119// Test that in the normal case a migration does transition through each state
120// and wind up back in IDLE.
[email protected]b486b462012-02-11 00:11:42121TEST_F(SyncBackendMigratorTest, Sanity) {
[email protected]1a425fc2011-09-01 23:11:59122 MockMigrationObserver migration_observer;
123 migrator()->AddMigrationObserver(&migration_observer);
124 EXPECT_CALL(migration_observer, OnMigrationStateChange()).Times(4);
125
[email protected]a4a147652012-07-03 23:41:32126 syncer::ModelTypeSet to_migrate, difference;
127 to_migrate.Put(syncer::PREFERENCES);
128 difference.Put(syncer::AUTOFILL);
129 difference.Put(syncer::BOOKMARKS);
[email protected]dc556252011-04-20 01:59:35130
131 EXPECT_CALL(*manager(), state())
132 .WillOnce(Return(DataTypeManager::CONFIGURED));
[email protected]41b89262012-08-31 22:32:46133 EXPECT_CALL(
134 *manager(),
135 PurgeForMigration(_, syncer::CONFIGURE_REASON_MIGRATION)).Times(1);
136 EXPECT_CALL(
137 *manager(),
138 Configure(_, syncer::CONFIGURE_REASON_MIGRATION)).Times(1);
[email protected]dc556252011-04-20 01:59:35139
[email protected]1a425fc2011-09-01 23:11:59140 migrator()->MigrateTypes(to_migrate);
141 EXPECT_EQ(BackendMigrator::DISABLING_TYPES, migrator()->state());
[email protected]dc556252011-04-20 01:59:35142
[email protected]1a425fc2011-09-01 23:11:59143 SetUnsyncedTypes(to_migrate);
[email protected]dc556252011-04-20 01:59:35144 SendConfigureDone(DataTypeManager::OK, difference);
[email protected]1a425fc2011-09-01 23:11:59145 EXPECT_EQ(BackendMigrator::REENABLING_TYPES, migrator()->state());
[email protected]dc556252011-04-20 01:59:35146
[email protected]a4a147652012-07-03 23:41:32147 SetUnsyncedTypes(syncer::ModelTypeSet());
[email protected]dc556252011-04-20 01:59:35148 SendConfigureDone(DataTypeManager::OK, preferred_types());
[email protected]1a425fc2011-09-01 23:11:59149 EXPECT_EQ(BackendMigrator::IDLE, migrator()->state());
150
151 migrator()->RemoveMigrationObserver(&migration_observer);
[email protected]dc556252011-04-20 01:59:35152}
153
[email protected]8e8aea772011-06-02 18:43:57154// Test that in the normal case with Nigori a migration transitions through
155// each state and wind up back in IDLE.
[email protected]b486b462012-02-11 00:11:42156TEST_F(SyncBackendMigratorTest, MigrateNigori) {
[email protected]a4a147652012-07-03 23:41:32157 syncer::ModelTypeSet to_migrate, difference;
158 to_migrate.Put(syncer::NIGORI);
159 difference.Put(syncer::AUTOFILL);
160 difference.Put(syncer::BOOKMARKS);
[email protected]8e8aea772011-06-02 18:43:57161
162 EXPECT_CALL(*manager(), state())
163 .WillOnce(Return(DataTypeManager::CONFIGURED));
164
[email protected]41b89262012-08-31 22:32:46165 EXPECT_CALL(*manager(), PurgeForMigration(_,
[email protected]65f173552012-06-28 22:43:58166 syncer::CONFIGURE_REASON_MIGRATION));
[email protected]8e8aea772011-06-02 18:43:57167
[email protected]1a425fc2011-09-01 23:11:59168 migrator()->MigrateTypes(to_migrate);
169 EXPECT_EQ(BackendMigrator::DISABLING_TYPES, migrator()->state());
[email protected]8e8aea772011-06-02 18:43:57170
[email protected]1a425fc2011-09-01 23:11:59171 SetUnsyncedTypes(to_migrate);
[email protected]8e8aea772011-06-02 18:43:57172 SendConfigureDone(DataTypeManager::OK, difference);
[email protected]1a425fc2011-09-01 23:11:59173 EXPECT_EQ(BackendMigrator::REENABLING_TYPES, migrator()->state());
[email protected]8e8aea772011-06-02 18:43:57174
[email protected]a4a147652012-07-03 23:41:32175 SetUnsyncedTypes(syncer::ModelTypeSet());
[email protected]8e8aea772011-06-02 18:43:57176 SendConfigureDone(DataTypeManager::OK, preferred_types());
[email protected]1a425fc2011-09-01 23:11:59177 EXPECT_EQ(BackendMigrator::IDLE, migrator()->state());
[email protected]8e8aea772011-06-02 18:43:57178}
179
180
[email protected]dc556252011-04-20 01:59:35181// Test that the migrator waits for the data type manager to be idle before
182// starting a migration.
[email protected]b486b462012-02-11 00:11:42183TEST_F(SyncBackendMigratorTest, WaitToStart) {
[email protected]a4a147652012-07-03 23:41:32184 syncer::ModelTypeSet to_migrate;
185 to_migrate.Put(syncer::PREFERENCES);
[email protected]dc556252011-04-20 01:59:35186
187 EXPECT_CALL(*manager(), state())
188 .WillOnce(Return(DataTypeManager::CONFIGURING));
[email protected]b2a3c142011-05-05 03:29:55189 EXPECT_CALL(*manager(), Configure(_, _)).Times(0);
[email protected]1a425fc2011-09-01 23:11:59190 migrator()->MigrateTypes(to_migrate);
191 EXPECT_EQ(BackendMigrator::WAITING_TO_START, migrator()->state());
[email protected]dc556252011-04-20 01:59:35192
193 Mock::VerifyAndClearExpectations(manager());
194 EXPECT_CALL(*manager(), state())
195 .WillOnce(Return(DataTypeManager::CONFIGURED));
[email protected]41b89262012-08-31 22:32:46196 EXPECT_CALL(*manager(),
197 PurgeForMigration(_, syncer::CONFIGURE_REASON_MIGRATION));
[email protected]a4a147652012-07-03 23:41:32198 SetUnsyncedTypes(syncer::ModelTypeSet());
199 SendConfigureDone(DataTypeManager::OK, syncer::ModelTypeSet());
[email protected]dc556252011-04-20 01:59:35200
[email protected]1a425fc2011-09-01 23:11:59201 EXPECT_EQ(BackendMigrator::DISABLING_TYPES, migrator()->state());
[email protected]dc556252011-04-20 01:59:35202}
203
204// Test that the migrator can cope with a migration request while a migration
205// is in progress.
[email protected]b486b462012-02-11 00:11:42206TEST_F(SyncBackendMigratorTest, RestartMigration) {
[email protected]a4a147652012-07-03 23:41:32207 syncer::ModelTypeSet to_migrate1, to_migrate2, to_migrate_union, bookmarks;
208 to_migrate1.Put(syncer::PREFERENCES);
209 to_migrate2.Put(syncer::AUTOFILL);
210 to_migrate_union.Put(syncer::PREFERENCES);
211 to_migrate_union.Put(syncer::AUTOFILL);
212 bookmarks.Put(syncer::BOOKMARKS);
[email protected]dc556252011-04-20 01:59:35213
214 EXPECT_CALL(*manager(), state())
215 .WillOnce(Return(DataTypeManager::CONFIGURED));
[email protected]41b89262012-08-31 22:32:46216 EXPECT_CALL(
217 *manager(),
218 PurgeForMigration(_, syncer::CONFIGURE_REASON_MIGRATION)).Times(2);
[email protected]1a425fc2011-09-01 23:11:59219 migrator()->MigrateTypes(to_migrate1);
[email protected]dc556252011-04-20 01:59:35220
[email protected]1a425fc2011-09-01 23:11:59221 EXPECT_EQ(BackendMigrator::DISABLING_TYPES, migrator()->state());
222 migrator()->MigrateTypes(to_migrate2);
[email protected]dc556252011-04-20 01:59:35223
[email protected]a4a147652012-07-03 23:41:32224 const syncer::ModelTypeSet difference1 =
[email protected]71229fa82011-12-10 01:00:54225 Difference(preferred_types(), to_migrate1);
[email protected]dc556252011-04-20 01:59:35226
227 Mock::VerifyAndClearExpectations(manager());
[email protected]41b89262012-08-31 22:32:46228 EXPECT_CALL(
229 *manager(),
230 PurgeForMigration(_, syncer::CONFIGURE_REASON_MIGRATION)).Times(1);
[email protected]65f173552012-06-28 22:43:58231 EXPECT_CALL(*manager(), Configure(_, syncer::CONFIGURE_REASON_MIGRATION))
[email protected]41b89262012-08-31 22:32:46232 .Times(1);
[email protected]1a425fc2011-09-01 23:11:59233 SetUnsyncedTypes(to_migrate1);
[email protected]dc556252011-04-20 01:59:35234 SendConfigureDone(DataTypeManager::OK, difference1);
[email protected]1a425fc2011-09-01 23:11:59235 EXPECT_EQ(BackendMigrator::DISABLING_TYPES, migrator()->state());
[email protected]dc556252011-04-20 01:59:35236
[email protected]1a425fc2011-09-01 23:11:59237 SetUnsyncedTypes(to_migrate_union);
[email protected]dc556252011-04-20 01:59:35238 SendConfigureDone(DataTypeManager::OK, bookmarks);
[email protected]1a425fc2011-09-01 23:11:59239 EXPECT_EQ(BackendMigrator::REENABLING_TYPES, migrator()->state());
[email protected]dc556252011-04-20 01:59:35240}
241
242// Test that an external invocation of Configure(...) during a migration results
243// in a migration reattempt.
[email protected]b486b462012-02-11 00:11:42244TEST_F(SyncBackendMigratorTest, InterruptedWhileDisablingTypes) {
[email protected]a4a147652012-07-03 23:41:32245 syncer::ModelTypeSet to_migrate;
246 syncer::ModelTypeSet difference;
247 to_migrate.Put(syncer::PREFERENCES);
248 difference.Put(syncer::AUTOFILL);
249 difference.Put(syncer::BOOKMARKS);
[email protected]dc556252011-04-20 01:59:35250
251 EXPECT_CALL(*manager(), state())
252 .WillOnce(Return(DataTypeManager::CONFIGURED));
[email protected]41b89262012-08-31 22:32:46253 EXPECT_CALL(*manager(), PurgeForMigration(HasModelTypes(to_migrate),
[email protected]65f173552012-06-28 22:43:58254 syncer::CONFIGURE_REASON_MIGRATION));
[email protected]1a425fc2011-09-01 23:11:59255 migrator()->MigrateTypes(to_migrate);
256 EXPECT_EQ(BackendMigrator::DISABLING_TYPES, migrator()->state());
[email protected]dc556252011-04-20 01:59:35257
258 Mock::VerifyAndClearExpectations(manager());
[email protected]41b89262012-08-31 22:32:46259 EXPECT_CALL(*manager(), PurgeForMigration(HasModelTypes(to_migrate),
[email protected]65f173552012-06-28 22:43:58260 syncer::CONFIGURE_REASON_MIGRATION));
[email protected]a4a147652012-07-03 23:41:32261 SetUnsyncedTypes(syncer::ModelTypeSet());
[email protected]dc556252011-04-20 01:59:35262 SendConfigureDone(DataTypeManager::OK, preferred_types());
263
[email protected]1a425fc2011-09-01 23:11:59264 EXPECT_EQ(BackendMigrator::DISABLING_TYPES, migrator()->state());
[email protected]dc556252011-04-20 01:59:35265}
266
[email protected]1a425fc2011-09-01 23:11:59267// Test that spurious OnConfigureDone events don't confuse the
268// migrator while it's waiting for disabled types to have been purged
269// from the sync db.
[email protected]b486b462012-02-11 00:11:42270TEST_F(SyncBackendMigratorTest, WaitingForPurge) {
[email protected]a4a147652012-07-03 23:41:32271 syncer::ModelTypeSet to_migrate, difference;
272 to_migrate.Put(syncer::PREFERENCES);
273 to_migrate.Put(syncer::AUTOFILL);
274 difference.Put(syncer::BOOKMARKS);
[email protected]dc556252011-04-20 01:59:35275
276 EXPECT_CALL(*manager(), state())
277 .WillOnce(Return(DataTypeManager::CONFIGURED));
[email protected]41b89262012-08-31 22:32:46278 EXPECT_CALL(
279 *manager(),
280 PurgeForMigration(_, syncer::CONFIGURE_REASON_MIGRATION)).Times(1);
281 EXPECT_CALL(
282 *manager(),
283 Configure(_, syncer::CONFIGURE_REASON_MIGRATION)).Times(1);
[email protected]dc556252011-04-20 01:59:35284
[email protected]1a425fc2011-09-01 23:11:59285 migrator()->MigrateTypes(to_migrate);
286 EXPECT_EQ(BackendMigrator::DISABLING_TYPES, migrator()->state());
287
288 SendConfigureDone(DataTypeManager::OK, difference);
289 EXPECT_EQ(BackendMigrator::DISABLING_TYPES, migrator()->state());
[email protected]dc556252011-04-20 01:59:35290
[email protected]a4a147652012-07-03 23:41:32291 syncer::ModelTypeSet prefs;
292 prefs.Put(syncer::PREFERENCES);
[email protected]1a425fc2011-09-01 23:11:59293 SetUnsyncedTypes(prefs);
294 SendConfigureDone(DataTypeManager::OK, difference);
295 EXPECT_EQ(BackendMigrator::DISABLING_TYPES, migrator()->state());
[email protected]dc556252011-04-20 01:59:35296
[email protected]1a425fc2011-09-01 23:11:59297 SetUnsyncedTypes(to_migrate);
298 SendConfigureDone(DataTypeManager::OK, difference);
299 EXPECT_EQ(BackendMigrator::REENABLING_TYPES, migrator()->state());
[email protected]dc556252011-04-20 01:59:35300}
301
[email protected]b486b462012-02-11 00:11:42302TEST_F(SyncBackendMigratorTest, MigratedTypeDisabledByUserDuringMigration) {
[email protected]a4a147652012-07-03 23:41:32303 syncer::ModelTypeSet to_migrate;
304 to_migrate.Put(syncer::PREFERENCES);
[email protected]dc556252011-04-20 01:59:35305
306 EXPECT_CALL(*manager(), state())
307 .WillOnce(Return(DataTypeManager::CONFIGURED));
[email protected]41b89262012-08-31 22:32:46308 EXPECT_CALL(
309 *manager(),
310 PurgeForMigration(_, syncer::CONFIGURE_REASON_MIGRATION)).Times(1);
311 EXPECT_CALL(
312 *manager(),
313 Configure(_, syncer::CONFIGURE_REASON_MIGRATION)).Times(1);
[email protected]1a425fc2011-09-01 23:11:59314 migrator()->MigrateTypes(to_migrate);
[email protected]dc556252011-04-20 01:59:35315
[email protected]a4a147652012-07-03 23:41:32316 RemovePreferredType(syncer::PREFERENCES);
[email protected]1a425fc2011-09-01 23:11:59317 SetUnsyncedTypes(to_migrate);
[email protected]dc556252011-04-20 01:59:35318 SendConfigureDone(DataTypeManager::OK, preferred_types());
[email protected]1a425fc2011-09-01 23:11:59319 EXPECT_EQ(BackendMigrator::REENABLING_TYPES, migrator()->state());
[email protected]a4a147652012-07-03 23:41:32320 SetUnsyncedTypes(syncer::ModelTypeSet());
[email protected]dc556252011-04-20 01:59:35321 SendConfigureDone(DataTypeManager::OK, preferred_types());
[email protected]1a425fc2011-09-01 23:11:59322 EXPECT_EQ(BackendMigrator::IDLE, migrator()->state());
[email protected]dc556252011-04-20 01:59:35323}
324
[email protected]b486b462012-02-11 00:11:42325TEST_F(SyncBackendMigratorTest, ConfigureFailure) {
[email protected]a4a147652012-07-03 23:41:32326 syncer::ModelTypeSet to_migrate;
327 to_migrate.Put(syncer::PREFERENCES);
[email protected]dc556252011-04-20 01:59:35328
329 EXPECT_CALL(*manager(), state())
330 .WillOnce(Return(DataTypeManager::CONFIGURED));
[email protected]41b89262012-08-31 22:32:46331 EXPECT_CALL(
332 *manager(),
333 PurgeForMigration(_, syncer::CONFIGURE_REASON_MIGRATION)).Times(1);
[email protected]1a425fc2011-09-01 23:11:59334 migrator()->MigrateTypes(to_migrate);
[email protected]a4a147652012-07-03 23:41:32335 SetUnsyncedTypes(syncer::ModelTypeSet());
336 SendConfigureDone(DataTypeManager::ABORTED, syncer::ModelTypeSet());
[email protected]1a425fc2011-09-01 23:11:59337 EXPECT_EQ(BackendMigrator::IDLE, migrator()->state());
[email protected]dc556252011-04-20 01:59:35338}
339
340}; // namespace browser_sync