1cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)// Copyright 2014 The Chromium Authors. All rights reserved.
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file.
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "components/sync_driver/data_type_manager_impl.h"
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/compiler_specific.h"
89ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch#include "base/message_loop/message_loop.h"
95d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "components/sync_driver/backend_data_type_configurer.h"
105d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "components/sync_driver/data_type_controller.h"
115d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "components/sync_driver/data_type_encryption_handler.h"
125d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "components/sync_driver/data_type_manager_observer.h"
131320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "components/sync_driver/data_type_status_table.h"
145d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "components/sync_driver/fake_data_type_controller.h"
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "sync/internal_api/public/base/model_type.h"
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "sync/internal_api/public/configure_reason.h"
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "testing/gtest/include/gtest/gtest.h"
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
195f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)namespace sync_driver {
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
211320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucciusing syncer::SyncError;
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using syncer::ModelType;
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using syncer::ModelTypeSet;
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using syncer::ModelTypeToString;
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using syncer::BOOKMARKS;
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using syncer::APPS;
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using syncer::PASSWORDS;
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using syncer::PREFERENCES;
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using syncer::NIGORI;
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
31868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)namespace {
32868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
33ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch// Helper for unioning with priority types.
341320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TucciModelTypeSet AddHighPriorityTypesTo(ModelTypeSet types) {
351320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  ModelTypeSet result = syncer::ControlTypes();
36eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  result.PutAll(types);
37eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  return result;
38eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch}
39eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
401320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TucciDataTypeStatusTable BuildStatusTable(ModelTypeSet crypto_errors,
411320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                                     ModelTypeSet association_errors,
421320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                                     ModelTypeSet unready_errors,
431320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                                     ModelTypeSet unrecoverable_errors) {
441320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  DataTypeStatusTable::TypeErrorMap error_map;
451320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  for (ModelTypeSet::Iterator iter = crypto_errors.First(); iter.Good();
461320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci       iter.Inc()) {
471320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    error_map[iter.Get()] = SyncError(FROM_HERE,
481320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                                      SyncError::CRYPTO_ERROR,
491320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                                      "crypto error expected",
501320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                                      iter.Get());
511320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  }
521320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  for (ModelTypeSet::Iterator iter = association_errors.First(); iter.Good();
531320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci       iter.Inc()) {
541320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    error_map[iter.Get()] = SyncError(FROM_HERE,
551320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                                      SyncError::DATATYPE_ERROR,
561320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                                      "association error expected",
571320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                                      iter.Get());
581320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  }
591320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  for (ModelTypeSet::Iterator iter = unready_errors.First(); iter.Good();
601320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci       iter.Inc()) {
611320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    error_map[iter.Get()] = SyncError(FROM_HERE,
621320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                                      SyncError::UNREADY_ERROR,
631320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                                      "unready error expected",
641320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                                      iter.Get());
651320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  }
661320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  for (ModelTypeSet::Iterator iter = unrecoverable_errors.First(); iter.Good();
671320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci       iter.Inc()) {
681320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    error_map[iter.Get()] = SyncError(FROM_HERE,
691320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                                      SyncError::UNRECOVERABLE_ERROR,
701320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                                      "unrecoverable error expected",
711320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                                      iter.Get());
721320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  }
731320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  DataTypeStatusTable status_table;
741320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  status_table.UpdateFailedDataTypes(error_map);
751320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  return status_table;
761320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}
771320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Fake BackendDataTypeConfigurer implementation that simply stores away the
795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// callback passed into ConfigureDataTypes.
805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class FakeBackendDataTypeConfigurer : public BackendDataTypeConfigurer {
815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  FakeBackendDataTypeConfigurer() {}
835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual ~FakeBackendDataTypeConfigurer() {}
845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void ConfigureDataTypes(
865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      syncer::ConfigureReason reason,
872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      const DataTypeConfigStateMap& config_state_map,
88b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)      const base::Callback<void(ModelTypeSet,
89b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)                                ModelTypeSet)>& ready_task,
905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      const base::Callback<void()>& retry_callback) OVERRIDE {
915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    last_ready_task_ = ready_task;
92868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
93868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    if (!expected_configure_types_.Empty()) {
94868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      EXPECT_TRUE(
95868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)          expected_configure_types_.Equals(
96868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)              GetDataTypesInState(CONFIGURE_ACTIVE, config_state_map)))
971320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci          << ModelTypeSetToString(expected_configure_types_)
98868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)          << " v.s. "
991320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci          << ModelTypeSetToString(
100868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)              GetDataTypesInState(CONFIGURE_ACTIVE, config_state_map));
101868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    }
1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
104010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  virtual void ActivateDataType(
105010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      syncer::ModelType type, syncer::ModelSafeGroup group,
106f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      ChangeProcessor* change_processor) OVERRIDE {
107f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    activated_types_.Put(type);
108f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  }
109f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  virtual void DeactivateDataType(syncer::ModelType type) OVERRIDE {
110f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    activated_types_.Remove(type);
111f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  }
112010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
113b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  base::Callback<void(ModelTypeSet, ModelTypeSet)> last_ready_task() const {
1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return last_ready_task_;
1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1171320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  void set_expected_configure_types(ModelTypeSet types) {
118868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    expected_configure_types_ = types;
119868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  }
120868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
1211320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  const ModelTypeSet activated_types() { return activated_types_; }
122f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
124b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  base::Callback<void(ModelTypeSet, ModelTypeSet)> last_ready_task_;
1251320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  ModelTypeSet expected_configure_types_;
1261320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  ModelTypeSet activated_types_;
1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1291320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci// DataTypeManagerObserver implementation.
1301320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucciclass FakeDataTypeManagerObserver : public DataTypeManagerObserver {
1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
1321320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  FakeDataTypeManagerObserver() { ResetExpectations(); }
1331320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  virtual ~FakeDataTypeManagerObserver() {
1341320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    EXPECT_FALSE(start_expected_);
1351320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    DataTypeManager::ConfigureResult default_result;
1361320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    EXPECT_EQ(done_expectation_.status, default_result.status);
1371320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    EXPECT_TRUE(
1381320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        done_expectation_.data_type_status_table.GetFailedTypes().Empty());
1391320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  }
1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1411320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  void ExpectStart() {
1421320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    start_expected_ = true;
1431320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  }
1441320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  void ExpectDone(const DataTypeManager::ConfigureResult& result) {
1451320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    done_expectation_ = result;
1461320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  }
1471320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  void ResetExpectations() {
1481320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    start_expected_ = false;
1491320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    done_expectation_ = DataTypeManager::ConfigureResult();
1501320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  }
1511320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
1521320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  virtual void OnConfigureDone(
1531320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      const DataTypeManager::ConfigureResult& result) OVERRIDE {
1541320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    EXPECT_EQ(done_expectation_.status, result.status);
1551320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    DataTypeStatusTable::TypeErrorMap errors =
1561320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        result.data_type_status_table.GetAllErrors();
1571320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    DataTypeStatusTable::TypeErrorMap expected_errors =
1581320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        done_expectation_.data_type_status_table.GetAllErrors();
1591320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    ASSERT_EQ(expected_errors.size(), errors.size());
1601320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    for (DataTypeStatusTable::TypeErrorMap::const_iterator iter =
1611320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci             expected_errors.begin();
1621320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci         iter != expected_errors.end();
1631320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci         ++iter) {
1641320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      ASSERT_TRUE(errors.find(iter->first) != errors.end());
1651320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      ASSERT_EQ(iter->second.error_type(),
1661320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                errors.find(iter->first)->second.error_type());
1671320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    }
1681320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    done_expectation_ = DataTypeManager::ConfigureResult();
1691320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  }
1701320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
1711320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  virtual void OnConfigureRetry() OVERRIDE{
1721320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    // Not verified.
1731320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  }
1741320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
1751320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  virtual void OnConfigureStart() OVERRIDE {
1761320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    EXPECT_TRUE(start_expected_);
1771320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    start_expected_ = false;
1781320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  }
1791320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
1801320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci private:
1811320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  bool start_expected_ = true;
1821320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  DataTypeManager::ConfigureResult done_expectation_;
1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
185868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)class FakeDataTypeEncryptionHandler : public DataTypeEncryptionHandler {
186868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) public:
187868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  FakeDataTypeEncryptionHandler();
188868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  virtual ~FakeDataTypeEncryptionHandler();
189868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
190868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  virtual bool IsPassphraseRequired() const OVERRIDE;
1911320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  virtual ModelTypeSet GetEncryptedDataTypes() const OVERRIDE;
192868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
193868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  void set_passphrase_required(bool passphrase_required) {
194868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    passphrase_required_ = passphrase_required;
195868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  }
1961320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  void set_encrypted_types(ModelTypeSet encrypted_types) {
197868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    encrypted_types_ = encrypted_types;
198868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  }
199868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) private:
200868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  bool passphrase_required_;
2011320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  ModelTypeSet encrypted_types_;
202868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)};
203868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
204868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)FakeDataTypeEncryptionHandler::FakeDataTypeEncryptionHandler()
205868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    : passphrase_required_(false) {}
206868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)FakeDataTypeEncryptionHandler::~FakeDataTypeEncryptionHandler() {}
207868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
208868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)bool FakeDataTypeEncryptionHandler::IsPassphraseRequired() const {
209868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  return passphrase_required_;
210868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)}
211868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
2121320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TucciModelTypeSet
213868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)FakeDataTypeEncryptionHandler::GetEncryptedDataTypes() const {
214868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  return encrypted_types_;
2155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
217eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch} // namespace
218eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
219868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)class TestDataTypeManager : public DataTypeManagerImpl {
220868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) public:
221868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  TestDataTypeManager(
222868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      const syncer::WeakHandle<syncer::DataTypeDebugInfoListener>&
223868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)          debug_info_listener,
224868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      BackendDataTypeConfigurer* configurer,
225868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      const DataTypeController::TypeMap* controllers,
226868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      const DataTypeEncryptionHandler* encryption_handler,
2271320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      DataTypeManagerObserver* observer)
228cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      : DataTypeManagerImpl(base::Closure(),
229cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)                            debug_info_listener,
230868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                            controllers,
231868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                            encryption_handler,
232868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                            configurer,
2331320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                            observer),
2345d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        custom_priority_types_(syncer::ControlTypes()) {}
235868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
2361320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  void set_priority_types(const ModelTypeSet& priority_types) {
237eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    custom_priority_types_ = priority_types;
238868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  }
239868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
2405d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  DataTypeManager::ConfigureResult configure_result() const {
2415d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    return configure_result_;
2425d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  }
2435d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
2445d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  virtual void OnModelAssociationDone(
2455d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      const DataTypeManager::ConfigureResult& result) OVERRIDE {
2465d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    configure_result_ = result;
2475d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    DataTypeManagerImpl::OnModelAssociationDone(result);
2485d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  }
2495d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
250eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch private:
2511320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  virtual ModelTypeSet GetPriorityTypes() const OVERRIDE {
252eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    return custom_priority_types_;
253868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  }
254868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
2551320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  ModelTypeSet custom_priority_types_;
2565d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  DataTypeManager::ConfigureResult configure_result_;
257868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)};
258868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
2595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// The actual test harness class, parametrized on nigori state (i.e., tests are
2605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// run both configuring with nigori, and configuring without).
2615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class SyncDataTypeManagerImplTest : public testing::Test {
2625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
263cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  SyncDataTypeManagerImplTest() {}
2645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual ~SyncDataTypeManagerImplTest() {
2665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) protected:
2695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void SetUp() {
2702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)   dtm_.reset(
271868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)       new TestDataTypeManager(
2722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)           syncer::WeakHandle<syncer::DataTypeDebugInfoListener>(),
2732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)           &configurer_,
2742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)           &controllers_,
275868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)           &encryption_handler_,
2761320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci           &observer_));
2775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void SetConfigureStartExpectation() {
2801320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    observer_.ExpectStart();
2815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2831320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  void SetConfigureDoneExpectation(DataTypeManager::ConfigureStatus status,
2841320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                                   const DataTypeStatusTable& status_table) {
2851320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    DataTypeManager::ConfigureResult result;
2861320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    result.status = status;
2871320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    result.data_type_status_table = status_table;
2881320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    observer_.ExpectDone(result);
2895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Configure the given DTM with the given desired types.
2925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void Configure(DataTypeManagerImpl* dtm,
2931320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                 const ModelTypeSet& desired_types) {
2945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    dtm->Configure(desired_types, syncer::CONFIGURE_REASON_RECONFIGURATION);
2955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Finish downloading for the given DTM. Should be done only after
2985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // a call to Configure().
2995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void FinishDownload(const DataTypeManager& dtm,
300b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)                      ModelTypeSet types_to_configure,
3015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                      ModelTypeSet failed_download_types) {
302868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    EXPECT_TRUE(DataTypeManager::DOWNLOAD_PENDING == dtm.state() ||
303868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                DataTypeManager::CONFIGURING == dtm.state());
3045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_FALSE(configurer_.last_ready_task().is_null());
305b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)    configurer_.last_ready_task().Run(
306b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)        syncer::Difference(types_to_configure, failed_download_types),
307b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)        failed_download_types);
3085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
3095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Adds a fake controller for the given type to |controllers_|.
3115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Should be called only before setting up the DTM.
3125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void AddController(ModelType model_type) {
3135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    controllers_[model_type] = new FakeDataTypeController(model_type);
3145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
3155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Gets the fake controller for the given type, which should have
3175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // been previously added via AddController().
3185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_refptr<FakeDataTypeController> GetController(
3195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      ModelType model_type) const {
3205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    DataTypeController::TypeMap::const_iterator it =
3215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        controllers_.find(model_type);
3225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (it == controllers_.end()) {
3235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return NULL;
3245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
3255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return make_scoped_refptr(
3265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        static_cast<FakeDataTypeController*>(it->second.get()));
3275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
3285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3291320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  void FailEncryptionFor(ModelTypeSet encrypted_types) {
330868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    encryption_handler_.set_passphrase_required(true);
331868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    encryption_handler_.set_encrypted_types(encrypted_types);
332868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  }
333868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
33490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  base::MessageLoopForUI ui_loop_;
3355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DataTypeController::TypeMap controllers_;
3365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  FakeBackendDataTypeConfigurer configurer_;
3371320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  FakeDataTypeManagerObserver observer_;
338868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  scoped_ptr<TestDataTypeManager> dtm_;
339868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  FakeDataTypeEncryptionHandler encryption_handler_;
3405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
3415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Set up a DTM with no controllers, configure it, finish downloading,
3435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// and then stop it.
3445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(SyncDataTypeManagerImplTest, NoControllers) {
3455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SetConfigureStartExpectation();
3461320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  SetConfigureDoneExpectation(DataTypeManager::OK, DataTypeStatusTable());
3475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  Configure(dtm_.get(), ModelTypeSet());
3492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(DataTypeManager::DOWNLOAD_PENDING, dtm_->state());
3505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
351b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  FinishDownload(*dtm_, ModelTypeSet(), ModelTypeSet());
3522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(DataTypeManager::CONFIGURED, dtm_->state());
3535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  dtm_->Stop();
3552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(DataTypeManager::STOPPED, dtm_->state());
3565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Set up a DTM with a single controller, configure it, finish
3595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// downloading, finish starting the controller, and then stop the DTM.
3605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(SyncDataTypeManagerImplTest, ConfigureOne) {
3615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AddController(BOOKMARKS);
3625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SetConfigureStartExpectation();
3641320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  SetConfigureDoneExpectation(DataTypeManager::OK, DataTypeStatusTable());
3655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  Configure(dtm_.get(), ModelTypeSet(BOOKMARKS));
3672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(DataTypeManager::DOWNLOAD_PENDING, dtm_->state());
3685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
369ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  FinishDownload(*dtm_, ModelTypeSet(), ModelTypeSet());
370b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  FinishDownload(*dtm_, ModelTypeSet(BOOKMARKS), ModelTypeSet());
3712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(DataTypeManager::CONFIGURING, dtm_->state());
3725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GetController(BOOKMARKS)->FinishStart(DataTypeController::OK);
3742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(DataTypeManager::CONFIGURED, dtm_->state());
375f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  EXPECT_EQ(1U, configurer_.activated_types().Size());
3765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  dtm_->Stop();
3782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(DataTypeManager::STOPPED, dtm_->state());
379f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  EXPECT_TRUE(configurer_.activated_types().Empty());
3805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Set up a DTM with a single controller, configure it, but stop it
3835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// before finishing the download.  It should still be safe to run the
3845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// download callback even after the DTM is stopped and destroyed.
3855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(SyncDataTypeManagerImplTest, ConfigureOneStopWhileDownloadPending) {
3865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AddController(BOOKMARKS);
3875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {
3895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    SetConfigureStartExpectation();
3901320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    SetConfigureDoneExpectation(DataTypeManager::ABORTED,
3911320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                                DataTypeStatusTable());
3925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    Configure(dtm_.get(), ModelTypeSet(BOOKMARKS));
3942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    EXPECT_EQ(DataTypeManager::DOWNLOAD_PENDING, dtm_->state());
3955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    dtm_->Stop();
3972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    EXPECT_EQ(DataTypeManager::STOPPED, dtm_->state());
3985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
3995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
400b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  configurer_.last_ready_task().Run(ModelTypeSet(BOOKMARKS), ModelTypeSet());
401f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  EXPECT_TRUE(configurer_.activated_types().Empty());
4025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Set up a DTM with a single controller, configure it, finish
4055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// downloading, but stop the DTM before the controller finishes
4065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// starting up.  It should still be safe to finish starting up the
4075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// controller even after the DTM is stopped and destroyed.
4085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(SyncDataTypeManagerImplTest, ConfigureOneStopWhileStartingModel) {
4095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AddController(BOOKMARKS);
4105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {
4125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    SetConfigureStartExpectation();
4131320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    SetConfigureDoneExpectation(DataTypeManager::ABORTED,
4141320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                                DataTypeStatusTable());
4155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    Configure(dtm_.get(), ModelTypeSet(BOOKMARKS));
4172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    EXPECT_EQ(DataTypeManager::DOWNLOAD_PENDING, dtm_->state());
4185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
419ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch    FinishDownload(*dtm_, ModelTypeSet(), ModelTypeSet());
420b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)    FinishDownload(*dtm_, ModelTypeSet(BOOKMARKS), ModelTypeSet());
4212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    EXPECT_EQ(DataTypeManager::CONFIGURING, dtm_->state());
4225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    dtm_->Stop();
4242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    EXPECT_EQ(DataTypeManager::STOPPED, dtm_->state());
4252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    dtm_.reset();
4265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
4275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GetController(BOOKMARKS)->FinishStart(DataTypeController::OK);
429f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  EXPECT_TRUE(configurer_.activated_types().Empty());
4305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Set up a DTM with a single controller, configure it, finish
4335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// downloading, start the controller's model, but stop the DTM before
4345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// the controller finishes starting up.  It should still be safe to
4355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// finish starting up the controller even after the DTM is stopped and
4365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// destroyed.
4375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(SyncDataTypeManagerImplTest, ConfigureOneStopWhileAssociating) {
4385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AddController(BOOKMARKS);
439eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
4405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {
4415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    SetConfigureStartExpectation();
4421320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    SetConfigureDoneExpectation(DataTypeManager::ABORTED,
4431320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                                DataTypeStatusTable());
4445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    Configure(dtm_.get(), ModelTypeSet(BOOKMARKS));
4462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    EXPECT_EQ(DataTypeManager::DOWNLOAD_PENDING, dtm_->state());
4475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
448ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch    FinishDownload(*dtm_, ModelTypeSet(), ModelTypeSet());
449b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)    FinishDownload(*dtm_, ModelTypeSet(BOOKMARKS), ModelTypeSet());
4502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    EXPECT_EQ(DataTypeManager::CONFIGURING, dtm_->state());
451f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    EXPECT_TRUE(configurer_.activated_types().Empty());
4525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    dtm_->Stop();
4542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    EXPECT_EQ(DataTypeManager::STOPPED, dtm_->state());
4552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    dtm_.reset();
4565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
4575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GetController(BOOKMARKS)->FinishStart(DataTypeController::OK);
459f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  EXPECT_TRUE(configurer_.activated_types().Empty());
4605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Set up a DTM with a single controller.  Then:
4635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//
4645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//   1) Configure.
4655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//   2) Finish the download for step 1.
4665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//   3) Finish starting the controller with the NEEDS_CRYPTO status.
467868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)//   4) Complete download for the reconfiguration without the controller.
468868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)//   5) Stop the DTM.
4695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(SyncDataTypeManagerImplTest, OneWaitingForCrypto) {
4705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AddController(PASSWORDS);
4715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SetConfigureStartExpectation();
4731320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  SetConfigureDoneExpectation(DataTypeManager::OK,
4741320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                              BuildStatusTable(ModelTypeSet(PASSWORDS),
4751320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                                               ModelTypeSet(),
4761320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                                               ModelTypeSet(),
4771320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                                               ModelTypeSet()));
4785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const ModelTypeSet types(PASSWORDS);
4805d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  dtm_->set_priority_types(AddHighPriorityTypesTo(types));
4815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Step 1.
4832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  Configure(dtm_.get(), types);
4842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(DataTypeManager::DOWNLOAD_PENDING, dtm_->state());
4855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Step 2.
487ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  FinishDownload(*dtm_, ModelTypeSet(), ModelTypeSet());
4882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(DataTypeManager::CONFIGURING, dtm_->state());
4895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Step 3.
491868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  FailEncryptionFor(types);
4925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GetController(PASSWORDS)->FinishStart(DataTypeController::NEEDS_CRYPTO);
4932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(DataTypeManager::DOWNLOAD_PENDING, dtm_->state());
4945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
495868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // Step 4.
496868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  FinishDownload(*dtm_, ModelTypeSet(), ModelTypeSet());
4972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(DataTypeManager::CONFIGURED, dtm_->state());
4985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
499868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // Step 5.
5002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  dtm_->Stop();
5012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(DataTypeManager::STOPPED, dtm_->state());
5025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
5035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Set up a DTM with two controllers.  Then:
5055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//
5065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//   1) Configure with first controller.
5075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//   2) Finish the download for step 1.
5085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//   3) Finish starting the first controller.
5095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//   4) Configure with both controllers.
5105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//   5) Finish the download for step 4.
5115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//   6) Finish starting the second controller.
5125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//   7) Stop the DTM.
5135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(SyncDataTypeManagerImplTest, ConfigureOneThenBoth) {
5145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AddController(BOOKMARKS);
5155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AddController(PREFERENCES);
5165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SetConfigureStartExpectation();
5181320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  SetConfigureDoneExpectation(DataTypeManager::OK, DataTypeStatusTable());
5195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Step 1.
5212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  Configure(dtm_.get(), ModelTypeSet(BOOKMARKS));
5222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(DataTypeManager::DOWNLOAD_PENDING, dtm_->state());
5235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Step 2.
525ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  FinishDownload(*dtm_, ModelTypeSet(), ModelTypeSet());
526b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  FinishDownload(*dtm_, ModelTypeSet(BOOKMARKS), ModelTypeSet());
5272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(DataTypeManager::CONFIGURING, dtm_->state());
5285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Step 3.
5305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GetController(BOOKMARKS)->FinishStart(DataTypeController::OK);
5312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(DataTypeManager::CONFIGURED, dtm_->state());
5325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5331320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  observer_.ResetExpectations();
5345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SetConfigureStartExpectation();
5351320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  SetConfigureDoneExpectation(DataTypeManager::OK, DataTypeStatusTable());
5365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Step 4.
5382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  Configure(dtm_.get(), ModelTypeSet(BOOKMARKS, PREFERENCES));
5392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(DataTypeManager::DOWNLOAD_PENDING, dtm_->state());
5405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Step 5.
542ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  FinishDownload(*dtm_, ModelTypeSet(), ModelTypeSet());
543b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  FinishDownload(*dtm_, ModelTypeSet(BOOKMARKS, PREFERENCES), ModelTypeSet());
5442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(DataTypeManager::CONFIGURING, dtm_->state());
5455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Step 6.
5475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GetController(PREFERENCES)->FinishStart(DataTypeController::OK);
5482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(DataTypeManager::CONFIGURED, dtm_->state());
549f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  EXPECT_EQ(2U, configurer_.activated_types().Size());
5505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Step 7.
5522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  dtm_->Stop();
5532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(DataTypeManager::STOPPED, dtm_->state());
554f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  EXPECT_TRUE(configurer_.activated_types().Empty());
5555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
5565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Set up a DTM with two controllers.  Then:
5585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//
5595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//   1) Configure with first controller.
5605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//   2) Finish the download for step 1.
5615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//   3) Finish starting the first controller.
5625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//   4) Configure with second controller.
5635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//   5) Finish the download for step 4.
5645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//   6) Finish starting the second controller.
5655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//   7) Stop the DTM.
5665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(SyncDataTypeManagerImplTest, ConfigureOneThenSwitch) {
5675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AddController(BOOKMARKS);
5685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AddController(PREFERENCES);
5695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SetConfigureStartExpectation();
5711320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  SetConfigureDoneExpectation(DataTypeManager::OK, DataTypeStatusTable());
5725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Step 1.
5742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  Configure(dtm_.get(), ModelTypeSet(BOOKMARKS));
5752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(DataTypeManager::DOWNLOAD_PENDING, dtm_->state());
5765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Step 2.
578ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  FinishDownload(*dtm_, ModelTypeSet(), ModelTypeSet());
579b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  FinishDownload(*dtm_, ModelTypeSet(BOOKMARKS), ModelTypeSet());
5802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(DataTypeManager::CONFIGURING, dtm_->state());
5815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Step 3.
5835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GetController(BOOKMARKS)->FinishStart(DataTypeController::OK);
5842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(DataTypeManager::CONFIGURED, dtm_->state());
5855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5861320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  observer_.ResetExpectations();
5875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SetConfigureStartExpectation();
5881320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  SetConfigureDoneExpectation(DataTypeManager::OK, DataTypeStatusTable());
5895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Step 4.
5912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  Configure(dtm_.get(), ModelTypeSet(PREFERENCES));
5922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(DataTypeManager::DOWNLOAD_PENDING, dtm_->state());
5935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Step 5.
595ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  FinishDownload(*dtm_, ModelTypeSet(), ModelTypeSet());
596b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  FinishDownload(*dtm_, ModelTypeSet(PREFERENCES), ModelTypeSet());
5972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(DataTypeManager::CONFIGURING, dtm_->state());
5985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Step 6.
6005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GetController(PREFERENCES)->FinishStart(DataTypeController::OK);
6012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(DataTypeManager::CONFIGURED, dtm_->state());
602f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  EXPECT_EQ(1U, configurer_.activated_types().Size());
6035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Step 7.
6052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  dtm_->Stop();
6062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(DataTypeManager::STOPPED, dtm_->state());
607f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  EXPECT_TRUE(configurer_.activated_types().Empty());
6085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
6095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Set up a DTM with two controllers.  Then:
6115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//
6125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//   1) Configure with first controller.
6135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//   2) Finish the download for step 1.
6145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//   3) Configure with both controllers.
6155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//   4) Finish starting the first controller.
6165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//   5) Finish the download for step 3.
6175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//   6) Finish starting the second controller.
6185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//   7) Stop the DTM.
6195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(SyncDataTypeManagerImplTest, ConfigureWhileOneInFlight) {
6205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AddController(BOOKMARKS);
6215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AddController(PREFERENCES);
6225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SetConfigureStartExpectation();
6241320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  SetConfigureDoneExpectation(DataTypeManager::OK, DataTypeStatusTable());
6255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Step 1.
6272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  Configure(dtm_.get(), ModelTypeSet(BOOKMARKS));
6282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(DataTypeManager::DOWNLOAD_PENDING, dtm_->state());
6295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Step 2.
631ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  FinishDownload(*dtm_, ModelTypeSet(), ModelTypeSet());
632b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  FinishDownload(*dtm_, ModelTypeSet(BOOKMARKS), ModelTypeSet());
6332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(DataTypeManager::CONFIGURING, dtm_->state());
6345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Step 3.
6362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  Configure(dtm_.get(), ModelTypeSet(BOOKMARKS, PREFERENCES));
6372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(DataTypeManager::CONFIGURING, dtm_->state());
6385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Step 4.
6405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GetController(BOOKMARKS)->FinishStart(DataTypeController::OK);
6412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(DataTypeManager::DOWNLOAD_PENDING, dtm_->state());
6425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Step 5.
644ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  FinishDownload(*dtm_, ModelTypeSet(), ModelTypeSet());
645b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  FinishDownload(*dtm_, ModelTypeSet(BOOKMARKS, PREFERENCES), ModelTypeSet());
6462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(DataTypeManager::CONFIGURING, dtm_->state());
6475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Step 6.
6495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GetController(PREFERENCES)->FinishStart(DataTypeController::OK);
6502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(DataTypeManager::CONFIGURED, dtm_->state());
651f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  EXPECT_EQ(2U, configurer_.activated_types().Size());
6525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Step 7.
6542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  dtm_->Stop();
6552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(DataTypeManager::STOPPED, dtm_->state());
656f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  EXPECT_TRUE(configurer_.activated_types().Empty());
6575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
6585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Set up a DTM with one controller.  Then configure, finish
6605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// downloading, and start the controller with an unrecoverable error.
6615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// The unrecoverable error should cause the DTM to stop.
6625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(SyncDataTypeManagerImplTest, OneFailingController) {
6635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AddController(BOOKMARKS);
6645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SetConfigureStartExpectation();
6661320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  SetConfigureDoneExpectation(DataTypeManager::UNRECOVERABLE_ERROR,
6671320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                              BuildStatusTable(ModelTypeSet(),
6681320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                                               ModelTypeSet(),
6691320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                                               ModelTypeSet(),
6701320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                                               ModelTypeSet(BOOKMARKS)));
6715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  Configure(dtm_.get(), ModelTypeSet(BOOKMARKS));
6732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(DataTypeManager::DOWNLOAD_PENDING, dtm_->state());
6745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
675ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  FinishDownload(*dtm_, ModelTypeSet(), ModelTypeSet());
676b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  FinishDownload(*dtm_, ModelTypeSet(BOOKMARKS), ModelTypeSet());
6772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(DataTypeManager::CONFIGURING, dtm_->state());
678f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  EXPECT_TRUE(configurer_.activated_types().Empty());
6795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GetController(BOOKMARKS)->FinishStart(
6815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      DataTypeController::UNRECOVERABLE_ERROR);
6822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(DataTypeManager::STOPPED, dtm_->state());
683f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  EXPECT_TRUE(configurer_.activated_types().Empty());
6845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
6855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Set up a DTM with two controllers.  Then:
6875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//
6885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//   1) Configure with both controllers.
6895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//   2) Finish the download for step 1.
6905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//   3) Finish starting the first controller successfully.
6915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//   4) Finish starting the second controller with an unrecoverable error.
6925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//
6935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// The failure from step 4 should cause the DTM to stop.
6945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(SyncDataTypeManagerImplTest, SecondControllerFails) {
6955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AddController(BOOKMARKS);
6965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AddController(PREFERENCES);
6975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SetConfigureStartExpectation();
6991320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  SetConfigureDoneExpectation(DataTypeManager::UNRECOVERABLE_ERROR,
7001320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                              BuildStatusTable(ModelTypeSet(),
7011320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                                               ModelTypeSet(),
7021320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                                               ModelTypeSet(),
7031320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                                               ModelTypeSet(PREFERENCES)));
7045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Step 1.
7062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  Configure(dtm_.get(), ModelTypeSet(BOOKMARKS, PREFERENCES));
7072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(DataTypeManager::DOWNLOAD_PENDING, dtm_->state());
7085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Step 2.
710ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  FinishDownload(*dtm_, ModelTypeSet(), ModelTypeSet());
711b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  FinishDownload(*dtm_, ModelTypeSet(BOOKMARKS, PREFERENCES), ModelTypeSet());
7122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(DataTypeManager::CONFIGURING, dtm_->state());
7135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Step 3.
7155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GetController(BOOKMARKS)->FinishStart(DataTypeController::OK);
7162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(DataTypeManager::CONFIGURING, dtm_->state());
7175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Step 4.
7195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GetController(PREFERENCES)->FinishStart(
7205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      DataTypeController::UNRECOVERABLE_ERROR);
7212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(DataTypeManager::STOPPED, dtm_->state());
7225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
7235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Set up a DTM with two controllers.  Then:
7255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//
7265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//   1) Configure with both controllers.
7275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//   2) Finish the download for step 1.
728868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)//   3) Finish starting the first controller successfully.
729868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)//   4) Finish starting the second controller with an association failure.
730868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)//   5) Finish the purge/reconfigure without the failed type.
731868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)//   6) Stop the DTM.
7325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//
7335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// The association failure from step 3 should be ignored.
7345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//
7355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// TODO(akalin): Check that the data type that failed association is
7365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// recorded in the CONFIGURE_DONE notification.
7375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(SyncDataTypeManagerImplTest, OneControllerFailsAssociation) {
7385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AddController(BOOKMARKS);
7395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AddController(PREFERENCES);
7405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SetConfigureStartExpectation();
7421320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  SetConfigureDoneExpectation(DataTypeManager::OK,
7431320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                              BuildStatusTable(ModelTypeSet(),
7441320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                                               ModelTypeSet(PREFERENCES),
7451320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                                               ModelTypeSet(),
7461320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                                               ModelTypeSet()));
7475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Step 1.
7492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  Configure(dtm_.get(), ModelTypeSet(BOOKMARKS, PREFERENCES));
7502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(DataTypeManager::DOWNLOAD_PENDING, dtm_->state());
7515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Step 2.
753ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  FinishDownload(*dtm_, ModelTypeSet(), ModelTypeSet());
754b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  FinishDownload(*dtm_, ModelTypeSet(BOOKMARKS, PREFERENCES), ModelTypeSet());
7552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(DataTypeManager::CONFIGURING, dtm_->state());
7565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Step 3.
7585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GetController(BOOKMARKS)->FinishStart(DataTypeController::OK);
7592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(DataTypeManager::CONFIGURING, dtm_->state());
7605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Step 4.
7625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GetController(PREFERENCES)->FinishStart(
7635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      DataTypeController::ASSOCIATION_FAILED);
764868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  EXPECT_EQ(DataTypeManager::DOWNLOAD_PENDING, dtm_->state());
7655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Step 5.
767ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  FinishDownload(*dtm_, ModelTypeSet(), ModelTypeSet());
768868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  FinishDownload(*dtm_, ModelTypeSet(BOOKMARKS), ModelTypeSet());
769868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  EXPECT_EQ(DataTypeManager::CONFIGURED, dtm_->state());
770f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  EXPECT_EQ(1U, configurer_.activated_types().Size());
771868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
772868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // Step 6.
7732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  dtm_->Stop();
7742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(DataTypeManager::STOPPED, dtm_->state());
775f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  EXPECT_TRUE(configurer_.activated_types().Empty());
7765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
7775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Set up a DTM with two controllers.  Then:
7795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//
7805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//   1) Configure with first controller.
7815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//   2) Configure with both controllers.
7825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//   3) Finish the download for step 1.
7835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//   4) Finish the download for step 2.
7845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//   5) Finish starting both controllers.
7855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//   6) Stop the DTM.
7865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(SyncDataTypeManagerImplTest, ConfigureWhileDownloadPending) {
7875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AddController(BOOKMARKS);
7885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AddController(PREFERENCES);
7895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SetConfigureStartExpectation();
7911320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  SetConfigureDoneExpectation(DataTypeManager::OK, DataTypeStatusTable());
7925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Step 1.
7942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  Configure(dtm_.get(), ModelTypeSet(BOOKMARKS));
7952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(DataTypeManager::DOWNLOAD_PENDING, dtm_->state());
7965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Step 2.
7982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  Configure(dtm_.get(), ModelTypeSet(BOOKMARKS, PREFERENCES));
7992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(DataTypeManager::DOWNLOAD_PENDING, dtm_->state());
8005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Step 3.
802ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  FinishDownload(*dtm_, ModelTypeSet(), ModelTypeSet());
8032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(DataTypeManager::DOWNLOAD_PENDING, dtm_->state());
8045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Step 4.
806ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  FinishDownload(*dtm_, ModelTypeSet(), ModelTypeSet());
807b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  FinishDownload(*dtm_, ModelTypeSet(BOOKMARKS, PREFERENCES), ModelTypeSet());
8082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(DataTypeManager::CONFIGURING, dtm_->state());
8095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Step 5.
8115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GetController(BOOKMARKS)->FinishStart(DataTypeController::OK);
8122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(DataTypeManager::CONFIGURING, dtm_->state());
8135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GetController(PREFERENCES)->FinishStart(DataTypeController::OK);
8142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(DataTypeManager::CONFIGURED, dtm_->state());
8155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Step 6.
8172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  dtm_->Stop();
8182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(DataTypeManager::STOPPED, dtm_->state());
8195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
8205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Set up a DTM with two controllers.  Then:
8225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//
8235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//   1) Configure with first controller.
8245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//   2) Configure with both controllers.
8255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//   3) Finish the download for step 1 with a failed data type.
8265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//   4) Finish the download for step 2 successfully.
8275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//   5) Finish starting both controllers.
8285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//   6) Stop the DTM.
8295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//
8305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// The failure from step 3 should be ignored since there's a
8315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// reconfigure pending from step 2.
8325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(SyncDataTypeManagerImplTest, ConfigureWhileDownloadPendingWithFailure) {
8335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AddController(BOOKMARKS);
8345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AddController(PREFERENCES);
8355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SetConfigureStartExpectation();
8371320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  SetConfigureDoneExpectation(DataTypeManager::OK, DataTypeStatusTable());
8385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Step 1.
8402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  Configure(dtm_.get(), ModelTypeSet(BOOKMARKS));
841ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  FinishDownload(*dtm_, ModelTypeSet(), ModelTypeSet());
842ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  EXPECT_EQ(DataTypeManager::CONFIGURING, dtm_->state());
8435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Step 2.
8452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  Configure(dtm_.get(), ModelTypeSet(BOOKMARKS, PREFERENCES));
846ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  EXPECT_EQ(DataTypeManager::CONFIGURING, dtm_->state());
8475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Step 3.
849ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  FinishDownload(*dtm_, ModelTypeSet(), ModelTypeSet());
850ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  FinishDownload(*dtm_, ModelTypeSet(BOOKMARKS), ModelTypeSet());
851ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  EXPECT_EQ(DataTypeManager::CONFIGURING, dtm_->state());
8525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Step 4.
854b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  FinishDownload(*dtm_, ModelTypeSet(BOOKMARKS, PREFERENCES), ModelTypeSet());
8552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(DataTypeManager::CONFIGURING, dtm_->state());
8565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Step 5.
8585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GetController(BOOKMARKS)->FinishStart(DataTypeController::OK);
8592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(DataTypeManager::CONFIGURING, dtm_->state());
8605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GetController(PREFERENCES)->FinishStart(DataTypeController::OK);
8612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(DataTypeManager::CONFIGURED, dtm_->state());
8625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Step 6.
8642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  dtm_->Stop();
8652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(DataTypeManager::STOPPED, dtm_->state());
8665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
8675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Tests a Purge then Configure.  This is similar to the sequence of
8695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// operations that would be invoked by the BackendMigrator.
8705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(SyncDataTypeManagerImplTest, MigrateAll) {
8715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AddController(BOOKMARKS);
8725d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  dtm_->set_priority_types(AddHighPriorityTypesTo(ModelTypeSet(BOOKMARKS)));
8735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SetConfigureStartExpectation();
8751320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  SetConfigureDoneExpectation(DataTypeManager::OK, DataTypeStatusTable());
8765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Initial setup.
8782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  Configure(dtm_.get(), ModelTypeSet(BOOKMARKS));
879b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  FinishDownload(*dtm_, ModelTypeSet(BOOKMARKS), ModelTypeSet());
8805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GetController(BOOKMARKS)->FinishStart(DataTypeController::OK);
8815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // We've now configured bookmarks and (implicitly) the control types.
8832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(DataTypeManager::CONFIGURED, dtm_->state());
8841320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  observer_.ResetExpectations();
8855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Pretend we were told to migrate all types.
8875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ModelTypeSet to_migrate;
8885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  to_migrate.Put(BOOKMARKS);
8895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  to_migrate.PutAll(syncer::ControlTypes());
8905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SetConfigureStartExpectation();
8921320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  SetConfigureDoneExpectation(DataTypeManager::OK, DataTypeStatusTable());
8932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  dtm_->PurgeForMigration(to_migrate,
894b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)                          syncer::CONFIGURE_REASON_MIGRATION);
8952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(DataTypeManager::DOWNLOAD_PENDING, dtm_->state());
8965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // The DTM will call ConfigureDataTypes(), even though it is unnecessary.
898b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  FinishDownload(*dtm_, ModelTypeSet(), ModelTypeSet());
8992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(DataTypeManager::CONFIGURED, dtm_->state());
9001320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  observer_.ResetExpectations();
9015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Re-enable the migrated types.
9035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SetConfigureStartExpectation();
9041320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  SetConfigureDoneExpectation(DataTypeManager::OK, DataTypeStatusTable());
9052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  Configure(dtm_.get(), to_migrate);
906b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  FinishDownload(*dtm_, to_migrate, ModelTypeSet());
9075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GetController(BOOKMARKS)->FinishStart(DataTypeController::OK);
9082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(DataTypeManager::CONFIGURED, dtm_->state());
9095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
9105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Test receipt of a Configure request while a purge is in flight.
9125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(SyncDataTypeManagerImplTest, ConfigureDuringPurge) {
9135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AddController(BOOKMARKS);
9145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AddController(PREFERENCES);
9155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Initial configure.
9175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SetConfigureStartExpectation();
9181320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  SetConfigureDoneExpectation(DataTypeManager::OK, DataTypeStatusTable());
9192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  Configure(dtm_.get(), ModelTypeSet(BOOKMARKS));
920ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  FinishDownload(*dtm_, ModelTypeSet(), ModelTypeSet());
921b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  FinishDownload(*dtm_, ModelTypeSet(BOOKMARKS), ModelTypeSet());
9225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GetController(BOOKMARKS)->FinishStart(DataTypeController::OK);
9232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(DataTypeManager::CONFIGURED, dtm_->state());
9241320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  observer_.ResetExpectations();
9255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Purge the Nigori type.
9275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SetConfigureStartExpectation();
9282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  dtm_->PurgeForMigration(ModelTypeSet(NIGORI),
929b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)                          syncer::CONFIGURE_REASON_MIGRATION);
9302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(DataTypeManager::DOWNLOAD_PENDING, dtm_->state());
9311320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  observer_.ResetExpectations();
9325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Before the backend configuration completes, ask for a different
9345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // set of types.  This request asks for
9355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // - BOOKMARKS: which is redundant because it was already enabled,
9365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // - PREFERENCES: which is new and will need to be downloaded, and
9375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // - NIGORI: (added implicitly because it is a control type) which
9385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  //   the DTM is part-way through purging.
9392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  Configure(dtm_.get(), ModelTypeSet(BOOKMARKS, PREFERENCES));
9402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(DataTypeManager::DOWNLOAD_PENDING, dtm_->state());
9415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Invoke the callback we've been waiting for since we asked to purge NIGORI.
943b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  FinishDownload(*dtm_, ModelTypeSet(), ModelTypeSet());
9441320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  observer_.ResetExpectations();
9455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9461320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  SetConfigureDoneExpectation(DataTypeManager::OK, DataTypeStatusTable());
9472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(DataTypeManager::DOWNLOAD_PENDING, dtm_->state());
9485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Now invoke the callback for the second configure request.
950ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  FinishDownload(*dtm_, ModelTypeSet(), ModelTypeSet());
951b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  FinishDownload(*dtm_, ModelTypeSet(BOOKMARKS, PREFERENCES), ModelTypeSet());
9522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(DataTypeManager::CONFIGURING, dtm_->state());
9535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Start the preferences controller.  We don't need to start controller for
9555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // the NIGORI because it has none.  We don't need to start the controller for
9565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // the BOOKMARKS because it was never stopped.
9575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GetController(PREFERENCES)->FinishStart(DataTypeController::OK);
9582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(DataTypeManager::CONFIGURED, dtm_->state());
9595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
9605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
961868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)TEST_F(SyncDataTypeManagerImplTest, PrioritizedConfiguration) {
962868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  AddController(BOOKMARKS);
963868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  AddController(PREFERENCES);
964868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
965eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  dtm_->set_priority_types(
9661320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      AddHighPriorityTypesTo(ModelTypeSet(PREFERENCES)));
967868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
968868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // Initial configure.
969868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  SetConfigureStartExpectation();
9701320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  SetConfigureDoneExpectation(DataTypeManager::OK, DataTypeStatusTable());
971868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
972868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // Initially only PREFERENCES is configured.
973eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  configurer_.set_expected_configure_types(
974ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch      AddHighPriorityTypesTo(ModelTypeSet(PREFERENCES)));
975868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  Configure(dtm_.get(), ModelTypeSet(BOOKMARKS, PREFERENCES));
976868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  EXPECT_EQ(DataTypeManager::DOWNLOAD_PENDING, dtm_->state());
977868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
978868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // BOOKMARKS is configured after download of PREFERENCES finishes.
9795d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  configurer_.set_expected_configure_types(ModelTypeSet(BOOKMARKS));
980868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  FinishDownload(*dtm_, ModelTypeSet(PREFERENCES), ModelTypeSet());
981868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  EXPECT_EQ(DataTypeManager::CONFIGURING, dtm_->state());
982868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
983868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  FinishDownload(*dtm_, ModelTypeSet(BOOKMARKS), ModelTypeSet());
984868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  GetController(PREFERENCES)->FinishStart(DataTypeController::OK);
985868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  EXPECT_EQ(DataTypeManager::CONFIGURING, dtm_->state());
986868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
987868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  GetController(BOOKMARKS)->FinishStart(DataTypeController::OK);
988868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  EXPECT_EQ(DataTypeManager::CONFIGURED, dtm_->state());
989868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)}
990868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
991868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)TEST_F(SyncDataTypeManagerImplTest, PrioritizedConfigurationReconfigure) {
992868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  AddController(BOOKMARKS);
993868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  AddController(PREFERENCES);
994868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  AddController(APPS);
995868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
996eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  dtm_->set_priority_types(
9971320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      AddHighPriorityTypesTo(ModelTypeSet(PREFERENCES)));
998868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
999868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // Initial configure.
1000868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  SetConfigureStartExpectation();
10011320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  SetConfigureDoneExpectation(DataTypeManager::OK, DataTypeStatusTable());
1002868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
1003868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // Reconfigure while associating PREFERENCES and downloading BOOKMARKS.
1004eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  configurer_.set_expected_configure_types(
1005ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch      AddHighPriorityTypesTo(ModelTypeSet(PREFERENCES)));
1006868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  Configure(dtm_.get(), ModelTypeSet(BOOKMARKS, PREFERENCES));
1007868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  EXPECT_EQ(DataTypeManager::DOWNLOAD_PENDING, dtm_->state());
1008868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
10095d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  configurer_.set_expected_configure_types(ModelTypeSet(BOOKMARKS));
1010868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  FinishDownload(*dtm_, ModelTypeSet(PREFERENCES), ModelTypeSet());
1011868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  EXPECT_EQ(DataTypeManager::CONFIGURING, dtm_->state());
1012868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
1013868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // Enable syncing for APPS.
1014868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  Configure(dtm_.get(), ModelTypeSet(BOOKMARKS, PREFERENCES, APPS));
1015868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  EXPECT_EQ(DataTypeManager::CONFIGURING, dtm_->state());
1016868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
1017868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // Reconfiguration starts after downloading and association of previous
1018868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // types finish.
1019eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  configurer_.set_expected_configure_types(
1020ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch      AddHighPriorityTypesTo(ModelTypeSet(PREFERENCES)));
1021868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  FinishDownload(*dtm_, ModelTypeSet(BOOKMARKS), ModelTypeSet());
1022868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  GetController(PREFERENCES)->FinishStart(DataTypeController::OK);
1023868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  EXPECT_EQ(DataTypeManager::DOWNLOAD_PENDING, dtm_->state());
1024868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
10255d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  configurer_.set_expected_configure_types(ModelTypeSet(BOOKMARKS, APPS));
1026868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  FinishDownload(*dtm_, ModelTypeSet(PREFERENCES), ModelTypeSet());
1027868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  EXPECT_EQ(DataTypeManager::CONFIGURING, dtm_->state());
1028868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
1029868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  FinishDownload(*dtm_, ModelTypeSet(BOOKMARKS, APPS), ModelTypeSet());
1030868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  EXPECT_EQ(DataTypeManager::CONFIGURING, dtm_->state());
1031868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
1032868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // Skip calling FinishStart() for PREFENCES because it's already started in
1033868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // first configuration.
1034868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  GetController(BOOKMARKS)->FinishStart(DataTypeController::OK);
1035868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  GetController(APPS)->FinishStart(DataTypeController::OK);
1036868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  EXPECT_EQ(DataTypeManager::CONFIGURED, dtm_->state());
1037868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)}
1038868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
1039868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)TEST_F(SyncDataTypeManagerImplTest, PrioritizedConfigurationStop) {
1040868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  AddController(BOOKMARKS);
1041868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  AddController(PREFERENCES);
1042868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
1043eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  dtm_->set_priority_types(
10441320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      AddHighPriorityTypesTo(ModelTypeSet(PREFERENCES)));
1045868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
1046868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // Initial configure.
1047868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  SetConfigureStartExpectation();
10481320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  SetConfigureDoneExpectation(DataTypeManager::ABORTED, DataTypeStatusTable());
1049868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
1050868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // Initially only PREFERENCES is configured.
1051eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  configurer_.set_expected_configure_types(
1052ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch      AddHighPriorityTypesTo(ModelTypeSet(PREFERENCES)));
1053868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  Configure(dtm_.get(), ModelTypeSet(BOOKMARKS, PREFERENCES));
1054868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  EXPECT_EQ(DataTypeManager::DOWNLOAD_PENDING, dtm_->state());
1055868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
1056868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // BOOKMARKS is configured after download of PREFERENCES finishes.
10575d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  configurer_.set_expected_configure_types(ModelTypeSet(BOOKMARKS));
1058868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  FinishDownload(*dtm_, ModelTypeSet(PREFERENCES), ModelTypeSet());
1059868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  EXPECT_EQ(DataTypeManager::CONFIGURING, dtm_->state());
1060868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
1061116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  // PREFERENCES controller is associating while BOOKMARKS is downloading.
1062868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  EXPECT_EQ(DataTypeController::ASSOCIATING,
1063868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)            GetController(PREFERENCES)->state());
10645d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_EQ(DataTypeController::MODEL_LOADED,
10655d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)            GetController(BOOKMARKS)->state());
1066868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
1067868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  dtm_->Stop();
1068868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  EXPECT_EQ(DataTypeManager::STOPPED, dtm_->state());
1069868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  EXPECT_EQ(DataTypeController::NOT_RUNNING,
1070868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)            GetController(PREFERENCES)->state());
1071868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  EXPECT_EQ(DataTypeController::NOT_RUNNING, GetController(BOOKMARKS)->state());
1072868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)}
1073868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
1074868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)TEST_F(SyncDataTypeManagerImplTest, PrioritizedConfigurationDownloadError) {
1075868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  AddController(BOOKMARKS);
1076868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  AddController(PREFERENCES);
1077868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
1078eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  dtm_->set_priority_types(
10791320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      AddHighPriorityTypesTo(ModelTypeSet(PREFERENCES)));
1080868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
1081868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // Initial configure.
1082868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  SetConfigureStartExpectation();
10831320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  SetConfigureDoneExpectation(DataTypeManager::UNRECOVERABLE_ERROR,
10841320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                              BuildStatusTable(ModelTypeSet(),
10851320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                                               ModelTypeSet(),
10861320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                                               ModelTypeSet(),
10871320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                                               ModelTypeSet(BOOKMARKS)));
1088868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
1089868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // Initially only PREFERENCES is configured.
1090eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  configurer_.set_expected_configure_types(
1091ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch      AddHighPriorityTypesTo(ModelTypeSet(PREFERENCES)));
1092868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  Configure(dtm_.get(), ModelTypeSet(BOOKMARKS, PREFERENCES));
1093868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  EXPECT_EQ(DataTypeManager::DOWNLOAD_PENDING, dtm_->state());
1094868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
1095868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // BOOKMARKS is configured after download of PREFERENCES finishes.
10965d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  configurer_.set_expected_configure_types(ModelTypeSet(BOOKMARKS));
1097868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  FinishDownload(*dtm_, ModelTypeSet(PREFERENCES), ModelTypeSet());
1098868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  EXPECT_EQ(DataTypeManager::CONFIGURING, dtm_->state());
1099868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
1100116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  // PREFERENCES controller is associating while BOOKMARKS is downloading.
1101868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  EXPECT_EQ(DataTypeController::ASSOCIATING,
1102868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)            GetController(PREFERENCES)->state());
11035d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_EQ(DataTypeController::MODEL_LOADED,
11045d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)            GetController(BOOKMARKS)->state());
1105868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
1106868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // Make BOOKMARKS download fail.
1107868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  FinishDownload(*dtm_, ModelTypeSet(), ModelTypeSet(BOOKMARKS));
1108868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  EXPECT_EQ(DataTypeManager::STOPPED, dtm_->state());
1109868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  EXPECT_EQ(DataTypeController::NOT_RUNNING,
1110868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)            GetController(PREFERENCES)->state());
1111868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  EXPECT_EQ(DataTypeController::NOT_RUNNING, GetController(BOOKMARKS)->state());
1112868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)}
1113868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
1114eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen MurdochTEST_F(SyncDataTypeManagerImplTest, HighPriorityAssociationFailure) {
1115eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  AddController(PREFERENCES);   // Will fail.
1116eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  AddController(BOOKMARKS);     // Will succeed.
1117868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
1118eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  dtm_->set_priority_types(
11191320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      AddHighPriorityTypesTo(ModelTypeSet(PREFERENCES)));
1120868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
1121868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // Initial configure.
1122868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  SetConfigureStartExpectation();
11231320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  SetConfigureDoneExpectation(DataTypeManager::OK,
11241320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                              BuildStatusTable(ModelTypeSet(),
11251320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                                               ModelTypeSet(PREFERENCES),
11261320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                                               ModelTypeSet(),
11271320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                                               ModelTypeSet()));
1128868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
1129868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // Initially only PREFERENCES is configured.
1130eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  configurer_.set_expected_configure_types(
1131ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch      AddHighPriorityTypesTo(ModelTypeSet(PREFERENCES)));
1132868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  Configure(dtm_.get(), ModelTypeSet(BOOKMARKS, PREFERENCES));
1133868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  EXPECT_EQ(DataTypeManager::DOWNLOAD_PENDING, dtm_->state());
1134868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
1135868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // BOOKMARKS is configured after download of PREFERENCES finishes.
11365d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  configurer_.set_expected_configure_types(ModelTypeSet(BOOKMARKS));
1137868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  FinishDownload(*dtm_, ModelTypeSet(PREFERENCES), ModelTypeSet());
1138868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  EXPECT_EQ(DataTypeManager::CONFIGURING, dtm_->state());
1139868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
1140116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  // PREFERENCES controller is associating while BOOKMARKS is downloading.
1141868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  EXPECT_EQ(DataTypeController::ASSOCIATING,
1142868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)            GetController(PREFERENCES)->state());
11435d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_EQ(DataTypeController::MODEL_LOADED,
11445d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)            GetController(BOOKMARKS)->state());
1145868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
1146868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // Make PREFERENCES association fail.
1147868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  GetController(PREFERENCES)->FinishStart(
1148eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      DataTypeController::ASSOCIATION_FAILED);
1149eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  EXPECT_EQ(DataTypeManager::CONFIGURING, dtm_->state());
1150eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
1151eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  // Reconfigure without PREFERENCES after the BOOKMARKS download completes,
1152eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  // then reconfigure with BOOKMARKS.
11535d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  configurer_.set_expected_configure_types(syncer::ControlTypes());
1154eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  FinishDownload(*dtm_, ModelTypeSet(BOOKMARKS), ModelTypeSet());
11555d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  configurer_.set_expected_configure_types(ModelTypeSet(BOOKMARKS));
1156eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  FinishDownload(*dtm_, ModelTypeSet(), ModelTypeSet());
1157eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
1158eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  // Reconfigure with BOOKMARKS.
1159eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  FinishDownload(*dtm_, ModelTypeSet(BOOKMARKS), ModelTypeSet());
1160eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  EXPECT_EQ(DataTypeController::ASSOCIATING,
1161eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch            GetController(BOOKMARKS)->state());
1162eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  GetController(BOOKMARKS)->FinishStart(DataTypeController::OK);
1163eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
1164eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  EXPECT_EQ(DataTypeManager::CONFIGURED, dtm_->state());
1165868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  EXPECT_EQ(DataTypeController::NOT_RUNNING,
1166868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)            GetController(PREFERENCES)->state());
1167eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  EXPECT_EQ(DataTypeController::RUNNING, GetController(BOOKMARKS)->state());
1168868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)}
1169868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
1170eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen MurdochTEST_F(SyncDataTypeManagerImplTest, LowPriorityAssociationFailure) {
1171eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  AddController(PREFERENCES);  // Will succeed.
1172eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  AddController(BOOKMARKS);    // Will fail.
1173eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
1174eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  dtm_->set_priority_types(
11751320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      AddHighPriorityTypesTo(ModelTypeSet(PREFERENCES)));
1176eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
1177eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  // Initial configure.
1178eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  SetConfigureStartExpectation();
11791320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  SetConfigureDoneExpectation(DataTypeManager::OK,
11801320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                              BuildStatusTable(ModelTypeSet(),
11811320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                                               ModelTypeSet(BOOKMARKS),
11821320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                                               ModelTypeSet(),
11831320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                                               ModelTypeSet()));
1184eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
1185eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  // Initially only PREFERENCES is configured.
1186eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  configurer_.set_expected_configure_types(
1187ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch      AddHighPriorityTypesTo(ModelTypeSet(PREFERENCES)));
1188eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  Configure(dtm_.get(), ModelTypeSet(BOOKMARKS, PREFERENCES));
1189eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  EXPECT_EQ(DataTypeManager::DOWNLOAD_PENDING, dtm_->state());
1190eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
1191eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  // BOOKMARKS is configured after download of PREFERENCES finishes.
11925d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  configurer_.set_expected_configure_types(ModelTypeSet(BOOKMARKS));
1193eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  FinishDownload(*dtm_, ModelTypeSet(PREFERENCES), ModelTypeSet());
1194eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  EXPECT_EQ(DataTypeManager::CONFIGURING, dtm_->state());
1195eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
1196116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  // PREFERENCES controller is associating while BOOKMARKS is downloading.
1197eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  EXPECT_EQ(DataTypeController::ASSOCIATING,
1198eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch            GetController(PREFERENCES)->state());
11995d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_EQ(DataTypeController::MODEL_LOADED,
12005d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)            GetController(BOOKMARKS)->state());
1201eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
1202eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  // BOOKMARKS finishes downloading and PREFERENCES finishes associating.
1203eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  FinishDownload(*dtm_, ModelTypeSet(BOOKMARKS), ModelTypeSet());
1204eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  GetController(PREFERENCES)->FinishStart(DataTypeController::OK);
1205eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  EXPECT_EQ(DataTypeController::RUNNING, GetController(PREFERENCES)->state());
1206eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
1207eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  // Make BOOKMARKS association fail, which triggers reconfigure with only
1208eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  // PREFERENCES.
1209eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  configurer_.set_expected_configure_types(
1210ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch      AddHighPriorityTypesTo(ModelTypeSet(PREFERENCES)));
1211ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  GetController(BOOKMARKS)->FinishStart(DataTypeController::ASSOCIATION_FAILED);
1212eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  EXPECT_EQ(DataTypeController::NOT_RUNNING,
1213eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch            GetController(BOOKMARKS)->state());
1214eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  EXPECT_EQ(DataTypeManager::DOWNLOAD_PENDING, dtm_->state());
1215eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
1216eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  // Finish configuration with only PREFERENCES.
12175d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  configurer_.set_expected_configure_types(ModelTypeSet());
1218eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  FinishDownload(*dtm_, ModelTypeSet(PREFERENCES), ModelTypeSet());
1219eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  EXPECT_EQ(DataTypeManager::CONFIGURED, dtm_->state());
1220eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  EXPECT_EQ(DataTypeController::RUNNING, GetController(PREFERENCES)->state());
1221eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  EXPECT_EQ(DataTypeController::NOT_RUNNING,
1222eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch            GetController(BOOKMARKS)->state());
1223eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch}
1224868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
12255d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)TEST_F(SyncDataTypeManagerImplTest, FilterDesiredTypes) {
12265d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  AddController(BOOKMARKS);
12275d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
12285d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  ModelTypeSet types(BOOKMARKS, APPS);
12295d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  dtm_->set_priority_types(AddHighPriorityTypesTo(types));
12305d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
12315d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  SetConfigureStartExpectation();
12321320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  SetConfigureDoneExpectation(DataTypeManager::OK, DataTypeStatusTable());
12335d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
12341320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  ModelTypeSet expected_types = syncer::ControlTypes();
12355d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  expected_types.Put(BOOKMARKS);
12365d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // APPS is filtered out because there's no controller for it.
12375d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  configurer_.set_expected_configure_types(expected_types);
12385d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  Configure(dtm_.get(), types);
12395d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  FinishDownload(*dtm_, ModelTypeSet(BOOKMARKS), ModelTypeSet());
12405d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  GetController(BOOKMARKS)->FinishStart(DataTypeController::OK);
12415d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
12425d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  dtm_->Stop();
12435d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_EQ(DataTypeManager::STOPPED, dtm_->state());
12445d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
12455d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
1246cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)TEST_F(SyncDataTypeManagerImplTest, ConfigureForBackupRollback) {
1247cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  AddController(BOOKMARKS);
1248cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
1249cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  SetConfigureStartExpectation();
1250cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
1251cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  ModelTypeSet expected_types = syncer::ControlTypes();
1252cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  expected_types.Put(BOOKMARKS);
1253cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  configurer_.set_expected_configure_types(expected_types);
1254cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  dtm_->set_priority_types(expected_types);
1255cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
1256cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  dtm_->Configure(ModelTypeSet(BOOKMARKS),
1257cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)                  syncer::CONFIGURE_REASON_BACKUP_ROLLBACK);
1258cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)}
1259cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
12606d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)TEST_F(SyncDataTypeManagerImplTest, ReenableAfterDataTypeError) {
12616d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  AddController(PREFERENCES);  // Will succeed.
12626d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  AddController(BOOKMARKS);    // Will be disabled due to datatype error.
12636d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)
12646d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  SetConfigureStartExpectation();
12651320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  SetConfigureDoneExpectation(DataTypeManager::OK,
12661320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                              BuildStatusTable(ModelTypeSet(),
12671320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                                               ModelTypeSet(BOOKMARKS),
12681320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                                               ModelTypeSet(),
12691320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                                               ModelTypeSet()));
12706d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)
12716d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  Configure(dtm_.get(), ModelTypeSet(BOOKMARKS, PREFERENCES));
12726d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  FinishDownload(*dtm_, ModelTypeSet(), ModelTypeSet());
12731320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  FinishDownload(*dtm_, ModelTypeSet(PREFERENCES, BOOKMARKS), ModelTypeSet());
12746d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  GetController(PREFERENCES)->FinishStart(DataTypeController::OK);
12751320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  GetController(BOOKMARKS)
12761320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      ->FinishStart(DataTypeController::ASSOCIATION_FAILED);
12771320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  FinishDownload(*dtm_, ModelTypeSet(), ModelTypeSet());  // Reconfig for error.
12781320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  FinishDownload(*dtm_, ModelTypeSet(), ModelTypeSet());  // Reconfig for error.
12796d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  EXPECT_EQ(DataTypeManager::CONFIGURED, dtm_->state());
12806d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  EXPECT_EQ(DataTypeController::RUNNING, GetController(PREFERENCES)->state());
12816d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  EXPECT_EQ(DataTypeController::NOT_RUNNING, GetController(BOOKMARKS)->state());
12826d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)
12831320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  observer_.ResetExpectations();
12846d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)
12856d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  // Re-enable bookmarks.
12861320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  SetConfigureDoneExpectation(DataTypeManager::OK, DataTypeStatusTable());
128703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  dtm_->ReenableType(syncer::BOOKMARKS);
12886d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)
12896d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  EXPECT_EQ(DataTypeManager::DOWNLOAD_PENDING, dtm_->state());
12906d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  FinishDownload(*dtm_, ModelTypeSet(), ModelTypeSet());
12916d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  FinishDownload(*dtm_, ModelTypeSet(BOOKMARKS), ModelTypeSet());
12926d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  EXPECT_EQ(DataTypeManager::CONFIGURING, dtm_->state());
12936d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  GetController(BOOKMARKS)->FinishStart(DataTypeController::OK);
12946d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  EXPECT_EQ(DataTypeManager::CONFIGURED, dtm_->state());
12956d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  EXPECT_EQ(DataTypeController::RUNNING, GetController(PREFERENCES)->state());
12966d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  EXPECT_EQ(DataTypeController::RUNNING, GetController(BOOKMARKS)->state());
129703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)
129803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  // Should do nothing.
129903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  dtm_->ReenableType(syncer::BOOKMARKS);
13006d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)}
13016d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)
13026e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)TEST_F(SyncDataTypeManagerImplTest, UnreadyType) {
13036e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  AddController(BOOKMARKS);
13046e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  GetController(BOOKMARKS)->SetReadyForStart(false);
13056e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)
13066e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  // Bookmarks is never started due to being unready.
13076e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  SetConfigureStartExpectation();
13081320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  SetConfigureDoneExpectation(DataTypeManager::OK,
13091320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                              BuildStatusTable(ModelTypeSet(),
13101320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                                               ModelTypeSet(),
13111320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                                               ModelTypeSet(BOOKMARKS),
13121320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                                               ModelTypeSet()));
13136e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  Configure(dtm_.get(), ModelTypeSet(BOOKMARKS));
13146e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  FinishDownload(*dtm_, ModelTypeSet(), ModelTypeSet());
13156e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  EXPECT_EQ(DataTypeController::NOT_RUNNING, GetController(BOOKMARKS)->state());
13166e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  EXPECT_EQ(DataTypeManager::CONFIGURED, dtm_->state());
13176e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  EXPECT_EQ(0U, configurer_.activated_types().Size());
13181320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  observer_.ResetExpectations();
13196e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)
13206e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  // Bookmarks should start normally now.
13216e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  GetController(BOOKMARKS)->SetReadyForStart(true);
13221320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  SetConfigureDoneExpectation(DataTypeManager::OK, DataTypeStatusTable());
132303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  dtm_->ReenableType(BOOKMARKS);
13246e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  EXPECT_EQ(DataTypeManager::DOWNLOAD_PENDING, dtm_->state());
13256e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)
13266e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  FinishDownload(*dtm_, ModelTypeSet(), ModelTypeSet());
13276e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  FinishDownload(*dtm_, ModelTypeSet(BOOKMARKS), ModelTypeSet());
13286e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  EXPECT_EQ(DataTypeManager::CONFIGURING, dtm_->state());
13296e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)
13306e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  GetController(BOOKMARKS)->FinishStart(DataTypeController::OK);
13316e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  EXPECT_EQ(DataTypeManager::CONFIGURED, dtm_->state());
13326e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  EXPECT_EQ(1U, configurer_.activated_types().Size());
13336e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)
133403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  // Should do nothing.
13351320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  observer_.ResetExpectations();
133603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  dtm_->ReenableType(BOOKMARKS);
133703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)
13386e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  dtm_->Stop();
13396e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  EXPECT_EQ(DataTypeManager::STOPPED, dtm_->state());
13406e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  EXPECT_TRUE(configurer_.activated_types().Empty());
13416e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)}
13426e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)
13431320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TucciTEST_F(SyncDataTypeManagerImplTest, ModelLoadError) {
13441320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  AddController(BOOKMARKS);
13451320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  GetController(BOOKMARKS)->SetModelLoadError(syncer::SyncError(
13461320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        FROM_HERE, SyncError::DATATYPE_ERROR, "load error", BOOKMARKS));
13471320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
13481320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // Bookmarks is never started due to hitting a model load error.
13491320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  SetConfigureStartExpectation();
13501320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  SetConfigureDoneExpectation(DataTypeManager::OK,
13511320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                              BuildStatusTable(ModelTypeSet(),
13521320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                                               ModelTypeSet(BOOKMARKS),
13531320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                                               ModelTypeSet(),
13541320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                                               ModelTypeSet()));
13551320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  Configure(dtm_.get(), ModelTypeSet(BOOKMARKS));
13561320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  FinishDownload(*dtm_, ModelTypeSet(), ModelTypeSet());
13571320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  FinishDownload(*dtm_, ModelTypeSet(BOOKMARKS), ModelTypeSet());
13581320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  EXPECT_EQ(DataTypeManager::CONFIGURED, dtm_->state());
13591320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  EXPECT_EQ(DataTypeController::NOT_RUNNING, GetController(BOOKMARKS)->state());
13601320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
13611320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  EXPECT_EQ(0U, configurer_.activated_types().Size());
13621320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}
13631320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
13641320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
13651320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TucciTEST_F(SyncDataTypeManagerImplTest, ErrorBeforeAssociation) {
13661320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  AddController(BOOKMARKS);
13671320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
13681320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // Bookmarks is never started due to hitting a datatype error while the DTM
13691320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // is still downloading types.
13701320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  SetConfigureStartExpectation();
13711320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  SetConfigureDoneExpectation(DataTypeManager::OK,
13721320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                              BuildStatusTable(ModelTypeSet(),
13731320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                                               ModelTypeSet(BOOKMARKS),
13741320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                                               ModelTypeSet(),
13751320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                                               ModelTypeSet()));
13761320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  Configure(dtm_.get(), ModelTypeSet(BOOKMARKS));
13771320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  FinishDownload(*dtm_, ModelTypeSet(), ModelTypeSet());
13781320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  GetController(BOOKMARKS)->OnSingleDataTypeUnrecoverableError(
13791320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      syncer::SyncError(FROM_HERE,
13801320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                        SyncError::DATATYPE_ERROR,
13811320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                        "bookmarks error",
13821320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                        BOOKMARKS));
13831320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  FinishDownload(*dtm_, ModelTypeSet(BOOKMARKS), ModelTypeSet());
13841320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  FinishDownload(*dtm_, ModelTypeSet(), ModelTypeSet());  // Reconfig for error.
13851320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  EXPECT_EQ(DataTypeManager::CONFIGURED, dtm_->state());
13861320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  EXPECT_EQ(DataTypeController::NOT_RUNNING, GetController(BOOKMARKS)->state());
13871320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
13881320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  EXPECT_EQ(0U, configurer_.activated_types().Size());
13891320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}
13901320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
139134680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles)TEST_F(SyncDataTypeManagerImplTest, AssociationNeverCompletes) {
139234680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles)  AddController(BOOKMARKS);
139334680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles)
139434680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles)  // Bookmarks times out during association and so it's never started.
139534680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles)  SetConfigureStartExpectation();
139634680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles)  SetConfigureDoneExpectation(DataTypeManager::OK,
139734680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles)                              BuildStatusTable(ModelTypeSet(),
139834680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles)                                               ModelTypeSet(BOOKMARKS),
139934680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles)                                               ModelTypeSet(),
140034680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles)                                               ModelTypeSet()));
140134680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles)  Configure(dtm_.get(), ModelTypeSet(BOOKMARKS));
140234680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles)
140334680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles)  GetController(BOOKMARKS)->SetDelayModelLoad();
140434680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles)  FinishDownload(*dtm_, ModelTypeSet(), ModelTypeSet());
140534680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles)  FinishDownload(*dtm_, ModelTypeSet(BOOKMARKS), ModelTypeSet());
140634680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles)
140734680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles)  EXPECT_EQ(DataTypeManager::CONFIGURING, dtm_->state());
140834680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles)
140934680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles)  // Simulate timeout by firing the timer.
141034680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles)  dtm_->GetModelAssociationManagerForTesting()
141134680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles)      ->GetTimerForTesting()
141234680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles)      ->user_task()
141334680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles)      .Run();
141434680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles)  EXPECT_EQ(DataTypeManager::DOWNLOAD_PENDING, dtm_->state());
141534680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles)  EXPECT_EQ(DataTypeController::NOT_RUNNING, GetController(BOOKMARKS)->state());
141634680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles)
141734680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles)  FinishDownload(*dtm_, ModelTypeSet(), ModelTypeSet());
141834680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles)
141934680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles)  EXPECT_EQ(DataTypeManager::CONFIGURED, dtm_->state());
142034680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles)  EXPECT_EQ(0U, configurer_.activated_types().Size());
142134680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles)}
142234680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles)
14235f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)}  // namespace sync_driver
1424