| Index: components/sync_driver/data_type_manager_impl_unittest.cc
|
| diff --git a/components/sync_driver/data_type_manager_impl_unittest.cc b/components/sync_driver/data_type_manager_impl_unittest.cc
|
| deleted file mode 100644
|
| index e32db87b4ffc85c3c7761f00f778fb4c452e3014..0000000000000000000000000000000000000000
|
| --- a/components/sync_driver/data_type_manager_impl_unittest.cc
|
| +++ /dev/null
|
| @@ -1,1714 +0,0 @@
|
| -// Copyright 2014 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/data_type_manager_impl.h"
|
| -
|
| -#include "base/compiler_specific.h"
|
| -#include "base/message_loop/message_loop.h"
|
| -#include "components/sync/base/model_type.h"
|
| -#include "components/sync/core/activation_context.h"
|
| -#include "components/sync/core/configure_reason.h"
|
| -#include "components/sync_driver/backend_data_type_configurer.h"
|
| -#include "components/sync_driver/data_type_encryption_handler.h"
|
| -#include "components/sync_driver/data_type_manager_observer.h"
|
| -#include "components/sync_driver/data_type_status_table.h"
|
| -#include "components/sync_driver/fake_data_type_controller.h"
|
| -#include "testing/gtest/include/gtest/gtest.h"
|
| -
|
| -namespace sync_driver {
|
| -
|
| -using syncer::SyncError;
|
| -using syncer::ModelType;
|
| -using syncer::ModelTypeSet;
|
| -using syncer::ModelTypeToString;
|
| -using syncer::BOOKMARKS;
|
| -using syncer::APPS;
|
| -using syncer::PASSWORDS;
|
| -using syncer::PREFERENCES;
|
| -using syncer::NIGORI;
|
| -
|
| -namespace {
|
| -
|
| -// Helper for unioning with control types.
|
| -ModelTypeSet AddControlTypesTo(ModelTypeSet types) {
|
| - ModelTypeSet result = syncer::ControlTypes();
|
| - result.PutAll(types);
|
| - return result;
|
| -}
|
| -
|
| -DataTypeStatusTable BuildStatusTable(ModelTypeSet crypto_errors,
|
| - ModelTypeSet association_errors,
|
| - ModelTypeSet unready_errors,
|
| - ModelTypeSet unrecoverable_errors) {
|
| - DataTypeStatusTable::TypeErrorMap error_map;
|
| - for (ModelTypeSet::Iterator iter = crypto_errors.First(); iter.Good();
|
| - iter.Inc()) {
|
| - error_map[iter.Get()] = SyncError(FROM_HERE,
|
| - SyncError::CRYPTO_ERROR,
|
| - "crypto error expected",
|
| - iter.Get());
|
| - }
|
| - for (ModelTypeSet::Iterator iter = association_errors.First(); iter.Good();
|
| - iter.Inc()) {
|
| - error_map[iter.Get()] = SyncError(FROM_HERE,
|
| - SyncError::DATATYPE_ERROR,
|
| - "association error expected",
|
| - iter.Get());
|
| - }
|
| - for (ModelTypeSet::Iterator iter = unready_errors.First(); iter.Good();
|
| - iter.Inc()) {
|
| - error_map[iter.Get()] = SyncError(FROM_HERE,
|
| - SyncError::UNREADY_ERROR,
|
| - "unready error expected",
|
| - iter.Get());
|
| - }
|
| - for (ModelTypeSet::Iterator iter = unrecoverable_errors.First(); iter.Good();
|
| - iter.Inc()) {
|
| - error_map[iter.Get()] = SyncError(FROM_HERE,
|
| - SyncError::UNRECOVERABLE_ERROR,
|
| - "unrecoverable error expected",
|
| - iter.Get());
|
| - }
|
| - DataTypeStatusTable status_table;
|
| - status_table.UpdateFailedDataTypes(error_map);
|
| - return status_table;
|
| -}
|
| -
|
| -// Fake BackendDataTypeConfigurer implementation that simply stores away the
|
| -// callback passed into ConfigureDataTypes.
|
| -class FakeBackendDataTypeConfigurer : public BackendDataTypeConfigurer {
|
| - public:
|
| - FakeBackendDataTypeConfigurer() : configure_call_count_(0) {}
|
| - ~FakeBackendDataTypeConfigurer() override {}
|
| -
|
| - syncer::ModelTypeSet ConfigureDataTypes(
|
| - syncer::ConfigureReason reason,
|
| - const DataTypeConfigStateMap& config_state_map,
|
| - const base::Callback<void(ModelTypeSet, ModelTypeSet)>& ready_task,
|
| - const base::Callback<void()>& retry_callback) override {
|
| - configure_call_count_++;
|
| - last_ready_task_ = ready_task;
|
| -
|
| - for (auto iter = expected_configure_types_.begin();
|
| - iter != expected_configure_types_.end(); ++iter) {
|
| - if (!iter->second.Empty()) {
|
| - EXPECT_TRUE(iter->second ==
|
| - GetDataTypesInState(iter->first, config_state_map))
|
| - << "State " << iter->first << " : "
|
| - << ModelTypeSetToString(iter->second) << " v.s. "
|
| - << ModelTypeSetToString(
|
| - GetDataTypesInState(iter->first, config_state_map));
|
| - }
|
| - }
|
| - return ready_types_;
|
| - }
|
| -
|
| - void ActivateDirectoryDataType(syncer::ModelType type,
|
| - syncer::ModelSafeGroup group,
|
| - ChangeProcessor* change_processor) override {
|
| - activated_types_.Put(type);
|
| - }
|
| - void DeactivateDirectoryDataType(syncer::ModelType type) override {
|
| - activated_types_.Remove(type);
|
| - }
|
| -
|
| - void ActivateNonBlockingDataType(syncer::ModelType type,
|
| - std::unique_ptr<syncer_v2::ActivationContext>
|
| - activation_context) override {
|
| - // TODO(stanisc): crbug.com/515962: Add test coverage.
|
| - }
|
| -
|
| - void DeactivateNonBlockingDataType(syncer::ModelType type) override {
|
| - // TODO(stanisc): crbug.com/515962: Add test coverage.
|
| - }
|
| -
|
| - base::Callback<void(ModelTypeSet, ModelTypeSet)> last_ready_task() const {
|
| - return last_ready_task_;
|
| - }
|
| -
|
| - void set_expected_configure_types(DataTypeConfigState config_state,
|
| - ModelTypeSet types) {
|
| - expected_configure_types_[config_state] = types;
|
| - }
|
| -
|
| - void set_ready_types(ModelTypeSet types) {
|
| - ready_types_ = types;
|
| - }
|
| -
|
| - const ModelTypeSet activated_types() { return activated_types_; }
|
| -
|
| - int configure_call_count() const { return configure_call_count_; }
|
| -
|
| - private:
|
| - base::Callback<void(ModelTypeSet, ModelTypeSet)> last_ready_task_;
|
| - std::map<DataTypeConfigState, ModelTypeSet> expected_configure_types_;
|
| - ModelTypeSet activated_types_;
|
| - ModelTypeSet ready_types_;
|
| - int configure_call_count_;
|
| -};
|
| -
|
| -// DataTypeManagerObserver implementation.
|
| -class FakeDataTypeManagerObserver : public DataTypeManagerObserver {
|
| - public:
|
| - FakeDataTypeManagerObserver() { ResetExpectations(); }
|
| - ~FakeDataTypeManagerObserver() override {
|
| - EXPECT_FALSE(start_expected_);
|
| - DataTypeManager::ConfigureResult default_result;
|
| - EXPECT_EQ(done_expectation_.status, default_result.status);
|
| - EXPECT_TRUE(
|
| - done_expectation_.data_type_status_table.GetFailedTypes().Empty());
|
| - }
|
| -
|
| - void ExpectStart() {
|
| - start_expected_ = true;
|
| - }
|
| - void ExpectDone(const DataTypeManager::ConfigureResult& result) {
|
| - done_expectation_ = result;
|
| - }
|
| - void ResetExpectations() {
|
| - start_expected_ = false;
|
| - done_expectation_ = DataTypeManager::ConfigureResult();
|
| - }
|
| -
|
| - void OnConfigureDone(
|
| - const DataTypeManager::ConfigureResult& result) override {
|
| - EXPECT_EQ(done_expectation_.status, result.status);
|
| - DataTypeStatusTable::TypeErrorMap errors =
|
| - result.data_type_status_table.GetAllErrors();
|
| - DataTypeStatusTable::TypeErrorMap expected_errors =
|
| - done_expectation_.data_type_status_table.GetAllErrors();
|
| - ASSERT_EQ(expected_errors.size(), errors.size());
|
| - for (DataTypeStatusTable::TypeErrorMap::const_iterator iter =
|
| - expected_errors.begin();
|
| - iter != expected_errors.end();
|
| - ++iter) {
|
| - ASSERT_TRUE(errors.find(iter->first) != errors.end());
|
| - ASSERT_EQ(iter->second.error_type(),
|
| - errors.find(iter->first)->second.error_type());
|
| - }
|
| - done_expectation_ = DataTypeManager::ConfigureResult();
|
| - }
|
| -
|
| - void OnConfigureStart() override {
|
| - EXPECT_TRUE(start_expected_);
|
| - start_expected_ = false;
|
| - }
|
| -
|
| - private:
|
| - bool start_expected_ = true;
|
| - DataTypeManager::ConfigureResult done_expectation_;
|
| -};
|
| -
|
| -class FakeDataTypeEncryptionHandler : public DataTypeEncryptionHandler {
|
| - public:
|
| - FakeDataTypeEncryptionHandler();
|
| - ~FakeDataTypeEncryptionHandler() override;
|
| -
|
| - bool IsPassphraseRequired() const override;
|
| - ModelTypeSet GetEncryptedDataTypes() const override;
|
| -
|
| - void set_passphrase_required(bool passphrase_required) {
|
| - passphrase_required_ = passphrase_required;
|
| - }
|
| - void set_encrypted_types(ModelTypeSet encrypted_types) {
|
| - encrypted_types_ = encrypted_types;
|
| - }
|
| - private:
|
| - bool passphrase_required_;
|
| - ModelTypeSet encrypted_types_;
|
| -};
|
| -
|
| -FakeDataTypeEncryptionHandler::FakeDataTypeEncryptionHandler()
|
| - : passphrase_required_(false) {}
|
| -FakeDataTypeEncryptionHandler::~FakeDataTypeEncryptionHandler() {}
|
| -
|
| -bool FakeDataTypeEncryptionHandler::IsPassphraseRequired() const {
|
| - return passphrase_required_;
|
| -}
|
| -
|
| -ModelTypeSet
|
| -FakeDataTypeEncryptionHandler::GetEncryptedDataTypes() const {
|
| - return encrypted_types_;
|
| -}
|
| -
|
| -} // namespace
|
| -
|
| -class TestDataTypeManager : public DataTypeManagerImpl {
|
| - public:
|
| - TestDataTypeManager(
|
| - const syncer::WeakHandle<syncer::DataTypeDebugInfoListener>&
|
| - debug_info_listener,
|
| - BackendDataTypeConfigurer* configurer,
|
| - const DataTypeController::TypeMap* controllers,
|
| - const DataTypeEncryptionHandler* encryption_handler,
|
| - DataTypeManagerObserver* observer)
|
| - : DataTypeManagerImpl(debug_info_listener,
|
| - controllers,
|
| - encryption_handler,
|
| - configurer,
|
| - observer),
|
| - custom_priority_types_(syncer::ControlTypes()) {}
|
| -
|
| - void set_priority_types(const ModelTypeSet& priority_types) {
|
| - custom_priority_types_ = priority_types;
|
| - }
|
| -
|
| - DataTypeManager::ConfigureResult configure_result() const {
|
| - return configure_result_;
|
| - }
|
| -
|
| - void OnModelAssociationDone(
|
| - const DataTypeManager::ConfigureResult& result) override {
|
| - configure_result_ = result;
|
| - DataTypeManagerImpl::OnModelAssociationDone(result);
|
| - }
|
| -
|
| - private:
|
| - ModelTypeSet GetPriorityTypes() const override {
|
| - return custom_priority_types_;
|
| - }
|
| -
|
| - ModelTypeSet custom_priority_types_;
|
| - DataTypeManager::ConfigureResult configure_result_;
|
| -};
|
| -
|
| -// The actual test harness class, parametrized on nigori state (i.e., tests are
|
| -// run both configuring with nigori, and configuring without).
|
| -class SyncDataTypeManagerImplTest : public testing::Test {
|
| - public:
|
| - SyncDataTypeManagerImplTest() {}
|
| -
|
| - ~SyncDataTypeManagerImplTest() override {}
|
| -
|
| - protected:
|
| - void SetUp() override {
|
| - dtm_.reset(
|
| - new TestDataTypeManager(
|
| - syncer::WeakHandle<syncer::DataTypeDebugInfoListener>(),
|
| - &configurer_,
|
| - &controllers_,
|
| - &encryption_handler_,
|
| - &observer_));
|
| - }
|
| -
|
| - void SetConfigureStartExpectation() {
|
| - observer_.ExpectStart();
|
| - }
|
| -
|
| - void SetConfigureDoneExpectation(DataTypeManager::ConfigureStatus status,
|
| - const DataTypeStatusTable& status_table) {
|
| - DataTypeManager::ConfigureResult result;
|
| - result.status = status;
|
| - result.data_type_status_table = status_table;
|
| - observer_.ExpectDone(result);
|
| - }
|
| -
|
| - // Configure the given DTM with the given desired types.
|
| - void Configure(DataTypeManagerImpl* dtm,
|
| - const ModelTypeSet& desired_types) {
|
| - dtm->Configure(desired_types, syncer::CONFIGURE_REASON_RECONFIGURATION);
|
| - }
|
| -
|
| - // Finish downloading for the given DTM. Should be done only after
|
| - // a call to Configure().
|
| - void FinishDownload(const DataTypeManager& dtm,
|
| - ModelTypeSet types_to_configure,
|
| - ModelTypeSet failed_download_types) {
|
| - EXPECT_EQ(DataTypeManager::CONFIGURING, dtm.state());
|
| - ASSERT_FALSE(configurer_.last_ready_task().is_null());
|
| - configurer_.last_ready_task().Run(
|
| - syncer::Difference(types_to_configure, failed_download_types),
|
| - failed_download_types);
|
| - }
|
| -
|
| - // Adds a fake controller for the given type to |controllers_|.
|
| - // Should be called only before setting up the DTM.
|
| - void AddController(ModelType model_type) {
|
| - controllers_[model_type] = new FakeDataTypeController(model_type);
|
| - }
|
| -
|
| - // Gets the fake controller for the given type, which should have
|
| - // been previously added via AddController().
|
| - scoped_refptr<FakeDataTypeController> GetController(
|
| - ModelType model_type) const {
|
| - DataTypeController::TypeMap::const_iterator it =
|
| - controllers_.find(model_type);
|
| - if (it == controllers_.end()) {
|
| - return NULL;
|
| - }
|
| - return make_scoped_refptr(
|
| - static_cast<FakeDataTypeController*>(it->second.get()));
|
| - }
|
| -
|
| - void FailEncryptionFor(ModelTypeSet encrypted_types) {
|
| - encryption_handler_.set_passphrase_required(true);
|
| - encryption_handler_.set_encrypted_types(encrypted_types);
|
| - }
|
| -
|
| - base::MessageLoopForUI ui_loop_;
|
| - DataTypeController::TypeMap controllers_;
|
| - FakeBackendDataTypeConfigurer configurer_;
|
| - FakeDataTypeManagerObserver observer_;
|
| - std::unique_ptr<TestDataTypeManager> dtm_;
|
| - FakeDataTypeEncryptionHandler encryption_handler_;
|
| -};
|
| -
|
| -// Set up a DTM with no controllers, configure it, finish downloading,
|
| -// and then stop it.
|
| -TEST_F(SyncDataTypeManagerImplTest, NoControllers) {
|
| - SetConfigureStartExpectation();
|
| - SetConfigureDoneExpectation(DataTypeManager::OK, DataTypeStatusTable());
|
| -
|
| - Configure(dtm_.get(), ModelTypeSet());
|
| - EXPECT_EQ(DataTypeManager::CONFIGURING, dtm_->state());
|
| -
|
| - FinishDownload(*dtm_, ModelTypeSet(), ModelTypeSet());
|
| - EXPECT_EQ(DataTypeManager::CONFIGURED, dtm_->state());
|
| -
|
| - dtm_->Stop();
|
| - EXPECT_EQ(DataTypeManager::STOPPED, dtm_->state());
|
| -}
|
| -
|
| -// Set up a DTM with a single controller, configure it, finish
|
| -// downloading, finish starting the controller, and then stop the DTM.
|
| -TEST_F(SyncDataTypeManagerImplTest, ConfigureOne) {
|
| - AddController(BOOKMARKS);
|
| -
|
| - SetConfigureStartExpectation();
|
| - SetConfigureDoneExpectation(DataTypeManager::OK, DataTypeStatusTable());
|
| -
|
| - Configure(dtm_.get(), ModelTypeSet(BOOKMARKS));
|
| - EXPECT_EQ(DataTypeManager::CONFIGURING, dtm_->state());
|
| -
|
| - FinishDownload(*dtm_, ModelTypeSet(), ModelTypeSet());
|
| - FinishDownload(*dtm_, ModelTypeSet(BOOKMARKS), ModelTypeSet());
|
| - EXPECT_EQ(DataTypeManager::CONFIGURING, dtm_->state());
|
| -
|
| - GetController(BOOKMARKS)->FinishStart(DataTypeController::OK);
|
| - EXPECT_EQ(DataTypeManager::CONFIGURED, dtm_->state());
|
| - EXPECT_EQ(1U, configurer_.activated_types().Size());
|
| -
|
| - dtm_->Stop();
|
| - EXPECT_EQ(DataTypeManager::STOPPED, dtm_->state());
|
| - EXPECT_TRUE(configurer_.activated_types().Empty());
|
| -}
|
| -
|
| -// Set up a DTM with a single controller, configure it, but stop it
|
| -// before finishing the download. It should still be safe to run the
|
| -// download callback even after the DTM is stopped and destroyed.
|
| -TEST_F(SyncDataTypeManagerImplTest, ConfigureOneStopWhileDownloadPending) {
|
| - AddController(BOOKMARKS);
|
| -
|
| - {
|
| - SetConfigureStartExpectation();
|
| - SetConfigureDoneExpectation(DataTypeManager::ABORTED,
|
| - DataTypeStatusTable());
|
| -
|
| - Configure(dtm_.get(), ModelTypeSet(BOOKMARKS));
|
| - EXPECT_EQ(DataTypeManager::CONFIGURING, dtm_->state());
|
| -
|
| - dtm_->Stop();
|
| - EXPECT_EQ(DataTypeManager::STOPPED, dtm_->state());
|
| - }
|
| -
|
| - configurer_.last_ready_task().Run(ModelTypeSet(BOOKMARKS), ModelTypeSet());
|
| - EXPECT_TRUE(configurer_.activated_types().Empty());
|
| -}
|
| -
|
| -// Set up a DTM with a single controller, configure it, finish
|
| -// downloading, but stop the DTM before the controller finishes
|
| -// starting up. It should still be safe to finish starting up the
|
| -// controller even after the DTM is stopped and destroyed.
|
| -TEST_F(SyncDataTypeManagerImplTest, ConfigureOneStopWhileStartingModel) {
|
| - AddController(BOOKMARKS);
|
| -
|
| - {
|
| - SetConfigureStartExpectation();
|
| - SetConfigureDoneExpectation(DataTypeManager::ABORTED,
|
| - DataTypeStatusTable());
|
| -
|
| - Configure(dtm_.get(), ModelTypeSet(BOOKMARKS));
|
| - EXPECT_EQ(DataTypeManager::CONFIGURING, dtm_->state());
|
| -
|
| - FinishDownload(*dtm_, ModelTypeSet(), ModelTypeSet());
|
| - FinishDownload(*dtm_, ModelTypeSet(BOOKMARKS), ModelTypeSet());
|
| - EXPECT_EQ(DataTypeManager::CONFIGURING, dtm_->state());
|
| -
|
| - dtm_->Stop();
|
| - EXPECT_EQ(DataTypeManager::STOPPED, dtm_->state());
|
| - dtm_.reset();
|
| - }
|
| -
|
| - GetController(BOOKMARKS)->FinishStart(DataTypeController::OK);
|
| - EXPECT_TRUE(configurer_.activated_types().Empty());
|
| -}
|
| -
|
| -// Set up a DTM with a single controller, configure it, finish
|
| -// downloading, start the controller's model, but stop the DTM before
|
| -// the controller finishes starting up. It should still be safe to
|
| -// finish starting up the controller even after the DTM is stopped and
|
| -// destroyed.
|
| -TEST_F(SyncDataTypeManagerImplTest, ConfigureOneStopWhileAssociating) {
|
| - AddController(BOOKMARKS);
|
| -
|
| - {
|
| - SetConfigureStartExpectation();
|
| - SetConfigureDoneExpectation(DataTypeManager::ABORTED,
|
| - DataTypeStatusTable());
|
| -
|
| - Configure(dtm_.get(), ModelTypeSet(BOOKMARKS));
|
| - EXPECT_EQ(DataTypeManager::CONFIGURING, dtm_->state());
|
| -
|
| - FinishDownload(*dtm_, ModelTypeSet(), ModelTypeSet());
|
| - FinishDownload(*dtm_, ModelTypeSet(BOOKMARKS), ModelTypeSet());
|
| - EXPECT_EQ(DataTypeManager::CONFIGURING, dtm_->state());
|
| - EXPECT_TRUE(configurer_.activated_types().Empty());
|
| -
|
| - dtm_->Stop();
|
| - EXPECT_EQ(DataTypeManager::STOPPED, dtm_->state());
|
| - dtm_.reset();
|
| - }
|
| -
|
| - GetController(BOOKMARKS)->FinishStart(DataTypeController::OK);
|
| - EXPECT_TRUE(configurer_.activated_types().Empty());
|
| -}
|
| -
|
| -// Set up a DTM with a single controller. Then:
|
| -//
|
| -// 1) Configure.
|
| -// 2) Finish the download for step 1.
|
| -// 3) Finish starting the controller with the NEEDS_CRYPTO status.
|
| -// 4) Complete download for the reconfiguration without the controller.
|
| -// 5) Stop the DTM.
|
| -TEST_F(SyncDataTypeManagerImplTest, OneWaitingForCrypto) {
|
| - AddController(PASSWORDS);
|
| -
|
| - SetConfigureStartExpectation();
|
| - SetConfigureDoneExpectation(DataTypeManager::OK,
|
| - BuildStatusTable(ModelTypeSet(PASSWORDS),
|
| - ModelTypeSet(),
|
| - ModelTypeSet(),
|
| - ModelTypeSet()));
|
| -
|
| - const ModelTypeSet types(PASSWORDS);
|
| - dtm_->set_priority_types(AddControlTypesTo(types));
|
| -
|
| - // Step 1.
|
| - Configure(dtm_.get(), types);
|
| - EXPECT_EQ(DataTypeManager::CONFIGURING, dtm_->state());
|
| -
|
| - // Step 2.
|
| - FinishDownload(*dtm_, ModelTypeSet(), ModelTypeSet());
|
| - EXPECT_EQ(DataTypeManager::CONFIGURING, dtm_->state());
|
| -
|
| - // Step 3.
|
| - FailEncryptionFor(types);
|
| - GetController(PASSWORDS)->FinishStart(DataTypeController::NEEDS_CRYPTO);
|
| - EXPECT_EQ(DataTypeManager::CONFIGURING, dtm_->state());
|
| -
|
| - // Step 4.
|
| - FinishDownload(*dtm_, ModelTypeSet(), ModelTypeSet());
|
| - EXPECT_EQ(DataTypeManager::CONFIGURED, dtm_->state());
|
| -
|
| - // Step 5.
|
| - dtm_->Stop();
|
| - EXPECT_EQ(DataTypeManager::STOPPED, dtm_->state());
|
| -}
|
| -
|
| -// Set up a DTM with two controllers. Then:
|
| -//
|
| -// 1) Configure with first controller.
|
| -// 2) Finish the download for step 1.
|
| -// 3) Finish starting the first controller.
|
| -// 4) Configure with both controllers.
|
| -// 5) Finish the download for step 4.
|
| -// 6) Finish starting the second controller.
|
| -// 7) Stop the DTM.
|
| -TEST_F(SyncDataTypeManagerImplTest, ConfigureOneThenBoth) {
|
| - AddController(BOOKMARKS);
|
| - AddController(PREFERENCES);
|
| -
|
| - SetConfigureStartExpectation();
|
| - SetConfigureDoneExpectation(DataTypeManager::OK, DataTypeStatusTable());
|
| -
|
| - // Step 1.
|
| - Configure(dtm_.get(), ModelTypeSet(BOOKMARKS));
|
| - EXPECT_EQ(DataTypeManager::CONFIGURING, dtm_->state());
|
| -
|
| - // Step 2.
|
| - FinishDownload(*dtm_, ModelTypeSet(), ModelTypeSet());
|
| - FinishDownload(*dtm_, ModelTypeSet(BOOKMARKS), ModelTypeSet());
|
| - EXPECT_EQ(DataTypeManager::CONFIGURING, dtm_->state());
|
| -
|
| - // Step 3.
|
| - GetController(BOOKMARKS)->FinishStart(DataTypeController::OK);
|
| - EXPECT_EQ(DataTypeManager::CONFIGURED, dtm_->state());
|
| -
|
| - observer_.ResetExpectations();
|
| - SetConfigureStartExpectation();
|
| - SetConfigureDoneExpectation(DataTypeManager::OK, DataTypeStatusTable());
|
| -
|
| - // Step 4.
|
| - Configure(dtm_.get(), ModelTypeSet(BOOKMARKS, PREFERENCES));
|
| - EXPECT_EQ(DataTypeManager::CONFIGURING, dtm_->state());
|
| -
|
| - // Step 5.
|
| - FinishDownload(*dtm_, ModelTypeSet(), ModelTypeSet());
|
| - FinishDownload(*dtm_, ModelTypeSet(BOOKMARKS, PREFERENCES), ModelTypeSet());
|
| - EXPECT_EQ(DataTypeManager::CONFIGURING, dtm_->state());
|
| -
|
| - // Step 6.
|
| - GetController(PREFERENCES)->FinishStart(DataTypeController::OK);
|
| - EXPECT_EQ(DataTypeManager::CONFIGURED, dtm_->state());
|
| - EXPECT_EQ(2U, configurer_.activated_types().Size());
|
| -
|
| - // Step 7.
|
| - dtm_->Stop();
|
| - EXPECT_EQ(DataTypeManager::STOPPED, dtm_->state());
|
| - EXPECT_TRUE(configurer_.activated_types().Empty());
|
| -}
|
| -
|
| -// Set up a DTM with two controllers. Then:
|
| -//
|
| -// 1) Configure with first controller.
|
| -// 2) Finish the download for step 1.
|
| -// 3) Finish starting the first controller.
|
| -// 4) Configure with second controller.
|
| -// 5) Finish the download for step 4.
|
| -// 6) Finish starting the second controller.
|
| -// 7) Stop the DTM.
|
| -TEST_F(SyncDataTypeManagerImplTest, ConfigureOneThenSwitch) {
|
| - AddController(BOOKMARKS);
|
| - AddController(PREFERENCES);
|
| -
|
| - SetConfigureStartExpectation();
|
| - SetConfigureDoneExpectation(DataTypeManager::OK, DataTypeStatusTable());
|
| -
|
| - // Step 1.
|
| - Configure(dtm_.get(), ModelTypeSet(BOOKMARKS));
|
| - EXPECT_EQ(DataTypeManager::CONFIGURING, dtm_->state());
|
| -
|
| - // Step 2.
|
| - FinishDownload(*dtm_, ModelTypeSet(), ModelTypeSet());
|
| - FinishDownload(*dtm_, ModelTypeSet(BOOKMARKS), ModelTypeSet());
|
| - EXPECT_EQ(DataTypeManager::CONFIGURING, dtm_->state());
|
| -
|
| - // Step 3.
|
| - GetController(BOOKMARKS)->FinishStart(DataTypeController::OK);
|
| - EXPECT_EQ(DataTypeManager::CONFIGURED, dtm_->state());
|
| -
|
| - observer_.ResetExpectations();
|
| - SetConfigureStartExpectation();
|
| - SetConfigureDoneExpectation(DataTypeManager::OK, DataTypeStatusTable());
|
| -
|
| - // Step 4.
|
| - Configure(dtm_.get(), ModelTypeSet(PREFERENCES));
|
| - EXPECT_EQ(DataTypeManager::CONFIGURING, dtm_->state());
|
| -
|
| - // Step 5.
|
| - FinishDownload(*dtm_, ModelTypeSet(), ModelTypeSet());
|
| - FinishDownload(*dtm_, ModelTypeSet(PREFERENCES), ModelTypeSet());
|
| - EXPECT_EQ(DataTypeManager::CONFIGURING, dtm_->state());
|
| -
|
| - // Step 6.
|
| - GetController(PREFERENCES)->FinishStart(DataTypeController::OK);
|
| - EXPECT_EQ(DataTypeManager::CONFIGURED, dtm_->state());
|
| - EXPECT_EQ(1U, configurer_.activated_types().Size());
|
| -
|
| - // Step 7.
|
| - dtm_->Stop();
|
| - EXPECT_EQ(DataTypeManager::STOPPED, dtm_->state());
|
| - EXPECT_TRUE(configurer_.activated_types().Empty());
|
| -}
|
| -
|
| -// Set up a DTM with two controllers. Then:
|
| -//
|
| -// 1) Configure with first controller.
|
| -// 2) Finish the download for step 1.
|
| -// 3) Configure with both controllers.
|
| -// 4) Finish starting the first controller.
|
| -// 5) Finish the download for step 3.
|
| -// 6) Finish starting the second controller.
|
| -// 7) Stop the DTM.
|
| -TEST_F(SyncDataTypeManagerImplTest, ConfigureWhileOneInFlight) {
|
| - AddController(BOOKMARKS);
|
| - AddController(PREFERENCES);
|
| -
|
| - SetConfigureStartExpectation();
|
| - SetConfigureDoneExpectation(DataTypeManager::OK, DataTypeStatusTable());
|
| -
|
| - // Step 1.
|
| - Configure(dtm_.get(), ModelTypeSet(BOOKMARKS));
|
| - EXPECT_EQ(DataTypeManager::CONFIGURING, dtm_->state());
|
| -
|
| - // Step 2.
|
| - FinishDownload(*dtm_, ModelTypeSet(), ModelTypeSet());
|
| - FinishDownload(*dtm_, ModelTypeSet(BOOKMARKS), ModelTypeSet());
|
| - EXPECT_EQ(DataTypeManager::CONFIGURING, dtm_->state());
|
| -
|
| - // Step 3.
|
| - Configure(dtm_.get(), ModelTypeSet(BOOKMARKS, PREFERENCES));
|
| - EXPECT_EQ(DataTypeManager::CONFIGURING, dtm_->state());
|
| -
|
| - // Step 4.
|
| - GetController(BOOKMARKS)->FinishStart(DataTypeController::OK);
|
| - EXPECT_EQ(DataTypeManager::CONFIGURING, dtm_->state());
|
| -
|
| - // Step 5.
|
| - FinishDownload(*dtm_, ModelTypeSet(), ModelTypeSet());
|
| - FinishDownload(*dtm_, ModelTypeSet(BOOKMARKS, PREFERENCES), ModelTypeSet());
|
| - EXPECT_EQ(DataTypeManager::CONFIGURING, dtm_->state());
|
| -
|
| - // Step 6.
|
| - GetController(PREFERENCES)->FinishStart(DataTypeController::OK);
|
| - EXPECT_EQ(DataTypeManager::CONFIGURED, dtm_->state());
|
| - EXPECT_EQ(2U, configurer_.activated_types().Size());
|
| -
|
| - // Step 7.
|
| - dtm_->Stop();
|
| - EXPECT_EQ(DataTypeManager::STOPPED, dtm_->state());
|
| - EXPECT_TRUE(configurer_.activated_types().Empty());
|
| -}
|
| -
|
| -// Set up a DTM with one controller. Then configure, finish
|
| -// downloading, and start the controller with an unrecoverable error.
|
| -// The unrecoverable error should cause the DTM to stop.
|
| -TEST_F(SyncDataTypeManagerImplTest, OneFailingController) {
|
| - AddController(BOOKMARKS);
|
| -
|
| - SetConfigureStartExpectation();
|
| - SetConfigureDoneExpectation(DataTypeManager::UNRECOVERABLE_ERROR,
|
| - BuildStatusTable(ModelTypeSet(),
|
| - ModelTypeSet(),
|
| - ModelTypeSet(),
|
| - ModelTypeSet(BOOKMARKS)));
|
| -
|
| - Configure(dtm_.get(), ModelTypeSet(BOOKMARKS));
|
| - EXPECT_EQ(DataTypeManager::CONFIGURING, dtm_->state());
|
| -
|
| - FinishDownload(*dtm_, ModelTypeSet(), ModelTypeSet());
|
| - FinishDownload(*dtm_, ModelTypeSet(BOOKMARKS), ModelTypeSet());
|
| - EXPECT_EQ(DataTypeManager::CONFIGURING, dtm_->state());
|
| - EXPECT_TRUE(configurer_.activated_types().Empty());
|
| -
|
| - GetController(BOOKMARKS)->FinishStart(
|
| - DataTypeController::UNRECOVERABLE_ERROR);
|
| - EXPECT_EQ(DataTypeManager::STOPPED, dtm_->state());
|
| - EXPECT_TRUE(configurer_.activated_types().Empty());
|
| -}
|
| -
|
| -// Set up a DTM with two controllers. Then:
|
| -//
|
| -// 1) Configure with both controllers.
|
| -// 2) Finish the download for step 1.
|
| -// 3) Finish starting the first controller successfully.
|
| -// 4) Finish starting the second controller with an unrecoverable error.
|
| -//
|
| -// The failure from step 4 should cause the DTM to stop.
|
| -TEST_F(SyncDataTypeManagerImplTest, SecondControllerFails) {
|
| - AddController(BOOKMARKS);
|
| - AddController(PREFERENCES);
|
| -
|
| - SetConfigureStartExpectation();
|
| - SetConfigureDoneExpectation(DataTypeManager::UNRECOVERABLE_ERROR,
|
| - BuildStatusTable(ModelTypeSet(),
|
| - ModelTypeSet(),
|
| - ModelTypeSet(),
|
| - ModelTypeSet(PREFERENCES)));
|
| -
|
| - // Step 1.
|
| - Configure(dtm_.get(), ModelTypeSet(BOOKMARKS, PREFERENCES));
|
| - EXPECT_EQ(DataTypeManager::CONFIGURING, dtm_->state());
|
| -
|
| - // Step 2.
|
| - FinishDownload(*dtm_, ModelTypeSet(), ModelTypeSet());
|
| - FinishDownload(*dtm_, ModelTypeSet(BOOKMARKS, PREFERENCES), ModelTypeSet());
|
| - EXPECT_EQ(DataTypeManager::CONFIGURING, dtm_->state());
|
| -
|
| - // Step 3.
|
| - GetController(BOOKMARKS)->FinishStart(DataTypeController::OK);
|
| - EXPECT_EQ(DataTypeManager::CONFIGURING, dtm_->state());
|
| -
|
| - // Step 4.
|
| - GetController(PREFERENCES)->FinishStart(
|
| - DataTypeController::UNRECOVERABLE_ERROR);
|
| - EXPECT_EQ(DataTypeManager::STOPPED, dtm_->state());
|
| -}
|
| -
|
| -// Set up a DTM with two controllers. Then:
|
| -//
|
| -// 1) Configure with both controllers.
|
| -// 2) Finish the download for step 1.
|
| -// 3) Finish starting the first controller successfully.
|
| -// 4) Finish starting the second controller with an association failure.
|
| -// 5) Finish the purge/reconfigure without the failed type.
|
| -// 6) Stop the DTM.
|
| -//
|
| -// The association failure from step 3 should be ignored.
|
| -//
|
| -// TODO(akalin): Check that the data type that failed association is
|
| -// recorded in the CONFIGURE_DONE notification.
|
| -TEST_F(SyncDataTypeManagerImplTest, OneControllerFailsAssociation) {
|
| - AddController(BOOKMARKS);
|
| - AddController(PREFERENCES);
|
| -
|
| - SetConfigureStartExpectation();
|
| - SetConfigureDoneExpectation(DataTypeManager::OK,
|
| - BuildStatusTable(ModelTypeSet(),
|
| - ModelTypeSet(PREFERENCES),
|
| - ModelTypeSet(),
|
| - ModelTypeSet()));
|
| -
|
| - // Step 1.
|
| - Configure(dtm_.get(), ModelTypeSet(BOOKMARKS, PREFERENCES));
|
| - EXPECT_EQ(DataTypeManager::CONFIGURING, dtm_->state());
|
| -
|
| - // Step 2.
|
| - FinishDownload(*dtm_, ModelTypeSet(), ModelTypeSet());
|
| - FinishDownload(*dtm_, ModelTypeSet(BOOKMARKS, PREFERENCES), ModelTypeSet());
|
| - EXPECT_EQ(DataTypeManager::CONFIGURING, dtm_->state());
|
| -
|
| - // Step 3.
|
| - GetController(BOOKMARKS)->FinishStart(DataTypeController::OK);
|
| - EXPECT_EQ(DataTypeManager::CONFIGURING, dtm_->state());
|
| -
|
| - // Step 4.
|
| - GetController(PREFERENCES)->FinishStart(
|
| - DataTypeController::ASSOCIATION_FAILED);
|
| - EXPECT_EQ(DataTypeManager::CONFIGURING, dtm_->state());
|
| -
|
| - // Step 5.
|
| - FinishDownload(*dtm_, ModelTypeSet(), ModelTypeSet());
|
| - FinishDownload(*dtm_, ModelTypeSet(BOOKMARKS), ModelTypeSet());
|
| - EXPECT_EQ(DataTypeManager::CONFIGURED, dtm_->state());
|
| - EXPECT_EQ(1U, configurer_.activated_types().Size());
|
| -
|
| - // Step 6.
|
| - dtm_->Stop();
|
| - EXPECT_EQ(DataTypeManager::STOPPED, dtm_->state());
|
| - EXPECT_TRUE(configurer_.activated_types().Empty());
|
| -}
|
| -
|
| -// Set up a DTM with two controllers. Then:
|
| -//
|
| -// 1) Configure with first controller.
|
| -// 2) Configure with both controllers.
|
| -// 3) Finish the download for step 1.
|
| -// 4) Finish the download for step 2.
|
| -// 5) Finish starting both controllers.
|
| -// 6) Stop the DTM.
|
| -TEST_F(SyncDataTypeManagerImplTest, ConfigureWhileDownloadPending) {
|
| - AddController(BOOKMARKS);
|
| - AddController(PREFERENCES);
|
| -
|
| - SetConfigureStartExpectation();
|
| - SetConfigureDoneExpectation(DataTypeManager::OK, DataTypeStatusTable());
|
| -
|
| - // Step 1.
|
| - Configure(dtm_.get(), ModelTypeSet(BOOKMARKS));
|
| - EXPECT_EQ(DataTypeManager::CONFIGURING, dtm_->state());
|
| -
|
| - // Step 2.
|
| - Configure(dtm_.get(), ModelTypeSet(BOOKMARKS, PREFERENCES));
|
| - EXPECT_EQ(DataTypeManager::CONFIGURING, dtm_->state());
|
| -
|
| - // Step 3.
|
| - FinishDownload(*dtm_, ModelTypeSet(), ModelTypeSet());
|
| - EXPECT_EQ(DataTypeManager::CONFIGURING, dtm_->state());
|
| -
|
| - // Step 4.
|
| - FinishDownload(*dtm_, ModelTypeSet(), ModelTypeSet());
|
| - FinishDownload(*dtm_, ModelTypeSet(BOOKMARKS, PREFERENCES), ModelTypeSet());
|
| - EXPECT_EQ(DataTypeManager::CONFIGURING, dtm_->state());
|
| -
|
| - // Step 5.
|
| - GetController(BOOKMARKS)->FinishStart(DataTypeController::OK);
|
| - EXPECT_EQ(DataTypeManager::CONFIGURING, dtm_->state());
|
| - GetController(PREFERENCES)->FinishStart(DataTypeController::OK);
|
| - EXPECT_EQ(DataTypeManager::CONFIGURED, dtm_->state());
|
| -
|
| - // Step 6.
|
| - dtm_->Stop();
|
| - EXPECT_EQ(DataTypeManager::STOPPED, dtm_->state());
|
| -}
|
| -
|
| -// Set up a DTM with two controllers. Then:
|
| -//
|
| -// 1) Configure with first controller.
|
| -// 2) Configure with both controllers.
|
| -// 3) Finish the download for step 1 with a failed data type.
|
| -// 4) Finish the download for step 2 successfully.
|
| -// 5) Finish starting both controllers.
|
| -// 6) Stop the DTM.
|
| -//
|
| -// The failure from step 3 should be ignored since there's a
|
| -// reconfigure pending from step 2.
|
| -TEST_F(SyncDataTypeManagerImplTest, ConfigureWhileDownloadPendingWithFailure) {
|
| - AddController(BOOKMARKS);
|
| - AddController(PREFERENCES);
|
| -
|
| - SetConfigureStartExpectation();
|
| - SetConfigureDoneExpectation(DataTypeManager::OK, DataTypeStatusTable());
|
| -
|
| - // Step 1.
|
| - Configure(dtm_.get(), ModelTypeSet(BOOKMARKS));
|
| - FinishDownload(*dtm_, ModelTypeSet(), ModelTypeSet());
|
| - EXPECT_EQ(DataTypeManager::CONFIGURING, dtm_->state());
|
| -
|
| - // Step 2.
|
| - Configure(dtm_.get(), ModelTypeSet(BOOKMARKS, PREFERENCES));
|
| - EXPECT_EQ(DataTypeManager::CONFIGURING, dtm_->state());
|
| -
|
| - // Step 3.
|
| - FinishDownload(*dtm_, ModelTypeSet(), ModelTypeSet());
|
| - FinishDownload(*dtm_, ModelTypeSet(BOOKMARKS), ModelTypeSet());
|
| - EXPECT_EQ(DataTypeManager::CONFIGURING, dtm_->state());
|
| -
|
| - // Step 4.
|
| - FinishDownload(*dtm_, ModelTypeSet(BOOKMARKS, PREFERENCES), ModelTypeSet());
|
| - EXPECT_EQ(DataTypeManager::CONFIGURING, dtm_->state());
|
| -
|
| - // Step 5.
|
| - GetController(BOOKMARKS)->FinishStart(DataTypeController::OK);
|
| - EXPECT_EQ(DataTypeManager::CONFIGURING, dtm_->state());
|
| - GetController(PREFERENCES)->FinishStart(DataTypeController::OK);
|
| - EXPECT_EQ(DataTypeManager::CONFIGURED, dtm_->state());
|
| -
|
| - // Step 6.
|
| - dtm_->Stop();
|
| - EXPECT_EQ(DataTypeManager::STOPPED, dtm_->state());
|
| -}
|
| -
|
| -// Tests a Purge then Configure. This is similar to the sequence of
|
| -// operations that would be invoked by the BackendMigrator.
|
| -TEST_F(SyncDataTypeManagerImplTest, MigrateAll) {
|
| - AddController(BOOKMARKS);
|
| - dtm_->set_priority_types(AddControlTypesTo(ModelTypeSet(BOOKMARKS)));
|
| -
|
| - SetConfigureStartExpectation();
|
| - SetConfigureDoneExpectation(DataTypeManager::OK, DataTypeStatusTable());
|
| -
|
| - // Initial setup.
|
| - Configure(dtm_.get(), ModelTypeSet(BOOKMARKS));
|
| - FinishDownload(*dtm_, ModelTypeSet(BOOKMARKS), ModelTypeSet());
|
| - GetController(BOOKMARKS)->FinishStart(DataTypeController::OK);
|
| -
|
| - // We've now configured bookmarks and (implicitly) the control types.
|
| - EXPECT_EQ(DataTypeManager::CONFIGURED, dtm_->state());
|
| - observer_.ResetExpectations();
|
| -
|
| - // Pretend we were told to migrate all types.
|
| - ModelTypeSet to_migrate;
|
| - to_migrate.Put(BOOKMARKS);
|
| - to_migrate.PutAll(syncer::ControlTypes());
|
| -
|
| - SetConfigureStartExpectation();
|
| - SetConfigureDoneExpectation(DataTypeManager::OK, DataTypeStatusTable());
|
| - dtm_->PurgeForMigration(to_migrate,
|
| - syncer::CONFIGURE_REASON_MIGRATION);
|
| - EXPECT_EQ(DataTypeManager::CONFIGURING, dtm_->state());
|
| -
|
| - // The DTM will call ConfigureDataTypes(), even though it is unnecessary.
|
| - FinishDownload(*dtm_, ModelTypeSet(), ModelTypeSet());
|
| - EXPECT_EQ(DataTypeManager::CONFIGURED, dtm_->state());
|
| - observer_.ResetExpectations();
|
| -
|
| - // Re-enable the migrated types.
|
| - SetConfigureStartExpectation();
|
| - SetConfigureDoneExpectation(DataTypeManager::OK, DataTypeStatusTable());
|
| - Configure(dtm_.get(), to_migrate);
|
| - FinishDownload(*dtm_, to_migrate, ModelTypeSet());
|
| - GetController(BOOKMARKS)->FinishStart(DataTypeController::OK);
|
| - EXPECT_EQ(DataTypeManager::CONFIGURED, dtm_->state());
|
| -}
|
| -
|
| -// Test receipt of a Configure request while a purge is in flight.
|
| -TEST_F(SyncDataTypeManagerImplTest, ConfigureDuringPurge) {
|
| - AddController(BOOKMARKS);
|
| - AddController(PREFERENCES);
|
| -
|
| - // Initial configure.
|
| - SetConfigureStartExpectation();
|
| - SetConfigureDoneExpectation(DataTypeManager::OK, DataTypeStatusTable());
|
| - Configure(dtm_.get(), ModelTypeSet(BOOKMARKS));
|
| - FinishDownload(*dtm_, ModelTypeSet(), ModelTypeSet());
|
| - FinishDownload(*dtm_, ModelTypeSet(BOOKMARKS), ModelTypeSet());
|
| - GetController(BOOKMARKS)->FinishStart(DataTypeController::OK);
|
| - EXPECT_EQ(DataTypeManager::CONFIGURED, dtm_->state());
|
| - observer_.ResetExpectations();
|
| -
|
| - // Purge the Nigori type.
|
| - SetConfigureStartExpectation();
|
| - dtm_->PurgeForMigration(ModelTypeSet(NIGORI),
|
| - syncer::CONFIGURE_REASON_MIGRATION);
|
| - EXPECT_EQ(DataTypeManager::CONFIGURING, dtm_->state());
|
| - observer_.ResetExpectations();
|
| -
|
| - // Before the backend configuration completes, ask for a different
|
| - // set of types. This request asks for
|
| - // - BOOKMARKS: which is redundant because it was already enabled,
|
| - // - PREFERENCES: which is new and will need to be downloaded, and
|
| - // - NIGORI: (added implicitly because it is a control type) which
|
| - // the DTM is part-way through purging.
|
| - Configure(dtm_.get(), ModelTypeSet(BOOKMARKS, PREFERENCES));
|
| - EXPECT_EQ(DataTypeManager::CONFIGURING, dtm_->state());
|
| -
|
| - // Invoke the callback we've been waiting for since we asked to purge NIGORI.
|
| - FinishDownload(*dtm_, ModelTypeSet(), ModelTypeSet());
|
| - observer_.ResetExpectations();
|
| -
|
| - SetConfigureDoneExpectation(DataTypeManager::OK, DataTypeStatusTable());
|
| - EXPECT_EQ(DataTypeManager::CONFIGURING, dtm_->state());
|
| -
|
| - // Now invoke the callback for the second configure request.
|
| - FinishDownload(*dtm_, ModelTypeSet(), ModelTypeSet());
|
| - FinishDownload(*dtm_, ModelTypeSet(BOOKMARKS, PREFERENCES), ModelTypeSet());
|
| - EXPECT_EQ(DataTypeManager::CONFIGURING, dtm_->state());
|
| -
|
| - // Start the preferences controller. We don't need to start controller for
|
| - // the NIGORI because it has none. We don't need to start the controller for
|
| - // the BOOKMARKS because it was never stopped.
|
| - GetController(PREFERENCES)->FinishStart(DataTypeController::OK);
|
| - EXPECT_EQ(DataTypeManager::CONFIGURED, dtm_->state());
|
| -}
|
| -
|
| -TEST_F(SyncDataTypeManagerImplTest, PrioritizedConfiguration) {
|
| - AddController(BOOKMARKS);
|
| - AddController(PREFERENCES);
|
| -
|
| - dtm_->set_priority_types(
|
| - AddControlTypesTo(ModelTypeSet(PREFERENCES)));
|
| -
|
| - // Initial configure.
|
| - SetConfigureStartExpectation();
|
| - SetConfigureDoneExpectation(DataTypeManager::OK, DataTypeStatusTable());
|
| -
|
| - // Initially only PREFERENCES is configured.
|
| - configurer_.set_expected_configure_types(
|
| - BackendDataTypeConfigurer::CONFIGURE_ACTIVE,
|
| - AddControlTypesTo(ModelTypeSet(PREFERENCES)));
|
| - Configure(dtm_.get(), ModelTypeSet(BOOKMARKS, PREFERENCES));
|
| - EXPECT_EQ(DataTypeManager::CONFIGURING, dtm_->state());
|
| -
|
| - // BOOKMARKS is configured after download of PREFERENCES finishes.
|
| - configurer_.set_expected_configure_types(
|
| - BackendDataTypeConfigurer::CONFIGURE_ACTIVE, ModelTypeSet(BOOKMARKS));
|
| - FinishDownload(*dtm_, ModelTypeSet(PREFERENCES), ModelTypeSet());
|
| - EXPECT_EQ(DataTypeManager::CONFIGURING, dtm_->state());
|
| -
|
| - FinishDownload(*dtm_, ModelTypeSet(BOOKMARKS), ModelTypeSet());
|
| - GetController(PREFERENCES)->FinishStart(DataTypeController::OK);
|
| - EXPECT_EQ(DataTypeManager::CONFIGURING, dtm_->state());
|
| -
|
| - GetController(BOOKMARKS)->FinishStart(DataTypeController::OK);
|
| - EXPECT_EQ(DataTypeManager::CONFIGURED, dtm_->state());
|
| -}
|
| -
|
| -TEST_F(SyncDataTypeManagerImplTest, PrioritizedConfigurationReconfigure) {
|
| - AddController(BOOKMARKS);
|
| - AddController(PREFERENCES);
|
| - AddController(APPS);
|
| -
|
| - dtm_->set_priority_types(
|
| - AddControlTypesTo(ModelTypeSet(PREFERENCES)));
|
| -
|
| - // Initial configure.
|
| - SetConfigureStartExpectation();
|
| - SetConfigureDoneExpectation(DataTypeManager::OK, DataTypeStatusTable());
|
| -
|
| - // Reconfigure while associating PREFERENCES and downloading BOOKMARKS.
|
| - configurer_.set_expected_configure_types(
|
| - BackendDataTypeConfigurer::CONFIGURE_ACTIVE,
|
| - AddControlTypesTo(ModelTypeSet(PREFERENCES)));
|
| - Configure(dtm_.get(), ModelTypeSet(BOOKMARKS, PREFERENCES));
|
| - EXPECT_EQ(DataTypeManager::CONFIGURING, dtm_->state());
|
| -
|
| - configurer_.set_expected_configure_types(
|
| - BackendDataTypeConfigurer::CONFIGURE_ACTIVE, ModelTypeSet(BOOKMARKS));
|
| - FinishDownload(*dtm_, ModelTypeSet(PREFERENCES), ModelTypeSet());
|
| - EXPECT_EQ(DataTypeManager::CONFIGURING, dtm_->state());
|
| -
|
| - // Enable syncing for APPS.
|
| - Configure(dtm_.get(), ModelTypeSet(BOOKMARKS, PREFERENCES, APPS));
|
| - EXPECT_EQ(DataTypeManager::CONFIGURING, dtm_->state());
|
| -
|
| - // Reconfiguration starts after downloading and association of previous
|
| - // types finish.
|
| - configurer_.set_expected_configure_types(
|
| - BackendDataTypeConfigurer::CONFIGURE_ACTIVE,
|
| - AddControlTypesTo(ModelTypeSet(PREFERENCES)));
|
| - FinishDownload(*dtm_, ModelTypeSet(BOOKMARKS), ModelTypeSet());
|
| - GetController(PREFERENCES)->FinishStart(DataTypeController::OK);
|
| - EXPECT_EQ(DataTypeManager::CONFIGURING, dtm_->state());
|
| -
|
| - configurer_.set_expected_configure_types(
|
| - BackendDataTypeConfigurer::CONFIGURE_ACTIVE,
|
| - ModelTypeSet(BOOKMARKS, APPS));
|
| - FinishDownload(*dtm_, ModelTypeSet(PREFERENCES), ModelTypeSet());
|
| - EXPECT_EQ(DataTypeManager::CONFIGURING, dtm_->state());
|
| -
|
| - FinishDownload(*dtm_, ModelTypeSet(BOOKMARKS, APPS), ModelTypeSet());
|
| - EXPECT_EQ(DataTypeManager::CONFIGURING, dtm_->state());
|
| -
|
| - // Skip calling FinishStart() for PREFENCES because it's already started in
|
| - // first configuration.
|
| - GetController(BOOKMARKS)->FinishStart(DataTypeController::OK);
|
| - GetController(APPS)->FinishStart(DataTypeController::OK);
|
| - EXPECT_EQ(DataTypeManager::CONFIGURED, dtm_->state());
|
| -}
|
| -
|
| -TEST_F(SyncDataTypeManagerImplTest, PrioritizedConfigurationStop) {
|
| - AddController(BOOKMARKS);
|
| - AddController(PREFERENCES);
|
| -
|
| - dtm_->set_priority_types(
|
| - AddControlTypesTo(ModelTypeSet(PREFERENCES)));
|
| -
|
| - // Initial configure.
|
| - SetConfigureStartExpectation();
|
| - SetConfigureDoneExpectation(DataTypeManager::ABORTED, DataTypeStatusTable());
|
| -
|
| - // Initially only PREFERENCES is configured.
|
| - configurer_.set_expected_configure_types(
|
| - BackendDataTypeConfigurer::CONFIGURE_ACTIVE,
|
| - AddControlTypesTo(ModelTypeSet(PREFERENCES)));
|
| - Configure(dtm_.get(), ModelTypeSet(BOOKMARKS, PREFERENCES));
|
| - EXPECT_EQ(DataTypeManager::CONFIGURING, dtm_->state());
|
| -
|
| - // BOOKMARKS is configured after download of PREFERENCES finishes.
|
| - configurer_.set_expected_configure_types(
|
| - BackendDataTypeConfigurer::CONFIGURE_ACTIVE, ModelTypeSet(BOOKMARKS));
|
| - FinishDownload(*dtm_, ModelTypeSet(PREFERENCES), ModelTypeSet());
|
| - EXPECT_EQ(DataTypeManager::CONFIGURING, dtm_->state());
|
| -
|
| - // PREFERENCES controller is associating while BOOKMARKS is downloading.
|
| - EXPECT_EQ(DataTypeController::ASSOCIATING,
|
| - GetController(PREFERENCES)->state());
|
| - EXPECT_EQ(DataTypeController::MODEL_LOADED,
|
| - GetController(BOOKMARKS)->state());
|
| -
|
| - dtm_->Stop();
|
| - EXPECT_EQ(DataTypeManager::STOPPED, dtm_->state());
|
| - EXPECT_EQ(DataTypeController::NOT_RUNNING,
|
| - GetController(PREFERENCES)->state());
|
| - EXPECT_EQ(DataTypeController::NOT_RUNNING, GetController(BOOKMARKS)->state());
|
| -}
|
| -
|
| -TEST_F(SyncDataTypeManagerImplTest, PrioritizedConfigurationDownloadError) {
|
| - AddController(BOOKMARKS);
|
| - AddController(PREFERENCES);
|
| -
|
| - dtm_->set_priority_types(
|
| - AddControlTypesTo(ModelTypeSet(PREFERENCES)));
|
| -
|
| - // Initial configure. Bookmarks will fail to associate due to the download
|
| - // failure.
|
| - SetConfigureStartExpectation();
|
| - SetConfigureDoneExpectation(DataTypeManager::OK,
|
| - BuildStatusTable(ModelTypeSet(),
|
| - ModelTypeSet(BOOKMARKS),
|
| - ModelTypeSet(),
|
| - ModelTypeSet()));
|
| -
|
| - // Initially only PREFERENCES is configured.
|
| - configurer_.set_expected_configure_types(
|
| - BackendDataTypeConfigurer::CONFIGURE_ACTIVE,
|
| - AddControlTypesTo(ModelTypeSet(PREFERENCES)));
|
| - Configure(dtm_.get(), ModelTypeSet(BOOKMARKS, PREFERENCES));
|
| - EXPECT_EQ(DataTypeManager::CONFIGURING, dtm_->state());
|
| -
|
| - // BOOKMARKS is configured after download of PREFERENCES finishes.
|
| - configurer_.set_expected_configure_types(
|
| - BackendDataTypeConfigurer::CONFIGURE_ACTIVE, ModelTypeSet(BOOKMARKS));
|
| - FinishDownload(*dtm_, ModelTypeSet(PREFERENCES), ModelTypeSet());
|
| - EXPECT_EQ(DataTypeManager::CONFIGURING, dtm_->state());
|
| -
|
| - // PREFERENCES controller is associating while BOOKMARKS is downloading.
|
| - EXPECT_EQ(DataTypeController::ASSOCIATING,
|
| - GetController(PREFERENCES)->state());
|
| - EXPECT_EQ(DataTypeController::MODEL_LOADED,
|
| - GetController(BOOKMARKS)->state());
|
| -
|
| - // Make BOOKMARKS download fail. Preferences is still associating.
|
| - FinishDownload(*dtm_, ModelTypeSet(), ModelTypeSet(BOOKMARKS));
|
| - EXPECT_EQ(DataTypeManager::CONFIGURING, dtm_->state());
|
| - EXPECT_EQ(DataTypeController::ASSOCIATING,
|
| - GetController(PREFERENCES)->state());
|
| -
|
| - // Finish association of PREFERENCES. This will trigger a reconfiguration to
|
| - // disable bookmarks.
|
| - configurer_.set_expected_configure_types(
|
| - BackendDataTypeConfigurer::CONFIGURE_ACTIVE,
|
| - AddControlTypesTo(ModelTypeSet(PREFERENCES)));
|
| - GetController(PREFERENCES)->FinishStart(DataTypeController::OK);
|
| - FinishDownload(*dtm_, ModelTypeSet(PREFERENCES), ModelTypeSet());
|
| - EXPECT_EQ(DataTypeManager::CONFIGURED, dtm_->state());
|
| - EXPECT_EQ(DataTypeController::RUNNING,
|
| - GetController(PREFERENCES)->state());
|
| - EXPECT_EQ(DataTypeController::NOT_RUNNING, GetController(BOOKMARKS)->state());
|
| -}
|
| -
|
| -TEST_F(SyncDataTypeManagerImplTest, HighPriorityAssociationFailure) {
|
| - AddController(PREFERENCES); // Will fail.
|
| - AddController(BOOKMARKS); // Will succeed.
|
| -
|
| - dtm_->set_priority_types(
|
| - AddControlTypesTo(ModelTypeSet(PREFERENCES)));
|
| -
|
| - // Initial configure.
|
| - SetConfigureStartExpectation();
|
| - SetConfigureDoneExpectation(DataTypeManager::OK,
|
| - BuildStatusTable(ModelTypeSet(),
|
| - ModelTypeSet(PREFERENCES),
|
| - ModelTypeSet(),
|
| - ModelTypeSet()));
|
| -
|
| - // Initially only PREFERENCES is configured.
|
| - configurer_.set_expected_configure_types(
|
| - BackendDataTypeConfigurer::CONFIGURE_ACTIVE,
|
| - AddControlTypesTo(ModelTypeSet(PREFERENCES)));
|
| - Configure(dtm_.get(), ModelTypeSet(BOOKMARKS, PREFERENCES));
|
| - EXPECT_EQ(DataTypeManager::CONFIGURING, dtm_->state());
|
| -
|
| - // BOOKMARKS is configured after download of PREFERENCES finishes.
|
| - configurer_.set_expected_configure_types(
|
| - BackendDataTypeConfigurer::CONFIGURE_ACTIVE, ModelTypeSet(BOOKMARKS));
|
| - FinishDownload(*dtm_, ModelTypeSet(PREFERENCES), ModelTypeSet());
|
| - EXPECT_EQ(DataTypeManager::CONFIGURING, dtm_->state());
|
| -
|
| - // PREFERENCES controller is associating while BOOKMARKS is downloading.
|
| - EXPECT_EQ(DataTypeController::ASSOCIATING,
|
| - GetController(PREFERENCES)->state());
|
| - EXPECT_EQ(DataTypeController::MODEL_LOADED,
|
| - GetController(BOOKMARKS)->state());
|
| -
|
| - // Make PREFERENCES association fail.
|
| - GetController(PREFERENCES)->FinishStart(
|
| - DataTypeController::ASSOCIATION_FAILED);
|
| - EXPECT_EQ(DataTypeManager::CONFIGURING, dtm_->state());
|
| -
|
| - // Reconfigure without PREFERENCES after the BOOKMARKS download completes,
|
| - // then reconfigure with BOOKMARKS.
|
| - configurer_.set_expected_configure_types(
|
| - BackendDataTypeConfigurer::CONFIGURE_ACTIVE, syncer::ControlTypes());
|
| - FinishDownload(*dtm_, ModelTypeSet(BOOKMARKS), ModelTypeSet());
|
| - configurer_.set_expected_configure_types(
|
| - BackendDataTypeConfigurer::CONFIGURE_ACTIVE, ModelTypeSet(BOOKMARKS));
|
| - FinishDownload(*dtm_, ModelTypeSet(), ModelTypeSet());
|
| -
|
| - // Reconfigure with BOOKMARKS.
|
| - FinishDownload(*dtm_, ModelTypeSet(BOOKMARKS), ModelTypeSet());
|
| - EXPECT_EQ(DataTypeController::ASSOCIATING,
|
| - GetController(BOOKMARKS)->state());
|
| - GetController(BOOKMARKS)->FinishStart(DataTypeController::OK);
|
| -
|
| - EXPECT_EQ(DataTypeManager::CONFIGURED, dtm_->state());
|
| - EXPECT_EQ(DataTypeController::NOT_RUNNING,
|
| - GetController(PREFERENCES)->state());
|
| - EXPECT_EQ(DataTypeController::RUNNING, GetController(BOOKMARKS)->state());
|
| -}
|
| -
|
| -TEST_F(SyncDataTypeManagerImplTest, LowPriorityAssociationFailure) {
|
| - AddController(PREFERENCES); // Will succeed.
|
| - AddController(BOOKMARKS); // Will fail.
|
| -
|
| - dtm_->set_priority_types(
|
| - AddControlTypesTo(ModelTypeSet(PREFERENCES)));
|
| -
|
| - // Initial configure.
|
| - SetConfigureStartExpectation();
|
| - SetConfigureDoneExpectation(DataTypeManager::OK,
|
| - BuildStatusTable(ModelTypeSet(),
|
| - ModelTypeSet(BOOKMARKS),
|
| - ModelTypeSet(),
|
| - ModelTypeSet()));
|
| -
|
| - // Initially only PREFERENCES is configured.
|
| - configurer_.set_expected_configure_types(
|
| - BackendDataTypeConfigurer::CONFIGURE_ACTIVE,
|
| - AddControlTypesTo(ModelTypeSet(PREFERENCES)));
|
| - Configure(dtm_.get(), ModelTypeSet(BOOKMARKS, PREFERENCES));
|
| - EXPECT_EQ(DataTypeManager::CONFIGURING, dtm_->state());
|
| -
|
| - // BOOKMARKS is configured after download of PREFERENCES finishes.
|
| - configurer_.set_expected_configure_types(
|
| - BackendDataTypeConfigurer::CONFIGURE_ACTIVE, ModelTypeSet(BOOKMARKS));
|
| - FinishDownload(*dtm_, ModelTypeSet(PREFERENCES), ModelTypeSet());
|
| - EXPECT_EQ(DataTypeManager::CONFIGURING, dtm_->state());
|
| -
|
| - // PREFERENCES controller is associating while BOOKMARKS is downloading.
|
| - EXPECT_EQ(DataTypeController::ASSOCIATING,
|
| - GetController(PREFERENCES)->state());
|
| - EXPECT_EQ(DataTypeController::MODEL_LOADED,
|
| - GetController(BOOKMARKS)->state());
|
| -
|
| - // BOOKMARKS finishes downloading and PREFERENCES finishes associating.
|
| - FinishDownload(*dtm_, ModelTypeSet(BOOKMARKS), ModelTypeSet());
|
| - GetController(PREFERENCES)->FinishStart(DataTypeController::OK);
|
| - EXPECT_EQ(DataTypeController::RUNNING, GetController(PREFERENCES)->state());
|
| -
|
| - // Make BOOKMARKS association fail, which triggers reconfigure with only
|
| - // PREFERENCES.
|
| - configurer_.set_expected_configure_types(
|
| - BackendDataTypeConfigurer::CONFIGURE_ACTIVE,
|
| - AddControlTypesTo(ModelTypeSet(PREFERENCES)));
|
| - GetController(BOOKMARKS)->FinishStart(DataTypeController::ASSOCIATION_FAILED);
|
| - EXPECT_EQ(DataTypeController::NOT_RUNNING,
|
| - GetController(BOOKMARKS)->state());
|
| - EXPECT_EQ(DataTypeManager::CONFIGURING, dtm_->state());
|
| -
|
| - // Finish configuration with only PREFERENCES.
|
| - configurer_.set_expected_configure_types(
|
| - BackendDataTypeConfigurer::CONFIGURE_ACTIVE, ModelTypeSet());
|
| - FinishDownload(*dtm_, ModelTypeSet(PREFERENCES), ModelTypeSet());
|
| - EXPECT_EQ(DataTypeManager::CONFIGURED, dtm_->state());
|
| - EXPECT_EQ(DataTypeController::RUNNING, GetController(PREFERENCES)->state());
|
| - EXPECT_EQ(DataTypeController::NOT_RUNNING,
|
| - GetController(BOOKMARKS)->state());
|
| -}
|
| -
|
| -TEST_F(SyncDataTypeManagerImplTest, FilterDesiredTypes) {
|
| - AddController(BOOKMARKS);
|
| -
|
| - ModelTypeSet types(BOOKMARKS, APPS);
|
| - dtm_->set_priority_types(AddControlTypesTo(types));
|
| -
|
| - SetConfigureStartExpectation();
|
| - SetConfigureDoneExpectation(DataTypeManager::OK, DataTypeStatusTable());
|
| -
|
| - ModelTypeSet expected_types = syncer::ControlTypes();
|
| - expected_types.Put(BOOKMARKS);
|
| - // APPS is filtered out because there's no controller for it.
|
| - configurer_.set_expected_configure_types(
|
| - BackendDataTypeConfigurer::CONFIGURE_ACTIVE, expected_types);
|
| - Configure(dtm_.get(), types);
|
| - FinishDownload(*dtm_, ModelTypeSet(BOOKMARKS), ModelTypeSet());
|
| - GetController(BOOKMARKS)->FinishStart(DataTypeController::OK);
|
| -
|
| - dtm_->Stop();
|
| - EXPECT_EQ(DataTypeManager::STOPPED, dtm_->state());
|
| -}
|
| -
|
| -TEST_F(SyncDataTypeManagerImplTest, ReenableAfterDataTypeError) {
|
| - AddController(PREFERENCES); // Will succeed.
|
| - AddController(BOOKMARKS); // Will be disabled due to datatype error.
|
| -
|
| - SetConfigureStartExpectation();
|
| - SetConfigureDoneExpectation(DataTypeManager::OK,
|
| - BuildStatusTable(ModelTypeSet(),
|
| - ModelTypeSet(BOOKMARKS),
|
| - ModelTypeSet(),
|
| - ModelTypeSet()));
|
| -
|
| - Configure(dtm_.get(), ModelTypeSet(BOOKMARKS, PREFERENCES));
|
| - FinishDownload(*dtm_, ModelTypeSet(), ModelTypeSet());
|
| - FinishDownload(*dtm_, ModelTypeSet(PREFERENCES, BOOKMARKS), ModelTypeSet());
|
| - GetController(PREFERENCES)->FinishStart(DataTypeController::OK);
|
| - GetController(BOOKMARKS)
|
| - ->FinishStart(DataTypeController::ASSOCIATION_FAILED);
|
| - FinishDownload(*dtm_, ModelTypeSet(), ModelTypeSet()); // Reconfig for error.
|
| - FinishDownload(*dtm_, ModelTypeSet(), ModelTypeSet()); // Reconfig for error.
|
| - EXPECT_EQ(DataTypeManager::CONFIGURED, dtm_->state());
|
| - EXPECT_EQ(DataTypeController::RUNNING, GetController(PREFERENCES)->state());
|
| - EXPECT_EQ(DataTypeController::NOT_RUNNING, GetController(BOOKMARKS)->state());
|
| -
|
| - observer_.ResetExpectations();
|
| -
|
| - // Re-enable bookmarks.
|
| - SetConfigureDoneExpectation(DataTypeManager::OK, DataTypeStatusTable());
|
| - dtm_->ReenableType(syncer::BOOKMARKS);
|
| -
|
| - EXPECT_EQ(DataTypeManager::CONFIGURING, dtm_->state());
|
| - FinishDownload(*dtm_, ModelTypeSet(), ModelTypeSet());
|
| - FinishDownload(*dtm_, ModelTypeSet(BOOKMARKS), ModelTypeSet());
|
| - EXPECT_EQ(DataTypeManager::CONFIGURING, dtm_->state());
|
| - GetController(BOOKMARKS)->FinishStart(DataTypeController::OK);
|
| - EXPECT_EQ(DataTypeManager::CONFIGURED, dtm_->state());
|
| - EXPECT_EQ(DataTypeController::RUNNING, GetController(PREFERENCES)->state());
|
| - EXPECT_EQ(DataTypeController::RUNNING, GetController(BOOKMARKS)->state());
|
| -
|
| - // Should do nothing.
|
| - dtm_->ReenableType(syncer::BOOKMARKS);
|
| -}
|
| -
|
| -TEST_F(SyncDataTypeManagerImplTest, UnreadyType) {
|
| - AddController(BOOKMARKS);
|
| - GetController(BOOKMARKS)->SetReadyForStart(false);
|
| -
|
| - // Bookmarks is never started due to being unready.
|
| - SetConfigureStartExpectation();
|
| - SetConfigureDoneExpectation(DataTypeManager::OK,
|
| - BuildStatusTable(ModelTypeSet(),
|
| - ModelTypeSet(),
|
| - ModelTypeSet(BOOKMARKS),
|
| - ModelTypeSet()));
|
| - Configure(dtm_.get(), ModelTypeSet(BOOKMARKS));
|
| - FinishDownload(*dtm_, ModelTypeSet(), ModelTypeSet());
|
| - EXPECT_EQ(DataTypeController::NOT_RUNNING, GetController(BOOKMARKS)->state());
|
| - EXPECT_EQ(DataTypeManager::CONFIGURED, dtm_->state());
|
| - EXPECT_EQ(0U, configurer_.activated_types().Size());
|
| - observer_.ResetExpectations();
|
| -
|
| - // Bookmarks should start normally now.
|
| - GetController(BOOKMARKS)->SetReadyForStart(true);
|
| - SetConfigureDoneExpectation(DataTypeManager::OK, DataTypeStatusTable());
|
| - dtm_->ReenableType(BOOKMARKS);
|
| - EXPECT_EQ(DataTypeManager::CONFIGURING, dtm_->state());
|
| -
|
| - FinishDownload(*dtm_, ModelTypeSet(), ModelTypeSet());
|
| - FinishDownload(*dtm_, ModelTypeSet(BOOKMARKS), ModelTypeSet());
|
| - EXPECT_EQ(DataTypeManager::CONFIGURING, dtm_->state());
|
| -
|
| - GetController(BOOKMARKS)->FinishStart(DataTypeController::OK);
|
| - EXPECT_EQ(DataTypeManager::CONFIGURED, dtm_->state());
|
| - EXPECT_EQ(1U, configurer_.activated_types().Size());
|
| -
|
| - // Should do nothing.
|
| - observer_.ResetExpectations();
|
| - dtm_->ReenableType(BOOKMARKS);
|
| -
|
| - dtm_->Stop();
|
| - EXPECT_EQ(DataTypeManager::STOPPED, dtm_->state());
|
| - EXPECT_TRUE(configurer_.activated_types().Empty());
|
| -}
|
| -
|
| -TEST_F(SyncDataTypeManagerImplTest, ModelLoadError) {
|
| - AddController(BOOKMARKS);
|
| - GetController(BOOKMARKS)->SetModelLoadError(syncer::SyncError(
|
| - FROM_HERE, SyncError::DATATYPE_ERROR, "load error", BOOKMARKS));
|
| -
|
| - // Bookmarks is never started due to hitting a model load error.
|
| - SetConfigureStartExpectation();
|
| - SetConfigureDoneExpectation(DataTypeManager::OK,
|
| - BuildStatusTable(ModelTypeSet(),
|
| - ModelTypeSet(BOOKMARKS),
|
| - ModelTypeSet(),
|
| - ModelTypeSet()));
|
| - Configure(dtm_.get(), ModelTypeSet(BOOKMARKS));
|
| - FinishDownload(*dtm_, ModelTypeSet(), ModelTypeSet());
|
| - FinishDownload(*dtm_, ModelTypeSet(BOOKMARKS), ModelTypeSet());
|
| - EXPECT_EQ(DataTypeManager::CONFIGURED, dtm_->state());
|
| - EXPECT_EQ(DataTypeController::NOT_RUNNING, GetController(BOOKMARKS)->state());
|
| -
|
| - EXPECT_EQ(0U, configurer_.activated_types().Size());
|
| -}
|
| -
|
| -
|
| -TEST_F(SyncDataTypeManagerImplTest, ErrorBeforeAssociation) {
|
| - AddController(BOOKMARKS);
|
| -
|
| - // Bookmarks is never started due to hitting a datatype error while the DTM
|
| - // is still downloading types.
|
| - SetConfigureStartExpectation();
|
| - SetConfigureDoneExpectation(DataTypeManager::OK,
|
| - BuildStatusTable(ModelTypeSet(),
|
| - ModelTypeSet(BOOKMARKS),
|
| - ModelTypeSet(),
|
| - ModelTypeSet()));
|
| - Configure(dtm_.get(), ModelTypeSet(BOOKMARKS));
|
| - FinishDownload(*dtm_, ModelTypeSet(), ModelTypeSet());
|
| - GetController(BOOKMARKS)->OnSingleDataTypeUnrecoverableError(
|
| - syncer::SyncError(FROM_HERE,
|
| - SyncError::DATATYPE_ERROR,
|
| - "bookmarks error",
|
| - BOOKMARKS));
|
| - FinishDownload(*dtm_, ModelTypeSet(BOOKMARKS), ModelTypeSet());
|
| - FinishDownload(*dtm_, ModelTypeSet(), ModelTypeSet()); // Reconfig for error.
|
| - EXPECT_EQ(DataTypeManager::CONFIGURED, dtm_->state());
|
| - EXPECT_EQ(DataTypeController::NOT_RUNNING, GetController(BOOKMARKS)->state());
|
| -
|
| - EXPECT_EQ(0U, configurer_.activated_types().Size());
|
| -}
|
| -
|
| -TEST_F(SyncDataTypeManagerImplTest, AssociationNeverCompletes) {
|
| - AddController(BOOKMARKS);
|
| -
|
| - // Bookmarks times out during association and so it's never started.
|
| - SetConfigureStartExpectation();
|
| - SetConfigureDoneExpectation(DataTypeManager::OK,
|
| - BuildStatusTable(ModelTypeSet(),
|
| - ModelTypeSet(BOOKMARKS),
|
| - ModelTypeSet(),
|
| - ModelTypeSet()));
|
| - Configure(dtm_.get(), ModelTypeSet(BOOKMARKS));
|
| -
|
| - GetController(BOOKMARKS)->SetDelayModelLoad();
|
| - FinishDownload(*dtm_, ModelTypeSet(), ModelTypeSet());
|
| - FinishDownload(*dtm_, ModelTypeSet(BOOKMARKS), ModelTypeSet());
|
| -
|
| - EXPECT_EQ(DataTypeManager::CONFIGURING, dtm_->state());
|
| -
|
| - // Simulate timeout by firing the timer.
|
| - dtm_->GetModelAssociationManagerForTesting()
|
| - ->GetTimerForTesting()
|
| - ->user_task()
|
| - .Run();
|
| - EXPECT_EQ(DataTypeManager::CONFIGURING, dtm_->state());
|
| - EXPECT_EQ(DataTypeController::NOT_RUNNING, GetController(BOOKMARKS)->state());
|
| -
|
| - FinishDownload(*dtm_, ModelTypeSet(), ModelTypeSet());
|
| -
|
| - EXPECT_EQ(DataTypeManager::CONFIGURED, dtm_->state());
|
| - EXPECT_EQ(0U, configurer_.activated_types().Size());
|
| -}
|
| -
|
| -// Test that sync configures properly if all low priority types are ready.
|
| -TEST_F(SyncDataTypeManagerImplTest, AllLowPriorityTypesReady) {
|
| - AddController(PREFERENCES);
|
| - AddController(BOOKMARKS);
|
| -
|
| - dtm_->set_priority_types(
|
| - AddControlTypesTo(ModelTypeSet(PREFERENCES)));
|
| -
|
| - SetConfigureStartExpectation();
|
| - SetConfigureDoneExpectation(DataTypeManager::OK, DataTypeStatusTable());
|
| -
|
| - Configure(dtm_.get(), ModelTypeSet(PREFERENCES, BOOKMARKS));
|
| - EXPECT_EQ(DataTypeManager::CONFIGURING, dtm_->state());
|
| -
|
| - configurer_.set_ready_types(ModelTypeSet(BOOKMARKS));
|
| - FinishDownload(*dtm_, ModelTypeSet(PREFERENCES), ModelTypeSet());
|
| -
|
| - // Association of Bookmarks can't happen until higher priority types are
|
| - // finished.
|
| - EXPECT_EQ(DataTypeController::ASSOCIATING,
|
| - GetController(PREFERENCES)->state());
|
| - EXPECT_EQ(DataTypeController::MODEL_LOADED,
|
| - GetController(BOOKMARKS)->state());
|
| -
|
| - // Because Bookmarks are a ready type, once Preference finishes, Bookmarks
|
| - // can start associating immediately (even before the
|
| - // BackendDataTypeConfigurer calls back).
|
| - GetController(PREFERENCES)->FinishStart(DataTypeController::OK);
|
| - EXPECT_EQ(DataTypeController::ASSOCIATING,
|
| - GetController(BOOKMARKS)->state());
|
| -
|
| - // Once the association finishes, the DTM should still be waiting for the
|
| - // Sync configurer to call back.
|
| - GetController(BOOKMARKS)->FinishStart(DataTypeController::OK);
|
| - EXPECT_EQ(DataTypeController::RUNNING,
|
| - GetController(BOOKMARKS)->state());
|
| - EXPECT_EQ(DataTypeManager::CONFIGURING, dtm_->state());
|
| -
|
| - // Finishing the download should complete the configuration.
|
| - FinishDownload(*dtm_, ModelTypeSet(BOOKMARKS), ModelTypeSet());
|
| - EXPECT_EQ(DataTypeController::RUNNING,
|
| - GetController(BOOKMARKS)->state());
|
| - EXPECT_EQ(DataTypeManager::CONFIGURED, dtm_->state());
|
| - EXPECT_EQ(2U, configurer_.activated_types().Size());
|
| -
|
| - dtm_->Stop();
|
| - EXPECT_EQ(DataTypeManager::STOPPED, dtm_->state());
|
| - EXPECT_TRUE(configurer_.activated_types().Empty());
|
| -}
|
| -
|
| -// Test that sync configures properly if all high priority types are ready.
|
| -TEST_F(SyncDataTypeManagerImplTest, AllHighPriorityTypesReady) {
|
| - AddController(PREFERENCES);
|
| - AddController(BOOKMARKS);
|
| -
|
| - dtm_->set_priority_types(
|
| - AddControlTypesTo(ModelTypeSet(PREFERENCES)));
|
| -
|
| - SetConfigureStartExpectation();
|
| - SetConfigureDoneExpectation(DataTypeManager::OK, DataTypeStatusTable());
|
| -
|
| - configurer_.set_ready_types(ModelTypeSet(PREFERENCES));
|
| - Configure(dtm_.get(), ModelTypeSet(PREFERENCES, BOOKMARKS));
|
| - EXPECT_EQ(DataTypeManager::CONFIGURING, dtm_->state());
|
| -
|
| - // Association of Bookmarks can't happen until higher priority types are
|
| - // finished, but Preferences should start associating immediately.
|
| - EXPECT_EQ(DataTypeController::ASSOCIATING,
|
| - GetController(PREFERENCES)->state());
|
| - EXPECT_EQ(DataTypeController::MODEL_LOADED,
|
| - GetController(BOOKMARKS)->state());
|
| -
|
| - // When Prefs finish associating, configuration should still be waiting for
|
| - // the high priority download to finish.
|
| - GetController(PREFERENCES)->FinishStart(DataTypeController::OK);
|
| - EXPECT_EQ(DataTypeController::MODEL_LOADED,
|
| - GetController(BOOKMARKS)->state());
|
| -
|
| - // Because Bookmarks aren't a ready type, they'll need to wait until the
|
| - // low priority download also finishes.
|
| - FinishDownload(*dtm_, ModelTypeSet(PREFERENCES), ModelTypeSet());
|
| - EXPECT_EQ(DataTypeController::MODEL_LOADED,
|
| - GetController(BOOKMARKS)->state());
|
| -
|
| - FinishDownload(*dtm_, ModelTypeSet(BOOKMARKS), ModelTypeSet());
|
| - EXPECT_EQ(DataTypeController::ASSOCIATING,
|
| - GetController(BOOKMARKS)->state());
|
| - EXPECT_EQ(DataTypeManager::CONFIGURING, dtm_->state());
|
| -
|
| - // Finishing the Bookmarks association ends the configuration.
|
| - GetController(BOOKMARKS)->FinishStart(DataTypeController::OK);
|
| - EXPECT_EQ(DataTypeController::RUNNING,
|
| - GetController(BOOKMARKS)->state());
|
| -
|
| - EXPECT_EQ(DataTypeManager::CONFIGURED, dtm_->state());
|
| - EXPECT_EQ(2U, configurer_.activated_types().Size());
|
| -
|
| - dtm_->Stop();
|
| - EXPECT_EQ(DataTypeManager::STOPPED, dtm_->state());
|
| - EXPECT_TRUE(configurer_.activated_types().Empty());
|
| -}
|
| -
|
| -// Test that sync configures properly if all types are ready.
|
| -TEST_F(SyncDataTypeManagerImplTest, AllTypesReady) {
|
| - AddController(PREFERENCES);
|
| - AddController(BOOKMARKS);
|
| -
|
| - dtm_->set_priority_types(
|
| - AddControlTypesTo(ModelTypeSet(PREFERENCES)));
|
| -
|
| - SetConfigureStartExpectation();
|
| - SetConfigureDoneExpectation(DataTypeManager::OK, DataTypeStatusTable());
|
| -
|
| - configurer_.set_ready_types(ModelTypeSet(PREFERENCES));
|
| - Configure(dtm_.get(), ModelTypeSet(PREFERENCES, BOOKMARKS));
|
| - EXPECT_EQ(DataTypeManager::CONFIGURING, dtm_->state());
|
| -
|
| - // Association of Bookmarks can't happen until higher priority types are
|
| - // finished, but Preferences should start associating immediately.
|
| - EXPECT_EQ(DataTypeController::ASSOCIATING,
|
| - GetController(PREFERENCES)->state());
|
| - EXPECT_EQ(DataTypeController::MODEL_LOADED,
|
| - GetController(BOOKMARKS)->state());
|
| -
|
| - // When Prefs finish associating, configuration should still be waiting for
|
| - // the high priority download to finish.
|
| - GetController(PREFERENCES)->FinishStart(DataTypeController::OK);
|
| - EXPECT_EQ(DataTypeController::MODEL_LOADED,
|
| - GetController(BOOKMARKS)->state());
|
| -
|
| - // Because Bookmarks are a ready type, it can start associating immediately
|
| - // after the high priority types finish downloading.
|
| - configurer_.set_ready_types(ModelTypeSet(BOOKMARKS));
|
| - FinishDownload(*dtm_, ModelTypeSet(PREFERENCES), ModelTypeSet());
|
| - EXPECT_EQ(DataTypeController::ASSOCIATING,
|
| - GetController(BOOKMARKS)->state());
|
| -
|
| - // Finishing the Bookmarks association leaves the DTM waiting for the low
|
| - // priority download to finish.
|
| - GetController(BOOKMARKS)->FinishStart(DataTypeController::OK);
|
| - EXPECT_EQ(DataTypeController::RUNNING,
|
| - GetController(BOOKMARKS)->state());
|
| - EXPECT_EQ(DataTypeManager::CONFIGURING, dtm_->state());
|
| -
|
| - // Finishing the low priority download ends the configuration.
|
| - FinishDownload(*dtm_, ModelTypeSet(BOOKMARKS), ModelTypeSet());
|
| -
|
| - EXPECT_EQ(DataTypeManager::CONFIGURED, dtm_->state());
|
| - EXPECT_EQ(2U, configurer_.activated_types().Size());
|
| -
|
| - dtm_->Stop();
|
| - EXPECT_EQ(DataTypeManager::STOPPED, dtm_->state());
|
| - EXPECT_TRUE(configurer_.activated_types().Empty());
|
| -}
|
| -
|
| -// Test that "catching up" type puts them in the CONFIGURE_CLEAN state.
|
| -TEST_F(SyncDataTypeManagerImplTest, CatchUpTypeAddedToConfigureClean) {
|
| - AddController(BOOKMARKS);
|
| - AddController(PASSWORDS);
|
| -
|
| - SetConfigureStartExpectation();
|
| - SetConfigureDoneExpectation(DataTypeManager::OK, DataTypeStatusTable());
|
| - configurer_.set_expected_configure_types(
|
| - BackendDataTypeConfigurer::CONFIGURE_CLEAN,
|
| - AddControlTypesTo(ModelTypeSet(BOOKMARKS, PASSWORDS)));
|
| -
|
| - dtm_->Configure(ModelTypeSet(BOOKMARKS, PASSWORDS),
|
| - syncer::CONFIGURE_REASON_CATCH_UP);
|
| - EXPECT_EQ(DataTypeManager::CONFIGURING, dtm_->state());
|
| -
|
| - FinishDownload(*dtm_, ModelTypeSet(), ModelTypeSet());
|
| - FinishDownload(*dtm_, ModelTypeSet(BOOKMARKS, PASSWORDS), ModelTypeSet());
|
| - EXPECT_EQ(DataTypeManager::CONFIGURING, dtm_->state());
|
| -
|
| - GetController(BOOKMARKS)->FinishStart(DataTypeController::OK);
|
| - EXPECT_EQ(DataTypeManager::CONFIGURING, dtm_->state());
|
| - EXPECT_EQ(1U, configurer_.activated_types().Size());
|
| - GetController(PASSWORDS)->FinishStart(DataTypeController::OK);
|
| - EXPECT_EQ(DataTypeManager::CONFIGURED, dtm_->state());
|
| - EXPECT_EQ(2U, configurer_.activated_types().Size());
|
| -
|
| - dtm_->Stop();
|
| - EXPECT_EQ(DataTypeManager::STOPPED, dtm_->state());
|
| - EXPECT_TRUE(configurer_.activated_types().Empty());
|
| -}
|
| -
|
| -// Test that once we start a catch up cycle for a type, the type ends up in the
|
| -// clean state and DataTypeManager remains in catch up mode for subsequent
|
| -// overlapping cycles.
|
| -TEST_F(SyncDataTypeManagerImplTest, CatchUpMultipleConfigureCalls) {
|
| - AddController(BOOKMARKS);
|
| - AddController(PASSWORDS);
|
| -
|
| - SetConfigureStartExpectation();
|
| - SetConfigureDoneExpectation(DataTypeManager::OK, DataTypeStatusTable());
|
| -
|
| - // Configure (catch up) with one type.
|
| - configurer_.set_expected_configure_types(
|
| - BackendDataTypeConfigurer::CONFIGURE_CLEAN,
|
| - AddControlTypesTo(ModelTypeSet(BOOKMARKS)));
|
| - dtm_->Configure(ModelTypeSet(BOOKMARKS), syncer::CONFIGURE_REASON_CATCH_UP);
|
| - EXPECT_EQ(DataTypeManager::CONFIGURING, dtm_->state());
|
| -
|
| - // Configure with both types before the first one completes. Both types should
|
| - // end up in CONFIGURE_CLEAN.
|
| - configurer_.set_expected_configure_types(
|
| - BackendDataTypeConfigurer::CONFIGURE_CLEAN,
|
| - AddControlTypesTo(ModelTypeSet(BOOKMARKS, PASSWORDS)));
|
| - dtm_->Configure(ModelTypeSet(BOOKMARKS, PASSWORDS),
|
| - syncer::CONFIGURE_REASON_RECONFIGURATION);
|
| - EXPECT_EQ(DataTypeManager::CONFIGURING, dtm_->state());
|
| -
|
| - FinishDownload(*dtm_, ModelTypeSet(), ModelTypeSet());
|
| - EXPECT_EQ(DataTypeManager::CONFIGURING, dtm_->state());
|
| - FinishDownload(*dtm_, ModelTypeSet(), ModelTypeSet());
|
| - FinishDownload(*dtm_, ModelTypeSet(BOOKMARKS, PASSWORDS), ModelTypeSet());
|
| - EXPECT_EQ(DataTypeManager::CONFIGURING, dtm_->state());
|
| -
|
| - GetController(BOOKMARKS)->FinishStart(DataTypeController::OK);
|
| - EXPECT_EQ(DataTypeManager::CONFIGURING, dtm_->state());
|
| - GetController(PASSWORDS)->FinishStart(DataTypeController::OK);
|
| - EXPECT_EQ(DataTypeManager::CONFIGURED, dtm_->state());
|
| -
|
| - dtm_->Stop();
|
| - EXPECT_EQ(DataTypeManager::STOPPED, dtm_->state());
|
| -}
|
| -
|
| -// Test that DataTypeManagerImpl delays configuration until all datatypes for
|
| -// which ShouldLoadModelBeforeConfigure() returns true loaded their models.
|
| -TEST_F(SyncDataTypeManagerImplTest, DelayConfigureForUSSTypes) {
|
| - AddController(BOOKMARKS);
|
| - GetController(BOOKMARKS)->SetShouldLoadModelBeforeConfigure(true);
|
| - GetController(BOOKMARKS)->SetDelayModelLoad();
|
| -
|
| - SetConfigureStartExpectation();
|
| - SetConfigureDoneExpectation(DataTypeManager::OK, DataTypeStatusTable());
|
| -
|
| - Configure(dtm_.get(), ModelTypeSet(BOOKMARKS));
|
| - EXPECT_EQ(DataTypeManager::CONFIGURING, dtm_->state());
|
| - // Bookmarks model isn't loaded yet and it is required to complete before
|
| - // call to configure. Ensure that configure wasn't called.
|
| - EXPECT_EQ(0, configurer_.configure_call_count());
|
| - EXPECT_EQ(0, GetController(BOOKMARKS)->register_with_backend_call_count());
|
| -
|
| - // Finishing model load should trigger configure.
|
| - GetController(BOOKMARKS)->SimulateModelLoadFinishing();
|
| - EXPECT_EQ(1, configurer_.configure_call_count());
|
| - EXPECT_EQ(1, GetController(BOOKMARKS)->register_with_backend_call_count());
|
| -
|
| - FinishDownload(*dtm_, ModelTypeSet(), ModelTypeSet());
|
| - FinishDownload(*dtm_, ModelTypeSet(BOOKMARKS), ModelTypeSet());
|
| - EXPECT_EQ(DataTypeManager::CONFIGURING, dtm_->state());
|
| -
|
| - GetController(BOOKMARKS)->FinishStart(DataTypeController::OK);
|
| - EXPECT_EQ(DataTypeManager::CONFIGURED, dtm_->state());
|
| - EXPECT_EQ(1U, configurer_.activated_types().Size());
|
| -}
|
| -
|
| -} // namespace sync_driver
|
|
|