1f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)// Copyright 2013 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) 5f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "chrome/browser/sync/glue/sync_backend_host_impl.h" 65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <cstddef> 85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 91320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "base/files/file_util.h" 105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/location.h" 115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/memory/scoped_ptr.h" 129ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch#include "base/message_loop/message_loop.h" 135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/synchronization/waitable_event.h" 145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/test/test_timeouts.h" 157dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#include "chrome/browser/chrome_notification_types.h" 16f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#include "chrome/browser/invalidation/profile_invalidation_provider_factory.h" 172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/prefs/pref_service_syncable.h" 18c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch#include "chrome/test/base/testing_browser_process.h" 195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/test/base/testing_profile.h" 20c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch#include "chrome/test/base/testing_profile_manager.h" 215f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#include "components/invalidation/invalidator_state.h" 22cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "components/invalidation/invalidator_storage.h" 23f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#include "components/invalidation/profile_invalidation_provider.h" 241320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "components/sync_driver/device_info.h" 255d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "components/sync_driver/sync_frontend.h" 2623730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)#include "components/sync_driver/sync_prefs.h" 272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "content/public/browser/notification_service.h" 28a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch#include "content/public/test/test_browser_thread_bundle.h" 29a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch#include "content/public/test/test_utils.h" 305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "google/cacheinvalidation/include/types.h" 31116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "google_apis/gaia/gaia_constants.h" 325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/url_request/test_url_fetcher_factory.h" 335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "sync/internal_api/public/base/model_type.h" 345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "sync/internal_api/public/engine/model_safe_worker.h" 35a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)#include "sync/internal_api/public/http_bridge_network_resources.h" 36a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)#include "sync/internal_api/public/network_resources.h" 37010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)#include "sync/internal_api/public/sessions/commit_counters.h" 38010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)#include "sync/internal_api/public/sessions/status_counters.h" 39010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)#include "sync/internal_api/public/sessions/update_counters.h" 405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "sync/internal_api/public/sync_manager_factory.h" 415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "sync/internal_api/public/test/fake_sync_manager.h" 425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "sync/internal_api/public/util/experiments.h" 435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "sync/protocol/encryption.pb.h" 445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "sync/protocol/sync_protocol_error.h" 455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "sync/util/test_unrecoverable_error_handler.h" 465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "testing/gmock/include/gmock/gmock.h" 475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "testing/gtest/include/gtest/gtest.h" 48eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "url/gurl.h" 495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using content::BrowserThread; 515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using syncer::FakeSyncManager; 525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using syncer::SyncManager; 535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using ::testing::InvokeWithoutArgs; 545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using ::testing::StrictMock; 555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using ::testing::_; 565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace browser_sync { 585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace { 605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 61c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdochconst char kTestProfileName[] = "test-profile"; 62c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 63cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)static const base::FilePath::CharType kTestSyncDir[] = 64cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) FILE_PATH_LITERAL("sync-test"); 65cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)ACTION_P(Signal, event) { 675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) event->Signal(); 685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void QuitMessageLoop() { 7190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) base::MessageLoop::current()->Quit(); 725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 745f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)class MockSyncFrontend : public sync_driver::SyncFrontend { 755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual ~MockSyncFrontend() {} 775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 785f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) MOCK_METHOD4( 795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) OnBackendInitialized, 805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void(const syncer::WeakHandle<syncer::JsBackend>&, 815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const syncer::WeakHandle<syncer::DataTypeDebugInfoListener>&, 825f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) const std::string&, 835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool)); 845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MOCK_METHOD0(OnSyncCycleCompleted, void()); 855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MOCK_METHOD1(OnConnectionStatusChange, 865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void(syncer::ConnectionStatus status)); 875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MOCK_METHOD0(OnClearServerDataSucceeded, void()); 885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MOCK_METHOD0(OnClearServerDataFailed, void()); 895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MOCK_METHOD2(OnPassphraseRequired, 905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void(syncer::PassphraseRequiredReason, 915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const sync_pb::EncryptedData&)); 925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MOCK_METHOD0(OnPassphraseAccepted, void()); 935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MOCK_METHOD2(OnEncryptedTypesChanged, 945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void(syncer::ModelTypeSet, bool)); 955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MOCK_METHOD0(OnEncryptionComplete, void()); 965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MOCK_METHOD1(OnMigrationNeededForTypes, void(syncer::ModelTypeSet)); 97effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch MOCK_METHOD1(OnProtocolEvent, void(const syncer::ProtocolEvent&)); 98010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) MOCK_METHOD2(OnDirectoryTypeCommitCounterUpdated, 99010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) void(syncer::ModelType, const syncer::CommitCounters&)); 100010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) MOCK_METHOD2(OnDirectoryTypeUpdateCounterUpdated, 101010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) void(syncer::ModelType, const syncer::UpdateCounters&)); 102010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) MOCK_METHOD2(OnDirectoryTypeStatusCounterUpdated, 103010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) void(syncer::ModelType, const syncer::StatusCounters&)); 1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MOCK_METHOD1(OnExperimentsChanged, 1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void(const syncer::Experiments&)); 1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MOCK_METHOD1(OnActionableError, 1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void(const syncer::SyncProtocolError& sync_error)); 1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MOCK_METHOD0(OnSyncConfigureRetry, void()); 1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class FakeSyncManagerFactory : public syncer::SyncManagerFactory { 1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 113a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) explicit FakeSyncManagerFactory(FakeSyncManager** fake_manager) 114cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) : SyncManagerFactory(NORMAL), 115cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) fake_manager_(fake_manager) { 116a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) *fake_manager_ = NULL; 117a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) } 1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual ~FakeSyncManagerFactory() {} 1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // SyncManagerFactory implementation. Called on the sync thread. 1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual scoped_ptr<SyncManager> CreateSyncManager( 1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string name) OVERRIDE { 123a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) *fake_manager_ = new FakeSyncManager(initial_sync_ended_types_, 124a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) progress_marker_types_, 125a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) configure_fail_types_); 126a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) return scoped_ptr<SyncManager>(*fake_manager_); 1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void set_initial_sync_ended_types(syncer::ModelTypeSet types) { 1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) initial_sync_ended_types_ = types; 1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void set_progress_marker_types(syncer::ModelTypeSet types) { 1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) progress_marker_types_ = types; 1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void set_configure_fail_types(syncer::ModelTypeSet types) { 1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) configure_fail_types_ = types; 1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private: 1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) syncer::ModelTypeSet initial_sync_ended_types_; 1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) syncer::ModelTypeSet progress_marker_types_; 1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) syncer::ModelTypeSet configure_fail_types_; 145a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) FakeSyncManager** fake_manager_; 1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class SyncBackendHostTest : public testing::Test { 1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) protected: 1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SyncBackendHostTest() 151a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch : thread_bundle_(content::TestBrowserThreadBundle::REAL_IO_THREAD), 152c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch profile_manager_(TestingBrowserProcess::GetGlobal()), 1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) fake_manager_(NULL) {} 1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual ~SyncBackendHostTest() {} 1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void SetUp() OVERRIDE { 158c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch ASSERT_TRUE(profile_manager_.SetUp()); 159c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch profile_ = profile_manager_.CreateTestingProfile(kTestProfileName); 16023730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) sync_prefs_.reset(new sync_driver::SyncPrefs(profile_->GetPrefs())); 161f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) backend_.reset(new SyncBackendHostImpl( 1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) profile_->GetDebugName(), 163c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch profile_, 164f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) invalidation::ProfileInvalidationProviderFactory::GetForProfile( 165f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) profile_)->GetInvalidationService(), 166cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) sync_prefs_->AsWeakPtr(), 167cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) base::FilePath(kTestSyncDir))); 1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) credentials_.email = "user@example.com"; 1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) credentials_.sync_token = "sync_token"; 170116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch credentials_.scope_set.insert(GaiaConstants::kChromeSyncOAuth2Scope); 1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 172a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) fake_manager_factory_.reset(new FakeSyncManagerFactory(&fake_manager_)); 173a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // These types are always implicitly enabled. 1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) enabled_types_.PutAll(syncer::ControlTypes()); 1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // NOTE: We can't include Passwords or Typed URLs due to the Sync Backend 1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Registrar removing them if it can't find their model workers. 1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) enabled_types_.Put(syncer::BOOKMARKS); 1802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) enabled_types_.Put(syncer::NIGORI); 1812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) enabled_types_.Put(syncer::DEVICE_INFO); 1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) enabled_types_.Put(syncer::PREFERENCES); 1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) enabled_types_.Put(syncer::SESSIONS); 1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) enabled_types_.Put(syncer::SEARCH_ENGINES); 1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) enabled_types_.Put(syncer::AUTOFILL); 1862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) enabled_types_.Put(syncer::EXPERIMENTS); 187a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 188a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) network_resources_.reset(new syncer::HttpBridgeNetworkResources()); 1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void TearDown() OVERRIDE { 192c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (backend_) { 1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) backend_->StopSyncingForShutdown(); 1945f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) backend_->Shutdown(syncer::STOP_SYNC); 1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) backend_.reset(); 1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sync_prefs_.reset(); 198c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch profile_ = NULL; 199c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch profile_manager_.DeleteTestingProfile(kTestProfileName); 2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Pump messages posted by the sync thread (which may end up 2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // posting on the IO thread). 202a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch base::RunLoop().RunUntilIdle(); 203a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch content::RunAllPendingInMessageLoop(BrowserThread::IO); 2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Pump any messages posted by the IO thread. 205a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch base::RunLoop().RunUntilIdle(); 2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Synchronously initializes the backend. 2092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) void InitializeBackend(bool expect_success) { 2105f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) EXPECT_CALL(mock_frontend_, OnBackendInitialized(_, _, _, expect_success)). 2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WillOnce(InvokeWithoutArgs(QuitMessageLoop)); 212a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) backend_->Initialize( 213a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) &mock_frontend_, 214a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) scoped_ptr<base::Thread>(), 215a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) syncer::WeakHandle<syncer::JsEventHandler>(), 216a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) GURL(std::string()), 217a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) credentials_, 218a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) true, 219a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) fake_manager_factory_.PassAs<syncer::SyncManagerFactory>(), 220a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) scoped_ptr<syncer::UnrecoverableErrorHandler>( 221a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) new syncer::TestUnrecoverableErrorHandler).Pass(), 222a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) NULL, 223a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) network_resources_.get()); 224a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch base::RunLoop run_loop; 225a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch BrowserThread::PostDelayedTask(BrowserThread::UI, FROM_HERE, 226a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch run_loop.QuitClosure(), 227a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch TestTimeouts::action_timeout()); 228a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch run_loop.Run(); 2295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // |fake_manager_factory_|'s fake_manager() is set on the sync 2305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // thread, but we can rely on the message loop barriers to 2315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // guarantee that we see the updated value. 2325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(fake_manager_); 2335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Synchronously configures the backend's datatypes. 2365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void ConfigureDataTypes(syncer::ModelTypeSet types_to_add, 2375f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) syncer::ModelTypeSet types_to_remove, 2385f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) syncer::ModelTypeSet types_to_unapply) { 2395f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) sync_driver::BackendDataTypeConfigurer::DataTypeConfigStateMap 2405f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) config_state_map; 2415f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) sync_driver::BackendDataTypeConfigurer::SetDataTypesState( 2425f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) sync_driver::BackendDataTypeConfigurer::CONFIGURE_ACTIVE, 243868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) types_to_add, 244868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) &config_state_map); 2455f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) sync_driver::BackendDataTypeConfigurer::SetDataTypesState( 2465f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) sync_driver::BackendDataTypeConfigurer::DISABLED, 2472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) types_to_remove, &config_state_map); 2485f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) sync_driver::BackendDataTypeConfigurer::SetDataTypesState( 2495f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) sync_driver::BackendDataTypeConfigurer::UNREADY, 2505f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) types_to_unapply, &config_state_map); 2512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) types_to_add.PutAll(syncer::ControlTypes()); 2535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) backend_->ConfigureDataTypes( 2545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) syncer::CONFIGURE_REASON_RECONFIGURATION, 2552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) config_state_map, 2565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::Bind(&SyncBackendHostTest::DownloadReady, 2575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::Unretained(this)), 2585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::Bind(&SyncBackendHostTest::OnDownloadRetry, 2595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::Unretained(this))); 260a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch base::RunLoop run_loop; 261a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch BrowserThread::PostDelayedTask(BrowserThread::UI, FROM_HERE, 262a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch run_loop.QuitClosure(), 263a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch TestTimeouts::action_timeout()); 264a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch run_loop.Run(); 2655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) void IssueRefreshRequest(syncer::ModelTypeSet types) { 2682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); 2692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) content::NotificationService::current()->Notify( 2712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) chrome::NOTIFICATION_SYNC_REFRESH_LOCAL, 272c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch content::Source<Profile>(profile_), 2737dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch content::Details<syncer::ModelTypeSet>(&types)); 2742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 2752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) protected: 277b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) void DownloadReady(syncer::ModelTypeSet succeeded_types, 278b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) syncer::ModelTypeSet failed_types) { 27990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) base::MessageLoop::current()->Quit(); 2805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void OnDownloadRetry() { 2835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NOTIMPLEMENTED(); 2845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 286a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch content::TestBrowserThreadBundle thread_bundle_; 2875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) StrictMock<MockSyncFrontend> mock_frontend_; 2885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) syncer::SyncCredentials credentials_; 289c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch TestingProfileManager profile_manager_; 290c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch TestingProfile* profile_; 29123730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) scoped_ptr<sync_driver::SyncPrefs> sync_prefs_; 2925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<SyncBackendHost> backend_; 293a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) scoped_ptr<FakeSyncManagerFactory> fake_manager_factory_; 2945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FakeSyncManager* fake_manager_; 2955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) syncer::ModelTypeSet enabled_types_; 296a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) scoped_ptr<syncer::NetworkResources> network_resources_; 2975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 2985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Test basic initialization with no initial types (first time initialization). 3005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Only the nigori should be configured. 3015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(SyncBackendHostTest, InitShutdown) { 3022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) InitializeBackend(true); 3035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(fake_manager_->GetAndResetDownloadedTypes().Equals( 3045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) syncer::ControlTypes())); 3055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(fake_manager_->InitialSyncEndedTypes().Equals( 3065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) syncer::ControlTypes())); 3075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(fake_manager_->GetTypesWithEmptyProgressMarkerToken( 3085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) syncer::ControlTypes()).Empty()); 3095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Test first time sync scenario. All types should be properly configured. 3125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(SyncBackendHostTest, FirstTimeSync) { 3132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) InitializeBackend(true); 3145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(fake_manager_->GetAndResetDownloadedTypes().Equals( 3155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) syncer::ControlTypes())); 3165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(fake_manager_->InitialSyncEndedTypes().Equals( 3175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) syncer::ControlTypes())); 3185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(fake_manager_->GetTypesWithEmptyProgressMarkerToken( 3195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) syncer::ControlTypes()).Empty()); 3205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ConfigureDataTypes(enabled_types_, 3225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Difference(syncer::ModelTypeSet::All(), 3235f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) enabled_types_), 3245f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) syncer::ModelTypeSet()); 3255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(fake_manager_->GetAndResetDownloadedTypes().HasAll( 3265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Difference(enabled_types_, syncer::ControlTypes()))); 3275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(fake_manager_->InitialSyncEndedTypes().Equals(enabled_types_)); 3285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(fake_manager_->GetAndResetEnabledTypes().Equals(enabled_types_)); 3295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(fake_manager_->GetTypesWithEmptyProgressMarkerToken( 3305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) enabled_types_).Empty()); 3315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Test the restart after setting up sync scenario. No enabled types should be 3345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// downloaded or cleaned. 3355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(SyncBackendHostTest, Restart) { 3365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sync_prefs_->SetSyncSetupCompleted(); 3375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) syncer::ModelTypeSet all_but_nigori = enabled_types_; 338a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) fake_manager_factory_->set_progress_marker_types(enabled_types_); 339a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) fake_manager_factory_->set_initial_sync_ended_types(enabled_types_); 3402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) InitializeBackend(true); 3415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(fake_manager_->GetAndResetDownloadedTypes().Empty()); 3425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(Intersection(fake_manager_->GetAndResetCleanedTypes(), 3435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) enabled_types_).Empty()); 3445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(fake_manager_->InitialSyncEndedTypes().Equals(enabled_types_)); 3455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(fake_manager_->GetTypesWithEmptyProgressMarkerToken( 3465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) enabled_types_).Empty()); 3475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ConfigureDataTypes(enabled_types_, 3495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Difference(syncer::ModelTypeSet::All(), 3505f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) enabled_types_), 3515f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) syncer::ModelTypeSet()); 3525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(fake_manager_->GetAndResetDownloadedTypes().Empty()); 3535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(Intersection(fake_manager_->GetAndResetCleanedTypes(), 3545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) enabled_types_).Empty()); 3555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(fake_manager_->InitialSyncEndedTypes().Equals(enabled_types_)); 3565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(fake_manager_->GetAndResetEnabledTypes().Equals(enabled_types_)); 3575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(fake_manager_->GetTypesWithEmptyProgressMarkerToken( 3585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) enabled_types_).Empty()); 3595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Test a sync restart scenario where some types had never finished configuring. 3625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// The partial types should be purged, then reconfigured properly. 3635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(SyncBackendHostTest, PartialTypes) { 3645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sync_prefs_->SetSyncSetupCompleted(); 3655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Set sync manager behavior before passing it down. All types have progress 3665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // markers, but nigori and bookmarks are missing initial sync ended. 3675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) syncer::ModelTypeSet partial_types(syncer::NIGORI, syncer::BOOKMARKS); 3685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) syncer::ModelTypeSet full_types = 3695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Difference(enabled_types_, partial_types); 370a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) fake_manager_factory_->set_progress_marker_types(enabled_types_); 371a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) fake_manager_factory_->set_initial_sync_ended_types(full_types); 3725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Bringing up the backend should purge all partial types, then proceed to 3745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // download the Nigori. 3752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) InitializeBackend(true); 3765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(fake_manager_->GetAndResetDownloadedTypes().Equals( 3775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) syncer::ModelTypeSet(syncer::NIGORI))); 3785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(fake_manager_->GetAndResetCleanedTypes().HasAll(partial_types)); 3795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(fake_manager_->InitialSyncEndedTypes().Equals( 3805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Union(full_types, syncer::ModelTypeSet(syncer::NIGORI)))); 3815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(fake_manager_->GetTypesWithEmptyProgressMarkerToken( 3825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) enabled_types_).Equals( 3835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Difference(partial_types, syncer::ModelTypeSet(syncer::NIGORI)))); 3845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Now do the actual configuration, which should download and apply bookmarks. 3865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ConfigureDataTypes(enabled_types_, 3875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Difference(syncer::ModelTypeSet::All(), 3885f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) enabled_types_), 3895f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) syncer::ModelTypeSet()); 3905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(Intersection(fake_manager_->GetAndResetCleanedTypes(), 3915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) enabled_types_).Empty()); 3925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(fake_manager_->GetAndResetDownloadedTypes().Equals( 3935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) partial_types)); 3945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(fake_manager_->InitialSyncEndedTypes().Equals(enabled_types_)); 3955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(fake_manager_->GetAndResetEnabledTypes().Equals(enabled_types_)); 3965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(fake_manager_->GetTypesWithEmptyProgressMarkerToken( 3975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) enabled_types_).Empty()); 3985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Test the behavior when we lose the sync db. Although we already have types 4015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// enabled, we should re-download all of them because we lost their data. 4025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(SyncBackendHostTest, LostDB) { 4035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sync_prefs_->SetSyncSetupCompleted(); 4045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Initialization should fetch the Nigori node. Everything else should be 4055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // left untouched. 4062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) InitializeBackend(true); 4075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(fake_manager_->GetAndResetDownloadedTypes().Equals( 4085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) syncer::ModelTypeSet(syncer::ControlTypes()))); 4095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(fake_manager_->InitialSyncEndedTypes().Equals( 4105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) syncer::ModelTypeSet(syncer::ControlTypes()))); 4115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(fake_manager_->GetTypesWithEmptyProgressMarkerToken( 4125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) enabled_types_).Equals( 4135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Difference(enabled_types_, syncer::ControlTypes()))); 4145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The database was empty, so any cleaning is entirely optional. We want to 4165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // reset this value before running the next part of the test, though. 4175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) fake_manager_->GetAndResetCleanedTypes(); 4185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The actual configuration should redownload and apply all the enabled types. 4205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ConfigureDataTypes(enabled_types_, 4215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Difference(syncer::ModelTypeSet::All(), 4225f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) enabled_types_), 4235f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) syncer::ModelTypeSet()); 4245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(fake_manager_->GetAndResetDownloadedTypes().HasAll( 4255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Difference(enabled_types_, syncer::ControlTypes()))); 4265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(Intersection(fake_manager_->GetAndResetCleanedTypes(), 4275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) enabled_types_).Empty()); 4285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(fake_manager_->InitialSyncEndedTypes().Equals(enabled_types_)); 4295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(fake_manager_->GetAndResetEnabledTypes().Equals(enabled_types_)); 4305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(fake_manager_->GetTypesWithEmptyProgressMarkerToken( 4315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) enabled_types_).Empty()); 4325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(SyncBackendHostTest, DisableTypes) { 4355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Simulate first time sync. 4362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) InitializeBackend(true); 4375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) fake_manager_->GetAndResetCleanedTypes(); 4385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ConfigureDataTypes(enabled_types_, 4395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Difference(syncer::ModelTypeSet::All(), 4405f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) enabled_types_), 4415f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) syncer::ModelTypeSet()); 4425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(fake_manager_->GetAndResetDownloadedTypes().Equals( 4435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) enabled_types_)); 4445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(Intersection(fake_manager_->GetAndResetCleanedTypes(), 4455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) enabled_types_).Empty()); 4465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(fake_manager_->InitialSyncEndedTypes().Equals(enabled_types_)); 4475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(fake_manager_->GetTypesWithEmptyProgressMarkerToken( 4485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) enabled_types_).Empty()); 4495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Then disable two datatypes. 4515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) syncer::ModelTypeSet disabled_types(syncer::BOOKMARKS, 4525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) syncer::SEARCH_ENGINES); 4535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) syncer::ModelTypeSet old_types = enabled_types_; 4545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) enabled_types_.RemoveAll(disabled_types); 4555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ConfigureDataTypes(enabled_types_, 4565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Difference(syncer::ModelTypeSet::All(), 4575f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) enabled_types_), 4585f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) syncer::ModelTypeSet()); 4595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Only those datatypes disabled should be cleaned. Nothing should be 4615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // downloaded. 4625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(fake_manager_->GetAndResetDownloadedTypes().Empty()); 4635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(Intersection(fake_manager_->GetAndResetCleanedTypes(), 4645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) old_types).Equals(disabled_types)); 4655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(fake_manager_->InitialSyncEndedTypes().Equals(enabled_types_)); 4665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(fake_manager_->GetAndResetEnabledTypes().Equals(enabled_types_)); 4675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(fake_manager_->GetTypesWithEmptyProgressMarkerToken( 4685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) enabled_types_).Empty()); 4695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(SyncBackendHostTest, AddTypes) { 4725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Simulate first time sync. 4732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) InitializeBackend(true); 4745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) fake_manager_->GetAndResetCleanedTypes(); 4755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ConfigureDataTypes(enabled_types_, 4765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Difference(syncer::ModelTypeSet::All(), 4775f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) enabled_types_), 4785f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) syncer::ModelTypeSet()); 4795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(fake_manager_->GetAndResetDownloadedTypes().Equals( 4805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) enabled_types_)); 4815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(Intersection(fake_manager_->GetAndResetCleanedTypes(), 4825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) enabled_types_).Empty()); 4835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(fake_manager_->InitialSyncEndedTypes().Equals(enabled_types_)); 4845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(fake_manager_->GetTypesWithEmptyProgressMarkerToken( 4855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) enabled_types_).Empty()); 4865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Then add two datatypes. 4885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) syncer::ModelTypeSet new_types(syncer::EXTENSIONS, 4895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) syncer::APPS); 4905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) enabled_types_.PutAll(new_types); 4915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ConfigureDataTypes(enabled_types_, 4925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Difference(syncer::ModelTypeSet::All(), 4935f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) enabled_types_), 4945f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) syncer::ModelTypeSet()); 4955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Only those datatypes added should be downloaded (plus nigori). Nothing 4975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // should be cleaned aside from the disabled types. 4985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(fake_manager_->GetAndResetDownloadedTypes().Equals( 4995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Union(new_types, syncer::ModelTypeSet(syncer::NIGORI)))); 5005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(Intersection(fake_manager_->GetAndResetCleanedTypes(), 5015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) enabled_types_).Empty()); 5025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(fake_manager_->InitialSyncEndedTypes().Equals(enabled_types_)); 5035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(fake_manager_->GetAndResetEnabledTypes().Equals(enabled_types_)); 5045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(fake_manager_->GetTypesWithEmptyProgressMarkerToken( 5055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) enabled_types_).Empty()); 5065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 5075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// And and disable in the same configuration. 5095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(SyncBackendHostTest, AddDisableTypes) { 5105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Simulate first time sync. 5112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) InitializeBackend(true); 5125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) fake_manager_->GetAndResetCleanedTypes(); 5135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ConfigureDataTypes(enabled_types_, 5145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Difference(syncer::ModelTypeSet::All(), 5155f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) enabled_types_), 5165f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) syncer::ModelTypeSet()); 5175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(fake_manager_->GetAndResetDownloadedTypes().Equals( 5185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) enabled_types_)); 5195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(Intersection(fake_manager_->GetAndResetCleanedTypes(), 5205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) enabled_types_).Empty()); 5215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(fake_manager_->InitialSyncEndedTypes().Equals(enabled_types_)); 5225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(fake_manager_->GetTypesWithEmptyProgressMarkerToken( 5235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) enabled_types_).Empty()); 5245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Then add two datatypes. 5265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) syncer::ModelTypeSet old_types = enabled_types_; 5275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) syncer::ModelTypeSet disabled_types(syncer::BOOKMARKS, 5285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) syncer::SEARCH_ENGINES); 5295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) syncer::ModelTypeSet new_types(syncer::EXTENSIONS, 5305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) syncer::APPS); 5315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) enabled_types_.PutAll(new_types); 5325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) enabled_types_.RemoveAll(disabled_types); 5335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ConfigureDataTypes(enabled_types_, 5345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Difference(syncer::ModelTypeSet::All(), 5355f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) enabled_types_), 5365f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) syncer::ModelTypeSet()); 5375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Only those datatypes added should be downloaded (plus nigori). Nothing 5395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // should be cleaned aside from the disabled types. 5405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(fake_manager_->GetAndResetDownloadedTypes().Equals( 5415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Union(new_types, syncer::ModelTypeSet(syncer::NIGORI)))); 5425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(Intersection(fake_manager_->GetAndResetCleanedTypes(), 5435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) old_types).Equals(disabled_types)); 5445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(fake_manager_->InitialSyncEndedTypes().Equals(enabled_types_)); 5455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(fake_manager_->GetAndResetEnabledTypes().Equals(enabled_types_)); 5465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(fake_manager_->GetTypesWithEmptyProgressMarkerToken( 5475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) old_types).Equals(disabled_types)); 5485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 5495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Test restarting the browser to newly supported datatypes. The new datatypes 5515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// should be downloaded on the configuration after backend initialization. 5525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(SyncBackendHostTest, NewlySupportedTypes) { 5535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sync_prefs_->SetSyncSetupCompleted(); 5545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Set sync manager behavior before passing it down. All types have progress 5555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // markers and initial sync ended except the new types. 5565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) syncer::ModelTypeSet old_types = enabled_types_; 557a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) fake_manager_factory_->set_progress_marker_types(old_types); 558a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) fake_manager_factory_->set_initial_sync_ended_types(old_types); 5595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) syncer::ModelTypeSet new_types(syncer::APP_SETTINGS, 5605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) syncer::EXTENSION_SETTINGS); 5615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) enabled_types_.PutAll(new_types); 5625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Does nothing. 5642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) InitializeBackend(true); 5655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(fake_manager_->GetAndResetDownloadedTypes().Empty()); 5665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(Intersection(fake_manager_->GetAndResetCleanedTypes(), 5675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) old_types).Empty()); 5685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(fake_manager_->InitialSyncEndedTypes().Equals(old_types)); 5695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(fake_manager_->GetTypesWithEmptyProgressMarkerToken( 5705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) enabled_types_).Equals(new_types)); 5715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Downloads and applies the new types. 5735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ConfigureDataTypes(enabled_types_, 5745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Difference(syncer::ModelTypeSet::All(), 5755f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) enabled_types_), 5765f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) syncer::ModelTypeSet()); 5775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(fake_manager_->GetAndResetDownloadedTypes().Equals( 5785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Union(new_types, syncer::ModelTypeSet(syncer::NIGORI)))); 5795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(Intersection(fake_manager_->GetAndResetCleanedTypes(), 5805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) enabled_types_).Empty()); 5815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(fake_manager_->InitialSyncEndedTypes().Equals(enabled_types_)); 5825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(fake_manager_->GetAndResetEnabledTypes().Equals(enabled_types_)); 5835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(fake_manager_->GetTypesWithEmptyProgressMarkerToken( 5845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) enabled_types_).Empty()); 5855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 5865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Test the newly supported types scenario, but with the presence of partial 5885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// types as well. Both partial and newly supported types should be downloaded 5895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// the configuration. 5905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(SyncBackendHostTest, NewlySupportedTypesWithPartialTypes) { 5915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sync_prefs_->SetSyncSetupCompleted(); 5925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Set sync manager behavior before passing it down. All types have progress 5935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // markers and initial sync ended except the new types. 5945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) syncer::ModelTypeSet old_types = enabled_types_; 5955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) syncer::ModelTypeSet partial_types(syncer::NIGORI, syncer::BOOKMARKS); 5965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) syncer::ModelTypeSet full_types = 5975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Difference(enabled_types_, partial_types); 598a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) fake_manager_factory_->set_progress_marker_types(old_types); 599a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) fake_manager_factory_->set_initial_sync_ended_types(full_types); 6005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) syncer::ModelTypeSet new_types(syncer::APP_SETTINGS, 6015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) syncer::EXTENSION_SETTINGS); 6025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) enabled_types_.PutAll(new_types); 6035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Purge the partial types. The nigori will be among the purged types, but 6055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // the syncer will re-download it by the time the initialization is complete. 6062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) InitializeBackend(true); 6075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(fake_manager_->GetAndResetDownloadedTypes().Equals( 6085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) syncer::ModelTypeSet(syncer::NIGORI))); 6095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(fake_manager_->GetAndResetCleanedTypes().HasAll(partial_types)); 6105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(fake_manager_->InitialSyncEndedTypes().Equals( 6115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) syncer::Union(full_types, syncer::ModelTypeSet(syncer::NIGORI)))); 6125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(fake_manager_->GetTypesWithEmptyProgressMarkerToken( 6135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) enabled_types_).Equals(Union(new_types, Difference( 6145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) partial_types, syncer::ModelTypeSet(syncer::NIGORI))))); 6155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Downloads and applies the new types and partial types (which includes 6175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // nigori anyways). 6185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ConfigureDataTypes(enabled_types_, 6195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Difference(syncer::ModelTypeSet::All(), 6205f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) enabled_types_), 6215f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) syncer::ModelTypeSet()); 6225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(fake_manager_->GetAndResetDownloadedTypes().Equals( 6235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Union(new_types, partial_types))); 6245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(Intersection(fake_manager_->GetAndResetCleanedTypes(), 6255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) enabled_types_).Empty()); 6265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(fake_manager_->InitialSyncEndedTypes().Equals(enabled_types_)); 6275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(fake_manager_->GetAndResetEnabledTypes().Equals(enabled_types_)); 6285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(fake_manager_->GetTypesWithEmptyProgressMarkerToken( 6295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) enabled_types_).Empty()); 6305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 6315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Verify that downloading control types only downloads those types that do 6332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// not have initial sync ended set. 6342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(SyncBackendHostTest, DownloadControlTypes) { 6352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) sync_prefs_->SetSyncSetupCompleted(); 6362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Set sync manager behavior before passing it down. Experiments and device 6372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // info are new types without progress markers or initial sync ended, while 6382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // all other types have been fully downloaded and applied. 6391320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci syncer::ModelTypeSet new_types(syncer::EXPERIMENTS, syncer::NIGORI); 6402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) syncer::ModelTypeSet old_types = 6412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Difference(enabled_types_, new_types); 642a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) fake_manager_factory_->set_progress_marker_types(old_types); 643a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) fake_manager_factory_->set_initial_sync_ended_types(old_types); 6442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 6452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Bringing up the backend should download the new types without downloading 6462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // any old types. 6472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) InitializeBackend(true); 6482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_TRUE(fake_manager_->GetAndResetDownloadedTypes().Equals(new_types)); 649eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch EXPECT_TRUE(fake_manager_->GetAndResetCleanedTypes().Equals( 650eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch Difference(syncer::ModelTypeSet::All(), 651eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch enabled_types_))); 6522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_TRUE(fake_manager_->InitialSyncEndedTypes().Equals(enabled_types_)); 6532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_TRUE(fake_manager_->GetTypesWithEmptyProgressMarkerToken( 6542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) enabled_types_).Empty()); 6552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 6562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 6572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Fail to download control types. It's believed that there is a server bug 6582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// which can allow this to happen (crbug.com/164288). The sync backend host 6592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// should detect this condition and fail to initialize the backend. 6602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// 6612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// The failure is "silent" in the sense that the GetUpdates request appears to 6622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// be successful, but it returned no results. This means that the usual 6632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// download retry logic will not be invoked. 6642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(SyncBackendHostTest, SilentlyFailToDownloadControlTypes) { 665a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) fake_manager_factory_->set_configure_fail_types(syncer::ModelTypeSet::All()); 6662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) InitializeBackend(false); 6672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 6682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 6692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Test that local refresh requests are delivered to sync. 6702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(SyncBackendHostTest, ForwardLocalRefreshRequest) { 6712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) InitializeBackend(true); 6722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 6732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) syncer::ModelTypeSet set1 = syncer::ModelTypeSet::All(); 6742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) IssueRefreshRequest(set1); 6752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) fake_manager_->WaitForSyncThread(); 6762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_TRUE(set1.Equals(fake_manager_->GetLastRefreshRequestTypes())); 6772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 6782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) syncer::ModelTypeSet set2 = syncer::ModelTypeSet(syncer::SESSIONS); 6792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) IssueRefreshRequest(set2); 6802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) fake_manager_->WaitForSyncThread(); 6812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_TRUE(set2.Equals(fake_manager_->GetLastRefreshRequestTypes())); 6822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 6832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 6842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Test that local invalidations issued before sync is initialized are ignored. 6852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(SyncBackendHostTest, AttemptForwardLocalRefreshRequestEarly) { 6862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) syncer::ModelTypeSet set1 = syncer::ModelTypeSet::All(); 6872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) IssueRefreshRequest(set1); 6882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 6892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) InitializeBackend(true); 6902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 6912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) fake_manager_->WaitForSyncThread(); 6922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_FALSE(set1.Equals(fake_manager_->GetLastRefreshRequestTypes())); 6932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 6942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 6952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Test that local invalidations issued while sync is shutting down are ignored. 6962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(SyncBackendHostTest, AttemptForwardLocalRefreshRequestLate) { 6972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) InitializeBackend(true); 6982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 6992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) backend_->StopSyncingForShutdown(); 7002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 7012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) syncer::ModelTypeSet types = syncer::ModelTypeSet::All(); 7022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) IssueRefreshRequest(types); 7032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) fake_manager_->WaitForSyncThread(); 7042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_FALSE(types.Equals(fake_manager_->GetLastRefreshRequestTypes())); 7052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 7065f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) backend_->Shutdown(syncer::STOP_SYNC); 7072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) backend_.reset(); 7082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 7092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 710c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// Test that configuration on signin sends the proper GU source. 711c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)TEST_F(SyncBackendHostTest, DownloadControlTypesNewClient) { 712c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) InitializeBackend(true); 713c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_EQ(syncer::CONFIGURE_REASON_NEW_CLIENT, 714c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) fake_manager_->GetAndResetConfigureReason()); 715c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 716c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 717c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// Test that configuration on restart sends the proper GU source. 718c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)TEST_F(SyncBackendHostTest, DownloadControlTypesRestart) { 719c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) sync_prefs_->SetSyncSetupCompleted(); 7201e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) fake_manager_factory_->set_progress_marker_types(enabled_types_); 7211e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) fake_manager_factory_->set_initial_sync_ended_types(enabled_types_); 722c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) InitializeBackend(true); 723c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_EQ(syncer::CONFIGURE_REASON_NEWLY_ENABLED_DATA_TYPE, 724c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) fake_manager_->GetAndResetConfigureReason()); 725c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 726c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 727f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)// It is SyncBackendHostCore responsibility to cleanup Sync Data folder if sync 728f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)// setup hasn't been completed. This test ensures that cleanup happens. 729f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)TEST_F(SyncBackendHostTest, TestStartupWithOldSyncData) { 730f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) const char* nonsense = "slon"; 731f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) base::FilePath temp_directory = 732cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) profile_->GetPath().Append(base::FilePath(kTestSyncDir)); 733f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) base::FilePath sync_file = temp_directory.AppendASCII("SyncData.sqlite3"); 734a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) ASSERT_TRUE(base::CreateDirectory(temp_directory)); 735a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) ASSERT_NE(-1, base::WriteFile(sync_file, nonsense, strlen(nonsense))); 736f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 737f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) InitializeBackend(true); 738f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 739f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) EXPECT_FALSE(base::PathExists(sync_file)); 740f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)} 741f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 7425f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)// If bookmarks encounter an error that results in disabling without purging 7435f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)// (such as when the type is unready), and then is explicitly disabled, the 7445f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)// SyncBackendHost needs to tell the manager to purge the type, even though 7455f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)// it's already disabled (crbug.com/386778). 7465f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)TEST_F(SyncBackendHostTest, DisableThenPurgeType) { 7475f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) syncer::ModelTypeSet error_types(syncer::BOOKMARKS); 7485f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 7495f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) InitializeBackend(true); 7505f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 7515f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) // First enable the types. 7525f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) ConfigureDataTypes(enabled_types_, 7535f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) Difference(syncer::ModelTypeSet::All(), 7545f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) enabled_types_), 7555f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) syncer::ModelTypeSet()); 7565f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 7575f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) // Then mark the error types as unready (disables without purging). 7585f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) ConfigureDataTypes(enabled_types_, 7595f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) Difference(syncer::ModelTypeSet::All(), 7605f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) enabled_types_), 7615f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) error_types); 7625f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) EXPECT_TRUE(fake_manager_->GetTypesWithEmptyProgressMarkerToken( 7635f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) error_types).Empty()); 7645f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 7655f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) // Lastly explicitly disable the error types, which should result in a purge. 7665f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) enabled_types_.RemoveAll(error_types); 7675f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) ConfigureDataTypes(enabled_types_, 7685f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) Difference(syncer::ModelTypeSet::All(), 7695f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) enabled_types_), 7705f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) syncer::ModelTypeSet()); 7715f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) EXPECT_FALSE(fake_manager_->GetTypesWithEmptyProgressMarkerToken( 7725f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) error_types).Empty()); 7735f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)} 7745f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 7755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace 7765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace browser_sync 778