profile_sync_service_startup_unittest.cc revision 7d4cd473f85ac64c3747c96c277f9e506a0d2246
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"
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/message_loop.h"
92a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/prefs/pref_service.h"
10c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "chrome/browser/signin/fake_signin_manager.h"
117d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "chrome/browser/signin/oauth2_token_service.h"
127d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "chrome/browser/signin/profile_oauth2_token_service.h"
137d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "chrome/browser/signin/profile_oauth2_token_service_factory.h"
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/signin/signin_manager.h"
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/signin/signin_manager_factory.h"
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/signin/token_service.h"
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/signin/token_service_factory.h"
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/sync/glue/data_type_manager.h"
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/sync/glue/data_type_manager_mock.h"
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/sync/profile_sync_components_factory_mock.h"
212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/sync/profile_sync_service_factory.h"
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/sync/profile_sync_test_util.h"
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/sync/sync_prefs.h"
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/sync/test_profile_sync_service.h"
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/common/chrome_notification_types.h"
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/common/pref_names.h"
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/test/base/testing_profile.h"
28c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "content/public/browser/notification_service.h"
29c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "content/public/browser/notification_source.h"
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/test/test_browser_thread.h"
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "google_apis/gaia/gaia_auth_consumer.h"
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "google_apis/gaia/gaia_constants.h"
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "testing/gmock/include/gmock/gmock.h"
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using browser_sync::DataTypeManager;
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using browser_sync::DataTypeManagerMock;
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using content::BrowserThread;
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using testing::_;
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using testing::AnyNumber;
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using testing::DoAll;
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using testing::InvokeArgument;
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using testing::Mock;
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using testing::Return;
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)ACTION_P(InvokeOnConfigureStart, pss) {
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TestProfileSyncService* service = static_cast<TestProfileSyncService*>(pss);
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  service->OnConfigureStart();
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)ACTION_P2(InvokeOnConfigureDone, pss, result) {
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TestProfileSyncService* service = static_cast<TestProfileSyncService*>(pss);
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DataTypeManager::ConfigureResult configure_result =
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      static_cast<DataTypeManager::ConfigureResult>(result);
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  service->OnConfigureDone(configure_result);
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class FakeTokenService : public TokenService {
582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) public:
592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  FakeTokenService() {}
602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual ~FakeTokenService() {}
612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void LoadTokensFromDB() OVERRIDE {
632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    set_tokens_loaded(true);
642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    content::NotificationService::current()->Notify(
652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        chrome::NOTIFICATION_TOKEN_LOADING_FINISHED,
662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        content::Source<TokenService>(this),
672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        content::NotificationService::NoDetails());
682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)};
702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class ProfileSyncServiceStartupTest : public testing::Test {
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ProfileSyncServiceStartupTest()
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      : ui_thread_(BrowserThread::UI, &ui_loop_),
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        db_thread_(BrowserThread::DB),
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        file_thread_(BrowserThread::FILE),
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        io_thread_(BrowserThread::IO),
782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        profile_(new TestingProfile),
792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        sync_(NULL) {}
805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual ~ProfileSyncServiceStartupTest() {
825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void SetUp() {
855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    file_thread_.Start();
865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    io_thread_.StartIOThread();
875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    profile_->CreateRequestContext();
88a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)#if defined(OS_CHROMEOS)
89a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)    SigninManagerFactory::GetInstance()->SetTestingFactory(
90a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)        profile_.get(), FakeSigninManagerBase::Build);
91a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)#else
92a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)    SigninManagerFactory::GetInstance()->SetTestingFactory(
93a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)        profile_.get(), FakeSigninManager::Build);
94a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)#endif
955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void TearDown() {
982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    sync_->RemoveObserver(&observer_);
992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    ProfileSyncServiceFactory::GetInstance()->SetTestingFactory(
1002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        profile_.get(), NULL);
1017d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    ProfileOAuth2TokenServiceFactory::GetInstance()->SetTestingFactory(
1027d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)        profile_.get(), NULL);
1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    profile_.reset();
1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Pump messages posted by the sync core thread (which may end up
1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // posting on the IO thread).
1072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    ui_loop_.RunUntilIdle();
1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    io_thread_.Stop();
1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    file_thread_.Stop();
1102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    ui_loop_.RunUntilIdle();
1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  static BrowserContextKeyedService* BuildService(
11490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      content::BrowserContext* profile) {
1152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return new TestProfileSyncService(
1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        new ProfileSyncComponentsFactoryMock(),
117c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        static_cast<Profile*>(profile),
118a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)        SigninManagerFactory::GetForProfile(static_cast<Profile*>(profile)),
1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        ProfileSyncService::MANUAL_START,
1202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        true);
1212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
1222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
123a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  void CreateSyncService() {
1247d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    ProfileOAuth2TokenServiceFactory::GetInstance()->SetTestingFactory(
1257d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)        profile_.get(), FakeOAuth2TokenService::BuildTokenService);
1262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    sync_ = static_cast<TestProfileSyncService*>(
1272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        ProfileSyncServiceFactory::GetInstance()->SetTestingFactoryAndUse(
1282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            profile_.get(), BuildService));
129a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)    sync_->AddObserver(&observer_);
130a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)    sync_->set_synchronous_sync_configuration();
1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
133a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) protected:
1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DataTypeManagerMock* SetUpDataTypeManager() {
1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    DataTypeManagerMock* data_type_manager = new DataTypeManagerMock();
1362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    EXPECT_CALL(*sync_->components_factory_mock(),
137868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                CreateDataTypeManager(_, _, _, _, _, _)).
1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        WillOnce(Return(data_type_manager));
1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return data_type_manager;
1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
14290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  base::MessageLoop ui_loop_;
1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  content::TestBrowserThread ui_thread_;
1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  content::TestBrowserThread db_thread_;
1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  content::TestBrowserThread file_thread_;
1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  content::TestBrowserThread io_thread_;
1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<TestingProfile> profile_;
1482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  TestProfileSyncService* sync_;
1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ProfileSyncServiceObserverMock observer_;
1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class ProfileSyncServiceStartupCrosTest : public ProfileSyncServiceStartupTest {
1532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) public:
154a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  virtual void SetUp() {
155a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)    ProfileSyncServiceStartupTest::SetUp();
1567d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    ProfileOAuth2TokenServiceFactory::GetInstance()->SetTestingFactory(
1577d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)        profile_.get(), FakeOAuth2TokenService::BuildTokenService);
158a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)    sync_ = static_cast<TestProfileSyncService*>(
159a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)        ProfileSyncServiceFactory::GetInstance()->SetTestingFactoryAndUse(
160a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)            profile_.get(), BuildCrosService));
161a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)    sync_->AddObserver(&observer_);
162a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)    sync_->set_synchronous_sync_configuration();
163a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  }
164a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)
16590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  static BrowserContextKeyedService* BuildCrosService(
166c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      content::BrowserContext* context) {
167c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    Profile* profile = static_cast<Profile*>(context);
168c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    SigninManagerBase* signin =
169c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        SigninManagerFactory::GetForProfile(profile);
170a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)    profile->GetPrefs()->SetString(prefs::kGoogleServicesUsername,
171a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)                                   "test_user");
17290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    signin->Initialize(profile, NULL);
173a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)    EXPECT_FALSE(signin->GetAuthenticatedUsername().empty());
174c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    return new TestProfileSyncService(
175c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        new ProfileSyncComponentsFactoryMock(),
176c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        profile,
177c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        signin,
178c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        ProfileSyncService::AUTO_START,
179c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        true);
180c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
18390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)BrowserContextKeyedService* BuildFakeTokenService(
18490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    content::BrowserContext* profile) {
185a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  return new FakeTokenService();
186a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)}
1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
188a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)TEST_F(ProfileSyncServiceStartupTest, StartFirstTime) {
1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // We've never completed startup.
1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  profile_->GetPrefs()->ClearPref(prefs::kSyncHasSetupCompleted);
191a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  SigninManagerFactory::GetForProfile(
19290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      profile_.get())->Initialize(profile_.get(), NULL);
193a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  CreateSyncService();
194a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  DataTypeManagerMock* data_type_manager = SetUpDataTypeManager();
195a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  EXPECT_CALL(*data_type_manager, Configure(_, _)).Times(0);
1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Should not actually start, rather just clean things up and wait
1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // to be enabled.
1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(observer_, OnStateChanged()).Times(AnyNumber());
2002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  sync_->Initialize();
2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Preferences should be back to defaults.
2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(0, profile_->GetPrefs()->GetInt64(prefs::kSyncLastSyncedTime));
2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(profile_->GetPrefs()->GetBoolean(prefs::kSyncHasSetupCompleted));
2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Mock::VerifyAndClearExpectations(data_type_manager);
2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Then start things up.
2085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(*data_type_manager, Configure(_, _)).Times(1);
2095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(*data_type_manager, state()).
2105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      WillOnce(Return(DataTypeManager::CONFIGURED)).
2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      WillOnce(Return(DataTypeManager::CONFIGURED));
2125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(*data_type_manager, Stop()).Times(1);
2135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(observer_, OnStateChanged()).Times(AnyNumber());
2145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  sync_->SetSetupInProgress(true);
216a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)
217a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  // Simulate successful signin as test_user.
218a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  profile_->GetPrefs()->SetString(prefs::kGoogleServicesUsername,
219a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)                                  "test_user");
220a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  sync_->signin()->SetAuthenticatedUsername("test_user");
221a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  GoogleServiceSigninSuccessDetails details("test_user", "");
222a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  content::NotificationService::current()->Notify(
223a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)      chrome::NOTIFICATION_GOOGLE_SIGNIN_SUCCESSFUL,
224a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)      content::Source<Profile>(profile_.get()),
225a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)      content::Details<const GoogleServiceSigninSuccessDetails>(&details));
226a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)
227a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  // Create some tokens in the token service.
2285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TokenServiceFactory::GetForProfile(profile_.get())->IssueAuthTokenForTest(
2295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      GaiaConstants::kGaiaOAuth2LoginRefreshToken, "oauth2_login_token");
2307d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  TokenServiceFactory::GetForProfile(profile_.get())->IssueAuthTokenForTest(
2317d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      GaiaConstants::kSyncService, "token");
232a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)
233a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  // Simulate the UI telling sync it has finished setting up.
2342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  sync_->SetSetupInProgress(false);
2352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_TRUE(sync_->ShouldPushChanges());
2362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
2372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2387d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)// TODO(pavely): Reenable test once android is switched to oauth2.
2397d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)TEST_F(ProfileSyncServiceStartupTest, DISABLED_StartNoCredentials) {
2407d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  // We've never completed startup.
241a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  profile_->GetPrefs()->ClearPref(prefs::kSyncHasSetupCompleted);
242a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  SigninManagerFactory::GetForProfile(
24390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      profile_.get())->Initialize(profile_.get(), NULL);
2442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  TokenService* token_service = static_cast<TokenService*>(
2452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      TokenServiceFactory::GetInstance()->SetTestingFactoryAndUse(
2462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          profile_.get(), BuildFakeTokenService));
247a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  CreateSyncService();
2485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Should not actually start, rather just clean things up and wait
2505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // to be enabled.
2517d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  EXPECT_CALL(*sync_->components_factory_mock(),
2527d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)              CreateDataTypeManager(_, _, _, _, _, _)).Times(0);
2535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(observer_, OnStateChanged()).Times(AnyNumber());
2542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  sync_->Initialize();
2552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_FALSE(sync_->GetBackendForTest());
2565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Preferences should be back to defaults.
2585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(0, profile_->GetPrefs()->GetInt64(prefs::kSyncLastSyncedTime));
2595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(profile_->GetPrefs()->GetBoolean(prefs::kSyncHasSetupCompleted));
2605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Then start things up.
2622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  sync_->SetSetupInProgress(true);
263a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)
2647d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  // Simulate successful signin as test_user.
265a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  profile_->GetPrefs()->SetString(prefs::kGoogleServicesUsername,
266a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)                                  "test_user");
267a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  sync_->signin()->SetAuthenticatedUsername("test_user");
268a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  GoogleServiceSigninSuccessDetails details("test_user", "");
269a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  content::NotificationService::current()->Notify(
270a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)      chrome::NOTIFICATION_GOOGLE_SIGNIN_SUCCESSFUL,
271a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)      content::Source<Profile>(profile_.get()),
272a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)      content::Details<const GoogleServiceSigninSuccessDetails>(&details));
2735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // NOTE: Unlike StartFirstTime, this test does not issue any auth tokens.
2742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  token_service->LoadTokensFromDB();
275a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)
2762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  sync_->SetSetupInProgress(false);
2777d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  // ProfileSyncService should try to start by requesting access token.
2787d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  // This request should fail as login token was not issued to TokenService.
2797d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  EXPECT_FALSE(sync_->ShouldPushChanges());
2807d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  EXPECT_EQ(GoogleServiceAuthError::USER_NOT_SIGNED_UP,
2817d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      sync_->GetAuthError().state());
2822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
2832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2847d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)// TODO(pavely): Reenable test once android is switched to oauth2.
2857d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)TEST_F(ProfileSyncServiceStartupTest, DISABLED_StartInvalidCredentials) {
286a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  profile_->GetPrefs()->SetString(prefs::kGoogleServicesUsername,
287a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)                                  "test_user");
288a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  SigninManagerFactory::GetForProfile(
28990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      profile_.get())->Initialize(profile_.get(), NULL);
290a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  CreateSyncService();
2912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  DataTypeManagerMock* data_type_manager = SetUpDataTypeManager();
2922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_CALL(*data_type_manager, Configure(_, _)).Times(0);
2937d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  // Issue login token so that ProfileSyncServer tries to initialize backend.
2947d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  TokenServiceFactory::GetForProfile(profile_.get())->IssueAuthTokenForTest(
2957d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      GaiaConstants::kGaiaOAuth2LoginRefreshToken, "oauth2_login_token");
2962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Tell the backend to stall while downloading control types (simulating an
2982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // auth error).
2992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  sync_->fail_initial_download();
3002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_CALL(observer_, OnStateChanged()).Times(AnyNumber());
3022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  sync_->Initialize();
3032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_TRUE(sync_->GetBackendForTest());
3042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_FALSE(sync_->sync_initialized());
3052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  Mock::VerifyAndClearExpectations(data_type_manager);
3062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Update the credentials, unstalling the backend.
3082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_CALL(*data_type_manager, Configure(_, _));
3092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_CALL(*data_type_manager, state()).
3102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      WillRepeatedly(Return(DataTypeManager::CONFIGURED));
3112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_CALL(*data_type_manager, Stop()).Times(1);
3122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_CALL(observer_, OnStateChanged()).Times(AnyNumber());
3132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  sync_->SetSetupInProgress(true);
314a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)
315a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  // Simulate successful signin.
316a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  GoogleServiceSigninSuccessDetails details("test_user", std::string());
317a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  content::NotificationService::current()->Notify(
318a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)        chrome::NOTIFICATION_GOOGLE_SIGNIN_SUCCESSFUL,
319a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)        content::Source<Profile>(profile_.get()),
320a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)        content::Details<const GoogleServiceSigninSuccessDetails>(&details));
321a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)
3227d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  TokenServiceFactory::GetForProfile(profile_.get())->IssueAuthTokenForTest(
3237d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      GaiaConstants::kGaiaOAuth2LoginRefreshToken, "oauth2_login_token");
3242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  sync_->SetSetupInProgress(false);
3252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Verify we successfully finish startup and configuration.
3272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_TRUE(sync_->ShouldPushChanges());
3285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ProfileSyncServiceStartupCrosTest, StartCrosNoCredentials) {
3312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_CALL(*sync_->components_factory_mock(),
332868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)              CreateDataTypeManager(_, _, _, _, _, _)).Times(0);
3335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  profile_->GetPrefs()->ClearPref(prefs::kSyncHasSetupCompleted);
3345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(observer_, OnStateChanged()).Times(AnyNumber());
3352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  TokenService* token_service = static_cast<TokenService*>(
3362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      TokenServiceFactory::GetInstance()->SetTestingFactoryAndUse(
3372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          profile_.get(), BuildFakeTokenService));
3385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  sync_->Initialize();
3405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Sync should not start because there are no tokens yet.
3412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_FALSE(sync_->ShouldPushChanges());
3422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_FALSE(sync_->GetBackendForTest());
3432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  token_service->LoadTokensFromDB();
3442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  sync_->SetSetupInProgress(false);
3452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Sync should not start because there are still no tokens.
3472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_FALSE(sync_->ShouldPushChanges());
3482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_FALSE(sync_->GetBackendForTest());
3495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ProfileSyncServiceStartupCrosTest, StartFirstTime) {
3525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DataTypeManagerMock* data_type_manager = SetUpDataTypeManager();
3535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  profile_->GetPrefs()->ClearPref(prefs::kSyncHasSetupCompleted);
3545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(*data_type_manager, Configure(_, _));
3555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(*data_type_manager, state()).
3565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      WillRepeatedly(Return(DataTypeManager::CONFIGURED));
3575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(*data_type_manager, Stop()).Times(1);
3585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(observer_, OnStateChanged()).Times(AnyNumber());
3595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TokenServiceFactory::GetForProfile(profile_.get())->IssueAuthTokenForTest(
3617d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      GaiaConstants::kGaiaOAuth2LoginRefreshToken, "oauth2_login_token");
3627d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  TokenServiceFactory::GetForProfile(profile_.get())->IssueAuthTokenForTest(
3635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      GaiaConstants::kSyncService, "sync_token");
3642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  sync_->Initialize();
3652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_TRUE(sync_->ShouldPushChanges());
3665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ProfileSyncServiceStartupTest, StartNormal) {
369a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  // Pre load the tokens
370a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  profile_->GetPrefs()->SetString(prefs::kGoogleServicesUsername, "test_user");
371a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  SigninManagerFactory::GetForProfile(profile_.get())->Initialize(
37290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      profile_.get(), NULL);
373a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  CreateSyncService();
3745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DataTypeManagerMock* data_type_manager = SetUpDataTypeManager();
3755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(*data_type_manager, Configure(_, _));
3765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(*data_type_manager, state()).
3775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      WillRepeatedly(Return(DataTypeManager::CONFIGURED));
3785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(*data_type_manager, Stop()).Times(1);
3795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(observer_, OnStateChanged()).Times(AnyNumber());
3805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TokenServiceFactory::GetForProfile(profile_.get())->IssueAuthTokenForTest(
3827d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      GaiaConstants::kGaiaOAuth2LoginRefreshToken, "oauth2_login_token");
3837d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  TokenServiceFactory::GetForProfile(profile_.get())->IssueAuthTokenForTest(
3845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      GaiaConstants::kSyncService, "sync_token");
385a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)
3862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  sync_->Initialize();
3875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Test that we can recover from a case where a bug in the code resulted in
3905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// OnUserChoseDatatypes not being properly called and datatype preferences
3915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// therefore being left unset.
3925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ProfileSyncServiceStartupTest, StartRecoverDatatypePrefs) {
3935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Clear the datatype preference fields (simulating bug 154940).
3945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  profile_->GetPrefs()->ClearPref(prefs::kSyncKeepEverythingSynced);
3955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  syncer::ModelTypeSet user_types = syncer::UserTypes();
3965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for (syncer::ModelTypeSet::Iterator iter = user_types.First();
3975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)       iter.Good(); iter.Inc()) {
3985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    profile_->GetPrefs()->ClearPref(
3995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        browser_sync::SyncPrefs::GetPrefNameForDataType(iter.Get()));
4005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
4015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Pre load the tokens
403a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  profile_->GetPrefs()->SetString(prefs::kGoogleServicesUsername, "test_user");
404a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  SigninManagerFactory::GetForProfile(profile_.get())->Initialize(
40590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      profile_.get(), NULL);
406a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  CreateSyncService();
407a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  DataTypeManagerMock* data_type_manager = SetUpDataTypeManager();
408a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  EXPECT_CALL(*data_type_manager, Configure(_, _));
409a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  EXPECT_CALL(*data_type_manager, state()).
410a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)      WillRepeatedly(Return(DataTypeManager::CONFIGURED));
411a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  EXPECT_CALL(*data_type_manager, Stop()).Times(1);
412a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  EXPECT_CALL(observer_, OnStateChanged()).Times(AnyNumber());
413a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)
4145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TokenServiceFactory::GetForProfile(profile_.get())->IssueAuthTokenForTest(
4157d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      GaiaConstants::kGaiaOAuth2LoginRefreshToken, "oauth2_login_token");
4167d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  TokenServiceFactory::GetForProfile(profile_.get())->IssueAuthTokenForTest(
4175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      GaiaConstants::kSyncService, "sync_token");
4182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  sync_->Initialize();
4195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(profile_->GetPrefs()->GetBoolean(
4215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      prefs::kSyncKeepEverythingSynced));
4225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Verify that the recovery of datatype preferences doesn't overwrite a valid
4255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// case where only bookmarks are enabled.
4265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ProfileSyncServiceStartupTest, StartDontRecoverDatatypePrefs) {
427a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  // Explicitly set Keep Everything Synced to false and have only bookmarks
428a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  // enabled.
429a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  profile_->GetPrefs()->SetBoolean(prefs::kSyncKeepEverythingSynced, false);
430a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)
431a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  // Pre load the tokens
432a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  profile_->GetPrefs()->SetString(prefs::kGoogleServicesUsername, "test_user");
433a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  SigninManagerFactory::GetForProfile(profile_.get())->Initialize(
43490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      profile_.get(), NULL);
435a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  CreateSyncService();
4365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DataTypeManagerMock* data_type_manager = SetUpDataTypeManager();
4375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(*data_type_manager, Configure(_, _));
4385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(*data_type_manager, state()).
4395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      WillRepeatedly(Return(DataTypeManager::CONFIGURED));
4405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(*data_type_manager, Stop()).Times(1);
4415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(observer_, OnStateChanged()).Times(AnyNumber());
4425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TokenServiceFactory::GetForProfile(profile_.get())->IssueAuthTokenForTest(
4437d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      GaiaConstants::kGaiaOAuth2LoginRefreshToken, "oauth2_login_token");
4447d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  TokenServiceFactory::GetForProfile(profile_.get())->IssueAuthTokenForTest(
4455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      GaiaConstants::kSyncService, "sync_token");
4462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  sync_->Initialize();
4475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(profile_->GetPrefs()->GetBoolean(
4495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      prefs::kSyncKeepEverythingSynced));
4505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ProfileSyncServiceStartupTest, ManagedStartup) {
453a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  // Service should not be started by Initialize() since it's managed.
454a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  profile_->GetPrefs()->SetString(prefs::kGoogleServicesUsername, "test_user");
455a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  SigninManagerFactory::GetForProfile(profile_.get())->Initialize(
45690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      profile_.get(), NULL);
457a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  CreateSyncService();
458a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)
4595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Disable sync through policy.
4605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  profile_->GetPrefs()->SetBoolean(prefs::kSyncManaged, true);
4612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_CALL(*sync_->components_factory_mock(),
462868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)              CreateDataTypeManager(_, _, _, _, _, _)).Times(0);
4635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(observer_, OnStateChanged()).Times(AnyNumber());
4645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TokenServiceFactory::GetForProfile(profile_.get())->IssueAuthTokenForTest(
4667d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      GaiaConstants::kGaiaOAuth2LoginRefreshToken, "oauth2_login_token");
4672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  sync_->Initialize();
4685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ProfileSyncServiceStartupTest, SwitchManaged) {
471a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  profile_->GetPrefs()->SetString(prefs::kGoogleServicesUsername, "test_user");
472a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  SigninManagerFactory::GetForProfile(profile_.get())->Initialize(
47390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      profile_.get(), NULL);
474a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  CreateSyncService();
4755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DataTypeManagerMock* data_type_manager = SetUpDataTypeManager();
4765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(*data_type_manager, Configure(_, _));
4775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(observer_, OnStateChanged()).Times(AnyNumber());
4785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TokenServiceFactory::GetForProfile(profile_.get())->IssueAuthTokenForTest(
4797d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      GaiaConstants::kGaiaOAuth2LoginRefreshToken, "oauth2_login_token");
4807d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  TokenServiceFactory::GetForProfile(profile_.get())->IssueAuthTokenForTest(
4817d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      GaiaConstants::kSyncService, "token");
4822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  sync_->Initialize();
4835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // The service should stop when switching to managed mode.
4855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Mock::VerifyAndClearExpectations(data_type_manager);
4865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(*data_type_manager, state()).
4875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      WillOnce(Return(DataTypeManager::CONFIGURED));
4885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(*data_type_manager, Stop()).Times(1);
4895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(observer_, OnStateChanged()).Times(AnyNumber());
4905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  profile_->GetPrefs()->SetBoolean(prefs::kSyncManaged, true);
4915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // When switching back to unmanaged, the state should change, but the service
4935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // should not start up automatically (kSyncSetupCompleted will be false).
4945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Mock::VerifyAndClearExpectations(data_type_manager);
4952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_CALL(*sync_->components_factory_mock(),
496868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)              CreateDataTypeManager(_, _, _, _, _, _)).Times(0);
4975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(observer_, OnStateChanged()).Times(AnyNumber());
4985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  profile_->GetPrefs()->ClearPref(prefs::kSyncManaged);
4995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
5005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ProfileSyncServiceStartupTest, StartFailure) {
502a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  profile_->GetPrefs()->SetString(prefs::kGoogleServicesUsername, "test_user");
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(
5095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      FROM_HERE, "Association failed.", syncer::BOOKMARKS);
510868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  std::map<syncer::ModelType, syncer::SyncError> errors;
511868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  errors[syncer::BOOKMARKS] = error;
5125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DataTypeManager::ConfigureResult result(
5135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      status,
5145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      syncer::ModelTypeSet(),
5155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      errors,
516868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      syncer::ModelTypeSet(),
5175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      syncer::ModelTypeSet());
5185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(*data_type_manager, Configure(_, _)).
5195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      WillRepeatedly(
5202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          DoAll(InvokeOnConfigureStart(sync_),
5212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                InvokeOnConfigureDone(sync_, result)));
5225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(*data_type_manager, state()).
5235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      WillOnce(Return(DataTypeManager::STOPPED));
5245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(observer_, OnStateChanged()).Times(AnyNumber());
5255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TokenServiceFactory::GetForProfile(profile_.get())->IssueAuthTokenForTest(
5267d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      GaiaConstants::kGaiaOAuth2LoginRefreshToken, "oauth2_login_token");
5277d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  TokenServiceFactory::GetForProfile(profile_.get())->IssueAuthTokenForTest(
5287d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      GaiaConstants::kSyncService, "token");
5292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  sync_->Initialize();
5302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_TRUE(sync_->HasUnrecoverableError());
5315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
5325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ProfileSyncServiceStartupTest, StartDownloadFailed) {
534a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  // Pre load the tokens
535a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  profile_->GetPrefs()->SetString(prefs::kGoogleServicesUsername, "test_user");
536a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  SigninManagerFactory::GetForProfile(profile_.get())->Initialize(
53790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      profile_.get(), NULL);
538a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  CreateSyncService();
539a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)
5405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  profile_->GetPrefs()->ClearPref(prefs::kSyncHasSetupCompleted);
5415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(observer_, OnStateChanged()).Times(AnyNumber());
5435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TokenServiceFactory::GetForProfile(profile_.get())->IssueAuthTokenForTest(
5447d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      GaiaConstants::kGaiaOAuth2LoginRefreshToken, "oauth2_login_token");
5457d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  TokenServiceFactory::GetForProfile(profile_.get())->IssueAuthTokenForTest(
5467d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      GaiaConstants::kSyncService, "token");
5472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  sync_->fail_initial_download();
5485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5497d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  sync_->SetSetupInProgress(true);
5502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  sync_->Initialize();
5517d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  sync_->SetSetupInProgress(false);
5522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_FALSE(sync_->sync_initialized());
5537d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  EXPECT_TRUE(sync_->GetBackendForTest());
5545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
555