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

Unified Diff: components/sync_driver/glue/sync_backend_registrar_unittest.cc

Issue 2203673002: [Sync] Move //components/sync_driver to //components/sync/driver. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@sd-a
Patch Set: Full change rebased on static lib. Created 4 years, 4 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 side-by-side diff with in-line comments
Download patch
Index: components/sync_driver/glue/sync_backend_registrar_unittest.cc
diff --git a/components/sync_driver/glue/sync_backend_registrar_unittest.cc b/components/sync_driver/glue/sync_backend_registrar_unittest.cc
deleted file mode 100644
index 82ec5f24895d854b980ee9891c7f899b31164e41..0000000000000000000000000000000000000000
--- a/components/sync_driver/glue/sync_backend_registrar_unittest.cc
+++ /dev/null
@@ -1,469 +0,0 @@
-// Copyright 2012 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "components/sync_driver/glue/sync_backend_registrar.h"
-
-#include "base/location.h"
-#include "base/run_loop.h"
-#include "base/single_thread_task_runner.h"
-#include "components/sync/base/model_type.h"
-#include "components/sync/core/test/test_user_share.h"
-#include "components/sync/engine/passive_model_worker.h"
-#include "components/sync_driver/change_processor_mock.h"
-#include "components/sync_driver/fake_sync_client.h"
-#include "components/sync_driver/glue/browser_thread_model_worker.h"
-#include "components/sync_driver/sync_api_component_factory_mock.h"
-#include "testing/gmock/include/gmock/gmock.h"
-#include "testing/gtest/include/gtest/gtest.h"
-
-namespace browser_sync {
-
-namespace {
-
-using ::testing::_;
-using ::testing::InSequence;
-using ::testing::Return;
-using ::testing::StrictMock;
-using syncer::FIRST_REAL_MODEL_TYPE;
-using syncer::AUTOFILL;
-using syncer::BOOKMARKS;
-using syncer::PREFERENCES;
-using syncer::THEMES;
-using syncer::NIGORI;
-using syncer::PASSWORDS;
-using syncer::MODEL_TYPE_COUNT;
-using syncer::ModelTypeSet;
-using syncer::ModelType;
-using syncer::ModelTypeFromInt;
-
-void TriggerChanges(SyncBackendRegistrar* registrar, ModelType type) {
- registrar->OnChangesApplied(type, 0, NULL,
- syncer::ImmutableChangeRecordList());
- registrar->OnChangesComplete(type);
-}
-
-class RegistrarSyncClient : public sync_driver::FakeSyncClient {
- public:
- RegistrarSyncClient(
- const scoped_refptr<base::SingleThreadTaskRunner>& ui_task_runner,
- const scoped_refptr<base::SingleThreadTaskRunner>& db_task_runner,
- const scoped_refptr<base::SingleThreadTaskRunner>& file_task_runner)
- : ui_task_runner_(ui_task_runner),
- db_task_runner_(db_task_runner),
- file_task_runner_(file_task_runner) {}
-
- scoped_refptr<syncer::ModelSafeWorker> CreateModelWorkerForGroup(
- syncer::ModelSafeGroup group,
- syncer::WorkerLoopDestructionObserver* observer) override {
- switch (group) {
- case syncer::GROUP_UI:
- return new BrowserThreadModelWorker(ui_task_runner_, group, observer);
- case syncer::GROUP_DB:
- return new BrowserThreadModelWorker(db_task_runner_, group, observer);
- case syncer::GROUP_FILE:
- return new BrowserThreadModelWorker(file_task_runner_, group, observer);
- case syncer::GROUP_PASSIVE:
- return new syncer::PassiveModelWorker(observer);
- default:
- return nullptr;
- }
- }
-
- private:
- const scoped_refptr<base::SingleThreadTaskRunner> ui_task_runner_;
- const scoped_refptr<base::SingleThreadTaskRunner> db_task_runner_;
- const scoped_refptr<base::SingleThreadTaskRunner> file_task_runner_;
-};
-
-// Flaky: https://crbug.com/498238
-class SyncBackendRegistrarTest : public testing::Test {
- public:
- void TestNonUIDataTypeActivationAsync(sync_driver::ChangeProcessor* processor,
- base::WaitableEvent* done) {
- registrar_->ActivateDataType(AUTOFILL,
- syncer::GROUP_DB,
- processor,
- test_user_share_.user_share());
- syncer::ModelSafeRoutingInfo expected_routing_info;
- expected_routing_info[AUTOFILL] = syncer::GROUP_DB;
- ExpectRoutingInfo(registrar_.get(), expected_routing_info);
- ExpectHasProcessorsForTypes(*registrar_, ModelTypeSet(AUTOFILL));
- TriggerChanges(registrar_.get(), AUTOFILL);
- done->Signal();
- }
-
- protected:
- SyncBackendRegistrarTest()
- : db_thread_("DBThreadForTest"),
- file_thread_("FileThreadForTest"),
- sync_thread_(NULL) {}
-
- ~SyncBackendRegistrarTest() override {}
-
- void SetUp() override {
- db_thread_.StartAndWaitForTesting();
- file_thread_.StartAndWaitForTesting();
- test_user_share_.SetUp();
- sync_client_.reset(new RegistrarSyncClient(
- ui_task_runner(), db_task_runner(), file_task_runner()));
- registrar_.reset(new SyncBackendRegistrar(
- "test", sync_client_.get(), std::unique_ptr<base::Thread>(),
- ui_task_runner(), db_task_runner(), file_task_runner()));
- sync_thread_ = registrar_->sync_thread();
- }
-
- void TearDown() override {
- registrar_->RequestWorkerStopOnUIThread();
- test_user_share_.TearDown();
- sync_thread_->task_runner()->PostTask(
- FROM_HERE, base::Bind(&SyncBackendRegistrar::Shutdown,
- base::Unretained(registrar_.release())));
- sync_thread_->WaitUntilThreadStarted();
- base::RunLoop().RunUntilIdle();
- }
-
- void ExpectRoutingInfo(
- SyncBackendRegistrar* registrar,
- const syncer::ModelSafeRoutingInfo& expected_routing_info) {
- syncer::ModelSafeRoutingInfo routing_info;
- registrar->GetModelSafeRoutingInfo(&routing_info);
- EXPECT_EQ(expected_routing_info, routing_info);
- }
-
- void ExpectHasProcessorsForTypes(const SyncBackendRegistrar& registrar,
- ModelTypeSet types) {
- for (int i = FIRST_REAL_MODEL_TYPE; i < MODEL_TYPE_COUNT; ++i) {
- ModelType model_type = ModelTypeFromInt(i);
- EXPECT_EQ(types.Has(model_type),
- registrar_->IsTypeActivatedForTest(model_type));
- }
- }
-
- const scoped_refptr<base::SingleThreadTaskRunner> ui_task_runner() {
- return message_loop_.task_runner();
- }
-
- const scoped_refptr<base::SingleThreadTaskRunner> db_task_runner() {
- return db_thread_.task_runner();
- }
-
- const scoped_refptr<base::SingleThreadTaskRunner> file_task_runner() {
- return db_thread_.task_runner();
- }
-
- base::MessageLoop message_loop_;
- base::Thread db_thread_;
- base::Thread file_thread_;
-
- syncer::TestUserShare test_user_share_;
- std::unique_ptr<RegistrarSyncClient> sync_client_;
- std::unique_ptr<SyncBackendRegistrar> registrar_;
-
- base::Thread* sync_thread_;
-};
-
-TEST_F(SyncBackendRegistrarTest, ConstructorEmpty) {
- registrar_->SetInitialTypes(ModelTypeSet());
- EXPECT_FALSE(registrar_->IsNigoriEnabled());
- {
- std::vector<scoped_refptr<syncer::ModelSafeWorker> > workers;
- registrar_->GetWorkers(&workers);
- EXPECT_EQ(4u, workers.size());
- }
- ExpectRoutingInfo(registrar_.get(), syncer::ModelSafeRoutingInfo());
- ExpectHasProcessorsForTypes(*registrar_, ModelTypeSet());
-}
-
-TEST_F(SyncBackendRegistrarTest, ConstructorNonEmpty) {
- const ModelTypeSet initial_types(BOOKMARKS, NIGORI, PASSWORDS);
- registrar_->RegisterNonBlockingType(BOOKMARKS);
- registrar_->SetInitialTypes(initial_types);
- EXPECT_TRUE(registrar_->IsNigoriEnabled());
- {
- std::vector<scoped_refptr<syncer::ModelSafeWorker> > workers;
- registrar_->GetWorkers(&workers);
- EXPECT_EQ(4u, workers.size());
- }
- {
- syncer::ModelSafeRoutingInfo expected_routing_info;
- expected_routing_info[BOOKMARKS] = syncer::GROUP_NON_BLOCKING;
- expected_routing_info[NIGORI] = syncer::GROUP_PASSIVE;
- // Passwords dropped because of no password store.
- ExpectRoutingInfo(registrar_.get(), expected_routing_info);
- }
- ExpectHasProcessorsForTypes(*registrar_, ModelTypeSet());
-}
-
-TEST_F(SyncBackendRegistrarTest, ConfigureDataTypes) {
- registrar_->RegisterNonBlockingType(BOOKMARKS);
- registrar_->SetInitialTypes(ModelTypeSet());
-
- // Add.
- const ModelTypeSet types1(BOOKMARKS, NIGORI, AUTOFILL);
- EXPECT_EQ(types1, registrar_->ConfigureDataTypes(types1, ModelTypeSet()));
- {
- syncer::ModelSafeRoutingInfo expected_routing_info;
- expected_routing_info[BOOKMARKS] = syncer::GROUP_NON_BLOCKING;
- expected_routing_info[NIGORI] = syncer::GROUP_PASSIVE;
- expected_routing_info[AUTOFILL] = syncer::GROUP_PASSIVE;
- ExpectRoutingInfo(registrar_.get(), expected_routing_info);
- }
- ExpectHasProcessorsForTypes(*registrar_, ModelTypeSet());
- EXPECT_EQ(types1, registrar_->GetLastConfiguredTypes());
-
- // Add and remove.
- const ModelTypeSet types2(PREFERENCES, THEMES);
- EXPECT_EQ(types2, registrar_->ConfigureDataTypes(types2, types1));
- {
- syncer::ModelSafeRoutingInfo expected_routing_info;
- expected_routing_info[PREFERENCES] = syncer::GROUP_PASSIVE;
- expected_routing_info[THEMES] = syncer::GROUP_PASSIVE;
- ExpectRoutingInfo(registrar_.get(), expected_routing_info);
- }
- ExpectHasProcessorsForTypes(*registrar_, ModelTypeSet());
- EXPECT_EQ(types2, registrar_->GetLastConfiguredTypes());
-
- // Remove.
- EXPECT_TRUE(registrar_->ConfigureDataTypes(ModelTypeSet(), types2).Empty());
- ExpectRoutingInfo(registrar_.get(), syncer::ModelSafeRoutingInfo());
- ExpectHasProcessorsForTypes(*registrar_, ModelTypeSet());
- EXPECT_EQ(ModelTypeSet(), registrar_->GetLastConfiguredTypes());
-}
-
-TEST_F(SyncBackendRegistrarTest, ActivateDeactivateUIDataType) {
- InSequence in_sequence;
- registrar_->SetInitialTypes(ModelTypeSet());
-
- // Should do nothing.
- TriggerChanges(registrar_.get(), BOOKMARKS);
-
- StrictMock<sync_driver::ChangeProcessorMock> change_processor_mock;
- EXPECT_CALL(change_processor_mock, StartImpl());
- EXPECT_CALL(change_processor_mock, IsRunning())
- .WillRepeatedly(Return(true));
- EXPECT_CALL(change_processor_mock, ApplyChangesFromSyncModel(NULL, _, _));
- EXPECT_CALL(change_processor_mock, IsRunning())
- .WillRepeatedly(Return(true));
- EXPECT_CALL(change_processor_mock, CommitChangesFromSyncModel());
- EXPECT_CALL(change_processor_mock, IsRunning())
- .WillRepeatedly(Return(false));
-
- const ModelTypeSet types(BOOKMARKS);
- EXPECT_EQ(types, registrar_->ConfigureDataTypes(types, ModelTypeSet()));
- registrar_->ActivateDataType(BOOKMARKS, syncer::GROUP_UI,
- &change_processor_mock,
- test_user_share_.user_share());
- {
- syncer::ModelSafeRoutingInfo expected_routing_info;
- expected_routing_info[BOOKMARKS] = syncer::GROUP_UI;
- ExpectRoutingInfo(registrar_.get(), expected_routing_info);
- }
- ExpectHasProcessorsForTypes(*registrar_, types);
-
- TriggerChanges(registrar_.get(), BOOKMARKS);
-
- registrar_->DeactivateDataType(BOOKMARKS);
- ExpectRoutingInfo(registrar_.get(), syncer::ModelSafeRoutingInfo());
- ExpectHasProcessorsForTypes(*registrar_, ModelTypeSet());
-
- // Should do nothing.
- TriggerChanges(registrar_.get(), BOOKMARKS);
-}
-
-TEST_F(SyncBackendRegistrarTest, ActivateDeactivateNonUIDataType) {
- InSequence in_sequence;
- registrar_->SetInitialTypes(ModelTypeSet());
-
- // Should do nothing.
- TriggerChanges(registrar_.get(), AUTOFILL);
-
- StrictMock<sync_driver::ChangeProcessorMock> change_processor_mock;
- EXPECT_CALL(change_processor_mock, StartImpl());
- EXPECT_CALL(change_processor_mock, IsRunning())
- .WillRepeatedly(Return(true));
- EXPECT_CALL(change_processor_mock, ApplyChangesFromSyncModel(NULL, _, _));
- EXPECT_CALL(change_processor_mock, IsRunning())
- .WillRepeatedly(Return(true));
- EXPECT_CALL(change_processor_mock, CommitChangesFromSyncModel());
- EXPECT_CALL(change_processor_mock, IsRunning())
- .WillRepeatedly(Return(false));
-
- const ModelTypeSet types(AUTOFILL);
- EXPECT_EQ(types, registrar_->ConfigureDataTypes(types, ModelTypeSet()));
-
- base::WaitableEvent done(base::WaitableEvent::ResetPolicy::AUTOMATIC,
- base::WaitableEvent::InitialState::NOT_SIGNALED);
- db_task_runner()->PostTask(
- FROM_HERE,
- base::Bind(&SyncBackendRegistrarTest::TestNonUIDataTypeActivationAsync,
- base::Unretained(this), &change_processor_mock, &done));
- done.Wait();
-
- registrar_->DeactivateDataType(AUTOFILL);
- ExpectRoutingInfo(registrar_.get(), syncer::ModelSafeRoutingInfo());
- ExpectHasProcessorsForTypes(*registrar_, ModelTypeSet());
-
- // Should do nothing.
- TriggerChanges(registrar_.get(), AUTOFILL);
-}
-
-// Tests that registration and configuration of non-blocking data types is
-// handled correctly in SyncBackendRegistrar.
-TEST_F(SyncBackendRegistrarTest, ConfigureNonBlockingDataType) {
- registrar_->RegisterNonBlockingType(AUTOFILL);
- registrar_->RegisterNonBlockingType(BOOKMARKS);
-
- ExpectRoutingInfo(registrar_.get(), syncer::ModelSafeRoutingInfo());
- // Simulate that initial sync was already done for AUTOFILL.
- registrar_->AddRestoredNonBlockingType(AUTOFILL);
- // It should be added to routing info and set of configured types.
- EXPECT_EQ(ModelTypeSet(AUTOFILL), registrar_->GetLastConfiguredTypes());
- {
- syncer::ModelSafeRoutingInfo expected_routing_info;
- expected_routing_info[AUTOFILL] = syncer::GROUP_NON_BLOCKING;
- ExpectRoutingInfo(registrar_.get(), expected_routing_info);
- }
-
- // Configure two non-blocking types. Initial sync wasn't done for BOOKMARKS so
- // it should be included in types to be downloaded.
- ModelTypeSet types_to_add(AUTOFILL, BOOKMARKS);
- ModelTypeSet newly_added_types =
- registrar_->ConfigureDataTypes(types_to_add, ModelTypeSet());
- EXPECT_EQ(ModelTypeSet(BOOKMARKS), newly_added_types);
- EXPECT_EQ(types_to_add, registrar_->GetLastConfiguredTypes());
- {
- syncer::ModelSafeRoutingInfo expected_routing_info;
- expected_routing_info[AUTOFILL] = syncer::GROUP_NON_BLOCKING;
- expected_routing_info[BOOKMARKS] = syncer::GROUP_NON_BLOCKING;
- ExpectRoutingInfo(registrar_.get(), expected_routing_info);
- }
-}
-
-class SyncBackendRegistrarShutdownTest : public testing::Test {
- public:
- void BlockDBThread() {
- EXPECT_FALSE(db_thread_lock_.Try());
-
- db_thread_blocked_.Signal();
- base::AutoLock l(db_thread_lock_);
- }
-
- protected:
- friend class TestRegistrar;
-
- SyncBackendRegistrarShutdownTest()
- : db_thread_("DBThreadForTest"),
- file_thread_("FileThreadForTest"),
- db_thread_blocked_(base::WaitableEvent::ResetPolicy::AUTOMATIC,
- base::WaitableEvent::InitialState::NOT_SIGNALED) {
- quit_closure_ = run_loop_.QuitClosure();
- }
-
- ~SyncBackendRegistrarShutdownTest() override {}
-
- void SetUp() override {
- db_thread_.StartAndWaitForTesting();
- file_thread_.StartAndWaitForTesting();
- sync_client_.reset(new RegistrarSyncClient(
- ui_task_runner(), db_task_runner(), file_task_runner()));
- }
-
- void PostQuitOnUIMessageLoop() {
- ui_task_runner()->PostTask(FROM_HERE, quit_closure_);
- }
-
- const scoped_refptr<base::SingleThreadTaskRunner> ui_task_runner() {
- return message_loop_.task_runner();
- }
-
- const scoped_refptr<base::SingleThreadTaskRunner> db_task_runner() {
- return db_thread_.task_runner();
- }
-
- const scoped_refptr<base::SingleThreadTaskRunner> file_task_runner() {
- return file_thread_.task_runner();
- }
-
- base::MessageLoop message_loop_;
- base::Thread db_thread_;
- base::Thread file_thread_;
-
- std::unique_ptr<RegistrarSyncClient> sync_client_;
- base::WaitableEvent db_thread_blocked_;
-
- base::Lock db_thread_lock_;
- base::RunLoop run_loop_;
- base::Closure quit_closure_;
-};
-
-// Wrap SyncBackendRegistrar so that we can monitor its lifetime.
-class TestRegistrar : public SyncBackendRegistrar {
- public:
- explicit TestRegistrar(
- sync_driver::SyncClient* sync_client,
- const scoped_refptr<base::SingleThreadTaskRunner>& ui_thread,
- const scoped_refptr<base::SingleThreadTaskRunner>& db_thread,
- const scoped_refptr<base::SingleThreadTaskRunner>& file_thread,
- SyncBackendRegistrarShutdownTest* test)
- : SyncBackendRegistrar("test",
- sync_client,
- std::unique_ptr<base::Thread>(),
- ui_thread,
- db_thread,
- file_thread),
- test_(test) {}
-
- ~TestRegistrar() override { test_->PostQuitOnUIMessageLoop(); }
-
- private:
- SyncBackendRegistrarShutdownTest* test_;
-};
-
-TEST_F(SyncBackendRegistrarShutdownTest, BlockingShutdown) {
- // Take ownership of |db_thread_lock_| so that the DB thread can't acquire it.
- db_thread_lock_.Acquire();
-
- // This will block the DB thread by waiting on |db_thread_lock_|.
- db_task_runner()->PostTask(
- FROM_HERE, base::Bind(&SyncBackendRegistrarShutdownTest::BlockDBThread,
- base::Unretained(this)));
-
- std::unique_ptr<TestRegistrar> registrar(
- new TestRegistrar(sync_client_.get(), ui_task_runner(), db_task_runner(),
- file_task_runner(), this));
- base::Thread* sync_thread = registrar->sync_thread();
-
- // Stop here until the DB thread gets a chance to run and block on the lock.
- // Please note that since the task above didn't finish, the task to
- // initialize the worker on the DB thread hasn't had a chance to run yet too.
- // Which means ModelSafeWorker::SetWorkingLoopToCurrent hasn't been called
- // for the DB worker.
- db_thread_blocked_.Wait();
-
- registrar->SetInitialTypes(ModelTypeSet());
-
- // Start the shutdown.
- registrar->RequestWorkerStopOnUIThread();
-
- sync_thread->task_runner()->PostTask(
- FROM_HERE, base::Bind(&SyncBackendRegistrar::Shutdown,
- base::Unretained(registrar.release())));
-
- // Make sure the thread starts running.
- sync_thread->WaitUntilThreadStarted();
-
- // The test verifies that the sync thread doesn't block because
- // of the blocked DB thread and can finish the shutdown.
- base::RunLoop().RunUntilIdle();
-
- db_thread_lock_.Release();
-
- // Run the main thread loop until all workers have been removed and the
- // registrar destroyed.
- run_loop_.Run();
-}
-
-} // namespace
-
-} // namespace browser_sync
« no previous file with comments | « components/sync_driver/glue/sync_backend_registrar.cc ('k') | components/sync_driver/glue/ui_model_worker.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698