1a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)// Copyright 2014 The Chromium Authors. All rights reserved. 2a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 3a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)// found in the LICENSE file. 4a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 5a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "chrome/browser/sync/startup_controller.h" 6a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 7a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "base/command_line.h" 8a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "base/message_loop/message_loop.h" 9a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "base/run_loop.h" 10a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "base/time/time.h" 11a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "chrome/browser/defaults.h" 12a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "chrome/browser/signin/fake_profile_oauth2_token_service.h" 13effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch#include "chrome/browser/signin/fake_profile_oauth2_token_service_builder.h" 14a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "chrome/browser/signin/profile_oauth2_token_service_factory.h" 15116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "chrome/browser/sync/supervised_user_signin_manager_wrapper.h" 16a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "chrome/common/chrome_switches.h" 17a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "chrome/test/base/testing_profile.h" 1823730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)#include "components/sync_driver/sync_prefs.h" 19a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "testing/gtest/include/gtest/gtest.h" 20a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 21a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)namespace browser_sync { 22a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 23a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)static const char kTestUser[] = "test@gmail.com"; 24a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)static const char kTestToken[] = "testToken"; 25a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 26a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)// These are coupled to the implementation of StartupController's 27a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)// GetBackendInitializationStateString which is used by about:sync. We use it 28a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)// as a convenient way to verify internal state and that the class is 29a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)// outputting the correct values for the debug string. 30a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)static const char kStateStringStarted[] = "Started"; 31a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)static const char kStateStringDeferred[] = "Deferred"; 32a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)static const char kStateStringNotStarted[] = "Not started"; 33a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 34116680a4aac90f2aa7413d9095a592090648e557Ben Murdochclass FakeSupervisedUserSigninManagerWrapper 35116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch : public SupervisedUserSigninManagerWrapper { 36a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) public: 37116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch FakeSupervisedUserSigninManagerWrapper() 38116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch : SupervisedUserSigninManagerWrapper(NULL, NULL) {} 39a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) virtual std::string GetEffectiveUsername() const OVERRIDE { 40a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) return account_; 41a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) } 42a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 43a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) virtual std::string GetAccountIdToUse() const OVERRIDE { 44a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) return account_; 45a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) } 46a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 47a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) void set_account(const std::string& account) { account_ = account; } 48a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 49a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) private: 50a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) std::string account_; 51a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)}; 52a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 53a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)class StartupControllerTest : public testing::Test { 54a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) public: 55a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) StartupControllerTest() : started_(false) {} 56a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 57a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) virtual void SetUp() OVERRIDE { 58a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) profile_.reset(new TestingProfile()); 5923730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) sync_prefs_.reset(new sync_driver::SyncPrefs(profile_->GetPrefs())); 60effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch token_service_.reset(static_cast<FakeProfileOAuth2TokenService*>( 61effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch BuildFakeProfileOAuth2TokenService(profile_.get()))); 62116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch signin_.reset(new FakeSupervisedUserSigninManagerWrapper()); 63a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 64a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) ProfileSyncServiceStartBehavior behavior = 65a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) browser_defaults::kSyncAutoStarts ? AUTO_START : MANUAL_START; 66a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) base::Closure fake_start_backend = base::Bind( 67a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) &StartupControllerTest::FakeStartBackend, base::Unretained(this)); 68a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) controller_.reset(new StartupController(behavior, token_service(), 69a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) sync_prefs_.get(), signin_.get(), 70a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) fake_start_backend)); 71a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) controller_->Reset(syncer::UserTypes()); 72a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) controller_->OverrideFallbackTimeoutForTest( 73a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) base::TimeDelta::FromSeconds(0)); 74a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) } 75a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 76a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) virtual void TearDown() OVERRIDE { 77a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) controller_.reset(); 78a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) signin_.reset(); 79effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch token_service_->Shutdown(); 80a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) token_service_.reset(); 81a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) sync_prefs_.reset(); 82a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) started_ = false; 83a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) } 84a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 85a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) void FakeStartBackend() { 86a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) started_ = true; 87a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) } 88a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 89a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) bool started() const { return started_; } 90a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) void clear_started() { started_ = false; } 91a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) StartupController* controller() { return controller_.get(); } 92116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch FakeSupervisedUserSigninManagerWrapper* signin() { return signin_.get(); } 93a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) FakeProfileOAuth2TokenService* token_service() { 94effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch return token_service_.get(); 95a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) } 9623730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) sync_driver::SyncPrefs* sync_prefs() { return sync_prefs_.get(); } 97a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) Profile* profile() { return profile_.get(); } 98a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 99a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) private: 100a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) bool started_; 101a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) base::MessageLoop message_loop_; 102a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) scoped_ptr<StartupController> controller_; 103116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch scoped_ptr<FakeSupervisedUserSigninManagerWrapper> signin_; 104effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch scoped_ptr<FakeProfileOAuth2TokenService> token_service_; 10523730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) scoped_ptr<sync_driver::SyncPrefs> sync_prefs_; 106a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) scoped_ptr<TestingProfile> profile_; 107a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)}; 108a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 109a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)// Test that sync doesn't start until all conditions are met. 110a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)TEST_F(StartupControllerTest, Basic) { 111a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) controller()->TryStart(); 112a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) EXPECT_FALSE(started()); 113a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) sync_prefs()->SetSyncSetupCompleted(); 114a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) controller()->TryStart(); 115a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) EXPECT_FALSE(started()); 116a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) signin()->set_account(kTestUser); 117a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) controller()->TryStart(); 118a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) EXPECT_FALSE(started()); 119a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) token_service()->IssueRefreshTokenForUser(kTestUser, kTestToken); 120a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) const bool deferred_start = !CommandLine::ForCurrentProcess()-> 121a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) HasSwitch(switches::kSyncDisableDeferredStartup); 122a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) controller()->TryStart(); 123a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) EXPECT_EQ(!deferred_start, started()); 124a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) std::string state(controller()->GetBackendInitializationStateString()); 125a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) EXPECT_TRUE(deferred_start ? state == kStateStringDeferred : 126a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) state == kStateStringStarted); 127a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)} 128a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 129a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)// Test that sync doesn't when suppressed even if all other conditons are met. 130a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)TEST_F(StartupControllerTest, Suppressed) { 131a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) sync_prefs()->SetSyncSetupCompleted(); 132a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) sync_prefs()->SetStartSuppressed(true); 133a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) signin()->set_account(kTestUser); 134a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) token_service()->IssueRefreshTokenForUser(kTestUser, kTestToken); 135a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) controller()->TryStart(); 136a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) EXPECT_FALSE(started()); 137a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) EXPECT_EQ(kStateStringNotStarted, 138a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) controller()->GetBackendInitializationStateString()); 139a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)} 140a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 141a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)// Test that sync doesn't when managed even if all other conditons are met. 142a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)TEST_F(StartupControllerTest, Managed) { 143a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) sync_prefs()->SetSyncSetupCompleted(); 144a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) sync_prefs()->SetManagedForTest(true); 145a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) signin()->set_account(kTestUser); 146a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) token_service()->IssueRefreshTokenForUser(kTestUser, kTestToken); 147a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) controller()->TryStart(); 148a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) EXPECT_FALSE(started()); 149a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) EXPECT_EQ(kStateStringNotStarted, 150a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) controller()->GetBackendInitializationStateString()); 151a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)} 152a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 153a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)// Test that sync doesn't start until all conditions are met and a 154a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)// data type triggers sync startup. 155a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)TEST_F(StartupControllerTest, DataTypeTriggered) { 156a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) sync_prefs()->SetSyncSetupCompleted(); 157a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) signin()->set_account(kTestUser); 158a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) token_service()->IssueRefreshTokenForUser(kTestUser, kTestToken); 159a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) controller()->TryStart(); 160a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) EXPECT_FALSE(started()); 161a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) EXPECT_EQ(kStateStringDeferred, 162a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) controller()->GetBackendInitializationStateString()); 163a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) controller()->OnDataTypeRequestsSyncStartup(syncer::SESSIONS); 164a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) EXPECT_TRUE(started()); 165a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) EXPECT_EQ(kStateStringStarted, 166a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) controller()->GetBackendInitializationStateString()); 167a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 168a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // The fallback timer shouldn't result in another invocation of the closure 169a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // we passed to the StartupController. 170a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) clear_started(); 171a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) base::RunLoop().RunUntilIdle(); 172a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) EXPECT_FALSE(started()); 173a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)} 174a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 175a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)// Test that the fallback timer starts sync in the event all 176a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)// conditions are met and no data type requests sync. 177a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)TEST_F(StartupControllerTest, FallbackTimer) { 178a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) sync_prefs()->SetSyncSetupCompleted(); 179a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) signin()->set_account(kTestUser); 180a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) token_service()->IssueRefreshTokenForUser(kTestUser, kTestToken); 181a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) controller()->TryStart(); 182a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) EXPECT_FALSE(started()); 183a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) base::RunLoop().RunUntilIdle(); 184a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) EXPECT_TRUE(started()); 185a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)} 186a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 187a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)// Test that we start immediately if sessions is disabled. 188a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)TEST_F(StartupControllerTest, NoDeferralWithoutSessionsSync) { 189a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) syncer::ModelTypeSet types(syncer::UserTypes()); 190a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // Disabling sessions means disabling 4 types due to groupings. 191a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) types.Remove(syncer::SESSIONS); 192a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) types.Remove(syncer::PROXY_TABS); 193a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) types.Remove(syncer::TYPED_URLS); 194f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) types.Remove(syncer::SUPERVISED_USER_SETTINGS); 195a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) sync_prefs()->SetKeepEverythingSynced(false); 196a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) sync_prefs()->SetPreferredDataTypes(syncer::UserTypes(), types); 197a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) controller()->Reset(syncer::UserTypes()); 198a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) sync_prefs()->SetSyncSetupCompleted(); 199a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) signin()->set_account(kTestUser); 200a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) token_service()->IssueRefreshTokenForUser(kTestUser, kTestToken); 201a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) controller()->TryStart(); 202a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) EXPECT_TRUE(started()); 203a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)} 204a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 205a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)// Sanity check that the fallback timer doesn't fire before startup 206a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)// conditions are met. 207a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)TEST_F(StartupControllerTest, FallbackTimerWaits) { 208a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) controller()->TryStart(); 209a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) EXPECT_FALSE(started()); 210a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) base::RunLoop().RunUntilIdle(); 211a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) EXPECT_FALSE(started()); 212a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)} 213a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 214a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)// Test that sync starts when the user first asks to setup sync (which 215a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)// may be implicit due to the platform). 216a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)TEST_F(StartupControllerTest, FirstSetup) { 217a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) signin()->set_account(kTestUser); 218a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) token_service()->IssueRefreshTokenForUser(kTestUser, kTestToken); 219a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) controller()->TryStart(); 220a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 221a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) if (browser_defaults::kSyncAutoStarts) { 222a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) EXPECT_TRUE(started()); 223a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) } else { 224a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) controller()->set_setup_in_progress(true); 225a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) controller()->TryStart(); 226a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) EXPECT_TRUE(started()); 227a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) } 228a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)} 229a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 230a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)TEST_F(StartupControllerTest, Reset) { 231a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) sync_prefs()->SetSyncSetupCompleted(); 232a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) signin()->set_account(kTestUser); 233a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) token_service()->IssueRefreshTokenForUser(kTestUser, kTestToken); 234a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) controller()->TryStart(); 2356e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) const bool deferred_start = !CommandLine::ForCurrentProcess()-> 2366e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) HasSwitch(switches::kSyncDisableDeferredStartup); 2376e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) EXPECT_EQ(!deferred_start, started()); 238a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) controller()->OnDataTypeRequestsSyncStartup(syncer::SESSIONS); 239a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) EXPECT_TRUE(started()); 240a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) clear_started(); 241a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) controller()->Reset(syncer::UserTypes()); 242a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) EXPECT_FALSE(started()); 243a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) controller()->TryStart(); 2446e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) // Restart is not deferred. 245a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) EXPECT_TRUE(started()); 246a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)} 247a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 2480529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch// Test that setup-in-progress tracking is persistent across a Reset. 249a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)TEST_F(StartupControllerTest, ResetDuringSetup) { 250a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) signin()->set_account(kTestUser); 251a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) token_service()->IssueRefreshTokenForUser(kTestUser, kTestToken); 2520529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch 2530529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch // Simulate UI telling us setup is in progress. 254a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) controller()->set_setup_in_progress(true); 2550529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch 2560529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch // This could happen if the UI triggers a stop-syncing permanently call. 257a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) controller()->Reset(syncer::UserTypes()); 258a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 2590529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch // From the UI's point of view, setup is still in progress. 2600529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch EXPECT_TRUE(controller()->setup_in_progress()); 261a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)} 262a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 263a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)} // namespace browser_sync 264