| 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
|
|
|