test_profile_sync_service.cc revision a1401311d1ab56c4ed0a474bd38c108f75cb0cd9
1// Copyright (c) 2012 The Chromium Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
5#include "chrome/browser/sync/test_profile_sync_service.h"
6
7#include "chrome/browser/chrome_notification_types.h"
8#include "chrome/browser/managed_mode/managed_user_signin_manager_wrapper.h"
9#include "chrome/browser/signin/profile_oauth2_token_service_factory.h"
10#include "chrome/browser/signin/signin_manager.h"
11#include "chrome/browser/signin/signin_manager_factory.h"
12#include "chrome/browser/sync/glue/sync_backend_host.h"
13#include "chrome/browser/sync/glue/sync_backend_host_core.h"
14#include "chrome/browser/sync/profile_sync_components_factory.h"
15#include "chrome/browser/sync/profile_sync_components_factory_mock.h"
16#include "chrome/browser/sync/profile_sync_service_factory.h"
17#include "chrome/browser/sync/test/test_http_bridge_factory.h"
18#include "sync/internal_api/public/test/sync_manager_factory_for_profile_sync_test.h"
19#include "sync/internal_api/public/test/test_internal_components_factory.h"
20#include "sync/internal_api/public/user_share.h"
21#include "sync/js/js_reply_handler.h"
22#include "sync/protocol/encryption.pb.h"
23#include "testing/gmock/include/gmock/gmock.h"
24
25using syncer::InternalComponentsFactory;
26using syncer::TestInternalComponentsFactory;
27using syncer::UserShare;
28
29namespace browser_sync {
30
31SyncBackendHostForProfileSyncTest::SyncBackendHostForProfileSyncTest(
32    Profile* profile,
33    const base::WeakPtr<SyncPrefs>& sync_prefs,
34    base::Closure callback)
35    : browser_sync::SyncBackendHostImpl(
36        profile->GetDebugName(), profile, sync_prefs),
37    callback_(callback) {}
38
39SyncBackendHostForProfileSyncTest::~SyncBackendHostForProfileSyncTest() {}
40
41void SyncBackendHostForProfileSyncTest::InitCore(
42    scoped_ptr<DoInitializeOptions> options) {
43  options->http_bridge_factory =
44      scoped_ptr<syncer::HttpPostProviderFactory>(
45          new browser_sync::TestHttpBridgeFactory());
46  options->sync_manager_factory.reset(
47      new syncer::SyncManagerFactoryForProfileSyncTest(callback_));
48  options->credentials.email = "testuser@gmail.com";
49  options->credentials.sync_token = "token";
50  options->restored_key_for_bootstrapping = "";
51
52  // It'd be nice if we avoided creating the InternalComponentsFactory in the
53  // first place, but SyncBackendHost will have created one by now so we must
54  // free it. Grab the switches to pass on first.
55  InternalComponentsFactory::Switches factory_switches =
56      options->internal_components_factory->GetSwitches();
57  options->internal_components_factory.reset(
58      new TestInternalComponentsFactory(factory_switches,
59                                        syncer::STORAGE_IN_MEMORY));
60
61  SyncBackendHostImpl::InitCore(options.Pass());
62}
63
64void SyncBackendHostForProfileSyncTest::RequestConfigureSyncer(
65    syncer::ConfigureReason reason,
66    syncer::ModelTypeSet to_download,
67    syncer::ModelTypeSet to_purge,
68    syncer::ModelTypeSet to_journal,
69    syncer::ModelTypeSet to_unapply,
70    syncer::ModelTypeSet to_ignore,
71    const syncer::ModelSafeRoutingInfo& routing_info,
72    const base::Callback<void(syncer::ModelTypeSet,
73                              syncer::ModelTypeSet)>& ready_task,
74    const base::Closure& retry_callback) {
75  syncer::ModelTypeSet failed_configuration_types;
76
77  // The first parameter there should be the set of enabled types.  That's not
78  // something we have access to from this strange test harness.  We'll just
79  // send back the list of newly configured types instead and hope it doesn't
80  // break anything.
81  FinishConfigureDataTypesOnFrontendLoop(
82      syncer::Difference(to_download, failed_configuration_types),
83      syncer::Difference(to_download, failed_configuration_types),
84      failed_configuration_types,
85      ready_task);
86}
87
88}  // namespace browser_sync
89
90syncer::TestIdFactory* TestProfileSyncService::id_factory() {
91  return &id_factory_;
92}
93
94syncer::WeakHandle<syncer::JsEventHandler>
95TestProfileSyncService::GetJsEventHandler() {
96  return syncer::WeakHandle<syncer::JsEventHandler>();
97}
98
99TestProfileSyncService::TestProfileSyncService(
100    ProfileSyncComponentsFactory* factory,
101    Profile* profile,
102    SigninManagerBase* signin,
103    ProfileOAuth2TokenService* oauth2_token_service,
104    browser_sync::ProfileSyncServiceStartBehavior behavior)
105        : ProfileSyncService(factory,
106                             profile,
107                             new ManagedUserSigninManagerWrapper(signin),
108                             oauth2_token_service,
109                             behavior) {
110  SetSyncSetupCompleted();
111}
112
113TestProfileSyncService::~TestProfileSyncService() {
114}
115
116// static
117KeyedService* TestProfileSyncService::TestFactoryFunction(
118    content::BrowserContext* context) {
119  Profile* profile = static_cast<Profile*>(context);
120  SigninManagerBase* signin =
121      SigninManagerFactory::GetForProfile(profile);
122  ProfileOAuth2TokenService* oauth2_token_service =
123      ProfileOAuth2TokenServiceFactory::GetForProfile(profile);
124  ProfileSyncComponentsFactoryMock* factory =
125      new ProfileSyncComponentsFactoryMock();
126  return new TestProfileSyncService(factory,
127                                    profile,
128                                    signin,
129                                    oauth2_token_service,
130                                    browser_sync::AUTO_START);
131}
132
133// static
134TestProfileSyncService* TestProfileSyncService::BuildAutoStartAsyncInit(
135    Profile* profile, base::Closure callback) {
136  TestProfileSyncService* sync_service = static_cast<TestProfileSyncService*>(
137        ProfileSyncServiceFactory::GetInstance()->SetTestingFactoryAndUse(
138            profile, &TestProfileSyncService::TestFactoryFunction));
139  ProfileSyncComponentsFactoryMock* components =
140      sync_service->components_factory_mock();
141  // TODO(tim): Convert to a fake instead of mock.
142  EXPECT_CALL(*components,
143              CreateSyncBackendHost(testing::_,testing::_, testing::_)).
144      WillOnce(testing::Return(
145          new browser_sync::SyncBackendHostForProfileSyncTest(
146              profile,
147              sync_service->sync_prefs_.AsWeakPtr(),
148              callback)));
149  return sync_service;
150}
151
152ProfileSyncComponentsFactoryMock*
153TestProfileSyncService::components_factory_mock() {
154  // We always create a mock factory, see Build* routines.
155  return static_cast<ProfileSyncComponentsFactoryMock*>(factory());
156}
157
158void TestProfileSyncService::OnConfigureDone(
159    const browser_sync::DataTypeManager::ConfigureResult& result) {
160  ProfileSyncService::OnConfigureDone(result);
161  base::MessageLoop::current()->Quit();
162}
163
164UserShare* TestProfileSyncService::GetUserShare() const {
165  return backend_->GetUserShare();
166}
167