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)
5f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "base/file_util.h"
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/memory/scoped_ptr.h"
72a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/prefs/pref_service.h"
87dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#include "chrome/browser/chrome_notification_types.h"
9c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "chrome/browser/signin/fake_signin_manager.h"
107d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "chrome/browser/signin/profile_oauth2_token_service.h"
117d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "chrome/browser/signin/profile_oauth2_token_service_factory.h"
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/signin/signin_manager.h"
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/signin/signin_manager_factory.h"
14f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "chrome/browser/sync/fake_oauth2_token_service.h"
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/sync/glue/data_type_manager.h"
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/sync/glue/data_type_manager_mock.h"
17f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "chrome/browser/sync/glue/sync_backend_host_mock.h"
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/sync/profile_sync_components_factory_mock.h"
192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/sync/profile_sync_service_factory.h"
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/sync/profile_sync_test_util.h"
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/sync/sync_prefs.h"
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/common/pref_names.h"
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/test/base/testing_profile.h"
24c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "content/public/browser/notification_service.h"
25c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "content/public/browser/notification_source.h"
26a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch#include "content/public/test/test_browser_thread_bundle.h"
27a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch#include "content/public/test/test_utils.h"
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "google_apis/gaia/gaia_auth_consumer.h"
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "google_apis/gaia/gaia_constants.h"
30424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)#include "google_apis/gaia/oauth2_token_service.h"
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "testing/gmock/include/gmock/gmock.h"
32f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "testing/gtest/include/gtest/gtest.h"
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using browser_sync::DataTypeManager;
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using browser_sync::DataTypeManagerMock;
36f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)using browser_sync::SyncBackendHostMock;
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) {
46f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  ProfileSyncService* service =
47f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      static_cast<ProfileSyncService*>(pss);
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  service->OnConfigureStart();
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)ACTION_P2(InvokeOnConfigureDone, pss, result) {
52f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  ProfileSyncService* service =
53f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      static_cast<ProfileSyncService*>(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)
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class ProfileSyncServiceStartupTest : public testing::Test {
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ProfileSyncServiceStartupTest()
62a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch      : thread_bundle_(content::TestBrowserThreadBundle::REAL_DB_THREAD |
63a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch                       content::TestBrowserThreadBundle::REAL_FILE_THREAD |
64a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch                       content::TestBrowserThreadBundle::REAL_IO_THREAD),
652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        sync_(NULL) {}
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual ~ProfileSyncServiceStartupTest() {
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void SetUp() {
713551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    profile_ = CreateProfile();
723551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  }
733551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
743551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  virtual scoped_ptr<TestingProfile> CreateProfile() {
753551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    TestingProfile::Builder builder;
76a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)#if defined(OS_CHROMEOS)
773551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    builder.AddTestingFactory(SigninManagerFactory::GetInstance(),
783551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)                              FakeSigninManagerBase::Build);
79a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)#else
803551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    builder.AddTestingFactory(SigninManagerFactory::GetInstance(),
813551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)                              FakeSigninManager::Build);
82a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)#endif
833551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    builder.AddTestingFactory(ProfileOAuth2TokenServiceFactory::GetInstance(),
843551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)                              FakeOAuth2TokenService::BuildTokenService);
853551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    builder.AddTestingFactory(ProfileSyncServiceFactory::GetInstance(),
863551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)                              BuildService);
873551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    return builder.Build();
885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void TearDown() {
912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    sync_->RemoveObserver(&observer_);
925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    profile_.reset();
935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  static BrowserContextKeyedService* BuildService(
9668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)      content::BrowserContext* browser_context) {
9768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)    Profile* profile = static_cast<Profile*>(browser_context);
98f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    return new ProfileSyncService(
995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        new ProfileSyncComponentsFactoryMock(),
10068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)        profile,
10168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)        SigninManagerFactory::GetForProfile(profile),
10268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)        ProfileOAuth2TokenServiceFactory::GetForProfile(profile),
103f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)        ProfileSyncService::MANUAL_START);
1042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
1052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
106a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  void CreateSyncService() {
107f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    sync_ = static_cast<ProfileSyncService*>(
1083551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)        ProfileSyncServiceFactory::GetForProfile(profile_.get()));
109a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)    sync_->AddObserver(&observer_);
1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  void IssueTestTokens() {
11368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)    ProfileOAuth2TokenServiceFactory::GetForProfile(profile_.get())
11468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)        ->UpdateCredentials("test_user@gmail.com", "oauth2_login_token");
11568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  }
11668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)
117f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  ProfileSyncComponentsFactoryMock* components_factory_mock() {
118f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    return static_cast<ProfileSyncComponentsFactoryMock*>(sync_->factory());
119f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  }
120f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
121a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) protected:
1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DataTypeManagerMock* SetUpDataTypeManager() {
1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    DataTypeManagerMock* data_type_manager = new DataTypeManagerMock();
124f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    EXPECT_CALL(*components_factory_mock(),
125868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                CreateDataTypeManager(_, _, _, _, _, _)).
1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        WillOnce(Return(data_type_manager));
1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return data_type_manager;
1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
130f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  browser_sync::SyncBackendHostMock* SetUpSyncBackendHost() {
131f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    browser_sync::SyncBackendHostMock* sync_backend_host =
132f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)        new browser_sync::SyncBackendHostMock();
133f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    EXPECT_CALL(*components_factory_mock(),
134f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)                CreateSyncBackendHost(_, _, _)).
135f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)        WillOnce(Return(sync_backend_host));
136f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    return sync_backend_host;
137f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  }
138f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
139a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch  content::TestBrowserThreadBundle thread_bundle_;
1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<TestingProfile> profile_;
141f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  ProfileSyncService* sync_;
1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ProfileSyncServiceObserverMock observer_;
143f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  ProfileSyncComponentsFactoryMock* mock_components_factory_;
1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class ProfileSyncServiceStartupCrosTest : public ProfileSyncServiceStartupTest {
1472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) public:
148a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  virtual void SetUp() {
149a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)    ProfileSyncServiceStartupTest::SetUp();
150f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    sync_ = static_cast<ProfileSyncService*>(
151a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)        ProfileSyncServiceFactory::GetInstance()->SetTestingFactoryAndUse(
152a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)            profile_.get(), BuildCrosService));
153a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)    sync_->AddObserver(&observer_);
154a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  }
155a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)
15690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  static BrowserContextKeyedService* BuildCrosService(
157c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      content::BrowserContext* context) {
158c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    Profile* profile = static_cast<Profile*>(context);
159c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    SigninManagerBase* signin =
160c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        SigninManagerFactory::GetForProfile(profile);
161a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)    profile->GetPrefs()->SetString(prefs::kGoogleServicesUsername,
162eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch                                   "test_user@gmail.com");
16368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)    ProfileOAuth2TokenService* oauth2_token_service =
16468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)        ProfileOAuth2TokenServiceFactory::GetForProfile(profile);
16590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    signin->Initialize(profile, NULL);
166a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)    EXPECT_FALSE(signin->GetAuthenticatedUsername().empty());
167f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    return new ProfileSyncService(
168c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        new ProfileSyncComponentsFactoryMock(),
169c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        profile,
170c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        signin,
17168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)        oauth2_token_service,
172f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)        ProfileSyncService::AUTO_START);
173c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
176a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)TEST_F(ProfileSyncServiceStartupTest, StartFirstTime) {
1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // We've never completed startup.
1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  profile_->GetPrefs()->ClearPref(prefs::kSyncHasSetupCompleted);
179a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  SigninManagerFactory::GetForProfile(
18090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      profile_.get())->Initialize(profile_.get(), NULL);
181a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  CreateSyncService();
182f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  SetUpSyncBackendHost();
183a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  DataTypeManagerMock* data_type_manager = SetUpDataTypeManager();
184a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  EXPECT_CALL(*data_type_manager, Configure(_, _)).Times(0);
1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Should not actually start, rather just clean things up and wait
1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // to be enabled.
1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(observer_, OnStateChanged()).Times(AnyNumber());
1892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  sync_->Initialize();
1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Preferences should be back to defaults.
1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(0, profile_->GetPrefs()->GetInt64(prefs::kSyncLastSyncedTime));
1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(profile_->GetPrefs()->GetBoolean(prefs::kSyncHasSetupCompleted));
1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Mock::VerifyAndClearExpectations(data_type_manager);
1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Then start things up.
1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(*data_type_manager, Configure(_, _)).Times(1);
1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(*data_type_manager, state()).
1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      WillOnce(Return(DataTypeManager::CONFIGURED)).
2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      WillOnce(Return(DataTypeManager::CONFIGURED));
2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(*data_type_manager, Stop()).Times(1);
2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(observer_, OnStateChanged()).Times(AnyNumber());
2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  sync_->SetSetupInProgress(true);
205a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)
206a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  // Simulate successful signin as test_user.
207a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  profile_->GetPrefs()->SetString(prefs::kGoogleServicesUsername,
208eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch                                  "test_user@gmail.com");
209eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  sync_->signin()->SetAuthenticatedUsername("test_user@gmail.com");
210eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  GoogleServiceSigninSuccessDetails details("test_user@gmail.com", "");
211a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  content::NotificationService::current()->Notify(
212a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)      chrome::NOTIFICATION_GOOGLE_SIGNIN_SUCCESSFUL,
213a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)      content::Source<Profile>(profile_.get()),
214a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)      content::Details<const GoogleServiceSigninSuccessDetails>(&details));
215a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)
216a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  // Create some tokens in the token service.
21768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  IssueTestTokens();
218a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)
219a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  // Simulate the UI telling sync it has finished setting up.
2202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  sync_->SetSetupInProgress(false);
2212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_TRUE(sync_->ShouldPushChanges());
2222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
2232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2247d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)// TODO(pavely): Reenable test once android is switched to oauth2.
2257d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)TEST_F(ProfileSyncServiceStartupTest, DISABLED_StartNoCredentials) {
2267d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  // We've never completed startup.
227a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  profile_->GetPrefs()->ClearPref(prefs::kSyncHasSetupCompleted);
228a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  SigninManagerFactory::GetForProfile(
22990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      profile_.get())->Initialize(profile_.get(), NULL);
230a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  CreateSyncService();
2315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Should not actually start, rather just clean things up and wait
2335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // to be enabled.
234f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  EXPECT_CALL(*components_factory_mock(),
2357d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)              CreateDataTypeManager(_, _, _, _, _, _)).Times(0);
2365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(observer_, OnStateChanged()).Times(AnyNumber());
2372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  sync_->Initialize();
2385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Preferences should be back to defaults.
2405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(0, profile_->GetPrefs()->GetInt64(prefs::kSyncLastSyncedTime));
2415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(profile_->GetPrefs()->GetBoolean(prefs::kSyncHasSetupCompleted));
2425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Then start things up.
2442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  sync_->SetSetupInProgress(true);
245a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)
2467d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  // Simulate successful signin as test_user.
247a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  profile_->GetPrefs()->SetString(prefs::kGoogleServicesUsername,
248eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch                                  "test_user@gmail.com");
249eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  sync_->signin()->SetAuthenticatedUsername("test_user@gmail.com");
250eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  GoogleServiceSigninSuccessDetails details("test_user@gmail.com", "");
251a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  content::NotificationService::current()->Notify(
252a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)      chrome::NOTIFICATION_GOOGLE_SIGNIN_SUCCESSFUL,
253a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)      content::Source<Profile>(profile_.get()),
254a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)      content::Details<const GoogleServiceSigninSuccessDetails>(&details));
255f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  ProfileOAuth2TokenService* token_service =
256f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    ProfileOAuth2TokenServiceFactory::GetForProfile(profile_.get());
257f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  token_service->LoadCredentials();
258a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)
2592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  sync_->SetSetupInProgress(false);
2607d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  // ProfileSyncService should try to start by requesting access token.
261f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  // This request should fail as login token was not issued.
2627d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  EXPECT_FALSE(sync_->ShouldPushChanges());
2637d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  EXPECT_EQ(GoogleServiceAuthError::USER_NOT_SIGNED_UP,
2647d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      sync_->GetAuthError().state());
2652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
2662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2677d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)// TODO(pavely): Reenable test once android is switched to oauth2.
2687d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)TEST_F(ProfileSyncServiceStartupTest, DISABLED_StartInvalidCredentials) {
269a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  profile_->GetPrefs()->SetString(prefs::kGoogleServicesUsername,
270eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch                                  "test_user@gmail.com");
271a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  SigninManagerFactory::GetForProfile(
27290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      profile_.get())->Initialize(profile_.get(), NULL);
273a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  CreateSyncService();
274f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  SyncBackendHostMock* mock_sbh = SetUpSyncBackendHost();
2752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Tell the backend to stall while downloading control types (simulating an
2772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // auth error).
278f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  mock_sbh->set_fail_initial_download(true);
279f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
280f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  DataTypeManagerMock* data_type_manager = SetUpDataTypeManager();
281f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  EXPECT_CALL(*data_type_manager, Configure(_, _)).Times(0);
2822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_CALL(observer_, OnStateChanged()).Times(AnyNumber());
2842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  sync_->Initialize();
2852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_FALSE(sync_->sync_initialized());
2862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  Mock::VerifyAndClearExpectations(data_type_manager);
2872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Update the credentials, unstalling the backend.
2892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_CALL(*data_type_manager, Configure(_, _));
2902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_CALL(*data_type_manager, state()).
2912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      WillRepeatedly(Return(DataTypeManager::CONFIGURED));
2922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_CALL(*data_type_manager, Stop()).Times(1);
2932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_CALL(observer_, OnStateChanged()).Times(AnyNumber());
2942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  sync_->SetSetupInProgress(true);
295a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)
296a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  // Simulate successful signin.
297eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  GoogleServiceSigninSuccessDetails details("test_user@gmail.com",
298eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch                                            std::string());
299a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  content::NotificationService::current()->Notify(
300a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)        chrome::NOTIFICATION_GOOGLE_SIGNIN_SUCCESSFUL,
301a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)        content::Source<Profile>(profile_.get()),
302a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)        content::Details<const GoogleServiceSigninSuccessDetails>(&details));
303a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)
3042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  sync_->SetSetupInProgress(false);
3052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Verify we successfully finish startup and configuration.
3072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_TRUE(sync_->ShouldPushChanges());
3085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ProfileSyncServiceStartupCrosTest, StartCrosNoCredentials) {
311f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  EXPECT_CALL(*components_factory_mock(),
312868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)              CreateDataTypeManager(_, _, _, _, _, _)).Times(0);
313f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  EXPECT_CALL(*components_factory_mock(),
314f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)              CreateSyncBackendHost(_, _, _)).Times(0);
3155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  profile_->GetPrefs()->ClearPref(prefs::kSyncHasSetupCompleted);
3165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(observer_, OnStateChanged()).Times(AnyNumber());
317f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  ProfileOAuth2TokenService* token_service =
318f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    ProfileOAuth2TokenServiceFactory::GetForProfile(profile_.get());
3195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  sync_->Initialize();
3215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Sync should not start because there are no tokens yet.
3222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_FALSE(sync_->ShouldPushChanges());
323f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  token_service->LoadCredentials();
3242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  sync_->SetSetupInProgress(false);
3252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Sync should not start because there are still no tokens.
3272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_FALSE(sync_->ShouldPushChanges());
3285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ProfileSyncServiceStartupCrosTest, StartFirstTime) {
331f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  SetUpSyncBackendHost();
3325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DataTypeManagerMock* data_type_manager = SetUpDataTypeManager();
3335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  profile_->GetPrefs()->ClearPref(prefs::kSyncHasSetupCompleted);
3345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(*data_type_manager, Configure(_, _));
3355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(*data_type_manager, state()).
3365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      WillRepeatedly(Return(DataTypeManager::CONFIGURED));
3375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(*data_type_manager, Stop()).Times(1);
3385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(observer_, OnStateChanged()).Times(AnyNumber());
3395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
34068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  IssueTestTokens();
3412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  sync_->Initialize();
3422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_TRUE(sync_->ShouldPushChanges());
3435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ProfileSyncServiceStartupTest, StartNormal) {
346a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  // Pre load the tokens
347eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  profile_->GetPrefs()->SetString(prefs::kGoogleServicesUsername,
348eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch                                  "test_user@gmail.com");
349a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  SigninManagerFactory::GetForProfile(profile_.get())->Initialize(
35090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      profile_.get(), NULL);
351a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  CreateSyncService();
352f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  sync_->SetSyncSetupCompleted();
353f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  SetUpSyncBackendHost();
3545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DataTypeManagerMock* data_type_manager = SetUpDataTypeManager();
3555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(*data_type_manager, Configure(_, _));
3565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(*data_type_manager, state()).
3575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      WillRepeatedly(Return(DataTypeManager::CONFIGURED));
3585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(*data_type_manager, Stop()).Times(1);
3595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(observer_, OnStateChanged()).Times(AnyNumber());
3605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
36168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  IssueTestTokens();
362a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)
3632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  sync_->Initialize();
3645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Test that we can recover from a case where a bug in the code resulted in
3675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// OnUserChoseDatatypes not being properly called and datatype preferences
3685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// therefore being left unset.
3695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ProfileSyncServiceStartupTest, StartRecoverDatatypePrefs) {
3705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Clear the datatype preference fields (simulating bug 154940).
3715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  profile_->GetPrefs()->ClearPref(prefs::kSyncKeepEverythingSynced);
3725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  syncer::ModelTypeSet user_types = syncer::UserTypes();
3735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for (syncer::ModelTypeSet::Iterator iter = user_types.First();
3745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)       iter.Good(); iter.Inc()) {
3755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    profile_->GetPrefs()->ClearPref(
3765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        browser_sync::SyncPrefs::GetPrefNameForDataType(iter.Get()));
3775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
3785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Pre load the tokens
380eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  profile_->GetPrefs()->SetString(prefs::kGoogleServicesUsername,
381eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch                                  "test_user@gmail.com");
382a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  SigninManagerFactory::GetForProfile(profile_.get())->Initialize(
38390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      profile_.get(), NULL);
384a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  CreateSyncService();
385f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  sync_->SetSyncSetupCompleted();
386f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  SetUpSyncBackendHost();
387a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  DataTypeManagerMock* data_type_manager = SetUpDataTypeManager();
388a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  EXPECT_CALL(*data_type_manager, Configure(_, _));
389a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  EXPECT_CALL(*data_type_manager, state()).
390a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)      WillRepeatedly(Return(DataTypeManager::CONFIGURED));
391a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  EXPECT_CALL(*data_type_manager, Stop()).Times(1);
392a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  EXPECT_CALL(observer_, OnStateChanged()).Times(AnyNumber());
393a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)
39468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  IssueTestTokens();
3952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  sync_->Initialize();
3965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(profile_->GetPrefs()->GetBoolean(
3985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      prefs::kSyncKeepEverythingSynced));
3995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Verify that the recovery of datatype preferences doesn't overwrite a valid
4025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// case where only bookmarks are enabled.
4035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ProfileSyncServiceStartupTest, StartDontRecoverDatatypePrefs) {
404a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  // Explicitly set Keep Everything Synced to false and have only bookmarks
405a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  // enabled.
406a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  profile_->GetPrefs()->SetBoolean(prefs::kSyncKeepEverythingSynced, false);
407a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)
408a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  // Pre load the tokens
409eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  profile_->GetPrefs()->SetString(prefs::kGoogleServicesUsername,
410eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch                                  "test_user@gmail.com");
411a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  SigninManagerFactory::GetForProfile(profile_.get())->Initialize(
41290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      profile_.get(), NULL);
413a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  CreateSyncService();
414f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  sync_->SetSyncSetupCompleted();
415f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  SetUpSyncBackendHost();
4165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DataTypeManagerMock* data_type_manager = SetUpDataTypeManager();
4175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(*data_type_manager, Configure(_, _));
4185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(*data_type_manager, state()).
4195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      WillRepeatedly(Return(DataTypeManager::CONFIGURED));
4205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(*data_type_manager, Stop()).Times(1);
4215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(observer_, OnStateChanged()).Times(AnyNumber());
42268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  IssueTestTokens();
4232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  sync_->Initialize();
4245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(profile_->GetPrefs()->GetBoolean(
4265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      prefs::kSyncKeepEverythingSynced));
4275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ProfileSyncServiceStartupTest, ManagedStartup) {
430a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  // Service should not be started by Initialize() since it's managed.
431eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  profile_->GetPrefs()->SetString(prefs::kGoogleServicesUsername,
432eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch                                  "test_user@gmail.com");
433a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  SigninManagerFactory::GetForProfile(profile_.get())->Initialize(
43490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      profile_.get(), NULL);
435a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  CreateSyncService();
436a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)
4375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Disable sync through policy.
4385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  profile_->GetPrefs()->SetBoolean(prefs::kSyncManaged, true);
439f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  EXPECT_CALL(*components_factory_mock(),
440868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)              CreateDataTypeManager(_, _, _, _, _, _)).Times(0);
4415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(observer_, OnStateChanged()).Times(AnyNumber());
4425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  sync_->Initialize();
4445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ProfileSyncServiceStartupTest, SwitchManaged) {
447eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  profile_->GetPrefs()->SetString(prefs::kGoogleServicesUsername,
448eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch                                  "test_user@gmail.com");
449a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  SigninManagerFactory::GetForProfile(profile_.get())->Initialize(
45090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      profile_.get(), NULL);
451a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  CreateSyncService();
452f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  sync_->SetSyncSetupCompleted();
453f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  SetUpSyncBackendHost();
4545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DataTypeManagerMock* data_type_manager = SetUpDataTypeManager();
4555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(*data_type_manager, Configure(_, _));
4565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(observer_, OnStateChanged()).Times(AnyNumber());
45768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  IssueTestTokens();
4582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  sync_->Initialize();
4595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // The service should stop when switching to managed mode.
4615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Mock::VerifyAndClearExpectations(data_type_manager);
4625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(*data_type_manager, state()).
4635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      WillOnce(Return(DataTypeManager::CONFIGURED));
4645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(*data_type_manager, Stop()).Times(1);
4655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(observer_, OnStateChanged()).Times(AnyNumber());
4665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  profile_->GetPrefs()->SetBoolean(prefs::kSyncManaged, true);
4675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // When switching back to unmanaged, the state should change, but the service
4695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // should not start up automatically (kSyncSetupCompleted will be false).
4705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Mock::VerifyAndClearExpectations(data_type_manager);
471f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  EXPECT_CALL(*components_factory_mock(),
472868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)              CreateDataTypeManager(_, _, _, _, _, _)).Times(0);
4735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(observer_, OnStateChanged()).Times(AnyNumber());
4745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  profile_->GetPrefs()->ClearPref(prefs::kSyncManaged);
4755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ProfileSyncServiceStartupTest, StartFailure) {
478eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  profile_->GetPrefs()->SetString(prefs::kGoogleServicesUsername,
479eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch                                  "test_user@gmail.com");
480a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  SigninManagerFactory::GetForProfile(profile_.get())->Initialize(
48190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      profile_.get(), NULL);
482a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  CreateSyncService();
483f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  sync_->SetSyncSetupCompleted();
484f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  SetUpSyncBackendHost();
4855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DataTypeManagerMock* data_type_manager = SetUpDataTypeManager();
4865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DataTypeManager::ConfigureStatus status = DataTypeManager::ABORTED;
4875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  syncer::SyncError error(
488eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      FROM_HERE,
489eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      syncer::SyncError::DATATYPE_ERROR,
490eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      "Association failed.",
491eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      syncer::BOOKMARKS);
492868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  std::map<syncer::ModelType, syncer::SyncError> errors;
493868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  errors[syncer::BOOKMARKS] = error;
4945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DataTypeManager::ConfigureResult result(
4955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      status,
4965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      syncer::ModelTypeSet(),
4975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      errors,
498868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      syncer::ModelTypeSet(),
4995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      syncer::ModelTypeSet());
5005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(*data_type_manager, Configure(_, _)).
5015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      WillRepeatedly(
5022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          DoAll(InvokeOnConfigureStart(sync_),
5032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                InvokeOnConfigureDone(sync_, result)));
5045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(*data_type_manager, state()).
5055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      WillOnce(Return(DataTypeManager::STOPPED));
5065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(observer_, OnStateChanged()).Times(AnyNumber());
50768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  IssueTestTokens();
5082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  sync_->Initialize();
5092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_TRUE(sync_->HasUnrecoverableError());
5105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
5115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ProfileSyncServiceStartupTest, StartDownloadFailed) {
513a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  // Pre load the tokens
514eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  profile_->GetPrefs()->SetString(prefs::kGoogleServicesUsername,
515eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch                                  "test_user@gmail.com");
516a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  SigninManagerFactory::GetForProfile(profile_.get())->Initialize(
51790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      profile_.get(), NULL);
518a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  CreateSyncService();
519f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  SyncBackendHostMock* mock_sbh = SetUpSyncBackendHost();
520f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  mock_sbh->set_fail_initial_download(true);
521a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)
5225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  profile_->GetPrefs()->ClearPref(prefs::kSyncHasSetupCompleted);
5235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(observer_, OnStateChanged()).Times(AnyNumber());
52568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  IssueTestTokens();
5265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5277d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  sync_->SetSetupInProgress(true);
5282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  sync_->Initialize();
5297d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  sync_->SetSetupInProgress(false);
5302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_FALSE(sync_->sync_initialized());
5315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
532