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