profile_sync_service_startup_unittest.cc revision a3f7b4e666c476898878fa745f637129375cd889
15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 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)
55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "testing/gtest/include/gtest/gtest.h"
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/memory/scoped_ptr.h"
89ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch#include "base/message_loop/message_loop.h"
92a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/prefs/pref_service.h"
10a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch#include "base/run_loop.h"
117dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#include "chrome/browser/chrome_notification_types.h"
12c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "chrome/browser/signin/fake_signin_manager.h"
137d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "chrome/browser/signin/oauth2_token_service.h"
147d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "chrome/browser/signin/profile_oauth2_token_service.h"
157d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "chrome/browser/signin/profile_oauth2_token_service_factory.h"
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/signin/signin_manager.h"
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/signin/signin_manager_factory.h"
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/signin/token_service.h"
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/signin/token_service_factory.h"
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/sync/glue/data_type_manager.h"
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/sync/glue/data_type_manager_mock.h"
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/sync/profile_sync_components_factory_mock.h"
232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/sync/profile_sync_service_factory.h"
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/sync/profile_sync_test_util.h"
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/sync/sync_prefs.h"
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/sync/test_profile_sync_service.h"
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/common/pref_names.h"
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/test/base/testing_profile.h"
29c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "content/public/browser/notification_service.h"
30c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "content/public/browser/notification_source.h"
31a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch#include "content/public/test/test_browser_thread_bundle.h"
32a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch#include "content/public/test/test_utils.h"
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "google_apis/gaia/gaia_auth_consumer.h"
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "google_apis/gaia/gaia_constants.h"
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "testing/gmock/include/gmock/gmock.h"
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using browser_sync::DataTypeManager;
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using browser_sync::DataTypeManagerMock;
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using content::BrowserThread;
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using testing::_;
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using testing::AnyNumber;
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using testing::DoAll;
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using testing::InvokeArgument;
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using testing::Mock;
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using testing::Return;
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)ACTION_P(InvokeOnConfigureStart, pss) {
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TestProfileSyncService* service = static_cast<TestProfileSyncService*>(pss);
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  service->OnConfigureStart();
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)ACTION_P2(InvokeOnConfigureDone, pss, result) {
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TestProfileSyncService* service = static_cast<TestProfileSyncService*>(pss);
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DataTypeManager::ConfigureResult configure_result =
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      static_cast<DataTypeManager::ConfigureResult>(result);
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  service->OnConfigureDone(configure_result);
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class FakeTokenService : public TokenService {
602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) public:
612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  FakeTokenService() {}
622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual ~FakeTokenService() {}
632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void LoadTokensFromDB() OVERRIDE {
652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    set_tokens_loaded(true);
662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    content::NotificationService::current()->Notify(
672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        chrome::NOTIFICATION_TOKEN_LOADING_FINISHED,
682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        content::Source<TokenService>(this),
692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        content::NotificationService::NoDetails());
702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)};
722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class ProfileSyncServiceStartupTest : public testing::Test {
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ProfileSyncServiceStartupTest()
76a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch      : thread_bundle_(content::TestBrowserThreadBundle::REAL_DB_THREAD |
77a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch                       content::TestBrowserThreadBundle::REAL_FILE_THREAD |
78a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch                       content::TestBrowserThreadBundle::REAL_IO_THREAD),
792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        profile_(new TestingProfile),
802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        sync_(NULL) {}
815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual ~ProfileSyncServiceStartupTest() {
835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void SetUp() {
86a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)#if defined(OS_CHROMEOS)
87a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)    SigninManagerFactory::GetInstance()->SetTestingFactory(
88a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)        profile_.get(), FakeSigninManagerBase::Build);
89a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)#else
90a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)    SigninManagerFactory::GetInstance()->SetTestingFactory(
91a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)        profile_.get(), FakeSigninManager::Build);
92a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)#endif
935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void TearDown() {
962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    sync_->RemoveObserver(&observer_);
972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    ProfileSyncServiceFactory::GetInstance()->SetTestingFactory(
982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        profile_.get(), NULL);
997d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    ProfileOAuth2TokenServiceFactory::GetInstance()->SetTestingFactory(
1007d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)        profile_.get(), NULL);
1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    profile_.reset();
1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Pump messages posted by the sync core thread (which may end up
1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // posting on the IO thread).
105a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch    base::RunLoop().RunUntilIdle();
106a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch    content::RunAllPendingInMessageLoop(content::BrowserThread::IO);
107a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch    base::RunLoop().RunUntilIdle();
1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  static BrowserContextKeyedService* BuildService(
11190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      content::BrowserContext* profile) {
1122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return new TestProfileSyncService(
1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        new ProfileSyncComponentsFactoryMock(),
114c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        static_cast<Profile*>(profile),
115a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)        SigninManagerFactory::GetForProfile(static_cast<Profile*>(profile)),
1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        ProfileSyncService::MANUAL_START,
1172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        true);
1182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
1192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
120a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  void CreateSyncService() {
1217d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    ProfileOAuth2TokenServiceFactory::GetInstance()->SetTestingFactory(
1227d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)        profile_.get(), FakeOAuth2TokenService::BuildTokenService);
1232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    sync_ = static_cast<TestProfileSyncService*>(
1242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        ProfileSyncServiceFactory::GetInstance()->SetTestingFactoryAndUse(
1252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            profile_.get(), BuildService));
126a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)    sync_->AddObserver(&observer_);
127a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)    sync_->set_synchronous_sync_configuration();
1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
130a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) protected:
1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DataTypeManagerMock* SetUpDataTypeManager() {
1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    DataTypeManagerMock* data_type_manager = new DataTypeManagerMock();
1332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    EXPECT_CALL(*sync_->components_factory_mock(),
134868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                CreateDataTypeManager(_, _, _, _, _, _)).
1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        WillOnce(Return(data_type_manager));
1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return data_type_manager;
1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
139a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch  content::TestBrowserThreadBundle thread_bundle_;
1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<TestingProfile> profile_;
1412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  TestProfileSyncService* sync_;
1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ProfileSyncServiceObserverMock observer_;
1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class ProfileSyncServiceStartupCrosTest : public ProfileSyncServiceStartupTest {
1462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) public:
147a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  virtual void SetUp() {
148a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)    ProfileSyncServiceStartupTest::SetUp();
1497d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    ProfileOAuth2TokenServiceFactory::GetInstance()->SetTestingFactory(
1507d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)        profile_.get(), FakeOAuth2TokenService::BuildTokenService);
151a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)    sync_ = static_cast<TestProfileSyncService*>(
152a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)        ProfileSyncServiceFactory::GetInstance()->SetTestingFactoryAndUse(
153a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)            profile_.get(), BuildCrosService));
154a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)    sync_->AddObserver(&observer_);
155a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)    sync_->set_synchronous_sync_configuration();
156a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  }
157a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)
15890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  static BrowserContextKeyedService* BuildCrosService(
159c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      content::BrowserContext* context) {
160c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    Profile* profile = static_cast<Profile*>(context);
161c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    SigninManagerBase* signin =
162c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        SigninManagerFactory::GetForProfile(profile);
163a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)    profile->GetPrefs()->SetString(prefs::kGoogleServicesUsername,
164eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch                                   "test_user@gmail.com");
16590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    signin->Initialize(profile, NULL);
166a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)    EXPECT_FALSE(signin->GetAuthenticatedUsername().empty());
167c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    return new TestProfileSyncService(
168c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        new ProfileSyncComponentsFactoryMock(),
169c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        profile,
170c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        signin,
171c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        ProfileSyncService::AUTO_START,
172c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        true);
173c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
17690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)BrowserContextKeyedService* BuildFakeTokenService(
17790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    content::BrowserContext* profile) {
178a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  return new FakeTokenService();
179a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)}
1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
181a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)TEST_F(ProfileSyncServiceStartupTest, StartFirstTime) {
1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // We've never completed startup.
1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  profile_->GetPrefs()->ClearPref(prefs::kSyncHasSetupCompleted);
184a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  SigninManagerFactory::GetForProfile(
18590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      profile_.get())->Initialize(profile_.get(), NULL);
186a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  CreateSyncService();
187a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  DataTypeManagerMock* data_type_manager = SetUpDataTypeManager();
188a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  EXPECT_CALL(*data_type_manager, Configure(_, _)).Times(0);
1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Should not actually start, rather just clean things up and wait
1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // to be enabled.
1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(observer_, OnStateChanged()).Times(AnyNumber());
1932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  sync_->Initialize();
1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Preferences should be back to defaults.
1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(0, profile_->GetPrefs()->GetInt64(prefs::kSyncLastSyncedTime));
1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(profile_->GetPrefs()->GetBoolean(prefs::kSyncHasSetupCompleted));
1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Mock::VerifyAndClearExpectations(data_type_manager);
1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Then start things up.
2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(*data_type_manager, Configure(_, _)).Times(1);
2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(*data_type_manager, state()).
2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      WillOnce(Return(DataTypeManager::CONFIGURED)).
2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      WillOnce(Return(DataTypeManager::CONFIGURED));
2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(*data_type_manager, Stop()).Times(1);
2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(observer_, OnStateChanged()).Times(AnyNumber());
2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  sync_->SetSetupInProgress(true);
209a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)
210a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  // Simulate successful signin as test_user.
211a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  profile_->GetPrefs()->SetString(prefs::kGoogleServicesUsername,
212eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch                                  "test_user@gmail.com");
213eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  sync_->signin()->SetAuthenticatedUsername("test_user@gmail.com");
214eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  GoogleServiceSigninSuccessDetails details("test_user@gmail.com", "");
215a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  content::NotificationService::current()->Notify(
216a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)      chrome::NOTIFICATION_GOOGLE_SIGNIN_SUCCESSFUL,
217a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)      content::Source<Profile>(profile_.get()),
218a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)      content::Details<const GoogleServiceSigninSuccessDetails>(&details));
219a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)
220a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  // Create some tokens in the token service.
2215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TokenServiceFactory::GetForProfile(profile_.get())->IssueAuthTokenForTest(
2225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      GaiaConstants::kGaiaOAuth2LoginRefreshToken, "oauth2_login_token");
2237d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  TokenServiceFactory::GetForProfile(profile_.get())->IssueAuthTokenForTest(
2247d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      GaiaConstants::kSyncService, "token");
225a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)
226a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  // Simulate the UI telling sync it has finished setting up.
2272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  sync_->SetSetupInProgress(false);
2282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_TRUE(sync_->ShouldPushChanges());
2292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
2302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2317d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)// TODO(pavely): Reenable test once android is switched to oauth2.
2327d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)TEST_F(ProfileSyncServiceStartupTest, DISABLED_StartNoCredentials) {
2337d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  // We've never completed startup.
234a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  profile_->GetPrefs()->ClearPref(prefs::kSyncHasSetupCompleted);
235a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  SigninManagerFactory::GetForProfile(
23690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      profile_.get())->Initialize(profile_.get(), NULL);
2372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  TokenService* token_service = static_cast<TokenService*>(
2382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      TokenServiceFactory::GetInstance()->SetTestingFactoryAndUse(
2392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          profile_.get(), BuildFakeTokenService));
240a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  CreateSyncService();
2415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Should not actually start, rather just clean things up and wait
2435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // to be enabled.
2447d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  EXPECT_CALL(*sync_->components_factory_mock(),
2457d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)              CreateDataTypeManager(_, _, _, _, _, _)).Times(0);
2465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(observer_, OnStateChanged()).Times(AnyNumber());
2472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  sync_->Initialize();
2482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_FALSE(sync_->GetBackendForTest());
2495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Preferences should be back to defaults.
2515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(0, profile_->GetPrefs()->GetInt64(prefs::kSyncLastSyncedTime));
2525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(profile_->GetPrefs()->GetBoolean(prefs::kSyncHasSetupCompleted));
2535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Then start things up.
2552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  sync_->SetSetupInProgress(true);
256a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)
2577d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  // Simulate successful signin as test_user.
258a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  profile_->GetPrefs()->SetString(prefs::kGoogleServicesUsername,
259eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch                                  "test_user@gmail.com");
260eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  sync_->signin()->SetAuthenticatedUsername("test_user@gmail.com");
261eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  GoogleServiceSigninSuccessDetails details("test_user@gmail.com", "");
262a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  content::NotificationService::current()->Notify(
263a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)      chrome::NOTIFICATION_GOOGLE_SIGNIN_SUCCESSFUL,
264a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)      content::Source<Profile>(profile_.get()),
265a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)      content::Details<const GoogleServiceSigninSuccessDetails>(&details));
2665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // NOTE: Unlike StartFirstTime, this test does not issue any auth tokens.
2672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  token_service->LoadTokensFromDB();
268a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)
2692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  sync_->SetSetupInProgress(false);
2707d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  // ProfileSyncService should try to start by requesting access token.
2717d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  // This request should fail as login token was not issued to TokenService.
2727d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  EXPECT_FALSE(sync_->ShouldPushChanges());
2737d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  EXPECT_EQ(GoogleServiceAuthError::USER_NOT_SIGNED_UP,
2747d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      sync_->GetAuthError().state());
2752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
2762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2777d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)// TODO(pavely): Reenable test once android is switched to oauth2.
2787d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)TEST_F(ProfileSyncServiceStartupTest, DISABLED_StartInvalidCredentials) {
279a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  profile_->GetPrefs()->SetString(prefs::kGoogleServicesUsername,
280eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch                                  "test_user@gmail.com");
281a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  SigninManagerFactory::GetForProfile(
28290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      profile_.get())->Initialize(profile_.get(), NULL);
283a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  CreateSyncService();
2842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  DataTypeManagerMock* data_type_manager = SetUpDataTypeManager();
2852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_CALL(*data_type_manager, Configure(_, _)).Times(0);
2867d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  // Issue login token so that ProfileSyncServer tries to initialize backend.
2877d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  TokenServiceFactory::GetForProfile(profile_.get())->IssueAuthTokenForTest(
2887d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      GaiaConstants::kGaiaOAuth2LoginRefreshToken, "oauth2_login_token");
2892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Tell the backend to stall while downloading control types (simulating an
2912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // auth error).
2922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  sync_->fail_initial_download();
2932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_CALL(observer_, OnStateChanged()).Times(AnyNumber());
2952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  sync_->Initialize();
2962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_TRUE(sync_->GetBackendForTest());
2972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_FALSE(sync_->sync_initialized());
2982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  Mock::VerifyAndClearExpectations(data_type_manager);
2992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Update the credentials, unstalling the backend.
3012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_CALL(*data_type_manager, Configure(_, _));
3022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_CALL(*data_type_manager, state()).
3032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      WillRepeatedly(Return(DataTypeManager::CONFIGURED));
3042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_CALL(*data_type_manager, Stop()).Times(1);
3052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_CALL(observer_, OnStateChanged()).Times(AnyNumber());
3062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  sync_->SetSetupInProgress(true);
307a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)
308a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  // Simulate successful signin.
309eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  GoogleServiceSigninSuccessDetails details("test_user@gmail.com",
310eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch                                            std::string());
311a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  content::NotificationService::current()->Notify(
312a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)        chrome::NOTIFICATION_GOOGLE_SIGNIN_SUCCESSFUL,
313a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)        content::Source<Profile>(profile_.get()),
314a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)        content::Details<const GoogleServiceSigninSuccessDetails>(&details));
315a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)
3167d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  TokenServiceFactory::GetForProfile(profile_.get())->IssueAuthTokenForTest(
3177d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      GaiaConstants::kGaiaOAuth2LoginRefreshToken, "oauth2_login_token");
3182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  sync_->SetSetupInProgress(false);
3192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Verify we successfully finish startup and configuration.
3212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_TRUE(sync_->ShouldPushChanges());
3225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ProfileSyncServiceStartupCrosTest, StartCrosNoCredentials) {
3252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_CALL(*sync_->components_factory_mock(),
326868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)              CreateDataTypeManager(_, _, _, _, _, _)).Times(0);
3275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  profile_->GetPrefs()->ClearPref(prefs::kSyncHasSetupCompleted);
3285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(observer_, OnStateChanged()).Times(AnyNumber());
3292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  TokenService* token_service = static_cast<TokenService*>(
3302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      TokenServiceFactory::GetInstance()->SetTestingFactoryAndUse(
3312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          profile_.get(), BuildFakeTokenService));
3325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  sync_->Initialize();
3345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Sync should not start because there are no tokens yet.
3352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_FALSE(sync_->ShouldPushChanges());
3362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_FALSE(sync_->GetBackendForTest());
3372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  token_service->LoadTokensFromDB();
3382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  sync_->SetSetupInProgress(false);
3392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Sync should not start because there are still no tokens.
3412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_FALSE(sync_->ShouldPushChanges());
3422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_FALSE(sync_->GetBackendForTest());
3435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ProfileSyncServiceStartupCrosTest, StartFirstTime) {
3465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DataTypeManagerMock* data_type_manager = SetUpDataTypeManager();
3475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  profile_->GetPrefs()->ClearPref(prefs::kSyncHasSetupCompleted);
3485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(*data_type_manager, Configure(_, _));
3495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(*data_type_manager, state()).
3505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      WillRepeatedly(Return(DataTypeManager::CONFIGURED));
3515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(*data_type_manager, Stop()).Times(1);
3525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(observer_, OnStateChanged()).Times(AnyNumber());
3535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TokenServiceFactory::GetForProfile(profile_.get())->IssueAuthTokenForTest(
3557d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      GaiaConstants::kGaiaOAuth2LoginRefreshToken, "oauth2_login_token");
3567d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  TokenServiceFactory::GetForProfile(profile_.get())->IssueAuthTokenForTest(
3575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      GaiaConstants::kSyncService, "sync_token");
3582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  sync_->Initialize();
3592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_TRUE(sync_->ShouldPushChanges());
3605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ProfileSyncServiceStartupTest, StartNormal) {
363a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  // Pre load the tokens
364eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  profile_->GetPrefs()->SetString(prefs::kGoogleServicesUsername,
365eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch                                  "test_user@gmail.com");
366a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  SigninManagerFactory::GetForProfile(profile_.get())->Initialize(
36790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      profile_.get(), NULL);
368a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  CreateSyncService();
3695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DataTypeManagerMock* data_type_manager = SetUpDataTypeManager();
3705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(*data_type_manager, Configure(_, _));
3715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(*data_type_manager, state()).
3725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      WillRepeatedly(Return(DataTypeManager::CONFIGURED));
3735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(*data_type_manager, Stop()).Times(1);
3745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(observer_, OnStateChanged()).Times(AnyNumber());
3755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TokenServiceFactory::GetForProfile(profile_.get())->IssueAuthTokenForTest(
3777d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      GaiaConstants::kGaiaOAuth2LoginRefreshToken, "oauth2_login_token");
3787d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  TokenServiceFactory::GetForProfile(profile_.get())->IssueAuthTokenForTest(
3795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      GaiaConstants::kSyncService, "sync_token");
380a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)
3812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  sync_->Initialize();
3825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Test that we can recover from a case where a bug in the code resulted in
3855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// OnUserChoseDatatypes not being properly called and datatype preferences
3865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// therefore being left unset.
3875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ProfileSyncServiceStartupTest, StartRecoverDatatypePrefs) {
3885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Clear the datatype preference fields (simulating bug 154940).
3895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  profile_->GetPrefs()->ClearPref(prefs::kSyncKeepEverythingSynced);
3905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  syncer::ModelTypeSet user_types = syncer::UserTypes();
3915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for (syncer::ModelTypeSet::Iterator iter = user_types.First();
3925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)       iter.Good(); iter.Inc()) {
3935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    profile_->GetPrefs()->ClearPref(
3945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        browser_sync::SyncPrefs::GetPrefNameForDataType(iter.Get()));
3955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
3965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Pre load the tokens
398eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  profile_->GetPrefs()->SetString(prefs::kGoogleServicesUsername,
399eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch                                  "test_user@gmail.com");
400a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  SigninManagerFactory::GetForProfile(profile_.get())->Initialize(
40190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      profile_.get(), NULL);
402a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  CreateSyncService();
403a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  DataTypeManagerMock* data_type_manager = SetUpDataTypeManager();
404a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  EXPECT_CALL(*data_type_manager, Configure(_, _));
405a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  EXPECT_CALL(*data_type_manager, state()).
406a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)      WillRepeatedly(Return(DataTypeManager::CONFIGURED));
407a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  EXPECT_CALL(*data_type_manager, Stop()).Times(1);
408a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  EXPECT_CALL(observer_, OnStateChanged()).Times(AnyNumber());
409a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)
4105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TokenServiceFactory::GetForProfile(profile_.get())->IssueAuthTokenForTest(
4117d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      GaiaConstants::kGaiaOAuth2LoginRefreshToken, "oauth2_login_token");
4127d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  TokenServiceFactory::GetForProfile(profile_.get())->IssueAuthTokenForTest(
4135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      GaiaConstants::kSyncService, "sync_token");
4142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  sync_->Initialize();
4155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(profile_->GetPrefs()->GetBoolean(
4175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      prefs::kSyncKeepEverythingSynced));
4185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Verify that the recovery of datatype preferences doesn't overwrite a valid
4215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// case where only bookmarks are enabled.
4225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ProfileSyncServiceStartupTest, StartDontRecoverDatatypePrefs) {
423a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  // Explicitly set Keep Everything Synced to false and have only bookmarks
424a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  // enabled.
425a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  profile_->GetPrefs()->SetBoolean(prefs::kSyncKeepEverythingSynced, false);
426a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)
427a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  // Pre load the tokens
428eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  profile_->GetPrefs()->SetString(prefs::kGoogleServicesUsername,
429eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch                                  "test_user@gmail.com");
430a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  SigninManagerFactory::GetForProfile(profile_.get())->Initialize(
43190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      profile_.get(), NULL);
432a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  CreateSyncService();
4335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DataTypeManagerMock* data_type_manager = SetUpDataTypeManager();
4345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(*data_type_manager, Configure(_, _));
4355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(*data_type_manager, state()).
4365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      WillRepeatedly(Return(DataTypeManager::CONFIGURED));
4375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(*data_type_manager, Stop()).Times(1);
4385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(observer_, OnStateChanged()).Times(AnyNumber());
4395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TokenServiceFactory::GetForProfile(profile_.get())->IssueAuthTokenForTest(
4407d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      GaiaConstants::kGaiaOAuth2LoginRefreshToken, "oauth2_login_token");
4417d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  TokenServiceFactory::GetForProfile(profile_.get())->IssueAuthTokenForTest(
4425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      GaiaConstants::kSyncService, "sync_token");
4432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  sync_->Initialize();
4445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(profile_->GetPrefs()->GetBoolean(
4465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      prefs::kSyncKeepEverythingSynced));
4475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ProfileSyncServiceStartupTest, ManagedStartup) {
450a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  // Service should not be started by Initialize() since it's managed.
451eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  profile_->GetPrefs()->SetString(prefs::kGoogleServicesUsername,
452eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch                                  "test_user@gmail.com");
453a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  SigninManagerFactory::GetForProfile(profile_.get())->Initialize(
45490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      profile_.get(), NULL);
455a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  CreateSyncService();
456a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)
4575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Disable sync through policy.
4585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  profile_->GetPrefs()->SetBoolean(prefs::kSyncManaged, true);
4592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_CALL(*sync_->components_factory_mock(),
460868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)              CreateDataTypeManager(_, _, _, _, _, _)).Times(0);
4615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(observer_, OnStateChanged()).Times(AnyNumber());
4625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TokenServiceFactory::GetForProfile(profile_.get())->IssueAuthTokenForTest(
4647d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      GaiaConstants::kGaiaOAuth2LoginRefreshToken, "oauth2_login_token");
4652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  sync_->Initialize();
4665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ProfileSyncServiceStartupTest, SwitchManaged) {
469eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  profile_->GetPrefs()->SetString(prefs::kGoogleServicesUsername,
470eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch                                  "test_user@gmail.com");
471a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  SigninManagerFactory::GetForProfile(profile_.get())->Initialize(
47290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      profile_.get(), NULL);
473a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  CreateSyncService();
4745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DataTypeManagerMock* data_type_manager = SetUpDataTypeManager();
4755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(*data_type_manager, Configure(_, _));
4765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(observer_, OnStateChanged()).Times(AnyNumber());
4775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TokenServiceFactory::GetForProfile(profile_.get())->IssueAuthTokenForTest(
4787d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      GaiaConstants::kGaiaOAuth2LoginRefreshToken, "oauth2_login_token");
4797d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  TokenServiceFactory::GetForProfile(profile_.get())->IssueAuthTokenForTest(
4807d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      GaiaConstants::kSyncService, "token");
4812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  sync_->Initialize();
4825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // The service should stop when switching to managed mode.
4845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Mock::VerifyAndClearExpectations(data_type_manager);
4855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(*data_type_manager, state()).
4865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      WillOnce(Return(DataTypeManager::CONFIGURED));
4875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(*data_type_manager, Stop()).Times(1);
4885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(observer_, OnStateChanged()).Times(AnyNumber());
4895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  profile_->GetPrefs()->SetBoolean(prefs::kSyncManaged, true);
4905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // When switching back to unmanaged, the state should change, but the service
4925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // should not start up automatically (kSyncSetupCompleted will be false).
4935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Mock::VerifyAndClearExpectations(data_type_manager);
4942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_CALL(*sync_->components_factory_mock(),
495868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)              CreateDataTypeManager(_, _, _, _, _, _)).Times(0);
4965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(observer_, OnStateChanged()).Times(AnyNumber());
4975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  profile_->GetPrefs()->ClearPref(prefs::kSyncManaged);
4985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ProfileSyncServiceStartupTest, StartFailure) {
501eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  profile_->GetPrefs()->SetString(prefs::kGoogleServicesUsername,
502eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch                                  "test_user@gmail.com");
503a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  SigninManagerFactory::GetForProfile(profile_.get())->Initialize(
50490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      profile_.get(), NULL);
505a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  CreateSyncService();
5065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DataTypeManagerMock* data_type_manager = SetUpDataTypeManager();
5075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DataTypeManager::ConfigureStatus status = DataTypeManager::ABORTED;
5085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  syncer::SyncError error(
509eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      FROM_HERE,
510eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      syncer::SyncError::DATATYPE_ERROR,
511eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      "Association failed.",
512eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      syncer::BOOKMARKS);
513868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  std::map<syncer::ModelType, syncer::SyncError> errors;
514868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  errors[syncer::BOOKMARKS] = error;
5155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DataTypeManager::ConfigureResult result(
5165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      status,
5175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      syncer::ModelTypeSet(),
5185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      errors,
519868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      syncer::ModelTypeSet(),
5205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      syncer::ModelTypeSet());
5215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(*data_type_manager, Configure(_, _)).
5225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      WillRepeatedly(
5232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          DoAll(InvokeOnConfigureStart(sync_),
5242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                InvokeOnConfigureDone(sync_, result)));
5255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(*data_type_manager, state()).
5265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      WillOnce(Return(DataTypeManager::STOPPED));
5275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(observer_, OnStateChanged()).Times(AnyNumber());
5285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TokenServiceFactory::GetForProfile(profile_.get())->IssueAuthTokenForTest(
5297d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      GaiaConstants::kGaiaOAuth2LoginRefreshToken, "oauth2_login_token");
5307d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  TokenServiceFactory::GetForProfile(profile_.get())->IssueAuthTokenForTest(
5317d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      GaiaConstants::kSyncService, "token");
5322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  sync_->Initialize();
5332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_TRUE(sync_->HasUnrecoverableError());
5345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
5355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ProfileSyncServiceStartupTest, StartDownloadFailed) {
537a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  // Pre load the tokens
538eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  profile_->GetPrefs()->SetString(prefs::kGoogleServicesUsername,
539eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch                                  "test_user@gmail.com");
540a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  SigninManagerFactory::GetForProfile(profile_.get())->Initialize(
54190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      profile_.get(), NULL);
542a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  CreateSyncService();
543a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)
5445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  profile_->GetPrefs()->ClearPref(prefs::kSyncHasSetupCompleted);
5455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(observer_, OnStateChanged()).Times(AnyNumber());
5475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TokenServiceFactory::GetForProfile(profile_.get())->IssueAuthTokenForTest(
5487d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      GaiaConstants::kGaiaOAuth2LoginRefreshToken, "oauth2_login_token");
5497d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  TokenServiceFactory::GetForProfile(profile_.get())->IssueAuthTokenForTest(
5507d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      GaiaConstants::kSyncService, "token");
5512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  sync_->fail_initial_download();
5525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5537d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  sync_->SetSetupInProgress(true);
5542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  sync_->Initialize();
5557d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  sync_->SetSetupInProgress(false);
5562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_FALSE(sync_->sync_initialized());
5577d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  EXPECT_TRUE(sync_->GetBackendForTest());
5585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
559