OLD | NEW |
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 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 | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "chrome/browser/themes/theme_syncable_service.h" | 5 #include "chrome/browser/themes/theme_syncable_service.h" |
6 | 6 |
7 #include "base/command_line.h" | 7 #include "base/command_line.h" |
8 #include "base/compiler_specific.h" | 8 #include "base/compiler_specific.h" |
9 #include "base/files/file_path.h" | 9 #include "base/files/file_path.h" |
10 #include "base/memory/scoped_ptr.h" | 10 #include "base/memory/scoped_ptr.h" |
11 #include "base/time/time.h" | 11 #include "base/time/time.h" |
12 #include "chrome/browser/extensions/extension_service.h" | 12 #include "chrome/browser/extensions/extension_service.h" |
13 #include "chrome/browser/extensions/test_extension_system.h" | 13 #include "chrome/browser/extensions/test_extension_system.h" |
14 #include "chrome/browser/profiles/profile.h" | 14 #include "chrome/browser/profiles/profile.h" |
15 #include "chrome/browser/themes/theme_service.h" | 15 #include "chrome/browser/themes/theme_service.h" |
16 #include "chrome/browser/themes/theme_service_factory.h" | 16 #include "chrome/browser/themes/theme_service_factory.h" |
17 #include "chrome/common/extensions/extension_messages.h" | 17 #include "chrome/common/extensions/extension_messages.h" |
18 #include "chrome/common/extensions/manifest_url_handler.h" | 18 #include "chrome/common/extensions/manifest_url_handler.h" |
19 #include "chrome/test/base/testing_profile.h" | 19 #include "chrome/test/base/testing_profile.h" |
20 #include "content/public/test/test_browser_thread.h" | 20 #include "content/public/test/test_browser_thread.h" |
21 #include "extensions/common/extension.h" | 21 #include "extensions/common/extension.h" |
22 #include "extensions/common/manifest_constants.h" | 22 #include "extensions/common/manifest_constants.h" |
23 #include "extensions/common/permissions/api_permission_set.h" | 23 #include "extensions/common/permissions/api_permission_set.h" |
24 #include "extensions/common/permissions/permission_set.h" | 24 #include "extensions/common/permissions/permission_set.h" |
| 25 #include "sync/api/fake_sync_change_processor.h" |
| 26 #include "sync/api/sync_change_processor_wrapper_for_test.h" |
25 #include "sync/api/sync_error.h" | 27 #include "sync/api/sync_error.h" |
26 #include "sync/api/sync_error_factory_mock.h" | 28 #include "sync/api/sync_error_factory_mock.h" |
27 #include "sync/protocol/sync.pb.h" | 29 #include "sync/protocol/sync.pb.h" |
28 #include "sync/protocol/theme_specifics.pb.h" | 30 #include "sync/protocol/theme_specifics.pb.h" |
29 #include "testing/gtest/include/gtest/gtest.h" | 31 #include "testing/gtest/include/gtest/gtest.h" |
30 | 32 |
31 #if defined(OS_CHROMEOS) | 33 #if defined(OS_CHROMEOS) |
32 #include "chrome/browser/chromeos/login/user_manager.h" | 34 #include "chrome/browser/chromeos/login/user_manager.h" |
33 #include "chrome/browser/chromeos/settings/cros_settings.h" | 35 #include "chrome/browser/chromeos/settings/cros_settings.h" |
34 #include "chrome/browser/chromeos/settings/device_settings_service.h" | 36 #include "chrome/browser/chromeos/settings/device_settings_service.h" |
35 #endif | 37 #endif |
36 | 38 |
37 using std::string; | 39 using std::string; |
38 | 40 |
39 namespace { | 41 namespace { |
40 | 42 |
41 static const char kCustomThemeName[] = "name"; | 43 static const char kCustomThemeName[] = "name"; |
42 static const char kCustomThemeUrl[] = "http://update.url/foo"; | 44 static const char kCustomThemeUrl[] = "http://update.url/foo"; |
43 | 45 |
44 #if defined(OS_WIN) | 46 #if defined(OS_WIN) |
45 const base::FilePath::CharType kExtensionFilePath[] = | 47 const base::FilePath::CharType kExtensionFilePath[] = |
46 FILE_PATH_LITERAL("c:\\foo"); | 48 FILE_PATH_LITERAL("c:\\foo"); |
47 #elif defined(OS_POSIX) | 49 #elif defined(OS_POSIX) |
48 const base::FilePath::CharType kExtensionFilePath[] = FILE_PATH_LITERAL("/oo"); | 50 const base::FilePath::CharType kExtensionFilePath[] = FILE_PATH_LITERAL("/oo"); |
49 #endif | 51 #endif |
50 | 52 |
51 class FakeSyncChangeProcessor : public syncer::SyncChangeProcessor { | |
52 public: | |
53 FakeSyncChangeProcessor() : change_output_(NULL) {} | |
54 | |
55 // syncer::SyncChangeProcessor implementation. | |
56 virtual syncer::SyncError ProcessSyncChanges( | |
57 const tracked_objects::Location& from_here, | |
58 const syncer::SyncChangeList& change_list) OVERRIDE { | |
59 change_output_->insert(change_output_->end(), change_list.begin(), | |
60 change_list.end()); | |
61 return syncer::SyncError(); | |
62 } | |
63 | |
64 virtual syncer::SyncDataList GetAllSyncData(syncer::ModelType type) const | |
65 OVERRIDE { | |
66 return syncer::SyncDataList(); | |
67 } | |
68 | |
69 void SetChangeOutput(syncer::SyncChangeList *change_output) { | |
70 change_output_ = change_output; | |
71 } | |
72 | |
73 private: | |
74 syncer::SyncChangeList *change_output_; | |
75 }; | |
76 | |
77 class FakeThemeService : public ThemeService { | 53 class FakeThemeService : public ThemeService { |
78 public: | 54 public: |
79 FakeThemeService() : | 55 FakeThemeService() : |
80 using_native_theme_(false), | 56 using_native_theme_(false), |
81 using_default_theme_(false), | 57 using_default_theme_(false), |
82 theme_extension_(NULL), | 58 theme_extension_(NULL), |
83 is_dirty_(false) {} | 59 is_dirty_(false) {} |
84 | 60 |
85 // ThemeService implementation | 61 // ThemeService implementation |
86 virtual void SetTheme(const extensions::Extension* extension) OVERRIDE { | 62 virtual void SetTheme(const extensions::Extension* extension) OVERRIDE { |
(...skipping 85 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
172 file_thread_(content::BrowserThread::FILE, &loop_), | 148 file_thread_(content::BrowserThread::FILE, &loop_), |
173 fake_theme_service_(NULL) {} | 149 fake_theme_service_(NULL) {} |
174 | 150 |
175 virtual ~ThemeSyncableServiceTest() {} | 151 virtual ~ThemeSyncableServiceTest() {} |
176 | 152 |
177 virtual void SetUp() { | 153 virtual void SetUp() { |
178 profile_.reset(new TestingProfile); | 154 profile_.reset(new TestingProfile); |
179 fake_theme_service_ = BuildForProfile(profile_.get()); | 155 fake_theme_service_ = BuildForProfile(profile_.get()); |
180 theme_sync_service_.reset(new ThemeSyncableService(profile_.get(), | 156 theme_sync_service_.reset(new ThemeSyncableService(profile_.get(), |
181 fake_theme_service_)); | 157 fake_theme_service_)); |
182 fake_change_processor_.reset(new FakeSyncChangeProcessor); | 158 fake_change_processor_.reset(new syncer::FakeSyncChangeProcessor); |
183 SetUpExtension(); | 159 SetUpExtension(); |
184 } | 160 } |
185 | 161 |
186 virtual void TearDown() { | 162 virtual void TearDown() { |
187 profile_.reset(); | 163 profile_.reset(); |
188 loop_.RunUntilIdle(); | 164 loop_.RunUntilIdle(); |
189 } | 165 } |
190 | 166 |
191 void SetUpExtension() { | 167 void SetUpExtension() { |
192 CommandLine command_line(CommandLine::NO_PROGRAM); | 168 CommandLine command_line(CommandLine::NO_PROGRAM); |
(...skipping 55 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
248 #if defined OS_CHROMEOS | 224 #if defined OS_CHROMEOS |
249 chromeos::ScopedTestDeviceSettingsService test_device_settings_service_; | 225 chromeos::ScopedTestDeviceSettingsService test_device_settings_service_; |
250 chromeos::ScopedTestCrosSettings test_cros_settings_; | 226 chromeos::ScopedTestCrosSettings test_cros_settings_; |
251 chromeos::ScopedTestUserManager test_user_manager_; | 227 chromeos::ScopedTestUserManager test_user_manager_; |
252 #endif | 228 #endif |
253 | 229 |
254 scoped_ptr<TestingProfile> profile_; | 230 scoped_ptr<TestingProfile> profile_; |
255 FakeThemeService* fake_theme_service_; | 231 FakeThemeService* fake_theme_service_; |
256 scoped_refptr<extensions::Extension> theme_extension_; | 232 scoped_refptr<extensions::Extension> theme_extension_; |
257 scoped_ptr<ThemeSyncableService> theme_sync_service_; | 233 scoped_ptr<ThemeSyncableService> theme_sync_service_; |
258 scoped_ptr<syncer::SyncChangeProcessor> fake_change_processor_; | 234 scoped_ptr<syncer::FakeSyncChangeProcessor> fake_change_processor_; |
259 }; | 235 }; |
260 | 236 |
261 class PolicyInstalledThemeTest : public ThemeSyncableServiceTest { | 237 class PolicyInstalledThemeTest : public ThemeSyncableServiceTest { |
262 virtual extensions::Manifest::Location GetThemeLocation() OVERRIDE { | 238 virtual extensions::Manifest::Location GetThemeLocation() OVERRIDE { |
263 return extensions::Manifest::EXTERNAL_POLICY_DOWNLOAD; | 239 return extensions::Manifest::EXTERNAL_POLICY_DOWNLOAD; |
264 } | 240 } |
265 }; | 241 }; |
266 | 242 |
267 TEST_F(ThemeSyncableServiceTest, AreThemeSpecificsEqual) { | 243 TEST_F(ThemeSyncableServiceTest, AreThemeSpecificsEqual) { |
268 sync_pb::ThemeSpecifics a, b; | 244 sync_pb::ThemeSpecifics a, b; |
(...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
310 | 286 |
311 b.set_use_system_theme_by_default(true); | 287 b.set_use_system_theme_by_default(true); |
312 EXPECT_TRUE(ThemeSyncableService::AreThemeSpecificsEqual(a, b, false)); | 288 EXPECT_TRUE(ThemeSyncableService::AreThemeSpecificsEqual(a, b, false)); |
313 EXPECT_TRUE(ThemeSyncableService::AreThemeSpecificsEqual(a, b, true)); | 289 EXPECT_TRUE(ThemeSyncableService::AreThemeSpecificsEqual(a, b, true)); |
314 } | 290 } |
315 | 291 |
316 TEST_F(ThemeSyncableServiceTest, SetCurrentThemeDefaultTheme) { | 292 TEST_F(ThemeSyncableServiceTest, SetCurrentThemeDefaultTheme) { |
317 // Set up theme service to use custom theme. | 293 // Set up theme service to use custom theme. |
318 fake_theme_service_->SetTheme(theme_extension_.get()); | 294 fake_theme_service_->SetTheme(theme_extension_.get()); |
319 | 295 |
320 syncer::SyncError error = theme_sync_service_->MergeDataAndStartSyncing( | 296 syncer::SyncError error = |
321 syncer::THEMES, MakeThemeDataList(sync_pb::ThemeSpecifics()), | 297 theme_sync_service_ |
322 fake_change_processor_.Pass(), | 298 ->MergeDataAndStartSyncing( |
323 scoped_ptr<syncer::SyncErrorFactory>(new syncer::SyncErrorFactoryMock())). | 299 syncer::THEMES, |
324 error(); | 300 MakeThemeDataList(sync_pb::ThemeSpecifics()), |
| 301 scoped_ptr<syncer::SyncChangeProcessor>( |
| 302 new syncer::SyncChangeProcessorWrapperForTest( |
| 303 fake_change_processor_.get())), |
| 304 scoped_ptr<syncer::SyncErrorFactory>( |
| 305 new syncer::SyncErrorFactoryMock())) |
| 306 .error(); |
325 EXPECT_FALSE(error.IsSet()) << error.message(); | 307 EXPECT_FALSE(error.IsSet()) << error.message(); |
326 EXPECT_TRUE(fake_theme_service_->UsingDefaultTheme()); | 308 EXPECT_TRUE(fake_theme_service_->UsingDefaultTheme()); |
327 } | 309 } |
328 | 310 |
329 TEST_F(ThemeSyncableServiceTest, SetCurrentThemeSystemTheme) { | 311 TEST_F(ThemeSyncableServiceTest, SetCurrentThemeSystemTheme) { |
330 sync_pb::ThemeSpecifics theme_specifics; | 312 sync_pb::ThemeSpecifics theme_specifics; |
331 theme_specifics.set_use_system_theme_by_default(true); | 313 theme_specifics.set_use_system_theme_by_default(true); |
332 | 314 |
333 // Set up theme service to use custom theme. | 315 // Set up theme service to use custom theme. |
334 fake_theme_service_->SetTheme(theme_extension_.get()); | 316 fake_theme_service_->SetTheme(theme_extension_.get()); |
335 syncer::SyncError error = theme_sync_service_->MergeDataAndStartSyncing( | 317 syncer::SyncError error = |
336 syncer::THEMES, MakeThemeDataList(theme_specifics), | 318 theme_sync_service_ |
337 fake_change_processor_.Pass(), | 319 ->MergeDataAndStartSyncing( |
338 scoped_ptr<syncer::SyncErrorFactory>(new syncer::SyncErrorFactoryMock())). | 320 syncer::THEMES, |
339 error(); | 321 MakeThemeDataList(theme_specifics), |
| 322 scoped_ptr<syncer::SyncChangeProcessor>( |
| 323 new syncer::SyncChangeProcessorWrapperForTest( |
| 324 fake_change_processor_.get())), |
| 325 scoped_ptr<syncer::SyncErrorFactory>( |
| 326 new syncer::SyncErrorFactoryMock())) |
| 327 .error(); |
340 EXPECT_FALSE(error.IsSet()) << error.message(); | 328 EXPECT_FALSE(error.IsSet()) << error.message(); |
341 EXPECT_TRUE(fake_theme_service_->UsingNativeTheme()); | 329 EXPECT_TRUE(fake_theme_service_->UsingNativeTheme()); |
342 } | 330 } |
343 | 331 |
344 TEST_F(ThemeSyncableServiceTest, SetCurrentThemeCustomTheme) { | 332 TEST_F(ThemeSyncableServiceTest, SetCurrentThemeCustomTheme) { |
345 sync_pb::ThemeSpecifics theme_specifics; | 333 sync_pb::ThemeSpecifics theme_specifics; |
346 theme_specifics.set_use_custom_theme(true); | 334 theme_specifics.set_use_custom_theme(true); |
347 theme_specifics.set_custom_theme_id(theme_extension_->id()); | 335 theme_specifics.set_custom_theme_id(theme_extension_->id()); |
348 theme_specifics.set_custom_theme_name(kCustomThemeName); | 336 theme_specifics.set_custom_theme_name(kCustomThemeName); |
349 theme_specifics.set_custom_theme_name(kCustomThemeUrl); | 337 theme_specifics.set_custom_theme_name(kCustomThemeUrl); |
350 | 338 |
351 // Set up theme service to use default theme. | 339 // Set up theme service to use default theme. |
352 fake_theme_service_->UseDefaultTheme(); | 340 fake_theme_service_->UseDefaultTheme(); |
353 syncer::SyncError error = theme_sync_service_->MergeDataAndStartSyncing( | 341 syncer::SyncError error = |
354 syncer::THEMES, MakeThemeDataList(theme_specifics), | 342 theme_sync_service_ |
355 fake_change_processor_.Pass(), | 343 ->MergeDataAndStartSyncing( |
356 scoped_ptr<syncer::SyncErrorFactory>(new syncer::SyncErrorFactoryMock())). | 344 syncer::THEMES, |
357 error(); | 345 MakeThemeDataList(theme_specifics), |
| 346 scoped_ptr<syncer::SyncChangeProcessor>( |
| 347 new syncer::SyncChangeProcessorWrapperForTest( |
| 348 fake_change_processor_.get())), |
| 349 scoped_ptr<syncer::SyncErrorFactory>( |
| 350 new syncer::SyncErrorFactoryMock())) |
| 351 .error(); |
358 EXPECT_FALSE(error.IsSet()) << error.message(); | 352 EXPECT_FALSE(error.IsSet()) << error.message(); |
359 EXPECT_EQ(fake_theme_service_->theme_extension(), theme_extension_.get()); | 353 EXPECT_EQ(fake_theme_service_->theme_extension(), theme_extension_.get()); |
360 } | 354 } |
361 | 355 |
362 TEST_F(ThemeSyncableServiceTest, DontResetThemeWhenSpecificsAreEqual) { | 356 TEST_F(ThemeSyncableServiceTest, DontResetThemeWhenSpecificsAreEqual) { |
363 // Set up theme service to use default theme and expect no changes. | 357 // Set up theme service to use default theme and expect no changes. |
364 fake_theme_service_->UseDefaultTheme(); | 358 fake_theme_service_->UseDefaultTheme(); |
365 fake_theme_service_->MarkClean(); | 359 fake_theme_service_->MarkClean(); |
366 syncer::SyncError error = theme_sync_service_->MergeDataAndStartSyncing( | 360 syncer::SyncError error = |
367 syncer::THEMES, MakeThemeDataList(sync_pb::ThemeSpecifics()), | 361 theme_sync_service_ |
368 fake_change_processor_.Pass(), | 362 ->MergeDataAndStartSyncing( |
369 scoped_ptr<syncer::SyncErrorFactory>(new syncer::SyncErrorFactoryMock())). | 363 syncer::THEMES, |
370 error(); | 364 MakeThemeDataList(sync_pb::ThemeSpecifics()), |
| 365 scoped_ptr<syncer::SyncChangeProcessor>( |
| 366 new syncer::SyncChangeProcessorWrapperForTest( |
| 367 fake_change_processor_.get())), |
| 368 scoped_ptr<syncer::SyncErrorFactory>( |
| 369 new syncer::SyncErrorFactoryMock())) |
| 370 .error(); |
371 EXPECT_FALSE(error.IsSet()) << error.message(); | 371 EXPECT_FALSE(error.IsSet()) << error.message(); |
372 EXPECT_FALSE(fake_theme_service_->is_dirty()); | 372 EXPECT_FALSE(fake_theme_service_->is_dirty()); |
373 } | 373 } |
374 | 374 |
375 TEST_F(ThemeSyncableServiceTest, UpdateThemeSpecificsFromCurrentTheme) { | 375 TEST_F(ThemeSyncableServiceTest, UpdateThemeSpecificsFromCurrentTheme) { |
376 // Set up theme service to use custom theme. | 376 // Set up theme service to use custom theme. |
377 fake_theme_service_->SetTheme(theme_extension_.get()); | 377 fake_theme_service_->SetTheme(theme_extension_.get()); |
378 | 378 |
379 syncer::SyncChangeList change_list; | 379 syncer::SyncError error = |
380 static_cast<FakeSyncChangeProcessor*>(fake_change_processor_.get())-> | 380 theme_sync_service_ |
381 SetChangeOutput(&change_list); | 381 ->MergeDataAndStartSyncing( |
382 | 382 syncer::THEMES, |
383 syncer::SyncError error = theme_sync_service_->MergeDataAndStartSyncing( | 383 syncer::SyncDataList(), |
384 syncer::THEMES, syncer::SyncDataList(), fake_change_processor_.Pass(), | 384 scoped_ptr<syncer::SyncChangeProcessor>( |
385 scoped_ptr<syncer::SyncErrorFactory>(new syncer::SyncErrorFactoryMock())). | 385 new syncer::SyncChangeProcessorWrapperForTest( |
386 error(); | 386 fake_change_processor_.get())), |
| 387 scoped_ptr<syncer::SyncErrorFactory>( |
| 388 new syncer::SyncErrorFactoryMock())) |
| 389 .error(); |
387 EXPECT_FALSE(error.IsSet()) << error.message(); | 390 EXPECT_FALSE(error.IsSet()) << error.message(); |
388 | 391 const syncer::SyncChangeList& changes = fake_change_processor_->changes(); |
389 ASSERT_EQ(1u, change_list.size()); | 392 ASSERT_EQ(1u, changes.size()); |
390 EXPECT_TRUE(change_list[0].IsValid()); | 393 EXPECT_TRUE(changes[0].IsValid()); |
391 EXPECT_EQ(syncer::SyncChange::ACTION_ADD, change_list[0].change_type()); | 394 EXPECT_EQ(syncer::SyncChange::ACTION_ADD, changes[0].change_type()); |
392 EXPECT_EQ(syncer::THEMES, change_list[0].sync_data().GetDataType()); | 395 EXPECT_EQ(syncer::THEMES, changes[0].sync_data().GetDataType()); |
393 | 396 |
394 const sync_pb::ThemeSpecifics& theme_specifics = | 397 const sync_pb::ThemeSpecifics& theme_specifics = |
395 change_list[0].sync_data().GetSpecifics().theme(); | 398 changes[0].sync_data().GetSpecifics().theme(); |
396 EXPECT_TRUE(theme_specifics.use_custom_theme()); | 399 EXPECT_TRUE(theme_specifics.use_custom_theme()); |
397 EXPECT_EQ(theme_extension_->id(), theme_specifics.custom_theme_id()); | 400 EXPECT_EQ(theme_extension_->id(), theme_specifics.custom_theme_id()); |
398 EXPECT_EQ(theme_extension_->name(), theme_specifics.custom_theme_name()); | 401 EXPECT_EQ(theme_extension_->name(), theme_specifics.custom_theme_name()); |
399 EXPECT_EQ( | 402 EXPECT_EQ( |
400 extensions::ManifestURL::GetUpdateURL(theme_extension_.get()).spec(), | 403 extensions::ManifestURL::GetUpdateURL(theme_extension_.get()).spec(), |
401 theme_specifics.custom_theme_update_url()); | 404 theme_specifics.custom_theme_update_url()); |
402 } | 405 } |
403 | 406 |
404 TEST_F(ThemeSyncableServiceTest, GetAllSyncData) { | 407 TEST_F(ThemeSyncableServiceTest, GetAllSyncData) { |
405 // Set up theme service to use custom theme. | 408 // Set up theme service to use custom theme. |
(...skipping 12 matching lines...) Expand all Loading... |
418 extensions::ManifestURL::GetUpdateURL(theme_extension_.get()).spec(), | 421 extensions::ManifestURL::GetUpdateURL(theme_extension_.get()).spec(), |
419 theme_specifics.custom_theme_update_url()); | 422 theme_specifics.custom_theme_update_url()); |
420 } | 423 } |
421 | 424 |
422 TEST_F(ThemeSyncableServiceTest, ProcessSyncThemeChange) { | 425 TEST_F(ThemeSyncableServiceTest, ProcessSyncThemeChange) { |
423 // Set up theme service to use default theme. | 426 // Set up theme service to use default theme. |
424 fake_theme_service_->UseDefaultTheme(); | 427 fake_theme_service_->UseDefaultTheme(); |
425 fake_theme_service_->MarkClean(); | 428 fake_theme_service_->MarkClean(); |
426 | 429 |
427 // Start syncing. | 430 // Start syncing. |
428 syncer::SyncError error = theme_sync_service_->MergeDataAndStartSyncing( | 431 syncer::SyncError error = |
429 syncer::THEMES, MakeThemeDataList(sync_pb::ThemeSpecifics()), | 432 theme_sync_service_ |
430 fake_change_processor_.Pass(), | 433 ->MergeDataAndStartSyncing( |
431 scoped_ptr<syncer::SyncErrorFactory>(new syncer::SyncErrorFactoryMock())). | 434 syncer::THEMES, |
432 error(); | 435 MakeThemeDataList(sync_pb::ThemeSpecifics()), |
| 436 scoped_ptr<syncer::SyncChangeProcessor>( |
| 437 new syncer::SyncChangeProcessorWrapperForTest( |
| 438 fake_change_processor_.get())), |
| 439 scoped_ptr<syncer::SyncErrorFactory>( |
| 440 new syncer::SyncErrorFactoryMock())) |
| 441 .error(); |
433 EXPECT_FALSE(error.IsSet()) << error.message(); | 442 EXPECT_FALSE(error.IsSet()) << error.message(); |
434 // Don't expect theme change initially because specifics are equal. | 443 // Don't expect theme change initially because specifics are equal. |
435 EXPECT_FALSE(fake_theme_service_->is_dirty()); | 444 EXPECT_FALSE(fake_theme_service_->is_dirty()); |
436 | 445 |
437 // Change specifics to use custom theme and update. | 446 // Change specifics to use custom theme and update. |
438 sync_pb::ThemeSpecifics theme_specifics; | 447 sync_pb::ThemeSpecifics theme_specifics; |
439 theme_specifics.set_use_custom_theme(true); | 448 theme_specifics.set_use_custom_theme(true); |
440 theme_specifics.set_custom_theme_id(theme_extension_->id()); | 449 theme_specifics.set_custom_theme_id(theme_extension_->id()); |
441 theme_specifics.set_custom_theme_name(kCustomThemeName); | 450 theme_specifics.set_custom_theme_name(kCustomThemeName); |
442 theme_specifics.set_custom_theme_name(kCustomThemeUrl); | 451 theme_specifics.set_custom_theme_name(kCustomThemeUrl); |
443 sync_pb::EntitySpecifics entity_specifics; | 452 sync_pb::EntitySpecifics entity_specifics; |
444 entity_specifics.mutable_theme()->CopyFrom(theme_specifics); | 453 entity_specifics.mutable_theme()->CopyFrom(theme_specifics); |
445 syncer::SyncChangeList change_list; | 454 syncer::SyncChangeList change_list; |
446 change_list.push_back(syncer::SyncChange( | 455 change_list.push_back(syncer::SyncChange( |
447 FROM_HERE, | 456 FROM_HERE, |
448 syncer::SyncChange::ACTION_UPDATE, | 457 syncer::SyncChange::ACTION_UPDATE, |
449 syncer::SyncData::CreateRemoteData( | 458 syncer::SyncData::CreateRemoteData( |
450 1, entity_specifics, base::Time()))); | 459 1, entity_specifics, base::Time()))); |
451 error = theme_sync_service_->ProcessSyncChanges(FROM_HERE, change_list); | 460 error = theme_sync_service_->ProcessSyncChanges(FROM_HERE, change_list); |
452 EXPECT_FALSE(error.IsSet()) << error.message(); | 461 EXPECT_FALSE(error.IsSet()) << error.message(); |
453 EXPECT_EQ(fake_theme_service_->theme_extension(), theme_extension_.get()); | 462 EXPECT_EQ(fake_theme_service_->theme_extension(), theme_extension_.get()); |
454 } | 463 } |
455 | 464 |
456 TEST_F(ThemeSyncableServiceTest, OnThemeChangeByUser) { | 465 TEST_F(ThemeSyncableServiceTest, OnThemeChangeByUser) { |
457 syncer::SyncChangeList change_list; | |
458 static_cast<FakeSyncChangeProcessor*>(fake_change_processor_.get())-> | |
459 SetChangeOutput(&change_list); | |
460 | |
461 // Set up theme service to use default theme. | 466 // Set up theme service to use default theme. |
462 fake_theme_service_->UseDefaultTheme(); | 467 fake_theme_service_->UseDefaultTheme(); |
463 | 468 |
464 // Start syncing. | 469 // Start syncing. |
465 syncer::SyncError error = theme_sync_service_->MergeDataAndStartSyncing( | 470 syncer::SyncError error = |
466 syncer::THEMES, MakeThemeDataList(sync_pb::ThemeSpecifics()), | 471 theme_sync_service_ |
467 fake_change_processor_.Pass(), | 472 ->MergeDataAndStartSyncing( |
468 scoped_ptr<syncer::SyncErrorFactory>(new syncer::SyncErrorFactoryMock())). | 473 syncer::THEMES, |
469 error(); | 474 MakeThemeDataList(sync_pb::ThemeSpecifics()), |
| 475 scoped_ptr<syncer::SyncChangeProcessor>( |
| 476 new syncer::SyncChangeProcessorWrapperForTest( |
| 477 fake_change_processor_.get())), |
| 478 scoped_ptr<syncer::SyncErrorFactory>( |
| 479 new syncer::SyncErrorFactoryMock())) |
| 480 .error(); |
470 EXPECT_FALSE(error.IsSet()) << error.message(); | 481 EXPECT_FALSE(error.IsSet()) << error.message(); |
471 EXPECT_EQ(0u, change_list.size()); | 482 const syncer::SyncChangeList& changes = fake_change_processor_->changes(); |
| 483 EXPECT_EQ(0u, changes.size()); |
472 | 484 |
473 // Change current theme to custom theme and notify theme_sync_service_. | 485 // Change current theme to custom theme and notify theme_sync_service_. |
474 fake_theme_service_->SetTheme(theme_extension_.get()); | 486 fake_theme_service_->SetTheme(theme_extension_.get()); |
475 theme_sync_service_->OnThemeChange(); | 487 theme_sync_service_->OnThemeChange(); |
476 EXPECT_EQ(1u, change_list.size()); | 488 EXPECT_EQ(1u, changes.size()); |
477 const sync_pb::ThemeSpecifics& change_specifics = | 489 const sync_pb::ThemeSpecifics& change_specifics = |
478 change_list[0].sync_data().GetSpecifics().theme(); | 490 changes[0].sync_data().GetSpecifics().theme(); |
479 EXPECT_TRUE(change_specifics.use_custom_theme()); | 491 EXPECT_TRUE(change_specifics.use_custom_theme()); |
480 EXPECT_EQ(theme_extension_->id(), change_specifics.custom_theme_id()); | 492 EXPECT_EQ(theme_extension_->id(), change_specifics.custom_theme_id()); |
481 EXPECT_EQ(theme_extension_->name(), change_specifics.custom_theme_name()); | 493 EXPECT_EQ(theme_extension_->name(), change_specifics.custom_theme_name()); |
482 EXPECT_EQ( | 494 EXPECT_EQ( |
483 extensions::ManifestURL::GetUpdateURL(theme_extension_.get()).spec(), | 495 extensions::ManifestURL::GetUpdateURL(theme_extension_.get()).spec(), |
484 change_specifics.custom_theme_update_url()); | 496 change_specifics.custom_theme_update_url()); |
485 } | 497 } |
486 | 498 |
487 TEST_F(ThemeSyncableServiceTest, StopSync) { | 499 TEST_F(ThemeSyncableServiceTest, StopSync) { |
488 syncer::SyncChangeList change_list; | |
489 static_cast<FakeSyncChangeProcessor*>(fake_change_processor_.get())-> | |
490 SetChangeOutput(&change_list); | |
491 | |
492 // Set up theme service to use default theme. | 500 // Set up theme service to use default theme. |
493 fake_theme_service_->UseDefaultTheme(); | 501 fake_theme_service_->UseDefaultTheme(); |
494 | 502 |
495 // Start syncing. | 503 // Start syncing. |
496 syncer::SyncError error = theme_sync_service_->MergeDataAndStartSyncing( | 504 syncer::SyncError error = |
497 syncer::THEMES, MakeThemeDataList(sync_pb::ThemeSpecifics()), | 505 theme_sync_service_ |
498 fake_change_processor_.Pass(), | 506 ->MergeDataAndStartSyncing( |
499 scoped_ptr<syncer::SyncErrorFactory>(new syncer::SyncErrorFactoryMock())). | 507 syncer::THEMES, |
500 error(); | 508 MakeThemeDataList(sync_pb::ThemeSpecifics()), |
| 509 scoped_ptr<syncer::SyncChangeProcessor>( |
| 510 new syncer::SyncChangeProcessorWrapperForTest( |
| 511 fake_change_processor_.get())), |
| 512 scoped_ptr<syncer::SyncErrorFactory>( |
| 513 new syncer::SyncErrorFactoryMock())) |
| 514 .error(); |
501 EXPECT_FALSE(error.IsSet()) << error.message(); | 515 EXPECT_FALSE(error.IsSet()) << error.message(); |
502 EXPECT_EQ(0u, change_list.size()); | 516 const syncer::SyncChangeList& changes = fake_change_processor_->changes(); |
| 517 EXPECT_EQ(0u, changes.size()); |
503 | 518 |
504 // Stop syncing. | 519 // Stop syncing. |
505 theme_sync_service_->StopSyncing(syncer::THEMES); | 520 theme_sync_service_->StopSyncing(syncer::THEMES); |
506 | 521 |
507 // Change current theme to custom theme and notify theme_sync_service_. | 522 // Change current theme to custom theme and notify theme_sync_service_. |
508 // No change is output because sync has stopped. | 523 // No change is output because sync has stopped. |
509 fake_theme_service_->SetTheme(theme_extension_.get()); | 524 fake_theme_service_->SetTheme(theme_extension_.get()); |
510 theme_sync_service_->OnThemeChange(); | 525 theme_sync_service_->OnThemeChange(); |
511 EXPECT_EQ(0u, change_list.size()); | 526 EXPECT_EQ(0u, changes.size()); |
512 | 527 |
513 // ProcessSyncChanges() should return error when sync has stopped. | 528 // ProcessSyncChanges() should return error when sync has stopped. |
514 error = theme_sync_service_->ProcessSyncChanges(FROM_HERE, change_list); | 529 error = theme_sync_service_->ProcessSyncChanges(FROM_HERE, changes); |
515 EXPECT_TRUE(error.IsSet()); | 530 EXPECT_TRUE(error.IsSet()); |
516 EXPECT_EQ(syncer::THEMES, error.model_type()); | 531 EXPECT_EQ(syncer::THEMES, error.model_type()); |
517 EXPECT_EQ("datatype error was encountered: Theme syncable service is not " | 532 EXPECT_EQ("datatype error was encountered: Theme syncable service is not " |
518 "started.", | 533 "started.", |
519 error.message()); | 534 error.message()); |
520 } | 535 } |
521 | 536 |
522 TEST_F(ThemeSyncableServiceTest, RestoreSystemThemeBitWhenChangeToCustomTheme) { | 537 TEST_F(ThemeSyncableServiceTest, RestoreSystemThemeBitWhenChangeToCustomTheme) { |
523 syncer::SyncChangeList change_list; | |
524 static_cast<FakeSyncChangeProcessor*>(fake_change_processor_.get())-> | |
525 SetChangeOutput(&change_list); | |
526 | |
527 // Initialize to use system theme. | 538 // Initialize to use system theme. |
528 fake_theme_service_->UseDefaultTheme(); | 539 fake_theme_service_->UseDefaultTheme(); |
529 sync_pb::ThemeSpecifics theme_specifics; | 540 sync_pb::ThemeSpecifics theme_specifics; |
530 theme_specifics.set_use_system_theme_by_default(true); | 541 theme_specifics.set_use_system_theme_by_default(true); |
531 syncer::SyncError error = theme_sync_service_->MergeDataAndStartSyncing( | 542 syncer::SyncError error = |
532 syncer::THEMES, MakeThemeDataList(theme_specifics), | 543 theme_sync_service_ |
533 fake_change_processor_.Pass(), | 544 ->MergeDataAndStartSyncing( |
534 scoped_ptr<syncer::SyncErrorFactory>(new syncer::SyncErrorFactoryMock())). | 545 syncer::THEMES, |
535 error(); | 546 MakeThemeDataList(theme_specifics), |
| 547 scoped_ptr<syncer::SyncChangeProcessor>( |
| 548 new syncer::SyncChangeProcessorWrapperForTest( |
| 549 fake_change_processor_.get())), |
| 550 scoped_ptr<syncer::SyncErrorFactory>( |
| 551 new syncer::SyncErrorFactoryMock())) |
| 552 .error(); |
536 | 553 |
537 // Change to custom theme and notify theme_sync_service_. | 554 // Change to custom theme and notify theme_sync_service_. |
538 // use_system_theme_by_default bit should be preserved. | 555 // use_system_theme_by_default bit should be preserved. |
539 fake_theme_service_->SetTheme(theme_extension_.get()); | 556 fake_theme_service_->SetTheme(theme_extension_.get()); |
540 theme_sync_service_->OnThemeChange(); | 557 theme_sync_service_->OnThemeChange(); |
541 EXPECT_EQ(1u, change_list.size()); | 558 const syncer::SyncChangeList& changes = fake_change_processor_->changes(); |
| 559 EXPECT_EQ(1u, changes.size()); |
542 const sync_pb::ThemeSpecifics& change_specifics = | 560 const sync_pb::ThemeSpecifics& change_specifics = |
543 change_list[0].sync_data().GetSpecifics().theme(); | 561 changes[0].sync_data().GetSpecifics().theme(); |
544 EXPECT_TRUE(change_specifics.use_system_theme_by_default()); | 562 EXPECT_TRUE(change_specifics.use_system_theme_by_default()); |
545 } | 563 } |
546 | 564 |
547 #if defined(TOOLKIT_GTK) | 565 #if defined(TOOLKIT_GTK) |
548 TEST_F(ThemeSyncableServiceTest, | 566 TEST_F(ThemeSyncableServiceTest, |
549 GtkUpdateSystemThemeBitWhenChangeBetweenSystemAndDefault) { | 567 GtkUpdateSystemThemeBitWhenChangeBetweenSystemAndDefault) { |
550 syncer::SyncChangeList change_list; | |
551 static_cast<FakeSyncChangeProcessor*>(fake_change_processor_.get())-> | |
552 SetChangeOutput(&change_list); | |
553 | |
554 // Initialize to use native theme. | 568 // Initialize to use native theme. |
555 fake_theme_service_->SetNativeTheme(); | 569 fake_theme_service_->SetNativeTheme(); |
556 fake_theme_service_->MarkClean(); | 570 fake_theme_service_->MarkClean(); |
557 sync_pb::ThemeSpecifics theme_specifics; | 571 sync_pb::ThemeSpecifics theme_specifics; |
558 theme_specifics.set_use_system_theme_by_default(true); | 572 theme_specifics.set_use_system_theme_by_default(true); |
559 syncer::SyncError error = theme_sync_service_->MergeDataAndStartSyncing( | 573 syncer::SyncError error = |
560 syncer::THEMES, MakeThemeDataList(theme_specifics), | 574 theme_sync_service_ |
561 fake_change_processor_.Pass(), | 575 ->MergeDataAndStartSyncing( |
562 scoped_ptr<syncer::SyncErrorFactory>(new syncer::SyncErrorFactoryMock())). | 576 syncer::THEMES, |
563 error(); | 577 MakeThemeDataList(theme_specifics), |
| 578 scoped_ptr<syncer::SyncChangeProcessor>( |
| 579 new syncer::SyncChangeProcessorWrapperForTest( |
| 580 fake_change_processor_.get())), |
| 581 scoped_ptr<syncer::SyncErrorFactory>( |
| 582 new syncer::SyncErrorFactoryMock())) |
| 583 .error(); |
564 EXPECT_FALSE(fake_theme_service_->is_dirty()); | 584 EXPECT_FALSE(fake_theme_service_->is_dirty()); |
565 | 585 |
566 // Change to default theme and notify theme_sync_service_. | 586 // Change to default theme and notify theme_sync_service_. |
567 // use_system_theme_by_default bit should be false. | 587 // use_system_theme_by_default bit should be false. |
568 fake_theme_service_->UseDefaultTheme(); | 588 fake_theme_service_->UseDefaultTheme(); |
569 theme_sync_service_->OnThemeChange(); | 589 theme_sync_service_->OnThemeChange(); |
570 EXPECT_EQ(1u, change_list.size()); | 590 syncer::SyncChangeList& changes = fake_change_processor_->changes(); |
571 EXPECT_FALSE(change_list[0].sync_data().GetSpecifics().theme() | 591 EXPECT_EQ(1u, changes.size()); |
572 .use_system_theme_by_default()); | 592 EXPECT_FALSE(changes[0] |
| 593 .sync_data() |
| 594 .GetSpecifics() |
| 595 .theme() |
| 596 .use_system_theme_by_default()); |
573 | 597 |
574 // Change to native theme and notify theme_sync_service_. | 598 // Change to native theme and notify theme_sync_service_. |
575 // use_system_theme_by_default bit should be true. | 599 // use_system_theme_by_default bit should be true. |
576 change_list.clear(); | 600 changes.clear(); |
577 fake_theme_service_->SetNativeTheme(); | 601 fake_theme_service_->SetNativeTheme(); |
578 theme_sync_service_->OnThemeChange(); | 602 theme_sync_service_->OnThemeChange(); |
579 EXPECT_EQ(1u, change_list.size()); | 603 EXPECT_EQ(1u, changes.size()); |
580 EXPECT_TRUE(change_list[0].sync_data().GetSpecifics().theme() | 604 EXPECT_TRUE(changes[0] |
581 .use_system_theme_by_default()); | 605 .sync_data() |
| 606 .GetSpecifics() |
| 607 .theme() |
| 608 .use_system_theme_by_default()); |
582 } | 609 } |
583 #endif | 610 #endif |
584 | 611 |
585 #ifndef TOOLKIT_GTK | 612 #ifndef TOOLKIT_GTK |
586 TEST_F(ThemeSyncableServiceTest, | 613 TEST_F(ThemeSyncableServiceTest, |
587 NonGtkPreserveSystemThemeBitWhenChangeToDefaultTheme) { | 614 NonGtkPreserveSystemThemeBitWhenChangeToDefaultTheme) { |
588 syncer::SyncChangeList change_list; | |
589 static_cast<FakeSyncChangeProcessor*>(fake_change_processor_.get())-> | |
590 SetChangeOutput(&change_list); | |
591 | |
592 // Set up theme service to use default theme. | 615 // Set up theme service to use default theme. |
593 fake_theme_service_->UseDefaultTheme(); | 616 fake_theme_service_->UseDefaultTheme(); |
594 | 617 |
595 // Initialize to use custom theme with use_system_theme_by_default set true. | 618 // Initialize to use custom theme with use_system_theme_by_default set true. |
596 sync_pb::ThemeSpecifics theme_specifics; | 619 sync_pb::ThemeSpecifics theme_specifics; |
597 theme_specifics.set_use_custom_theme(true); | 620 theme_specifics.set_use_custom_theme(true); |
598 theme_specifics.set_custom_theme_id(theme_extension_->id()); | 621 theme_specifics.set_custom_theme_id(theme_extension_->id()); |
599 theme_specifics.set_custom_theme_name(kCustomThemeName); | 622 theme_specifics.set_custom_theme_name(kCustomThemeName); |
600 theme_specifics.set_custom_theme_name(kCustomThemeUrl); | 623 theme_specifics.set_custom_theme_name(kCustomThemeUrl); |
601 theme_specifics.set_use_system_theme_by_default(true); | 624 theme_specifics.set_use_system_theme_by_default(true); |
602 syncer::SyncError error = theme_sync_service_->MergeDataAndStartSyncing( | 625 syncer::SyncError error = |
603 syncer::THEMES, MakeThemeDataList(theme_specifics), | 626 theme_sync_service_ |
604 fake_change_processor_.Pass(), | 627 ->MergeDataAndStartSyncing( |
605 scoped_ptr<syncer::SyncErrorFactory>(new syncer::SyncErrorFactoryMock())). | 628 syncer::THEMES, |
606 error(); | 629 MakeThemeDataList(theme_specifics), |
| 630 scoped_ptr<syncer::SyncChangeProcessor>( |
| 631 new syncer::SyncChangeProcessorWrapperForTest( |
| 632 fake_change_processor_.get())), |
| 633 scoped_ptr<syncer::SyncErrorFactory>( |
| 634 new syncer::SyncErrorFactoryMock())) |
| 635 .error(); |
607 EXPECT_EQ(fake_theme_service_->theme_extension(), theme_extension_.get()); | 636 EXPECT_EQ(fake_theme_service_->theme_extension(), theme_extension_.get()); |
608 | 637 |
609 // Change to default theme and notify theme_sync_service_. | 638 // Change to default theme and notify theme_sync_service_. |
610 // use_system_theme_by_default bit should be preserved. | 639 // use_system_theme_by_default bit should be preserved. |
611 fake_theme_service_->UseDefaultTheme(); | 640 fake_theme_service_->UseDefaultTheme(); |
612 theme_sync_service_->OnThemeChange(); | 641 theme_sync_service_->OnThemeChange(); |
613 EXPECT_EQ(1u, change_list.size()); | 642 const syncer::SyncChangeList& changes = fake_change_processor_->changes(); |
| 643 EXPECT_EQ(1u, changes.size()); |
614 const sync_pb::ThemeSpecifics& change_specifics = | 644 const sync_pb::ThemeSpecifics& change_specifics = |
615 change_list[0].sync_data().GetSpecifics().theme(); | 645 changes[0].sync_data().GetSpecifics().theme(); |
616 EXPECT_FALSE(change_specifics.use_custom_theme()); | 646 EXPECT_FALSE(change_specifics.use_custom_theme()); |
617 EXPECT_TRUE(change_specifics.use_system_theme_by_default()); | 647 EXPECT_TRUE(change_specifics.use_system_theme_by_default()); |
618 } | 648 } |
619 #endif | 649 #endif |
620 | 650 |
621 TEST_F(PolicyInstalledThemeTest, InstallThemeByPolicy) { | 651 TEST_F(PolicyInstalledThemeTest, InstallThemeByPolicy) { |
622 // Set up theme service to use custom theme that was installed by policy. | 652 // Set up theme service to use custom theme that was installed by policy. |
623 fake_theme_service_->SetTheme(theme_extension_.get()); | 653 fake_theme_service_->SetTheme(theme_extension_.get()); |
624 | 654 |
625 syncer::SyncDataList data_list = | 655 syncer::SyncDataList data_list = |
626 theme_sync_service_->GetAllSyncData(syncer::THEMES); | 656 theme_sync_service_->GetAllSyncData(syncer::THEMES); |
627 | 657 |
628 ASSERT_EQ(0u, data_list.size()); | 658 ASSERT_EQ(0u, data_list.size()); |
629 } | 659 } |
OLD | NEW |