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