| Index: chrome/browser/sync/backend_migrator_unittest.cc
|
| diff --git a/chrome/browser/sync/backend_migrator_unittest.cc b/chrome/browser/sync/backend_migrator_unittest.cc
|
| index 94983926a234e55f0929e13dc916010b71a8ff27..0ea877adc49e1eb7d4f65e66465bf0872921f3d9 100644
|
| --- a/chrome/browser/sync/backend_migrator_unittest.cc
|
| +++ b/chrome/browser/sync/backend_migrator_unittest.cc
|
| @@ -4,6 +4,7 @@
|
|
|
| #include "chrome/browser/sync/backend_migrator.h"
|
|
|
| +#include "base/message_loop.h"
|
| #include "chrome/browser/sync/glue/data_type_manager_mock.h"
|
| #include "chrome/browser/sync/profile_sync_service_mock.h"
|
| #include "chrome/browser/sync/sessions/session_state.h"
|
| @@ -40,30 +41,12 @@ class BackendMigratorTest : public testing::Test {
|
| WillByDefault(SetArgumentPointee<0>(preferred_types_));
|
| }
|
|
|
| - void ReturnEmptyProgressMarkersInSnapshot() {
|
| - ReturnNonEmptyProgressMarkersInSnapshot(syncable::ModelTypeSet());
|
| - }
|
| -
|
| - void ReturnNonEmptyProgressMarkersInSnapshot(
|
| - const syncable::ModelTypeSet& for_types) {
|
| - std::string download_progress_markers[syncable::MODEL_TYPE_COUNT];
|
| - for (syncable::ModelTypeSet::const_iterator it = for_types.begin();
|
| - it != for_types.end(); ++it) {
|
| - download_progress_markers[*it] = "foobar";
|
| - }
|
| -
|
| - snap_.reset(new SyncSessionSnapshot(SyncerStatus(), ErrorCounters(),
|
| - 0, false, syncable::ModelTypeBitSet(), download_progress_markers,
|
| - false, false, 0, 0, 0, false, sessions::SyncSourceInfo(), 0,
|
| - base::Time::Now()));
|
| - EXPECT_CALL(service_, GetLastSessionSnapshot())
|
| - .WillOnce(Return(snap_.get()));
|
| - }
|
| -
|
| void SendConfigureDone(DataTypeManager::ConfigureStatus status,
|
| - const syncable::ModelTypeSet& types) {
|
| + const syncable::ModelTypeSet& requested_types,
|
| + const syncable::ModelTypeSet& purged_types) {
|
| if (status == DataTypeManager::OK) {
|
| - DataTypeManager::ConfigureResult result(status, types);
|
| + DataTypeManager::ConfigureResult result(
|
| + status, requested_types, purged_types);
|
| NotificationService::current()->Notify(
|
| chrome::NOTIFICATION_SYNC_CONFIGURE_DONE,
|
| Source<DataTypeManager>(&manager_),
|
| @@ -71,7 +54,8 @@ class BackendMigratorTest : public testing::Test {
|
| } else {
|
| DataTypeManager::ConfigureResult result(
|
| status,
|
| - types,
|
| + requested_types,
|
| + purged_types,
|
| syncable::ModelTypeSet(),
|
| FROM_HERE);
|
| NotificationService::current()->Notify(
|
| @@ -79,6 +63,7 @@ class BackendMigratorTest : public testing::Test {
|
| Source<DataTypeManager>(&manager_),
|
| Details<const DataTypeManager::ConfigureResult>(&result));
|
| }
|
| + message_loop_.RunAllPending();
|
| }
|
|
|
| ProfileSyncService* service() { return &service_; }
|
| @@ -92,15 +77,27 @@ class BackendMigratorTest : public testing::Test {
|
| }
|
| private:
|
| scoped_ptr<SyncSessionSnapshot> snap_;
|
| + MessageLoop message_loop_;
|
| syncable::ModelTypeSet preferred_types_;
|
| NiceMock<ProfileSyncServiceMock> service_;
|
| NiceMock<DataTypeManagerMock> manager_;
|
| };
|
|
|
| +class MockMigrationObserver : public MigrationObserver {
|
| + public:
|
| + virtual ~MockMigrationObserver() {}
|
| +
|
| + MOCK_METHOD0(OnMigrationStateChange, void());
|
| +};
|
| +
|
| // Test that in the normal case a migration does transition through each state
|
| // and wind up back in IDLE.
|
| TEST_F(BackendMigratorTest, Sanity) {
|
| - BackendMigrator migrator(service(), manager());
|
| + BackendMigrator migrator("Profile0", service(), manager());
|
| + MockMigrationObserver migration_observer;
|
| + migrator.AddMigrationObserver(&migration_observer);
|
| + EXPECT_CALL(migration_observer, OnMigrationStateChange()).Times(4);
|
| +
|
| syncable::ModelTypeSet to_migrate, difference;
|
| to_migrate.insert(syncable::PREFERENCES);
|
| difference.insert(syncable::AUTOFILL);
|
| @@ -108,28 +105,26 @@ TEST_F(BackendMigratorTest, Sanity) {
|
|
|
| EXPECT_CALL(*manager(), state())
|
| .WillOnce(Return(DataTypeManager::CONFIGURED));
|
| - EXPECT_CALL(*manager(), Configure(_, sync_api::CONFIGURE_REASON_MIGRATION));
|
| + EXPECT_CALL(*manager(), Configure(_, sync_api::CONFIGURE_REASON_MIGRATION))
|
| + .Times(2);
|
|
|
| migrator.MigrateTypes(to_migrate);
|
| EXPECT_EQ(BackendMigrator::DISABLING_TYPES, migrator.state());
|
|
|
| - SendConfigureDone(DataTypeManager::OK, difference);
|
| - EXPECT_EQ(BackendMigrator::WAITING_FOR_PURGE, migrator.state());
|
| -
|
| - ReturnEmptyProgressMarkersInSnapshot();
|
| - EXPECT_CALL(*manager(), Configure(preferred_types(),
|
| - sync_api::CONFIGURE_REASON_MIGRATION));
|
| - migrator.OnStateChanged();
|
| + SendConfigureDone(DataTypeManager::OK, difference, to_migrate);
|
| EXPECT_EQ(BackendMigrator::REENABLING_TYPES, migrator.state());
|
|
|
| - SendConfigureDone(DataTypeManager::OK, preferred_types());
|
| + SendConfigureDone(DataTypeManager::OK, preferred_types(),
|
| + syncable::ModelTypeSet());
|
| EXPECT_EQ(BackendMigrator::IDLE, migrator.state());
|
| +
|
| + migrator.RemoveMigrationObserver(&migration_observer);
|
| }
|
|
|
| // Test that in the normal case with Nigori a migration transitions through
|
| // each state and wind up back in IDLE.
|
| TEST_F(BackendMigratorTest, MigrateNigori) {
|
| - BackendMigrator migrator(service(), manager());
|
| + BackendMigrator migrator("Profile0", service(), manager());
|
| syncable::ModelTypeSet to_migrate, difference;
|
| to_migrate.insert(syncable::NIGORI);
|
| difference.insert(syncable::AUTOFILL);
|
| @@ -144,16 +139,11 @@ TEST_F(BackendMigratorTest, MigrateNigori) {
|
| migrator.MigrateTypes(to_migrate);
|
| EXPECT_EQ(BackendMigrator::DISABLING_TYPES, migrator.state());
|
|
|
| - SendConfigureDone(DataTypeManager::OK, difference);
|
| - EXPECT_EQ(BackendMigrator::WAITING_FOR_PURGE, migrator.state());
|
| -
|
| - ReturnEmptyProgressMarkersInSnapshot();
|
| - EXPECT_CALL(*manager(), Configure(preferred_types(),
|
| - sync_api::CONFIGURE_REASON_MIGRATION));
|
| - migrator.OnStateChanged();
|
| + SendConfigureDone(DataTypeManager::OK, difference, to_migrate);
|
| EXPECT_EQ(BackendMigrator::REENABLING_TYPES, migrator.state());
|
|
|
| - SendConfigureDone(DataTypeManager::OK, preferred_types());
|
| + SendConfigureDone(DataTypeManager::OK, preferred_types(),
|
| + syncable::ModelTypeSet());
|
| EXPECT_EQ(BackendMigrator::IDLE, migrator.state());
|
| }
|
|
|
| @@ -161,7 +151,7 @@ TEST_F(BackendMigratorTest, MigrateNigori) {
|
| // Test that the migrator waits for the data type manager to be idle before
|
| // starting a migration.
|
| TEST_F(BackendMigratorTest, WaitToStart) {
|
| - BackendMigrator migrator(service(), manager());
|
| + BackendMigrator migrator("Profile0", service(), manager());
|
| syncable::ModelTypeSet to_migrate;
|
| to_migrate.insert(syncable::PREFERENCES);
|
|
|
| @@ -175,7 +165,8 @@ TEST_F(BackendMigratorTest, WaitToStart) {
|
| EXPECT_CALL(*manager(), state())
|
| .WillOnce(Return(DataTypeManager::CONFIGURED));
|
| EXPECT_CALL(*manager(), Configure(_, sync_api::CONFIGURE_REASON_MIGRATION));
|
| - SendConfigureDone(DataTypeManager::OK, syncable::ModelTypeSet());
|
| + SendConfigureDone(DataTypeManager::OK, syncable::ModelTypeSet(),
|
| + syncable::ModelTypeSet());
|
|
|
| EXPECT_EQ(BackendMigrator::DISABLING_TYPES, migrator.state());
|
| }
|
| @@ -183,16 +174,18 @@ TEST_F(BackendMigratorTest, WaitToStart) {
|
| // Test that the migrator can cope with a migration request while a migration
|
| // is in progress.
|
| TEST_F(BackendMigratorTest, RestartMigration) {
|
| - BackendMigrator migrator(service(), manager());
|
| - syncable::ModelTypeSet to_migrate1, to_migrate2, bookmarks;
|
| + BackendMigrator migrator("Profile0", service(), manager());
|
| + syncable::ModelTypeSet to_migrate1, to_migrate2, to_migrate_union, bookmarks;
|
| to_migrate1.insert(syncable::PREFERENCES);
|
| to_migrate2.insert(syncable::AUTOFILL);
|
| + to_migrate_union.insert(syncable::PREFERENCES);
|
| + to_migrate_union.insert(syncable::AUTOFILL);
|
| bookmarks.insert(syncable::BOOKMARKS);
|
|
|
| EXPECT_CALL(*manager(), state())
|
| .WillOnce(Return(DataTypeManager::CONFIGURED));
|
| EXPECT_CALL(*manager(), Configure(_, sync_api::CONFIGURE_REASON_MIGRATION))
|
| - .Times(1);
|
| + .Times(2);
|
| migrator.MigrateTypes(to_migrate1);
|
|
|
| EXPECT_EQ(BackendMigrator::DISABLING_TYPES, migrator.state());
|
| @@ -204,21 +197,19 @@ TEST_F(BackendMigratorTest, RestartMigration) {
|
| std::inserter(difference1, difference1.end()));
|
|
|
| Mock::VerifyAndClearExpectations(manager());
|
| - EXPECT_CALL(*manager(), state())
|
| - .WillOnce(Return(DataTypeManager::CONFIGURED));
|
| - EXPECT_CALL(*manager(), Configure(bookmarks,
|
| - sync_api::CONFIGURE_REASON_MIGRATION));
|
| - SendConfigureDone(DataTypeManager::OK, difference1);
|
| + EXPECT_CALL(*manager(), Configure(_, sync_api::CONFIGURE_REASON_MIGRATION))
|
| + .Times(2);
|
| + SendConfigureDone(DataTypeManager::OK, difference1, to_migrate1);
|
| EXPECT_EQ(BackendMigrator::DISABLING_TYPES, migrator.state());
|
|
|
| - SendConfigureDone(DataTypeManager::OK, bookmarks);
|
| - EXPECT_EQ(BackendMigrator::WAITING_FOR_PURGE, migrator.state());
|
| + SendConfigureDone(DataTypeManager::OK, bookmarks, to_migrate_union);
|
| + EXPECT_EQ(BackendMigrator::REENABLING_TYPES, migrator.state());
|
| }
|
|
|
| // Test that an external invocation of Configure(...) during a migration results
|
| // in a migration reattempt.
|
| TEST_F(BackendMigratorTest, InterruptedWhileDisablingTypes) {
|
| - BackendMigrator migrator(service(), manager());
|
| + BackendMigrator migrator("Profile0", service(), manager());
|
| syncable::ModelTypeSet to_migrate;
|
| syncable::ModelTypeSet difference;
|
| to_migrate.insert(syncable::PREFERENCES);
|
| @@ -233,19 +224,19 @@ TEST_F(BackendMigratorTest, InterruptedWhileDisablingTypes) {
|
| EXPECT_EQ(BackendMigrator::DISABLING_TYPES, migrator.state());
|
|
|
| Mock::VerifyAndClearExpectations(manager());
|
| - EXPECT_CALL(*manager(), state())
|
| - .WillOnce(Return(DataTypeManager::CONFIGURED));
|
| EXPECT_CALL(*manager(), Configure(difference,
|
| sync_api::CONFIGURE_REASON_MIGRATION));
|
| - SendConfigureDone(DataTypeManager::OK, preferred_types());
|
| + SendConfigureDone(DataTypeManager::OK, preferred_types(),
|
| + syncable::ModelTypeSet());
|
|
|
| EXPECT_EQ(BackendMigrator::DISABLING_TYPES, migrator.state());
|
| }
|
|
|
| -// Test that spurious OnStateChanged events don't confuse the migrator while
|
| -// it's waiting for disabled types to have been purged from the sync db.
|
| +// Test that spurious OnConfigureDone events don't confuse the
|
| +// migrator while it's waiting for disabled types to have been purged
|
| +// from the sync db.
|
| TEST_F(BackendMigratorTest, WaitingForPurge) {
|
| - BackendMigrator migrator(service(), manager());
|
| + BackendMigrator migrator("Profile0", service(), manager());
|
| syncable::ModelTypeSet to_migrate, difference;
|
| to_migrate.insert(syncable::PREFERENCES);
|
| to_migrate.insert(syncable::AUTOFILL);
|
| @@ -253,57 +244,45 @@ TEST_F(BackendMigratorTest, WaitingForPurge) {
|
|
|
| EXPECT_CALL(*manager(), state())
|
| .WillOnce(Return(DataTypeManager::CONFIGURED));
|
| - EXPECT_CALL(*manager(), Configure(_, sync_api::CONFIGURE_REASON_MIGRATION));
|
| + EXPECT_CALL(*manager(), Configure(_, sync_api::CONFIGURE_REASON_MIGRATION))
|
| + .Times(2);
|
| +
|
| migrator.MigrateTypes(to_migrate);
|
| - SendConfigureDone(DataTypeManager::OK, difference);
|
| - EXPECT_EQ(BackendMigrator::WAITING_FOR_PURGE, migrator.state());
|
| + EXPECT_EQ(BackendMigrator::DISABLING_TYPES, migrator.state());
|
|
|
| - ReturnNonEmptyProgressMarkersInSnapshot(to_migrate);
|
| - migrator.OnStateChanged();
|
| - EXPECT_EQ(BackendMigrator::WAITING_FOR_PURGE, migrator.state());
|
| + SendConfigureDone(DataTypeManager::OK, difference, syncable::ModelTypeSet());
|
| + EXPECT_EQ(BackendMigrator::DISABLING_TYPES, migrator.state());
|
|
|
| syncable::ModelTypeSet prefs;
|
| prefs.insert(syncable::PREFERENCES);
|
| - ReturnNonEmptyProgressMarkersInSnapshot(prefs);
|
| - migrator.OnStateChanged();
|
| - EXPECT_EQ(BackendMigrator::WAITING_FOR_PURGE, migrator.state());
|
| + SendConfigureDone(DataTypeManager::OK, difference, prefs);
|
| + EXPECT_EQ(BackendMigrator::DISABLING_TYPES, migrator.state());
|
|
|
| - syncable::ModelTypeSet bookmarks;
|
| - bookmarks.insert(syncable::BOOKMARKS);
|
| - ReturnNonEmptyProgressMarkersInSnapshot(bookmarks);
|
| - EXPECT_CALL(*manager(), Configure(preferred_types(),
|
| - sync_api::CONFIGURE_REASON_MIGRATION));
|
| - migrator.OnStateChanged();
|
| + SendConfigureDone(DataTypeManager::OK, difference, to_migrate);
|
| EXPECT_EQ(BackendMigrator::REENABLING_TYPES, migrator.state());
|
| }
|
|
|
| TEST_F(BackendMigratorTest, MigratedTypeDisabledByUserDuringMigration) {
|
| - BackendMigrator migrator(service(), manager());
|
| + BackendMigrator migrator("Profile0", service(), manager());
|
| syncable::ModelTypeSet to_migrate;
|
| to_migrate.insert(syncable::PREFERENCES);
|
|
|
| EXPECT_CALL(*manager(), state())
|
| .WillOnce(Return(DataTypeManager::CONFIGURED));
|
| - EXPECT_CALL(*manager(), Configure(_, sync_api::CONFIGURE_REASON_MIGRATION));
|
| + EXPECT_CALL(*manager(), Configure(_, sync_api::CONFIGURE_REASON_MIGRATION))
|
| + .Times(2);
|
| migrator.MigrateTypes(to_migrate);
|
|
|
| RemovePreferredType(syncable::PREFERENCES);
|
| - SendConfigureDone(DataTypeManager::OK, preferred_types());
|
| - EXPECT_EQ(BackendMigrator::WAITING_FOR_PURGE, migrator.state());
|
| -
|
| - Mock::VerifyAndClearExpectations(manager());
|
| - ReturnEmptyProgressMarkersInSnapshot();
|
| - EXPECT_CALL(*manager(), Configure(preferred_types(),
|
| - sync_api::CONFIGURE_REASON_MIGRATION));
|
| - migrator.OnStateChanged();
|
| -
|
| + SendConfigureDone(DataTypeManager::OK, preferred_types(), to_migrate);
|
| EXPECT_EQ(BackendMigrator::REENABLING_TYPES, migrator.state());
|
| - SendConfigureDone(DataTypeManager::OK, preferred_types());
|
| + SendConfigureDone(DataTypeManager::OK, preferred_types(),
|
| + syncable::ModelTypeSet());
|
| EXPECT_EQ(BackendMigrator::IDLE, migrator.state());
|
| }
|
|
|
| TEST_F(BackendMigratorTest, ConfigureFailure) {
|
| - BackendMigrator migrator(service(), manager());
|
| + BackendMigrator migrator("Profile0", service(), manager());
|
| syncable::ModelTypeSet to_migrate;
|
| to_migrate.insert(syncable::PREFERENCES);
|
|
|
| @@ -312,7 +291,8 @@ TEST_F(BackendMigratorTest, ConfigureFailure) {
|
| EXPECT_CALL(*manager(), Configure(_, sync_api::CONFIGURE_REASON_MIGRATION))
|
| .Times(1);
|
| migrator.MigrateTypes(to_migrate);
|
| - SendConfigureDone(DataTypeManager::ABORTED, syncable::ModelTypeSet());
|
| + SendConfigureDone(DataTypeManager::ABORTED, syncable::ModelTypeSet(),
|
| + syncable::ModelTypeSet());
|
| EXPECT_EQ(BackendMigrator::IDLE, migrator.state());
|
| }
|
|
|
|
|