Index: components/sync/driver/glue/sync_backend_host_impl_unittest.cc |
diff --git a/components/sync/driver/glue/sync_backend_host_impl_unittest.cc b/components/sync/driver/glue/sync_backend_host_impl_unittest.cc |
index 87690485d0862e8a501f4193676d0defb83709c3..21d8d42d380367937db990b2a8df5487792ae1dd 100644 |
--- a/components/sync/driver/glue/sync_backend_host_impl_unittest.cc |
+++ b/components/sync/driver/glue/sync_backend_host_impl_unittest.cc |
@@ -35,7 +35,7 @@ |
#include "components/sync/engine/net/http_bridge_network_resources.h" |
#include "components/sync/engine/net/network_resources.h" |
#include "components/sync/engine/passive_model_worker.h" |
-#include "components/sync/engine/sync_engine_host.h" |
+#include "components/sync/engine/sync_engine_host_stub.h" |
#include "components/sync/engine/sync_manager_factory.h" |
#include "components/sync/test/callback_counter.h" |
#include "components/sync_preferences/pref_service_syncable.h" |
@@ -67,42 +67,29 @@ void EmptyNetworkTimeUpdate(const base::Time&, |
const base::TimeDelta&, |
const base::TimeDelta&) {} |
-void QuitMessageLoop() { |
- base::MessageLoop::current()->QuitWhenIdle(); |
-} |
- |
-class MockSyncEngineHost : public SyncEngineHost { |
+class TestSyncEngineHost : public SyncEngineHostStub { |
public: |
- virtual ~MockSyncEngineHost() {} |
- |
- MOCK_METHOD5(OnEngineInitialized, |
- void(ModelTypeSet initial_types, |
- const WeakHandle<JsBackend>&, |
- const WeakHandle<DataTypeDebugInfoListener>&, |
- const std::string&, |
- bool)); |
- MOCK_METHOD0(OnSyncCycleCompleted, void()); |
- MOCK_METHOD1(OnConnectionStatusChange, void(ConnectionStatus status)); |
- MOCK_METHOD0(OnClearServerDataSucceeded, void()); |
- MOCK_METHOD0(OnClearServerDataFailed, void()); |
- MOCK_METHOD2(OnPassphraseRequired, |
- void(PassphraseRequiredReason, const sync_pb::EncryptedData&)); |
- MOCK_METHOD0(OnPassphraseAccepted, void()); |
- MOCK_METHOD2(OnEncryptedTypesChanged, void(ModelTypeSet, bool)); |
- MOCK_METHOD0(OnEncryptionComplete, void()); |
- MOCK_METHOD1(OnMigrationNeededForTypes, void(ModelTypeSet)); |
- MOCK_METHOD1(OnProtocolEvent, void(const ProtocolEvent&)); |
- MOCK_METHOD2(OnDirectoryTypeCommitCounterUpdated, |
- void(ModelType, const CommitCounters&)); |
- MOCK_METHOD2(OnDirectoryTypeUpdateCounterUpdated, |
- void(ModelType, const UpdateCounters&)); |
- MOCK_METHOD2(OnDatatypeStatusCounterUpdated, |
- void(ModelType, const StatusCounters&)); |
- MOCK_METHOD1(OnExperimentsChanged, void(const Experiments&)); |
- MOCK_METHOD1(OnActionableError, void(const SyncProtocolError& sync_error)); |
- MOCK_METHOD0(OnSyncConfigureRetry, void()); |
- MOCK_METHOD1(OnLocalSetPassphraseEncryption, |
- void(const SyncEncryptionHandler::NigoriState& nigori_state)); |
+ explicit TestSyncEngineHost( |
+ base::Callback<void(ModelTypeSet)> set_engine_types) |
+ : set_engine_types_(set_engine_types) {} |
+ |
+ void OnEngineInitialized(ModelTypeSet initial_types, |
+ const WeakHandle<JsBackend>&, |
+ const WeakHandle<DataTypeDebugInfoListener>&, |
+ const std::string&, |
+ bool success) override { |
+ EXPECT_EQ(expect_success_, success); |
+ set_engine_types_.Run(initial_types); |
+ base::MessageLoop::current()->QuitWhenIdle(); |
+ } |
+ |
+ void SetExpectSuccess(bool expect_success) { |
+ expect_success_ = expect_success; |
+ } |
+ |
+ private: |
+ base::Callback<void(ModelTypeSet)> set_engine_types_; |
+ bool expect_success_ = false; |
}; |
class FakeSyncManagerFactory : public SyncManagerFactory { |
@@ -157,7 +144,10 @@ class BackendSyncClient : public FakeSyncClient { |
class SyncEngineTest : public testing::Test { |
protected: |
SyncEngineTest() |
- : sync_thread_("SyncThreadForTest"), fake_manager_(nullptr) {} |
+ : sync_thread_("SyncThreadForTest"), |
+ host_(base::Bind(&SyncEngineTest::SetEngineTypes, |
+ base::Unretained(this))), |
+ fake_manager_(nullptr) {} |
~SyncEngineTest() override {} |
@@ -206,8 +196,7 @@ class SyncEngineTest : public testing::Test { |
// Synchronously initializes the backend. |
void InitializeBackend(bool expect_success) { |
- EXPECT_CALL(mock_host_, OnEngineInitialized(_, _, _, _, expect_success)) |
- .WillOnce(InvokeWithoutArgs(QuitMessageLoop)); |
+ host_.SetExpectSuccess(expect_success); |
SyncEngine::HttpPostProviderFactoryGetter |
http_post_provider_factory_getter = |
base::Bind(&NetworkResources::GetHttpPostProviderFactory, |
@@ -216,7 +205,7 @@ class SyncEngineTest : public testing::Test { |
SyncEngine::InitParams params; |
params.sync_task_runner = sync_thread_.task_runner(); |
- params.host = &mock_host_; |
+ params.host = &host_; |
params.registrar = base::MakeUnique<SyncBackendRegistrar>( |
std::string(), base::Bind(&SyncClient::CreateModelWorkerForGroup, |
base::Unretained(&sync_client_))); |
@@ -231,55 +220,69 @@ class SyncEngineTest : public testing::Test { |
backend_->Initialize(std::move(params)); |
- base::RunLoop run_loop; |
- base::ThreadTaskRunnerHandle::Get()->PostDelayedTask( |
- FROM_HERE, run_loop.QuitClosure(), TestTimeouts::action_timeout()); |
- run_loop.Run(); |
+ PumpSyncThread(); |
// |fake_manager_factory_|'s fake_manager() is set on the sync |
// thread, but we can rely on the message loop barriers to |
// guarantee that we see the updated value. |
DCHECK(fake_manager_); |
} |
- // Returns DataTypeConfigStateMap with all |enabled_types_| in |
- // CONFIGURE_ACTIVE state and all remaining types DISABLED. |
- ModelTypeConfigurer::DataTypeConfigStateMap ConfigStateMapForEnabledTypes() { |
- ModelTypeConfigurer::DataTypeConfigStateMap config_state_map; |
- ModelTypeConfigurer::SetDataTypesState( |
- ModelTypeConfigurer::CONFIGURE_ACTIVE, enabled_types_, |
- &config_state_map); |
- ModelTypeConfigurer::SetDataTypesState( |
- ModelTypeConfigurer::DISABLED, |
- Difference(ModelTypeSet::All(), enabled_types_), &config_state_map); |
- return config_state_map; |
+ // Synchronously configures the backend's datatypes. |
+ ModelTypeSet ConfigureDataTypes() { |
+ return ConfigureDataTypesWithUnready(ModelTypeSet()); |
} |
- // Synchronously configures the backend's datatypes. |
- ModelTypeSet ConfigureDataTypes( |
- const ModelTypeConfigurer::DataTypeConfigStateMap& config_state_map) { |
- ModelTypeSet ready_types = backend_->ConfigureDataTypes( |
- CONFIGURE_REASON_RECONFIGURATION, config_state_map, |
- base::Bind(&SyncEngineTest::DownloadReady, base::Unretained(this)), |
- base::Bind(&SyncEngineTest::OnDownloadRetry, base::Unretained(this))); |
- base::RunLoop run_loop; |
- base::ThreadTaskRunnerHandle::Get()->PostDelayedTask( |
- FROM_HERE, run_loop.QuitClosure(), TestTimeouts::action_timeout()); |
- run_loop.Run(); |
+ ModelTypeSet ConfigureDataTypesWithUnready(ModelTypeSet unready_types) { |
+ ModelTypeSet disabled_types = |
+ Difference(ModelTypeSet::All(), enabled_types_); |
+ |
+ ModelTypeConfigurer::ConfigureParams params; |
+ params.reason = CONFIGURE_REASON_RECONFIGURATION; |
+ params.enabled_types = Difference(enabled_types_, unready_types); |
+ params.disabled_types = Union(disabled_types, unready_types); |
+ params.to_download = Difference(params.enabled_types, engine_types_); |
+ if (!params.to_download.Empty()) { |
+ params.to_download.Put(NIGORI); |
+ } |
+ params.to_purge = Intersection(engine_types_, disabled_types); |
+ params.ready_task = |
+ base::Bind(&SyncEngineTest::DownloadReady, base::Unretained(this)); |
+ params.retry_callback = |
+ base::Bind(&SyncEngineTest::OnDownloadRetry, base::Unretained(this)); |
+ |
+ ModelTypeSet ready_types = |
+ Difference(params.enabled_types, params.to_download); |
+ backend_->ConfigureDataTypes(std::move(params)); |
+ PumpSyncThread(); |
+ |
return ready_types; |
} |
protected: |
void DownloadReady(ModelTypeSet succeeded_types, ModelTypeSet failed_types) { |
+ engine_types_.PutAll(succeeded_types); |
base::MessageLoop::current()->QuitWhenIdle(); |
} |
void OnDownloadRetry() { NOTIMPLEMENTED(); } |
+ void SetEngineTypes(ModelTypeSet engine_types) { |
+ EXPECT_TRUE(engine_types_.Empty()); |
+ engine_types_ = engine_types; |
+ } |
+ |
+ void PumpSyncThread() { |
+ base::RunLoop run_loop; |
+ base::ThreadTaskRunnerHandle::Get()->PostDelayedTask( |
+ FROM_HERE, run_loop.QuitClosure(), TestTimeouts::action_timeout()); |
+ run_loop.Run(); |
+ } |
+ |
base::MessageLoop message_loop_; |
base::ScopedTempDir temp_dir_; |
sync_preferences::TestingPrefServiceSyncable pref_service_; |
base::Thread sync_thread_; |
- StrictMock<MockSyncEngineHost> mock_host_; |
+ TestSyncEngineHost host_; |
SyncCredentials credentials_; |
BackendSyncClient sync_client_; |
TestUnrecoverableErrorHandler test_unrecoverable_error_handler_; |
@@ -287,6 +290,7 @@ class SyncEngineTest : public testing::Test { |
std::unique_ptr<SyncBackendHostImpl> backend_; |
std::unique_ptr<FakeSyncManagerFactory> fake_manager_factory_; |
FakeSyncManager* fake_manager_; |
+ ModelTypeSet engine_types_; |
ModelTypeSet enabled_types_; |
std::unique_ptr<NetworkResources> network_resources_; |
std::unique_ptr<SyncEncryptionHandler::NigoriState> saved_nigori_state_; |
@@ -313,8 +317,7 @@ TEST_F(SyncEngineTest, FirstTimeSync) { |
fake_manager_->GetTypesWithEmptyProgressMarkerToken(ControlTypes()) |
.Empty()); |
- ModelTypeSet ready_types = |
- ConfigureDataTypes(ConfigStateMapForEnabledTypes()); |
+ ModelTypeSet ready_types = ConfigureDataTypes(); |
// Nigori is always downloaded so won't be ready. |
EXPECT_EQ(Difference(ControlTypes(), ModelTypeSet(NIGORI)), ready_types); |
EXPECT_TRUE(fake_manager_->GetAndResetDownloadedTypes().HasAll( |
@@ -343,8 +346,7 @@ TEST_F(SyncEngineTest, Restart) { |
fake_manager_->GetTypesWithEmptyProgressMarkerToken(enabled_types_) |
.Empty()); |
- ModelTypeSet ready_types = |
- ConfigureDataTypes(ConfigStateMapForEnabledTypes()); |
+ ModelTypeSet ready_types = ConfigureDataTypes(); |
EXPECT_EQ(enabled_types_, ready_types); |
EXPECT_TRUE(fake_manager_->GetAndResetDownloadedTypes().Empty()); |
EXPECT_TRUE( |
@@ -380,8 +382,7 @@ TEST_F(SyncEngineTest, PartialTypes) { |
fake_manager_->GetTypesWithEmptyProgressMarkerToken(enabled_types_)); |
// Now do the actual configuration, which should download and apply bookmarks. |
- ModelTypeSet ready_types = |
- ConfigureDataTypes(ConfigStateMapForEnabledTypes()); |
+ ModelTypeSet ready_types = ConfigureDataTypes(); |
EXPECT_EQ(full_types, ready_types); |
EXPECT_TRUE( |
Intersection(fake_manager_->GetAndResetPurgedTypes(), enabled_types_) |
@@ -414,8 +415,7 @@ TEST_F(SyncEngineTest, LostDB) { |
fake_manager_->GetAndResetPurgedTypes(); |
// The actual configuration should redownload and apply all the enabled types. |
- ModelTypeSet ready_types = |
- ConfigureDataTypes(ConfigStateMapForEnabledTypes()); |
+ ModelTypeSet ready_types = ConfigureDataTypes(); |
// Nigori is always downloaded so won't be ready. |
EXPECT_EQ(Difference(ControlTypes(), ModelTypeSet(NIGORI)), ready_types); |
EXPECT_TRUE(fake_manager_->GetAndResetDownloadedTypes().HasAll( |
@@ -434,8 +434,7 @@ TEST_F(SyncEngineTest, DisableTypes) { |
// Simulate first time sync. |
InitializeBackend(true); |
fake_manager_->GetAndResetPurgedTypes(); |
- ModelTypeSet ready_types = |
- ConfigureDataTypes(ConfigStateMapForEnabledTypes()); |
+ ModelTypeSet ready_types = ConfigureDataTypes(); |
// Nigori is always downloaded so won't be ready. |
EXPECT_EQ(Difference(ControlTypes(), ModelTypeSet(NIGORI)), ready_types); |
EXPECT_EQ(enabled_types_, fake_manager_->GetAndResetDownloadedTypes()); |
@@ -451,7 +450,7 @@ TEST_F(SyncEngineTest, DisableTypes) { |
ModelTypeSet disabled_types(BOOKMARKS, SEARCH_ENGINES); |
ModelTypeSet old_types = enabled_types_; |
enabled_types_.RemoveAll(disabled_types); |
- ready_types = ConfigureDataTypes(ConfigStateMapForEnabledTypes()); |
+ ready_types = ConfigureDataTypes(); |
// Only those datatypes disabled should be cleaned. Nothing should be |
// downloaded. |
@@ -470,8 +469,7 @@ TEST_F(SyncEngineTest, AddTypes) { |
// Simulate first time sync. |
InitializeBackend(true); |
fake_manager_->GetAndResetPurgedTypes(); |
- ModelTypeSet ready_types = |
- ConfigureDataTypes(ConfigStateMapForEnabledTypes()); |
+ ModelTypeSet ready_types = ConfigureDataTypes(); |
// Nigori is always downloaded so won't be ready. |
EXPECT_EQ(Difference(ControlTypes(), ModelTypeSet(NIGORI)), ready_types); |
EXPECT_EQ(enabled_types_, fake_manager_->GetAndResetDownloadedTypes()); |
@@ -486,7 +484,7 @@ TEST_F(SyncEngineTest, AddTypes) { |
// Then add two datatypes. |
ModelTypeSet new_types(EXTENSIONS, APPS); |
enabled_types_.PutAll(new_types); |
- ready_types = ConfigureDataTypes(ConfigStateMapForEnabledTypes()); |
+ ready_types = ConfigureDataTypes(); |
// Only those datatypes added should be downloaded (plus nigori). Nothing |
// should be cleaned aside from the disabled types. |
@@ -508,8 +506,7 @@ TEST_F(SyncEngineTest, AddDisableTypes) { |
// Simulate first time sync. |
InitializeBackend(true); |
fake_manager_->GetAndResetPurgedTypes(); |
- ModelTypeSet ready_types = |
- ConfigureDataTypes(ConfigStateMapForEnabledTypes()); |
+ ModelTypeSet ready_types = ConfigureDataTypes(); |
// Nigori is always downloaded so won't be ready. |
EXPECT_EQ(Difference(ControlTypes(), ModelTypeSet(NIGORI)), ready_types); |
EXPECT_EQ(enabled_types_, fake_manager_->GetAndResetDownloadedTypes()); |
@@ -527,7 +524,7 @@ TEST_F(SyncEngineTest, AddDisableTypes) { |
ModelTypeSet new_types(EXTENSIONS, APPS); |
enabled_types_.PutAll(new_types); |
enabled_types_.RemoveAll(disabled_types); |
- ready_types = ConfigureDataTypes(ConfigStateMapForEnabledTypes()); |
+ ready_types = ConfigureDataTypes(); |
// Only those datatypes added should be downloaded (plus nigori). Nothing |
// should be cleaned aside from the disabled types. |
@@ -564,8 +561,7 @@ TEST_F(SyncEngineTest, NewlySupportedTypes) { |
enabled_types_)); |
// Downloads and applies the new types (plus nigori). |
- ModelTypeSet ready_types = |
- ConfigureDataTypes(ConfigStateMapForEnabledTypes()); |
+ ModelTypeSet ready_types = ConfigureDataTypes(); |
new_types.Put(NIGORI); |
EXPECT_EQ(Difference(old_types, ModelTypeSet(NIGORI)), ready_types); |
@@ -608,8 +604,7 @@ TEST_F(SyncEngineTest, NewlySupportedTypesWithPartialTypes) { |
// Downloads and applies the new types and partial types (which includes |
// nigori anyways). |
- ModelTypeSet ready_types = |
- ConfigureDataTypes(ConfigStateMapForEnabledTypes()); |
+ ModelTypeSet ready_types = ConfigureDataTypes(); |
EXPECT_EQ(full_types, ready_types); |
EXPECT_EQ(Union(new_types, partial_types), |
fake_manager_->GetAndResetDownloadedTypes()); |
@@ -716,25 +711,20 @@ TEST_F(SyncEngineTest, DisableThenPurgeType) { |
InitializeBackend(true); |
// First enable the types. |
- ModelTypeSet ready_types = |
- ConfigureDataTypes(ConfigStateMapForEnabledTypes()); |
+ ModelTypeSet ready_types = ConfigureDataTypes(); |
// Nigori is always downloaded so won't be ready. |
EXPECT_EQ(Difference(ControlTypes(), ModelTypeSet(NIGORI)), ready_types); |
// Then mark the error types as unready (disables without purging). |
- ModelTypeConfigurer::DataTypeConfigStateMap config_state_map = |
- ConfigStateMapForEnabledTypes(); |
- ModelTypeConfigurer::SetDataTypesState(ModelTypeConfigurer::UNREADY, |
- error_types, &config_state_map); |
- ready_types = ConfigureDataTypes(config_state_map); |
+ ready_types = ConfigureDataTypesWithUnready(error_types); |
EXPECT_EQ(Difference(enabled_types_, error_types), ready_types); |
EXPECT_TRUE( |
fake_manager_->GetTypesWithEmptyProgressMarkerToken(error_types).Empty()); |
// Lastly explicitly disable the error types, which should result in a purge. |
enabled_types_.RemoveAll(error_types); |
- ready_types = ConfigureDataTypes(ConfigStateMapForEnabledTypes()); |
+ ready_types = ConfigureDataTypes(); |
EXPECT_EQ(Difference(enabled_types_, error_types), ready_types); |
EXPECT_FALSE( |
fake_manager_->GetTypesWithEmptyProgressMarkerToken(error_types).Empty()); |
@@ -823,36 +813,6 @@ TEST_F(SyncEngineTest, ModelTypeConnectorValidDuringShutdown) { |
backend_.reset(); |
} |
-// Ensure that types in CONFIGURE_CLEAN state are unapplied. |
-TEST_F(SyncEngineTest, ConfigureCelanTypesAreUnapplied) { |
- ModelTypeSet clean_types(AUTOFILL); |
- |
- InitializeBackend(true); |
- |
- // First enable the types. |
- ModelTypeSet ready_types = |
- ConfigureDataTypes(ConfigStateMapForEnabledTypes()); |
- EXPECT_TRUE( |
- fake_manager_->GetTypesWithEmptyProgressMarkerToken(clean_types).Empty()); |
- |
- // Then unapply AUTOFILL. |
- ModelTypeConfigurer::DataTypeConfigStateMap config_state_map = |
- ConfigStateMapForEnabledTypes(); |
- ModelTypeConfigurer::SetDataTypesState(ModelTypeConfigurer::CONFIGURE_CLEAN, |
- clean_types, &config_state_map); |
- |
- ready_types = ConfigureDataTypes(config_state_map); |
- |
- // Autofill should be unapplied as part of PurgeDisabledTypes, but should |
- // retain progress markers. |
- ModelTypeSet purged_types = fake_manager_->GetAndResetPurgedTypes(); |
- ModelTypeSet unapplied_types = fake_manager_->GetAndResetUnappliedTypes(); |
- EXPECT_EQ(unapplied_types, clean_types); |
- EXPECT_TRUE(purged_types.HasAll(clean_types)); |
- EXPECT_TRUE( |
- fake_manager_->GetTypesWithEmptyProgressMarkerToken(clean_types).Empty()); |
-} |
- |
} // namespace |
} // namespace syncer |