Index: components/browser_sync/browser/profile_sync_service_unittest.cc |
diff --git a/components/browser_sync/browser/profile_sync_service_unittest.cc b/components/browser_sync/browser/profile_sync_service_unittest.cc |
deleted file mode 100644 |
index b438d5c2ed0fa52494bdb073d818b3d4cd8763bf..0000000000000000000000000000000000000000 |
--- a/components/browser_sync/browser/profile_sync_service_unittest.cc |
+++ /dev/null |
@@ -1,975 +0,0 @@ |
-// Copyright (c) 2012 The Chromium Authors. All rights reserved. |
-// Use of this source code is governed by a BSD-style license that can be |
-// found in the LICENSE file. |
- |
-#include "components/browser_sync/browser/profile_sync_service.h" |
- |
-#include <memory> |
-#include <utility> |
-#include <vector> |
- |
-#include "base/callback.h" |
-#include "base/command_line.h" |
-#include "base/compiler_specific.h" |
-#include "base/feature_list.h" |
-#include "base/location.h" |
-#include "base/run_loop.h" |
-#include "base/single_thread_task_runner.h" |
-#include "base/strings/string_number_conversions.h" |
-#include "base/strings/utf_string_conversions.h" |
-#include "base/test/scoped_feature_list.h" |
-#include "base/test/sequenced_worker_pool_owner.h" |
-#include "base/threading/thread_task_runner_handle.h" |
-#include "base/values.h" |
-#include "build/build_config.h" |
-#include "components/browser_sync/browser/profile_sync_test_util.h" |
-#include "components/browser_sync/common/browser_sync_switches.h" |
-#include "components/invalidation/impl/profile_invalidation_provider.h" |
-#include "components/invalidation/public/invalidation_service.h" |
-#include "components/signin/core/browser/account_tracker_service.h" |
-#include "components/signin/core/browser/fake_signin_manager.h" |
-#include "components/strings/grit/components_strings.h" |
-#include "components/sync/driver/data_type_manager.h" |
-#include "components/sync/driver/data_type_manager_observer.h" |
-#include "components/sync/driver/fake_data_type_controller.h" |
-#include "components/sync/driver/glue/sync_backend_host_mock.h" |
-#include "components/sync/driver/pref_names.h" |
-#include "components/sync/driver/sync_api_component_factory_mock.h" |
-#include "components/sync/driver/sync_driver_switches.h" |
-#include "components/sync/driver/sync_prefs.h" |
-#include "components/sync/driver/sync_service_observer.h" |
-#include "components/sync/driver/sync_util.h" |
-#include "components/syncable_prefs/testing_pref_service_syncable.h" |
-#include "components/version_info/version_info.h" |
-#include "components/version_info/version_info_values.h" |
-#include "google_apis/gaia/gaia_constants.h" |
-#include "testing/gmock/include/gmock/gmock.h" |
-#include "testing/gtest/include/gtest/gtest.h" |
-#include "ui/base/l10n/l10n_util.h" |
- |
-using testing::Return; |
- |
-namespace browser_sync { |
- |
-namespace { |
- |
-const char kGaiaId[] = "12345"; |
-const char kEmail[] = "test_user@gmail.com"; |
- |
-class FakeDataTypeManager : public sync_driver::DataTypeManager { |
- public: |
- typedef base::Callback<void(syncer::ConfigureReason)> ConfigureCalled; |
- |
- explicit FakeDataTypeManager(const ConfigureCalled& configure_called) |
- : configure_called_(configure_called) {} |
- |
- ~FakeDataTypeManager() override{}; |
- |
- void Configure(syncer::ModelTypeSet desired_types, |
- syncer::ConfigureReason reason) override { |
- DCHECK(!configure_called_.is_null()); |
- configure_called_.Run(reason); |
- } |
- |
- void ReenableType(syncer::ModelType type) override {} |
- void ResetDataTypeErrors() override {} |
- void PurgeForMigration(syncer::ModelTypeSet undesired_types, |
- syncer::ConfigureReason reason) override {} |
- void Stop() override{}; |
- State state() const override { |
- return sync_driver::DataTypeManager::CONFIGURED; |
- }; |
- |
- private: |
- ConfigureCalled configure_called_; |
-}; |
- |
-ACTION_P(ReturnNewDataTypeManager, configure_called) { |
- return new FakeDataTypeManager(configure_called); |
-} |
- |
-using testing::Return; |
-using testing::StrictMock; |
-using testing::_; |
- |
-class TestSyncServiceObserver : public sync_driver::SyncServiceObserver { |
- public: |
- explicit TestSyncServiceObserver(ProfileSyncService* service) |
- : service_(service), setup_in_progress_(false) {} |
- void OnStateChanged() override { |
- setup_in_progress_ = service_->IsSetupInProgress(); |
- } |
- bool setup_in_progress() const { return setup_in_progress_; } |
- |
- private: |
- ProfileSyncService* service_; |
- bool setup_in_progress_; |
-}; |
- |
-// A variant of the SyncBackendHostMock that won't automatically |
-// call back when asked to initialized. Allows us to test things |
-// that could happen while backend init is in progress. |
-class SyncBackendHostNoReturn : public SyncBackendHostMock { |
- void Initialize( |
- sync_driver::SyncFrontend* frontend, |
- std::unique_ptr<base::Thread> sync_thread, |
- const scoped_refptr<base::SingleThreadTaskRunner>& db_thread, |
- const scoped_refptr<base::SingleThreadTaskRunner>& file_thread, |
- const syncer::WeakHandle<syncer::JsEventHandler>& event_handler, |
- const GURL& service_url, |
- const std::string& sync_user_agent, |
- const syncer::SyncCredentials& credentials, |
- bool delete_sync_data_folder, |
- std::unique_ptr<syncer::SyncManagerFactory> sync_manager_factory, |
- const syncer::WeakHandle<syncer::UnrecoverableErrorHandler>& |
- unrecoverable_error_handler, |
- const base::Closure& report_unrecoverable_error_function, |
- const HttpPostProviderFactoryGetter& http_post_provider_factory_getter, |
- std::unique_ptr<syncer::SyncEncryptionHandler::NigoriState> |
- saved_nigori_state) override {} |
-}; |
- |
-class SyncBackendHostMockCollectDeleteDirParam : public SyncBackendHostMock { |
- public: |
- explicit SyncBackendHostMockCollectDeleteDirParam( |
- std::vector<bool>* delete_dir_param) |
- : delete_dir_param_(delete_dir_param) {} |
- |
- void Initialize( |
- sync_driver::SyncFrontend* frontend, |
- std::unique_ptr<base::Thread> sync_thread, |
- const scoped_refptr<base::SingleThreadTaskRunner>& db_thread, |
- const scoped_refptr<base::SingleThreadTaskRunner>& file_thread, |
- const syncer::WeakHandle<syncer::JsEventHandler>& event_handler, |
- const GURL& service_url, |
- const std::string& sync_user_agent, |
- const syncer::SyncCredentials& credentials, |
- bool delete_sync_data_folder, |
- std::unique_ptr<syncer::SyncManagerFactory> sync_manager_factory, |
- const syncer::WeakHandle<syncer::UnrecoverableErrorHandler>& |
- unrecoverable_error_handler, |
- const base::Closure& report_unrecoverable_error_function, |
- const HttpPostProviderFactoryGetter& http_post_provider_factory_getter, |
- std::unique_ptr<syncer::SyncEncryptionHandler::NigoriState> |
- saved_nigori_state) override { |
- delete_dir_param_->push_back(delete_sync_data_folder); |
- SyncBackendHostMock::Initialize( |
- frontend, std::move(sync_thread), db_thread, file_thread, event_handler, |
- service_url, sync_user_agent, credentials, delete_sync_data_folder, |
- std::move(sync_manager_factory), unrecoverable_error_handler, |
- report_unrecoverable_error_function, http_post_provider_factory_getter, |
- std::move(saved_nigori_state)); |
- } |
- |
- private: |
- std::vector<bool>* delete_dir_param_; |
-}; |
- |
-// SyncBackendHostMock that calls an external callback when ClearServerData is |
-// called. |
-class SyncBackendHostCaptureClearServerData : public SyncBackendHostMock { |
- public: |
- typedef base::Callback<void( |
- const syncer::SyncManager::ClearServerDataCallback&)> |
- ClearServerDataCalled; |
- explicit SyncBackendHostCaptureClearServerData( |
- const ClearServerDataCalled& clear_server_data_called) |
- : clear_server_data_called_(clear_server_data_called) {} |
- |
- void ClearServerData( |
- const syncer::SyncManager::ClearServerDataCallback& callback) override { |
- clear_server_data_called_.Run(callback); |
- } |
- |
- private: |
- ClearServerDataCalled clear_server_data_called_; |
-}; |
- |
-ACTION(ReturnNewSyncBackendHostMock) { |
- return new browser_sync::SyncBackendHostMock(); |
-} |
- |
-ACTION(ReturnNewSyncBackendHostNoReturn) { |
- return new browser_sync::SyncBackendHostNoReturn(); |
-} |
- |
-ACTION_P(ReturnNewMockHostCollectDeleteDirParam, delete_dir_param) { |
- return new browser_sync::SyncBackendHostMockCollectDeleteDirParam( |
- delete_dir_param); |
-} |
- |
-void OnClearServerDataCalled( |
- syncer::SyncManager::ClearServerDataCallback* captured_callback, |
- const syncer::SyncManager::ClearServerDataCallback& callback) { |
- *captured_callback = callback; |
-} |
- |
-ACTION_P(ReturnNewMockHostCaptureClearServerData, captured_callback) { |
- return new SyncBackendHostCaptureClearServerData(base::Bind( |
- &OnClearServerDataCalled, base::Unretained(captured_callback))); |
-} |
- |
-// A test harness that uses a real ProfileSyncService and in most cases a |
-// MockSyncBackendHost. |
-// |
-// This is useful if we want to test the ProfileSyncService and don't care about |
-// testing the SyncBackendHost. |
-class ProfileSyncServiceTest : public ::testing::Test { |
- protected: |
- ProfileSyncServiceTest() : component_factory_(nullptr) {} |
- ~ProfileSyncServiceTest() override {} |
- |
- void SetUp() override { |
- base::CommandLine::ForCurrentProcess()->AppendSwitchASCII( |
- switches::kSyncDeferredStartupTimeoutSeconds, "0"); |
- } |
- |
- void TearDown() override { |
- // Kill the service before the profile. |
- if (service_) |
- service_->Shutdown(); |
- |
- service_.reset(); |
- } |
- |
- void IssueTestTokens() { |
- std::string account_id = |
- account_tracker()->SeedAccountInfo(kGaiaId, kEmail); |
- auth_service()->UpdateCredentials(account_id, "oauth2_login_token"); |
- } |
- |
- void CreateService(ProfileSyncService::StartBehavior behavior) { |
- signin_manager()->SetAuthenticatedAccountInfo(kGaiaId, kEmail); |
- component_factory_ = profile_sync_service_bundle_.component_factory(); |
- ProfileSyncServiceBundle::SyncClientBuilder builder( |
- &profile_sync_service_bundle_); |
- ProfileSyncService::InitParams init_params = |
- profile_sync_service_bundle_.CreateBasicInitParams(behavior, |
- builder.Build()); |
- |
- service_.reset(new ProfileSyncService(std::move(init_params))); |
- service_->RegisterDataTypeController( |
- base::MakeUnique<sync_driver::FakeDataTypeController>( |
- syncer::BOOKMARKS)); |
- } |
- |
-#if defined(OS_WIN) || defined(OS_MACOSX) || \ |
- (defined(OS_LINUX) && !defined(OS_CHROMEOS)) |
- void CreateServiceWithoutSignIn() { |
- CreateService(ProfileSyncService::AUTO_START); |
- signin_manager()->SignOut(signin_metrics::SIGNOUT_TEST, |
- signin_metrics::SignoutDelete::IGNORE_METRIC); |
- } |
-#endif |
- |
- void ShutdownAndDeleteService() { |
- if (service_) |
- service_->Shutdown(); |
- service_.reset(); |
- } |
- |
- void InitializeForNthSync() { |
- // Set first sync time before initialize to simulate a complete sync setup. |
- sync_driver::SyncPrefs sync_prefs(prefs()); |
- sync_prefs.SetFirstSyncTime(base::Time::Now()); |
- sync_prefs.SetFirstSetupComplete(); |
- sync_prefs.SetKeepEverythingSynced(true); |
- service_->Initialize(); |
- } |
- |
- void InitializeForFirstSync() { |
- service_->Initialize(); |
- } |
- |
- void TriggerPassphraseRequired() { |
- service_->OnPassphraseRequired(syncer::REASON_DECRYPTION, |
- sync_pb::EncryptedData()); |
- } |
- |
- void TriggerDataTypeStartRequest() { |
- service_->OnDataTypeRequestsSyncStartup(syncer::BOOKMARKS); |
- } |
- |
- void OnConfigureCalled(syncer::ConfigureReason configure_reason) { |
- sync_driver::DataTypeManager::ConfigureResult result; |
- result.status = sync_driver::DataTypeManager::OK; |
- service()->OnConfigureDone(result); |
- } |
- |
- FakeDataTypeManager::ConfigureCalled GetDefaultConfigureCalledCallback() { |
- return base::Bind(&ProfileSyncServiceTest::OnConfigureCalled, |
- base::Unretained(this)); |
- } |
- |
- void OnConfigureCalledRecordReason(syncer::ConfigureReason* reason_dest, |
- syncer::ConfigureReason reason) { |
- DCHECK(reason_dest); |
- *reason_dest = reason; |
- } |
- |
- FakeDataTypeManager::ConfigureCalled GetRecordingConfigureCalledCallback( |
- syncer::ConfigureReason* reason) { |
- return base::Bind(&ProfileSyncServiceTest::OnConfigureCalledRecordReason, |
- base::Unretained(this), reason); |
- } |
- |
- void ExpectDataTypeManagerCreation( |
- int times, |
- const FakeDataTypeManager::ConfigureCalled& callback) { |
- EXPECT_CALL(*component_factory_, CreateDataTypeManager(_, _, _, _, _)) |
- .Times(times) |
- .WillRepeatedly(ReturnNewDataTypeManager(callback)); |
- } |
- |
- void ExpectSyncBackendHostCreation(int times) { |
- EXPECT_CALL(*component_factory_, CreateSyncBackendHost(_, _, _, _)) |
- .Times(times) |
- .WillRepeatedly(ReturnNewSyncBackendHostMock()); |
- } |
- |
- void ExpectSyncBackendHostCreationCollectDeleteDir( |
- int times, std::vector<bool> *delete_dir_param) { |
- EXPECT_CALL(*component_factory_, CreateSyncBackendHost(_, _, _, _)) |
- .Times(times) |
- .WillRepeatedly( |
- ReturnNewMockHostCollectDeleteDirParam(delete_dir_param)); |
- } |
- |
- void ExpectSyncBackendHostCreationCaptureClearServerData( |
- syncer::SyncManager::ClearServerDataCallback* captured_callback) { |
- EXPECT_CALL(*component_factory_, CreateSyncBackendHost(_, _, _, _)) |
- .Times(1) |
- .WillOnce(ReturnNewMockHostCaptureClearServerData(captured_callback)); |
- } |
- |
- void PrepareDelayedInitSyncBackendHost() { |
- EXPECT_CALL(*component_factory_, CreateSyncBackendHost(_, _, _, _)) |
- .WillOnce(ReturnNewSyncBackendHostNoReturn()); |
- } |
- |
- AccountTrackerService* account_tracker() { |
- return profile_sync_service_bundle_.account_tracker(); |
- } |
- |
-#if defined(OS_CHROMEOS) |
- SigninManagerBase* signin_manager() |
-#else |
- SigninManager* signin_manager() |
-#endif |
- // Opening brace is outside of macro to avoid confusing lint. |
- { |
- return profile_sync_service_bundle_.signin_manager(); |
- } |
- |
- ProfileOAuth2TokenService* auth_service() { |
- return profile_sync_service_bundle_.auth_service(); |
- } |
- |
- ProfileSyncService* service() { |
- return service_.get(); |
- } |
- |
- syncable_prefs::TestingPrefServiceSyncable* prefs() { |
- return profile_sync_service_bundle_.pref_service(); |
- } |
- |
- SyncApiComponentFactoryMock* component_factory() { |
- return component_factory_; |
- } |
- |
- protected: |
- void PumpLoop() { |
- base::RunLoop run_loop; |
- base::ThreadTaskRunnerHandle::Get()->PostTask(FROM_HERE, |
- run_loop.QuitClosure()); |
- run_loop.Run(); |
- } |
- |
- private: |
- base::MessageLoop message_loop_; |
- browser_sync::ProfileSyncServiceBundle profile_sync_service_bundle_; |
- std::unique_ptr<ProfileSyncService> service_; |
- |
- // The current component factory used by sync. May be null if the server |
- // hasn't been created yet. |
- SyncApiComponentFactoryMock* component_factory_; |
-}; |
- |
-// Verify that the server URLs are sane. |
-TEST_F(ProfileSyncServiceTest, InitialState) { |
- CreateService(ProfileSyncService::AUTO_START); |
- InitializeForNthSync(); |
- const std::string& url = service()->sync_service_url().spec(); |
- EXPECT_TRUE(url == internal::kSyncServerUrl || |
- url == internal::kSyncDevServerUrl); |
-} |
- |
-// Verify a successful initialization. |
-TEST_F(ProfileSyncServiceTest, SuccessfulInitialization) { |
- prefs()->SetManagedPref(sync_driver::prefs::kSyncManaged, |
- new base::FundamentalValue(false)); |
- IssueTestTokens(); |
- CreateService(ProfileSyncService::AUTO_START); |
- ExpectDataTypeManagerCreation(1, GetDefaultConfigureCalledCallback()); |
- ExpectSyncBackendHostCreation(1); |
- InitializeForNthSync(); |
- EXPECT_FALSE(service()->IsManaged()); |
- EXPECT_TRUE(service()->IsSyncActive()); |
-} |
- |
-// Verify that an initialization where first setup is not complete does not |
-// start up the backend. |
-TEST_F(ProfileSyncServiceTest, NeedsConfirmation) { |
- prefs()->SetManagedPref(sync_driver::prefs::kSyncManaged, |
- new base::FundamentalValue(false)); |
- IssueTestTokens(); |
- CreateService(ProfileSyncService::MANUAL_START); |
- sync_driver::SyncPrefs sync_prefs(prefs()); |
- base::Time now = base::Time::Now(); |
- sync_prefs.SetLastSyncedTime(now); |
- sync_prefs.SetKeepEverythingSynced(true); |
- service()->Initialize(); |
- EXPECT_FALSE(service()->IsSyncActive()); |
- |
- // The last sync time shouldn't be cleared. |
- // TODO(zea): figure out a way to check that the directory itself wasn't |
- // cleared. |
- EXPECT_EQ(now, sync_prefs.GetLastSyncedTime()); |
-} |
- |
-// Verify that the SetSetupInProgress function call updates state |
-// and notifies observers. |
-TEST_F(ProfileSyncServiceTest, SetupInProgress) { |
- CreateService(ProfileSyncService::AUTO_START); |
- InitializeForFirstSync(); |
- |
- TestSyncServiceObserver observer(service()); |
- service()->AddObserver(&observer); |
- |
- auto sync_blocker = service()->GetSetupInProgressHandle(); |
- EXPECT_TRUE(observer.setup_in_progress()); |
- sync_blocker.reset(); |
- EXPECT_FALSE(observer.setup_in_progress()); |
- |
- service()->RemoveObserver(&observer); |
-} |
- |
-// Verify that disable by enterprise policy works. |
-TEST_F(ProfileSyncServiceTest, DisabledByPolicyBeforeInit) { |
- prefs()->SetManagedPref(sync_driver::prefs::kSyncManaged, |
- new base::FundamentalValue(true)); |
- IssueTestTokens(); |
- CreateService(ProfileSyncService::AUTO_START); |
- InitializeForNthSync(); |
- EXPECT_TRUE(service()->IsManaged()); |
- EXPECT_FALSE(service()->IsSyncActive()); |
-} |
- |
-// Verify that disable by enterprise policy works even after the backend has |
-// been initialized. |
-TEST_F(ProfileSyncServiceTest, DisabledByPolicyAfterInit) { |
- IssueTestTokens(); |
- CreateService(ProfileSyncService::AUTO_START); |
- ExpectDataTypeManagerCreation(1, GetDefaultConfigureCalledCallback()); |
- ExpectSyncBackendHostCreation(1); |
- InitializeForNthSync(); |
- |
- EXPECT_FALSE(service()->IsManaged()); |
- EXPECT_TRUE(service()->IsSyncActive()); |
- |
- prefs()->SetManagedPref(sync_driver::prefs::kSyncManaged, |
- new base::FundamentalValue(true)); |
- |
- EXPECT_TRUE(service()->IsManaged()); |
- EXPECT_FALSE(service()->IsSyncActive()); |
-} |
- |
-// Exercies the ProfileSyncService's code paths related to getting shut down |
-// before the backend initialize call returns. |
-TEST_F(ProfileSyncServiceTest, AbortedByShutdown) { |
- CreateService(ProfileSyncService::AUTO_START); |
- PrepareDelayedInitSyncBackendHost(); |
- |
- IssueTestTokens(); |
- InitializeForNthSync(); |
- EXPECT_FALSE(service()->IsSyncActive()); |
- |
- ShutdownAndDeleteService(); |
-} |
- |
-// Test RequestStop() before we've initialized the backend. |
-TEST_F(ProfileSyncServiceTest, EarlyRequestStop) { |
- CreateService(ProfileSyncService::AUTO_START); |
- IssueTestTokens(); |
- ExpectDataTypeManagerCreation(1, GetDefaultConfigureCalledCallback()); |
- ExpectSyncBackendHostCreation(1); |
- |
- service()->RequestStop(ProfileSyncService::KEEP_DATA); |
- EXPECT_FALSE(service()->IsSyncRequested()); |
- |
- // Because sync is not requested, this should fail. |
- InitializeForNthSync(); |
- EXPECT_FALSE(service()->IsSyncRequested()); |
- EXPECT_FALSE(service()->IsSyncActive()); |
- |
- // Request start. This should be enough to allow init to happen. |
- service()->RequestStart(); |
- EXPECT_TRUE(service()->IsSyncRequested()); |
- EXPECT_TRUE(service()->IsSyncActive()); |
-} |
- |
-// Test RequestStop() after we've initialized the backend. |
-TEST_F(ProfileSyncServiceTest, DisableAndEnableSyncTemporarily) { |
- CreateService(ProfileSyncService::AUTO_START); |
- IssueTestTokens(); |
- ExpectDataTypeManagerCreation(1, GetDefaultConfigureCalledCallback()); |
- ExpectSyncBackendHostCreation(1); |
- InitializeForNthSync(); |
- |
- EXPECT_TRUE(service()->IsSyncActive()); |
- EXPECT_FALSE(prefs()->GetBoolean(sync_driver::prefs::kSyncSuppressStart)); |
- |
- testing::Mock::VerifyAndClearExpectations(component_factory()); |
- |
- service()->RequestStop(ProfileSyncService::KEEP_DATA); |
- EXPECT_FALSE(service()->IsSyncActive()); |
- EXPECT_TRUE(prefs()->GetBoolean(sync_driver::prefs::kSyncSuppressStart)); |
- |
- ExpectDataTypeManagerCreation(1, GetDefaultConfigureCalledCallback()); |
- ExpectSyncBackendHostCreation(1); |
- |
- service()->RequestStart(); |
- EXPECT_TRUE(service()->IsSyncActive()); |
- EXPECT_FALSE(prefs()->GetBoolean(sync_driver::prefs::kSyncSuppressStart)); |
-} |
- |
-// Certain ProfileSyncService tests don't apply to Chrome OS, for example |
-// things that deal with concepts like "signing out" and policy. |
-#if !defined (OS_CHROMEOS) |
-TEST_F(ProfileSyncServiceTest, EnableSyncAndSignOut) { |
- CreateService(ProfileSyncService::AUTO_START); |
- ExpectDataTypeManagerCreation(1, GetDefaultConfigureCalledCallback()); |
- ExpectSyncBackendHostCreation(1); |
- IssueTestTokens(); |
- InitializeForNthSync(); |
- |
- EXPECT_TRUE(service()->IsSyncActive()); |
- EXPECT_FALSE(prefs()->GetBoolean(sync_driver::prefs::kSyncSuppressStart)); |
- |
- signin_manager()->SignOut(signin_metrics::SIGNOUT_TEST, |
- signin_metrics::SignoutDelete::IGNORE_METRIC); |
- EXPECT_FALSE(service()->IsSyncActive()); |
-} |
-#endif // !defined(OS_CHROMEOS) |
- |
-TEST_F(ProfileSyncServiceTest, GetSyncTokenStatus) { |
- CreateService(ProfileSyncService::AUTO_START); |
- IssueTestTokens(); |
- ExpectDataTypeManagerCreation(1, GetDefaultConfigureCalledCallback()); |
- ExpectSyncBackendHostCreation(1); |
- InitializeForNthSync(); |
- |
- // Initial status. |
- ProfileSyncService::SyncTokenStatus token_status = |
- service()->GetSyncTokenStatus(); |
- EXPECT_EQ(syncer::CONNECTION_NOT_ATTEMPTED, token_status.connection_status); |
- EXPECT_TRUE(token_status.connection_status_update_time.is_null()); |
- EXPECT_TRUE(token_status.token_request_time.is_null()); |
- EXPECT_TRUE(token_status.token_receive_time.is_null()); |
- |
- // Simulate an auth error. |
- service()->OnConnectionStatusChange(syncer::CONNECTION_AUTH_ERROR); |
- |
- // The token request will take the form of a posted task. Run it. |
- base::RunLoop loop; |
- loop.RunUntilIdle(); |
- |
- token_status = service()->GetSyncTokenStatus(); |
- EXPECT_EQ(syncer::CONNECTION_AUTH_ERROR, token_status.connection_status); |
- EXPECT_FALSE(token_status.connection_status_update_time.is_null()); |
- EXPECT_FALSE(token_status.token_request_time.is_null()); |
- EXPECT_FALSE(token_status.token_receive_time.is_null()); |
- EXPECT_EQ(GoogleServiceAuthError::AuthErrorNone(), |
- token_status.last_get_token_error); |
- EXPECT_TRUE(token_status.next_token_request_time.is_null()); |
- |
- // Simulate successful connection. |
- service()->OnConnectionStatusChange(syncer::CONNECTION_OK); |
- token_status = service()->GetSyncTokenStatus(); |
- EXPECT_EQ(syncer::CONNECTION_OK, token_status.connection_status); |
-} |
- |
-TEST_F(ProfileSyncServiceTest, RevokeAccessTokenFromTokenService) { |
- CreateService(ProfileSyncService::AUTO_START); |
- IssueTestTokens(); |
- ExpectDataTypeManagerCreation(1, GetDefaultConfigureCalledCallback()); |
- ExpectSyncBackendHostCreation(1); |
- InitializeForNthSync(); |
- EXPECT_TRUE(service()->IsSyncActive()); |
- |
- std::string primary_account_id = |
- signin_manager()->GetAuthenticatedAccountId(); |
- auth_service()->LoadCredentials(primary_account_id); |
- base::RunLoop().RunUntilIdle(); |
- EXPECT_FALSE(service()->GetAccessTokenForTest().empty()); |
- |
- std::string secondary_account_gaiaid = "1234567"; |
- std::string secondary_account_name = "test_user2@gmail.com"; |
- std::string secondary_account_id = account_tracker()->SeedAccountInfo( |
- secondary_account_gaiaid, secondary_account_name); |
- auth_service()->UpdateCredentials(secondary_account_id, |
- "second_account_refresh_token"); |
- auth_service()->RevokeCredentials(secondary_account_id); |
- EXPECT_FALSE(service()->GetAccessTokenForTest().empty()); |
- |
- auth_service()->RevokeCredentials(primary_account_id); |
- EXPECT_TRUE(service()->GetAccessTokenForTest().empty()); |
-} |
- |
-// CrOS does not support signout. |
-#if !defined(OS_CHROMEOS) |
-TEST_F(ProfileSyncServiceTest, SignOutRevokeAccessToken) { |
- CreateService(ProfileSyncService::AUTO_START); |
- IssueTestTokens(); |
- ExpectDataTypeManagerCreation(1, GetDefaultConfigureCalledCallback()); |
- ExpectSyncBackendHostCreation(1); |
- InitializeForNthSync(); |
- EXPECT_TRUE(service()->IsSyncActive()); |
- |
- std::string primary_account_id = |
- signin_manager()->GetAuthenticatedAccountId(); |
- auth_service()->LoadCredentials(primary_account_id); |
- base::RunLoop().RunUntilIdle(); |
- EXPECT_FALSE(service()->GetAccessTokenForTest().empty()); |
- |
- signin_manager()->SignOut(signin_metrics::SIGNOUT_TEST, |
- signin_metrics::SignoutDelete::IGNORE_METRIC); |
- EXPECT_TRUE(service()->GetAccessTokenForTest().empty()); |
-} |
-#endif |
- |
-// Verify that LastSyncedTime and local DeviceInfo is cleared on sign out. |
-TEST_F(ProfileSyncServiceTest, ClearDataOnSignOut) { |
- IssueTestTokens(); |
- CreateService(ProfileSyncService::AUTO_START); |
- ExpectDataTypeManagerCreation(1, GetDefaultConfigureCalledCallback()); |
- ExpectSyncBackendHostCreation(1); |
- InitializeForNthSync(); |
- EXPECT_TRUE(service()->IsSyncActive()); |
- EXPECT_EQ(l10n_util::GetStringUTF16(IDS_SYNC_TIME_JUST_NOW), |
- service()->GetLastSyncedTimeString()); |
- EXPECT_TRUE(service()->GetLocalDeviceInfoProvider()->GetLocalDeviceInfo()); |
- |
- // Sign out. |
- service()->RequestStop(ProfileSyncService::CLEAR_DATA); |
- PumpLoop(); |
- |
- EXPECT_EQ(l10n_util::GetStringUTF16(IDS_SYNC_TIME_NEVER), |
- service()->GetLastSyncedTimeString()); |
- EXPECT_FALSE(service()->GetLocalDeviceInfoProvider()->GetLocalDeviceInfo()); |
-} |
- |
-// Verify that the disable sync flag disables sync. |
-TEST_F(ProfileSyncServiceTest, DisableSyncFlag) { |
- base::CommandLine::ForCurrentProcess()->AppendSwitch(switches::kDisableSync); |
- EXPECT_FALSE(ProfileSyncService::IsSyncAllowedByFlag()); |
-} |
- |
-// Verify that no disable sync flag enables sync. |
-TEST_F(ProfileSyncServiceTest, NoDisableSyncFlag) { |
- EXPECT_TRUE(ProfileSyncService::IsSyncAllowedByFlag()); |
-} |
- |
-// Test Sync will stop after receive memory pressure |
-TEST_F(ProfileSyncServiceTest, MemoryPressureRecording) { |
- CreateService(ProfileSyncService::AUTO_START); |
- IssueTestTokens(); |
- ExpectDataTypeManagerCreation(1, GetDefaultConfigureCalledCallback()); |
- ExpectSyncBackendHostCreation(1); |
- InitializeForNthSync(); |
- |
- EXPECT_TRUE(service()->IsSyncActive()); |
- EXPECT_FALSE(prefs()->GetBoolean(sync_driver::prefs::kSyncSuppressStart)); |
- |
- testing::Mock::VerifyAndClearExpectations(component_factory()); |
- |
- sync_driver::SyncPrefs sync_prefs( |
- service()->GetSyncClient()->GetPrefService()); |
- |
- EXPECT_EQ( |
- prefs()->GetInteger(sync_driver::prefs::kSyncMemoryPressureWarningCount), |
- 0); |
- EXPECT_FALSE(sync_prefs.DidSyncShutdownCleanly()); |
- |
- // Simulate memory pressure notification. |
- base::MemoryPressureListener::NotifyMemoryPressure( |
- base::MemoryPressureListener::MEMORY_PRESSURE_LEVEL_CRITICAL); |
- base::RunLoop().RunUntilIdle(); |
- |
- // Verify memory pressure recorded. |
- EXPECT_EQ( |
- prefs()->GetInteger(sync_driver::prefs::kSyncMemoryPressureWarningCount), |
- 1); |
- EXPECT_FALSE(sync_prefs.DidSyncShutdownCleanly()); |
- |
- // Simulate memory pressure notification. |
- base::MemoryPressureListener::NotifyMemoryPressure( |
- base::MemoryPressureListener::MEMORY_PRESSURE_LEVEL_CRITICAL); |
- base::RunLoop().RunUntilIdle(); |
- ShutdownAndDeleteService(); |
- |
- // Verify memory pressure and shutdown recorded. |
- EXPECT_EQ( |
- prefs()->GetInteger(sync_driver::prefs::kSyncMemoryPressureWarningCount), |
- 2); |
- EXPECT_TRUE(sync_prefs.DidSyncShutdownCleanly()); |
-} |
- |
-// Verify that OnLocalSetPassphraseEncryption triggers catch up configure sync |
-// cycle, calls ClearServerData, shuts down and restarts sync. |
-TEST_F(ProfileSyncServiceTest, OnLocalSetPassphraseEncryption) { |
- base::test::ScopedFeatureList scoped_feature_list; |
- scoped_feature_list.InitAndEnableFeature( |
- switches::kSyncClearDataOnPassphraseEncryption); |
- IssueTestTokens(); |
- CreateService(ProfileSyncService::AUTO_START); |
- |
- syncer::SyncManager::ClearServerDataCallback captured_callback; |
- syncer::ConfigureReason configure_reason = syncer::CONFIGURE_REASON_UNKNOWN; |
- |
- // Initialize sync, ensure that both DataTypeManager and SyncBackendHost are |
- // initialized and DTM::Configure is called with |
- // CONFIGURE_REASON_NEWLY_ENABLED_DATA_TYPE. |
- ExpectSyncBackendHostCreationCaptureClearServerData(&captured_callback); |
- ExpectDataTypeManagerCreation( |
- 1, GetRecordingConfigureCalledCallback(&configure_reason)); |
- InitializeForNthSync(); |
- EXPECT_TRUE(service()->IsSyncActive()); |
- testing::Mock::VerifyAndClearExpectations(component_factory()); |
- EXPECT_EQ(syncer::CONFIGURE_REASON_NEWLY_ENABLED_DATA_TYPE, configure_reason); |
- sync_driver::DataTypeManager::ConfigureResult result; |
- result.status = sync_driver::DataTypeManager::OK; |
- service()->OnConfigureDone(result); |
- |
- // Simulate user entering encryption passphrase. Ensure that catch up |
- // configure cycle is started (DTM::Configure is called with |
- // CONFIGURE_REASON_CATCH_UP). |
- const syncer::SyncEncryptionHandler::NigoriState nigori_state; |
- service()->OnLocalSetPassphraseEncryption(nigori_state); |
- EXPECT_EQ(syncer::CONFIGURE_REASON_CATCH_UP, configure_reason); |
- EXPECT_TRUE(captured_callback.is_null()); |
- |
- // Simulate configure successful. Ensure that SBH::ClearServerData is called. |
- service()->OnConfigureDone(result); |
- EXPECT_FALSE(captured_callback.is_null()); |
- |
- // Once SBH::ClearServerData finishes successfully ensure that sync is |
- // restarted. |
- configure_reason = syncer::CONFIGURE_REASON_UNKNOWN; |
- ExpectSyncBackendHostCreation(1); |
- ExpectDataTypeManagerCreation( |
- 1, GetRecordingConfigureCalledCallback(&configure_reason)); |
- captured_callback.Run(); |
- testing::Mock::VerifyAndClearExpectations(component_factory()); |
- EXPECT_EQ(syncer::CONFIGURE_REASON_NEWLY_ENABLED_DATA_TYPE, configure_reason); |
- service()->OnConfigureDone(result); |
-} |
- |
-// Verify that if after OnLocalSetPassphraseEncryption catch up configure sync |
-// cycle gets interrupted, it starts again after browser restart. |
-TEST_F(ProfileSyncServiceTest, |
- OnLocalSetPassphraseEncryption_RestartDuringCatchUp) { |
- syncer::ConfigureReason configure_reason = syncer::CONFIGURE_REASON_UNKNOWN; |
- base::test::ScopedFeatureList scoped_feature_list; |
- scoped_feature_list.InitAndEnableFeature( |
- switches::kSyncClearDataOnPassphraseEncryption); |
- IssueTestTokens(); |
- CreateService(ProfileSyncService::AUTO_START); |
- ExpectSyncBackendHostCreation(1); |
- ExpectDataTypeManagerCreation( |
- 1, GetRecordingConfigureCalledCallback(&configure_reason)); |
- InitializeForNthSync(); |
- testing::Mock::VerifyAndClearExpectations(component_factory()); |
- EXPECT_EQ(syncer::CONFIGURE_REASON_NEWLY_ENABLED_DATA_TYPE, configure_reason); |
- sync_driver::DataTypeManager::ConfigureResult result; |
- result.status = sync_driver::DataTypeManager::OK; |
- service()->OnConfigureDone(result); |
- |
- // Simulate user entering encryption passphrase. Ensure Configure was called |
- // but don't let it continue. |
- const syncer::SyncEncryptionHandler::NigoriState nigori_state; |
- service()->OnLocalSetPassphraseEncryption(nigori_state); |
- EXPECT_EQ(syncer::CONFIGURE_REASON_CATCH_UP, configure_reason); |
- |
- // Simulate browser restart. First configuration is a regular one. |
- service()->Shutdown(); |
- syncer::SyncManager::ClearServerDataCallback captured_callback; |
- ExpectSyncBackendHostCreationCaptureClearServerData(&captured_callback); |
- ExpectDataTypeManagerCreation( |
- 1, GetRecordingConfigureCalledCallback(&configure_reason)); |
- service()->RequestStart(); |
- testing::Mock::VerifyAndClearExpectations(component_factory()); |
- EXPECT_EQ(syncer::CONFIGURE_REASON_NEWLY_ENABLED_DATA_TYPE, configure_reason); |
- EXPECT_TRUE(captured_callback.is_null()); |
- |
- // Simulate configure successful. This time it should be catch up. |
- service()->OnConfigureDone(result); |
- EXPECT_EQ(syncer::CONFIGURE_REASON_CATCH_UP, configure_reason); |
- EXPECT_TRUE(captured_callback.is_null()); |
- |
- // Simulate catch up configure successful. Ensure that SBH::ClearServerData is |
- // called. |
- service()->OnConfigureDone(result); |
- EXPECT_FALSE(captured_callback.is_null()); |
- |
- ExpectSyncBackendHostCreation(1); |
- ExpectDataTypeManagerCreation( |
- 1, GetRecordingConfigureCalledCallback(&configure_reason)); |
- captured_callback.Run(); |
- testing::Mock::VerifyAndClearExpectations(component_factory()); |
- EXPECT_EQ(syncer::CONFIGURE_REASON_NEWLY_ENABLED_DATA_TYPE, configure_reason); |
-} |
- |
-// Verify that if after OnLocalSetPassphraseEncryption ClearServerData gets |
-// interrupted, transition again from catch up sync cycle after browser restart. |
-TEST_F(ProfileSyncServiceTest, |
- OnLocalSetPassphraseEncryption_RestartDuringClearServerData) { |
- syncer::SyncManager::ClearServerDataCallback captured_callback; |
- syncer::ConfigureReason configure_reason = syncer::CONFIGURE_REASON_UNKNOWN; |
- base::test::ScopedFeatureList scoped_feature_list; |
- scoped_feature_list.InitAndEnableFeature( |
- switches::kSyncClearDataOnPassphraseEncryption); |
- IssueTestTokens(); |
- CreateService(ProfileSyncService::AUTO_START); |
- ExpectSyncBackendHostCreationCaptureClearServerData(&captured_callback); |
- ExpectDataTypeManagerCreation(1, GetDefaultConfigureCalledCallback()); |
- InitializeForNthSync(); |
- testing::Mock::VerifyAndClearExpectations(component_factory()); |
- |
- // Simulate user entering encryption passphrase. |
- const syncer::SyncEncryptionHandler::NigoriState nigori_state; |
- service()->OnLocalSetPassphraseEncryption(nigori_state); |
- EXPECT_FALSE(captured_callback.is_null()); |
- captured_callback.Reset(); |
- |
- // Simulate browser restart. First configuration is a regular one. |
- service()->Shutdown(); |
- ExpectSyncBackendHostCreationCaptureClearServerData(&captured_callback); |
- ExpectDataTypeManagerCreation( |
- 1, GetRecordingConfigureCalledCallback(&configure_reason)); |
- service()->RequestStart(); |
- testing::Mock::VerifyAndClearExpectations(component_factory()); |
- EXPECT_EQ(syncer::CONFIGURE_REASON_NEWLY_ENABLED_DATA_TYPE, configure_reason); |
- EXPECT_TRUE(captured_callback.is_null()); |
- |
- // Simulate configure successful. This time it should be catch up. |
- sync_driver::DataTypeManager::ConfigureResult result; |
- result.status = sync_driver::DataTypeManager::OK; |
- service()->OnConfigureDone(result); |
- EXPECT_EQ(syncer::CONFIGURE_REASON_CATCH_UP, configure_reason); |
- EXPECT_TRUE(captured_callback.is_null()); |
- |
- // Simulate catch up configure successful. Ensure that SBH::ClearServerData is |
- // called. |
- service()->OnConfigureDone(result); |
- EXPECT_FALSE(captured_callback.is_null()); |
- |
- ExpectSyncBackendHostCreation(1); |
- ExpectDataTypeManagerCreation( |
- 1, GetRecordingConfigureCalledCallback(&configure_reason)); |
- captured_callback.Run(); |
- testing::Mock::VerifyAndClearExpectations(component_factory()); |
- EXPECT_EQ(syncer::CONFIGURE_REASON_NEWLY_ENABLED_DATA_TYPE, configure_reason); |
-} |
- |
-// Test that the passphrase prompt due to version change logic gets triggered |
-// on a datatype type requesting startup, but only happens once. |
-TEST_F(ProfileSyncServiceTest, PassphrasePromptDueToVersion) { |
- IssueTestTokens(); |
- CreateService(ProfileSyncService::AUTO_START); |
- ExpectDataTypeManagerCreation(1, GetDefaultConfigureCalledCallback()); |
- ExpectSyncBackendHostCreation(1); |
- InitializeForNthSync(); |
- |
- sync_driver::SyncPrefs sync_prefs( |
- service()->GetSyncClient()->GetPrefService()); |
- EXPECT_EQ(PRODUCT_VERSION, sync_prefs.GetLastRunVersion()); |
- |
- sync_prefs.SetPassphrasePrompted(true); |
- |
- // Until a datatype requests startup while a passphrase is required the |
- // passphrase prompt bit should remain set. |
- EXPECT_TRUE(sync_prefs.IsPassphrasePrompted()); |
- TriggerPassphraseRequired(); |
- EXPECT_TRUE(sync_prefs.IsPassphrasePrompted()); |
- |
- // Because the last version was unset, this run should be treated as a new |
- // version and force a prompt. |
- TriggerDataTypeStartRequest(); |
- EXPECT_FALSE(sync_prefs.IsPassphrasePrompted()); |
- |
- // At this point further datatype startup request should have no effect. |
- sync_prefs.SetPassphrasePrompted(true); |
- TriggerDataTypeStartRequest(); |
- EXPECT_TRUE(sync_prefs.IsPassphrasePrompted()); |
-} |
- |
-// Test that when ProfileSyncService receives actionable error |
-// RESET_LOCAL_SYNC_DATA it restarts sync. |
-TEST_F(ProfileSyncServiceTest, ResetSyncData) { |
- IssueTestTokens(); |
- CreateService(ProfileSyncService::AUTO_START); |
- // Backend should get initialized two times: once during initialization and |
- // once when handling actionable error. |
- ExpectDataTypeManagerCreation(2, GetDefaultConfigureCalledCallback()); |
- ExpectSyncBackendHostCreation(2); |
- InitializeForNthSync(); |
- |
- syncer::SyncProtocolError client_cmd; |
- client_cmd.action = syncer::RESET_LOCAL_SYNC_DATA; |
- service()->OnActionableError(client_cmd); |
-} |
- |
-// Test that when ProfileSyncService receives actionable error |
-// DISABLE_SYNC_ON_CLIENT it disables sync and signs out. |
-TEST_F(ProfileSyncServiceTest, DisableSyncOnClient) { |
- IssueTestTokens(); |
- CreateService(ProfileSyncService::AUTO_START); |
- ExpectDataTypeManagerCreation(1, GetDefaultConfigureCalledCallback()); |
- ExpectSyncBackendHostCreation(1); |
- InitializeForNthSync(); |
- |
- EXPECT_TRUE(service()->IsSyncActive()); |
- EXPECT_EQ(l10n_util::GetStringUTF16(IDS_SYNC_TIME_JUST_NOW), |
- service()->GetLastSyncedTimeString()); |
- EXPECT_TRUE(service()->GetLocalDeviceInfoProvider()->GetLocalDeviceInfo()); |
- |
- syncer::SyncProtocolError client_cmd; |
- client_cmd.action = syncer::DISABLE_SYNC_ON_CLIENT; |
- service()->OnActionableError(client_cmd); |
- |
-// CrOS does not support signout. |
-#if !defined(OS_CHROMEOS) |
- EXPECT_TRUE(signin_manager()->GetAuthenticatedAccountId().empty()); |
-#else |
- EXPECT_FALSE(signin_manager()->GetAuthenticatedAccountId().empty()); |
-#endif |
- |
- EXPECT_FALSE(service()->IsSyncActive()); |
- EXPECT_EQ(l10n_util::GetStringUTF16(IDS_SYNC_TIME_NEVER), |
- service()->GetLastSyncedTimeString()); |
- EXPECT_FALSE(service()->GetLocalDeviceInfoProvider()->GetLocalDeviceInfo()); |
-} |
- |
-// Regression test for crbug/555434. The issue is that check for sessions DTC in |
-// OnSessionRestoreComplete was creating map entry with nullptr which later was |
-// dereferenced in OnSyncCycleCompleted. The fix is to use find() to check if |
-// entry for sessions exists in map. |
-TEST_F(ProfileSyncServiceTest, ValidPointersInDTCMap) { |
- CreateService(ProfileSyncService::AUTO_START); |
- service()->OnSessionRestoreComplete(); |
- service()->OnSyncCycleCompleted(); |
-} |
- |
-} // namespace |
-} // namespace browser_sync |