Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(60)

Side by Side Diff: components/browser_sync/browser/profile_sync_service_startup_unittest.cc

Issue 2345843003: [Sync] Merge //components/browser_sync into one directory. (Closed)
Patch Set: Address comment + rebase. Created 4 years, 3 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
(Empty)
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 <memory>
6 #include <utility>
7
8 #include "base/files/file_util.h"
9 #include "base/strings/utf_string_conversions.h"
10 #include "base/threading/thread_task_runner_handle.h"
11 #include "build/build_config.h"
12 #include "components/browser_sync/browser/profile_sync_service.h"
13 #include "components/browser_sync/browser/profile_sync_test_util.h"
14 #include "components/prefs/pref_service.h"
15 #include "components/signin/core/browser/account_tracker_service.h"
16 #include "components/signin/core/browser/fake_profile_oauth2_token_service.h"
17 #include "components/signin/core/browser/profile_oauth2_token_service.h"
18 #include "components/signin/core/browser/signin_manager.h"
19 #include "components/signin/core/common/signin_pref_names.h"
20 #include "components/sync/driver/data_type_manager.h"
21 #include "components/sync/driver/data_type_manager_mock.h"
22 #include "components/sync/driver/fake_data_type_controller.h"
23 #include "components/sync/driver/glue/sync_backend_host_mock.h"
24 #include "components/sync/driver/pref_names.h"
25 #include "components/sync/driver/sync_api_component_factory_mock.h"
26 #include "components/sync/driver/sync_prefs.h"
27 #include "components/sync/driver/sync_service_observer.h"
28 #include "components/syncable_prefs/pref_service_syncable.h"
29 #include "google_apis/gaia/gaia_auth_consumer.h"
30 #include "google_apis/gaia/gaia_constants.h"
31 #include "google_apis/gaia/oauth2_token_service.h"
32 #include "net/url_request/url_request_test_util.h"
33 #include "testing/gmock/include/gmock/gmock.h"
34 #include "testing/gtest/include/gtest/gtest.h"
35
36 using browser_sync::SyncBackendHostMock;
37 using sync_driver::DataTypeManager;
38 using sync_driver::DataTypeManagerMock;
39 using testing::_;
40 using testing::AnyNumber;
41 using testing::DoAll;
42 using testing::Mock;
43 using testing::Return;
44
45 namespace {
46
47 const char kGaiaId[] = "12345";
48 const char kEmail[] = "test_user@gmail.com";
49 const char kDummyPassword[] = "";
50
51 class SyncServiceObserverMock : public sync_driver::SyncServiceObserver {
52 public:
53 SyncServiceObserverMock();
54 virtual ~SyncServiceObserverMock();
55
56 MOCK_METHOD0(OnStateChanged, void());
57 };
58
59 SyncServiceObserverMock::SyncServiceObserverMock() {}
60
61 SyncServiceObserverMock::~SyncServiceObserverMock() {}
62
63 } // namespace
64
65 ACTION_P(InvokeOnConfigureStart, sync_service) {
66 sync_service->OnConfigureStart();
67 }
68
69 ACTION_P3(InvokeOnConfigureDone, sync_service, error_callback, result) {
70 DataTypeManager::ConfigureResult configure_result =
71 static_cast<DataTypeManager::ConfigureResult>(result);
72 if (result.status == sync_driver::DataTypeManager::ABORTED)
73 error_callback.Run(&configure_result);
74 sync_service->OnConfigureDone(configure_result);
75 }
76
77 class ProfileSyncServiceStartupTest : public testing::Test {
78 public:
79 ProfileSyncServiceStartupTest() {
80 profile_sync_service_bundle_.auth_service()
81 ->set_auto_post_fetch_response_on_message_loop(true);
82 }
83
84 ~ProfileSyncServiceStartupTest() override {
85 sync_service_->RemoveObserver(&observer_);
86 sync_service_->Shutdown();
87 }
88
89 void CreateSyncService(
90 ProfileSyncService::StartBehavior start_behavior) {
91 component_factory_ = profile_sync_service_bundle_.component_factory();
92 browser_sync::ProfileSyncServiceBundle::SyncClientBuilder builder(
93 &profile_sync_service_bundle_);
94 ProfileSyncService::InitParams init_params =
95 profile_sync_service_bundle_.CreateBasicInitParams(start_behavior,
96 builder.Build());
97
98 sync_service_.reset(new ProfileSyncService(std::move(init_params)));
99 sync_service_->RegisterDataTypeController(
100 base::MakeUnique<sync_driver::FakeDataTypeController>(
101 syncer::BOOKMARKS));
102 sync_service_->AddObserver(&observer_);
103 }
104
105 void IssueTestTokens(const std::string& account_id) {
106 profile_sync_service_bundle_.auth_service()->UpdateCredentials(
107 account_id, "oauth2_login_token");
108 }
109
110 void SetError(DataTypeManager::ConfigureResult* result) {
111 sync_driver::DataTypeStatusTable::TypeErrorMap errors;
112 errors[syncer::BOOKMARKS] =
113 syncer::SyncError(FROM_HERE,
114 syncer::SyncError::UNRECOVERABLE_ERROR,
115 "Error",
116 syncer::BOOKMARKS);
117 result->data_type_status_table.UpdateFailedDataTypes(errors);
118 }
119
120 protected:
121 std::string SimulateTestUserSignin(ProfileSyncService* sync_service) {
122 std::string account_id =
123 profile_sync_service_bundle_.account_tracker()->SeedAccountInfo(kGaiaId,
124 kEmail);
125 pref_service()->SetString(prefs::kGoogleServicesAccountId, account_id);
126 #if !defined(OS_CHROMEOS)
127 profile_sync_service_bundle_.signin_manager()->SignIn(kGaiaId, kEmail,
128 kDummyPassword);
129 #else
130 profile_sync_service_bundle_.signin_manager()->SetAuthenticatedAccountInfo(
131 kGaiaId, kEmail);
132 if (sync_service)
133 sync_service->GoogleSigninSucceeded(account_id, kEmail, kDummyPassword);
134 #endif
135 return account_id;
136 }
137
138 DataTypeManagerMock* SetUpDataTypeManager() {
139 DataTypeManagerMock* data_type_manager = new DataTypeManagerMock();
140 EXPECT_CALL(*component_factory_, CreateDataTypeManager(_, _, _, _, _))
141 .WillOnce(Return(data_type_manager));
142 return data_type_manager;
143 }
144
145 browser_sync::SyncBackendHostMock* SetUpSyncBackendHost() {
146 browser_sync::SyncBackendHostMock* sync_backend_host =
147 new browser_sync::SyncBackendHostMock();
148 EXPECT_CALL(*component_factory_, CreateSyncBackendHost(_, _, _, _))
149 .WillOnce(Return(sync_backend_host));
150 return sync_backend_host;
151 }
152
153 PrefService* pref_service() {
154 return profile_sync_service_bundle_.pref_service();
155 }
156
157 base::MessageLoop message_loop_;
158 browser_sync::ProfileSyncServiceBundle profile_sync_service_bundle_;
159 std::unique_ptr<ProfileSyncService> sync_service_;
160 SyncServiceObserverMock observer_;
161 sync_driver::DataTypeStatusTable data_type_status_table_;
162 SyncApiComponentFactoryMock* component_factory_ = nullptr;
163 };
164
165 class ProfileSyncServiceStartupCrosTest : public ProfileSyncServiceStartupTest {
166 public:
167 ProfileSyncServiceStartupCrosTest() {
168 CreateSyncService(ProfileSyncService::AUTO_START);
169 SimulateTestUserSignin(nullptr);
170 EXPECT_TRUE(
171 profile_sync_service_bundle_.signin_manager()->IsAuthenticated());
172 }
173 };
174
175 TEST_F(ProfileSyncServiceStartupTest, StartFirstTime) {
176 // We've never completed startup.
177 pref_service()->ClearPref(sync_driver::prefs::kSyncFirstSetupComplete);
178 CreateSyncService(ProfileSyncService::MANUAL_START);
179 SetUpSyncBackendHost();
180 DataTypeManagerMock* data_type_manager = SetUpDataTypeManager();
181 EXPECT_CALL(*data_type_manager, Configure(_, _)).Times(0);
182
183 // Should not actually start, rather just clean things up and wait
184 // to be enabled.
185 EXPECT_CALL(observer_, OnStateChanged()).Times(AnyNumber());
186 sync_service_->Initialize();
187
188 // Preferences should be back to defaults.
189 EXPECT_EQ(0,
190 pref_service()->GetInt64(sync_driver::prefs::kSyncLastSyncedTime));
191 EXPECT_FALSE(
192 pref_service()->GetBoolean(sync_driver::prefs::kSyncFirstSetupComplete));
193 Mock::VerifyAndClearExpectations(data_type_manager);
194
195 // Then start things up.
196 EXPECT_CALL(*data_type_manager, Configure(_, _)).Times(1);
197 EXPECT_CALL(*data_type_manager, state()).
198 WillOnce(Return(DataTypeManager::CONFIGURED)).
199 WillOnce(Return(DataTypeManager::CONFIGURED));
200 EXPECT_CALL(*data_type_manager, Stop()).Times(1);
201 EXPECT_CALL(observer_, OnStateChanged()).Times(AnyNumber());
202
203 auto sync_blocker = sync_service_->GetSetupInProgressHandle();
204
205 // Simulate successful signin as test_user.
206 std::string account_id = SimulateTestUserSignin(sync_service_.get());
207 // Create some tokens in the token service.
208 IssueTestTokens(account_id);
209
210 // Simulate the UI telling sync it has finished setting up.
211 sync_blocker.reset();
212 sync_service_->SetFirstSetupComplete();
213 EXPECT_TRUE(sync_service_->IsSyncActive());
214 }
215
216 // TODO(pavely): Reenable test once android is switched to oauth2.
217 TEST_F(ProfileSyncServiceStartupTest, DISABLED_StartNoCredentials) {
218 // We've never completed startup.
219 pref_service()->ClearPref(sync_driver::prefs::kSyncFirstSetupComplete);
220 CreateSyncService(ProfileSyncService::MANUAL_START);
221
222 // Should not actually start, rather just clean things up and wait
223 // to be enabled.
224 EXPECT_CALL(*component_factory_, CreateDataTypeManager(_, _, _, _, _))
225 .Times(0);
226 EXPECT_CALL(observer_, OnStateChanged()).Times(AnyNumber());
227 sync_service_->Initialize();
228
229 // Preferences should be back to defaults.
230 EXPECT_EQ(0,
231 pref_service()->GetInt64(sync_driver::prefs::kSyncLastSyncedTime));
232 EXPECT_FALSE(
233 pref_service()->GetBoolean(sync_driver::prefs::kSyncFirstSetupComplete));
234
235 // Then start things up.
236 auto sync_blocker = sync_service_->GetSetupInProgressHandle();
237
238 // Simulate successful signin as test_user.
239 std::string account_id = SimulateTestUserSignin(sync_service_.get());
240
241 profile_sync_service_bundle_.auth_service()->LoadCredentials(account_id);
242
243 sync_blocker.reset();
244 // ProfileSyncService should try to start by requesting access token.
245 // This request should fail as login token was not issued.
246 EXPECT_FALSE(sync_service_->IsSyncActive());
247 EXPECT_EQ(GoogleServiceAuthError::USER_NOT_SIGNED_UP,
248 sync_service_->GetAuthError().state());
249 }
250
251 // TODO(pavely): Reenable test once android is switched to oauth2.
252 TEST_F(ProfileSyncServiceStartupTest, DISABLED_StartInvalidCredentials) {
253 CreateSyncService(ProfileSyncService::MANUAL_START);
254 std::string account_id = SimulateTestUserSignin(sync_service_.get());
255 SyncBackendHostMock* mock_sbh = SetUpSyncBackendHost();
256
257 // Tell the backend to stall while downloading control types (simulating an
258 // auth error).
259 mock_sbh->set_fail_initial_download(true);
260
261 DataTypeManagerMock* data_type_manager = SetUpDataTypeManager();
262 EXPECT_CALL(*data_type_manager, Configure(_, _)).Times(0);
263
264 EXPECT_CALL(observer_, OnStateChanged()).Times(AnyNumber());
265 sync_service_->Initialize();
266 EXPECT_FALSE(sync_service_->IsSyncActive());
267 Mock::VerifyAndClearExpectations(data_type_manager);
268
269 // Update the credentials, unstalling the backend.
270 EXPECT_CALL(*data_type_manager, Configure(_, _));
271 EXPECT_CALL(*data_type_manager, state()).
272 WillRepeatedly(Return(DataTypeManager::CONFIGURED));
273 EXPECT_CALL(*data_type_manager, Stop()).Times(1);
274 EXPECT_CALL(observer_, OnStateChanged()).Times(AnyNumber());
275 auto sync_blocker = sync_service_->GetSetupInProgressHandle();
276
277 // Simulate successful signin.
278 SimulateTestUserSignin(sync_service_.get());
279
280 sync_blocker.reset();
281
282 // Verify we successfully finish startup and configuration.
283 EXPECT_TRUE(sync_service_->IsSyncActive());
284 }
285
286 TEST_F(ProfileSyncServiceStartupCrosTest, StartCrosNoCredentials) {
287 EXPECT_CALL(*component_factory_, CreateDataTypeManager(_, _, _, _, _))
288 .Times(0);
289 EXPECT_CALL(*component_factory_, CreateSyncBackendHost(_, _, _, _)).Times(0);
290 pref_service()->ClearPref(sync_driver::prefs::kSyncFirstSetupComplete);
291 EXPECT_CALL(observer_, OnStateChanged()).Times(AnyNumber());
292
293 sync_service_->Initialize();
294 // Sync should not start because there are no tokens yet.
295 EXPECT_FALSE(sync_service_->IsSyncActive());
296 sync_service_->SetFirstSetupComplete();
297
298 // Sync should not start because there are still no tokens.
299 EXPECT_FALSE(sync_service_->IsSyncActive());
300 }
301
302 TEST_F(ProfileSyncServiceStartupCrosTest, StartFirstTime) {
303 SetUpSyncBackendHost();
304 DataTypeManagerMock* data_type_manager = SetUpDataTypeManager();
305 pref_service()->ClearPref(sync_driver::prefs::kSyncFirstSetupComplete);
306 EXPECT_CALL(*data_type_manager, Configure(_, _));
307 EXPECT_CALL(*data_type_manager, state()).
308 WillRepeatedly(Return(DataTypeManager::CONFIGURED));
309 EXPECT_CALL(*data_type_manager, Stop());
310 EXPECT_CALL(observer_, OnStateChanged()).Times(AnyNumber());
311
312 IssueTestTokens(
313 profile_sync_service_bundle_.account_tracker()->PickAccountIdForAccount(
314 "12345", kEmail));
315 sync_service_->Initialize();
316 EXPECT_TRUE(sync_service_->IsSyncActive());
317 }
318
319 TEST_F(ProfileSyncServiceStartupTest, StartNormal) {
320 // Pre load the tokens
321 CreateSyncService(ProfileSyncService::MANUAL_START);
322 std::string account_id = SimulateTestUserSignin(sync_service_.get());
323 sync_service_->SetFirstSetupComplete();
324 SetUpSyncBackendHost();
325 DataTypeManagerMock* data_type_manager = SetUpDataTypeManager();
326 EXPECT_CALL(*data_type_manager, Configure(_, _));
327 EXPECT_CALL(*data_type_manager, state()).
328 WillRepeatedly(Return(DataTypeManager::CONFIGURED));
329 EXPECT_CALL(*data_type_manager, Stop()).Times(1);
330 EXPECT_CALL(observer_, OnStateChanged()).Times(AnyNumber());
331
332 IssueTestTokens(account_id);
333
334 sync_service_->Initialize();
335 }
336
337 // Test that we can recover from a case where a bug in the code resulted in
338 // OnUserChoseDatatypes not being properly called and datatype preferences
339 // therefore being left unset.
340 TEST_F(ProfileSyncServiceStartupTest, StartRecoverDatatypePrefs) {
341 // Clear the datatype preference fields (simulating bug 154940).
342 pref_service()->ClearPref(sync_driver::prefs::kSyncKeepEverythingSynced);
343 syncer::ModelTypeSet user_types = syncer::UserTypes();
344 for (syncer::ModelTypeSet::Iterator iter = user_types.First();
345 iter.Good(); iter.Inc()) {
346 pref_service()->ClearPref(
347 sync_driver::SyncPrefs::GetPrefNameForDataType(iter.Get()));
348 }
349
350 // Pre load the tokens
351 CreateSyncService(ProfileSyncService::MANUAL_START);
352 std::string account_id = SimulateTestUserSignin(sync_service_.get());
353 sync_service_->SetFirstSetupComplete();
354 SetUpSyncBackendHost();
355 DataTypeManagerMock* data_type_manager = SetUpDataTypeManager();
356 EXPECT_CALL(*data_type_manager, Configure(_, _));
357 EXPECT_CALL(*data_type_manager, state()).
358 WillRepeatedly(Return(DataTypeManager::CONFIGURED));
359 EXPECT_CALL(*data_type_manager, Stop()).Times(1);
360 EXPECT_CALL(observer_, OnStateChanged()).Times(AnyNumber());
361
362 IssueTestTokens(account_id);
363 sync_service_->Initialize();
364
365 EXPECT_TRUE(pref_service()->GetBoolean(
366 sync_driver::prefs::kSyncKeepEverythingSynced));
367 }
368
369 // Verify that the recovery of datatype preferences doesn't overwrite a valid
370 // case where only bookmarks are enabled.
371 TEST_F(ProfileSyncServiceStartupTest, StartDontRecoverDatatypePrefs) {
372 // Explicitly set Keep Everything Synced to false and have only bookmarks
373 // enabled.
374 pref_service()->SetBoolean(sync_driver::prefs::kSyncKeepEverythingSynced,
375 false);
376
377 // Pre load the tokens
378 CreateSyncService(ProfileSyncService::MANUAL_START);
379 std::string account_id = SimulateTestUserSignin(sync_service_.get());
380 sync_service_->SetFirstSetupComplete();
381 SetUpSyncBackendHost();
382 DataTypeManagerMock* data_type_manager = SetUpDataTypeManager();
383 EXPECT_CALL(*data_type_manager, Configure(_, _));
384 EXPECT_CALL(*data_type_manager, state()).
385 WillRepeatedly(Return(DataTypeManager::CONFIGURED));
386 EXPECT_CALL(*data_type_manager, Stop()).Times(1);
387 EXPECT_CALL(observer_, OnStateChanged()).Times(AnyNumber());
388 IssueTestTokens(account_id);
389 sync_service_->Initialize();
390
391 EXPECT_FALSE(pref_service()->GetBoolean(
392 sync_driver::prefs::kSyncKeepEverythingSynced));
393 }
394
395 TEST_F(ProfileSyncServiceStartupTest, ManagedStartup) {
396 // Service should not be started by Initialize() since it's managed.
397 pref_service()->SetString(prefs::kGoogleServicesAccountId, kEmail);
398 CreateSyncService(ProfileSyncService::MANUAL_START);
399
400 // Disable sync through policy.
401 pref_service()->SetBoolean(sync_driver::prefs::kSyncManaged, true);
402 EXPECT_CALL(*component_factory_, CreateDataTypeManager(_, _, _, _, _))
403 .Times(0);
404 EXPECT_CALL(observer_, OnStateChanged()).Times(AnyNumber());
405
406 sync_service_->Initialize();
407 }
408
409 TEST_F(ProfileSyncServiceStartupTest, SwitchManaged) {
410 CreateSyncService(ProfileSyncService::MANUAL_START);
411 std::string account_id = SimulateTestUserSignin(sync_service_.get());
412 sync_service_->SetFirstSetupComplete();
413 SetUpSyncBackendHost();
414 DataTypeManagerMock* data_type_manager = SetUpDataTypeManager();
415 EXPECT_CALL(*data_type_manager, Configure(_, _));
416 EXPECT_CALL(*data_type_manager, state())
417 .WillRepeatedly(Return(DataTypeManager::CONFIGURED));
418 EXPECT_CALL(observer_, OnStateChanged()).Times(AnyNumber());
419 IssueTestTokens(account_id);
420 sync_service_->Initialize();
421 EXPECT_TRUE(sync_service_->IsBackendInitialized());
422 EXPECT_TRUE(sync_service_->IsSyncActive());
423
424 // The service should stop when switching to managed mode.
425 Mock::VerifyAndClearExpectations(data_type_manager);
426 EXPECT_CALL(*data_type_manager, state()).
427 WillOnce(Return(DataTypeManager::CONFIGURED));
428 EXPECT_CALL(*data_type_manager, Stop()).Times(1);
429 pref_service()->SetBoolean(sync_driver::prefs::kSyncManaged, true);
430 EXPECT_FALSE(sync_service_->IsBackendInitialized());
431 // Note that PSS no longer references |data_type_manager| after stopping.
432
433 // When switching back to unmanaged, the state should change but sync should
434 // not start automatically because IsFirstSetupComplete() will be false.
435 // A new DataTypeManager should not be created.
436 Mock::VerifyAndClearExpectations(data_type_manager);
437 EXPECT_CALL(*component_factory_, CreateDataTypeManager(_, _, _, _, _))
438 .Times(0);
439 pref_service()->ClearPref(sync_driver::prefs::kSyncManaged);
440 EXPECT_FALSE(sync_service_->IsBackendInitialized());
441 EXPECT_FALSE(sync_service_->IsSyncActive());
442 }
443
444 TEST_F(ProfileSyncServiceStartupTest, StartFailure) {
445 CreateSyncService(ProfileSyncService::MANUAL_START);
446 std::string account_id = SimulateTestUserSignin(sync_service_.get());
447 sync_service_->SetFirstSetupComplete();
448 SetUpSyncBackendHost();
449 DataTypeManagerMock* data_type_manager = SetUpDataTypeManager();
450 DataTypeManager::ConfigureStatus status = DataTypeManager::ABORTED;
451 DataTypeManager::ConfigureResult result(
452 status,
453 syncer::ModelTypeSet());
454 EXPECT_CALL(*data_type_manager, Configure(_, _))
455 .WillRepeatedly(
456 DoAll(InvokeOnConfigureStart(sync_service_.get()),
457 InvokeOnConfigureDone(
458 sync_service_.get(),
459 base::Bind(&ProfileSyncServiceStartupTest::SetError,
460 base::Unretained(this)),
461 result)));
462 EXPECT_CALL(*data_type_manager, state()).
463 WillOnce(Return(DataTypeManager::STOPPED));
464 EXPECT_CALL(observer_, OnStateChanged()).Times(AnyNumber());
465 IssueTestTokens(account_id);
466 sync_service_->Initialize();
467 EXPECT_TRUE(sync_service_->HasUnrecoverableError());
468 }
469
470 TEST_F(ProfileSyncServiceStartupTest, StartDownloadFailed) {
471 // Pre load the tokens
472 CreateSyncService(ProfileSyncService::MANUAL_START);
473 std::string account_id = SimulateTestUserSignin(sync_service_.get());
474 SyncBackendHostMock* mock_sbh = SetUpSyncBackendHost();
475 mock_sbh->set_fail_initial_download(true);
476
477 pref_service()->ClearPref(sync_driver::prefs::kSyncFirstSetupComplete);
478
479 EXPECT_CALL(observer_, OnStateChanged()).Times(AnyNumber());
480 sync_service_->Initialize();
481
482 auto sync_blocker = sync_service_->GetSetupInProgressHandle();
483 IssueTestTokens(account_id);
484 sync_blocker.reset();
485 EXPECT_FALSE(sync_service_->IsSyncActive());
486 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698