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_delegator.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_->MergeDataAndStartSyncing( |
322 fake_change_processor_.Pass(), | 298 syncer::THEMES, |
323 scoped_ptr<syncer::SyncErrorFactory>(new syncer::SyncErrorFactoryMock())). | 299 MakeThemeDataList(sync_pb::ThemeSpecifics()), |
324 error(); | 300 scoped_ptr<syncer::SyncChangeProcessor>( |
| 301 new syncer::SyncChangeProcessorDelegator( |
| 302 fake_change_processor_.get())), |
| 303 scoped_ptr<syncer::SyncErrorFactory>( |
| 304 new syncer::SyncErrorFactoryMock())).error(); |
325 EXPECT_FALSE(error.IsSet()) << error.message(); | 305 EXPECT_FALSE(error.IsSet()) << error.message(); |
326 EXPECT_TRUE(fake_theme_service_->UsingDefaultTheme()); | 306 EXPECT_TRUE(fake_theme_service_->UsingDefaultTheme()); |
327 } | 307 } |
328 | 308 |
329 TEST_F(ThemeSyncableServiceTest, SetCurrentThemeSystemTheme) { | 309 TEST_F(ThemeSyncableServiceTest, SetCurrentThemeSystemTheme) { |
330 sync_pb::ThemeSpecifics theme_specifics; | 310 sync_pb::ThemeSpecifics theme_specifics; |
331 theme_specifics.set_use_system_theme_by_default(true); | 311 theme_specifics.set_use_system_theme_by_default(true); |
332 | 312 |
333 // Set up theme service to use custom theme. | 313 // Set up theme service to use custom theme. |
334 fake_theme_service_->SetTheme(theme_extension_.get()); | 314 fake_theme_service_->SetTheme(theme_extension_.get()); |
335 syncer::SyncError error = theme_sync_service_->MergeDataAndStartSyncing( | 315 syncer::SyncError error = |
336 syncer::THEMES, MakeThemeDataList(theme_specifics), | 316 theme_sync_service_->MergeDataAndStartSyncing( |
337 fake_change_processor_.Pass(), | 317 syncer::THEMES, |
338 scoped_ptr<syncer::SyncErrorFactory>(new syncer::SyncErrorFactoryMock())). | 318 MakeThemeDataList(theme_specifics), |
339 error(); | 319 scoped_ptr<syncer::SyncChangeProcessor>( |
| 320 new syncer::SyncChangeProcessorDelegator( |
| 321 fake_change_processor_.get())), |
| 322 scoped_ptr<syncer::SyncErrorFactory>( |
| 323 new syncer::SyncErrorFactoryMock())).error(); |
340 EXPECT_FALSE(error.IsSet()) << error.message(); | 324 EXPECT_FALSE(error.IsSet()) << error.message(); |
341 EXPECT_TRUE(fake_theme_service_->UsingNativeTheme()); | 325 EXPECT_TRUE(fake_theme_service_->UsingNativeTheme()); |
342 } | 326 } |
343 | 327 |
344 TEST_F(ThemeSyncableServiceTest, SetCurrentThemeCustomTheme) { | 328 TEST_F(ThemeSyncableServiceTest, SetCurrentThemeCustomTheme) { |
345 sync_pb::ThemeSpecifics theme_specifics; | 329 sync_pb::ThemeSpecifics theme_specifics; |
346 theme_specifics.set_use_custom_theme(true); | 330 theme_specifics.set_use_custom_theme(true); |
347 theme_specifics.set_custom_theme_id(theme_extension_->id()); | 331 theme_specifics.set_custom_theme_id(theme_extension_->id()); |
348 theme_specifics.set_custom_theme_name(kCustomThemeName); | 332 theme_specifics.set_custom_theme_name(kCustomThemeName); |
349 theme_specifics.set_custom_theme_name(kCustomThemeUrl); | 333 theme_specifics.set_custom_theme_name(kCustomThemeUrl); |
350 | 334 |
351 // Set up theme service to use default theme. | 335 // Set up theme service to use default theme. |
352 fake_theme_service_->UseDefaultTheme(); | 336 fake_theme_service_->UseDefaultTheme(); |
353 syncer::SyncError error = theme_sync_service_->MergeDataAndStartSyncing( | 337 syncer::SyncError error = |
354 syncer::THEMES, MakeThemeDataList(theme_specifics), | 338 theme_sync_service_->MergeDataAndStartSyncing( |
355 fake_change_processor_.Pass(), | 339 syncer::THEMES, |
356 scoped_ptr<syncer::SyncErrorFactory>(new syncer::SyncErrorFactoryMock())). | 340 MakeThemeDataList(theme_specifics), |
357 error(); | 341 scoped_ptr<syncer::SyncChangeProcessor>( |
| 342 new syncer::SyncChangeProcessorDelegator( |
| 343 fake_change_processor_.get())), |
| 344 scoped_ptr<syncer::SyncErrorFactory>( |
| 345 new syncer::SyncErrorFactoryMock())).error(); |
358 EXPECT_FALSE(error.IsSet()) << error.message(); | 346 EXPECT_FALSE(error.IsSet()) << error.message(); |
359 EXPECT_EQ(fake_theme_service_->theme_extension(), theme_extension_.get()); | 347 EXPECT_EQ(fake_theme_service_->theme_extension(), theme_extension_.get()); |
360 } | 348 } |
361 | 349 |
362 TEST_F(ThemeSyncableServiceTest, DontResetThemeWhenSpecificsAreEqual) { | 350 TEST_F(ThemeSyncableServiceTest, DontResetThemeWhenSpecificsAreEqual) { |
363 // Set up theme service to use default theme and expect no changes. | 351 // Set up theme service to use default theme and expect no changes. |
364 fake_theme_service_->UseDefaultTheme(); | 352 fake_theme_service_->UseDefaultTheme(); |
365 fake_theme_service_->MarkClean(); | 353 fake_theme_service_->MarkClean(); |
366 syncer::SyncError error = theme_sync_service_->MergeDataAndStartSyncing( | 354 syncer::SyncError error = |
367 syncer::THEMES, MakeThemeDataList(sync_pb::ThemeSpecifics()), | 355 theme_sync_service_->MergeDataAndStartSyncing( |
368 fake_change_processor_.Pass(), | 356 syncer::THEMES, |
369 scoped_ptr<syncer::SyncErrorFactory>(new syncer::SyncErrorFactoryMock())). | 357 MakeThemeDataList(sync_pb::ThemeSpecifics()), |
370 error(); | 358 scoped_ptr<syncer::SyncChangeProcessor>( |
| 359 new syncer::SyncChangeProcessorDelegator( |
| 360 fake_change_processor_.get())), |
| 361 scoped_ptr<syncer::SyncErrorFactory>( |
| 362 new syncer::SyncErrorFactoryMock())).error(); |
371 EXPECT_FALSE(error.IsSet()) << error.message(); | 363 EXPECT_FALSE(error.IsSet()) << error.message(); |
372 EXPECT_FALSE(fake_theme_service_->is_dirty()); | 364 EXPECT_FALSE(fake_theme_service_->is_dirty()); |
373 } | 365 } |
374 | 366 |
375 TEST_F(ThemeSyncableServiceTest, UpdateThemeSpecificsFromCurrentTheme) { | 367 TEST_F(ThemeSyncableServiceTest, UpdateThemeSpecificsFromCurrentTheme) { |
376 // Set up theme service to use custom theme. | 368 // Set up theme service to use custom theme. |
377 fake_theme_service_->SetTheme(theme_extension_.get()); | 369 fake_theme_service_->SetTheme(theme_extension_.get()); |
378 | 370 |
379 syncer::SyncChangeList change_list; | 371 syncer::SyncError error = |
380 static_cast<FakeSyncChangeProcessor*>(fake_change_processor_.get())-> | 372 theme_sync_service_->MergeDataAndStartSyncing( |
381 SetChangeOutput(&change_list); | 373 syncer::THEMES, |
382 | 374 syncer::SyncDataList(), |
383 syncer::SyncError error = theme_sync_service_->MergeDataAndStartSyncing( | 375 scoped_ptr<syncer::SyncChangeProcessor>( |
384 syncer::THEMES, syncer::SyncDataList(), fake_change_processor_.Pass(), | 376 new syncer::SyncChangeProcessorDelegator( |
385 scoped_ptr<syncer::SyncErrorFactory>(new syncer::SyncErrorFactoryMock())). | 377 fake_change_processor_.get())), |
386 error(); | 378 scoped_ptr<syncer::SyncErrorFactory>( |
| 379 new syncer::SyncErrorFactoryMock())).error(); |
387 EXPECT_FALSE(error.IsSet()) << error.message(); | 380 EXPECT_FALSE(error.IsSet()) << error.message(); |
388 | 381 const syncer::SyncChangeList& changes = fake_change_processor_->changes(); |
389 ASSERT_EQ(1u, change_list.size()); | 382 ASSERT_EQ(1u, changes.size()); |
390 EXPECT_TRUE(change_list[0].IsValid()); | 383 EXPECT_TRUE(changes[0].IsValid()); |
391 EXPECT_EQ(syncer::SyncChange::ACTION_ADD, change_list[0].change_type()); | 384 EXPECT_EQ(syncer::SyncChange::ACTION_ADD, changes[0].change_type()); |
392 EXPECT_EQ(syncer::THEMES, change_list[0].sync_data().GetDataType()); | 385 EXPECT_EQ(syncer::THEMES, changes[0].sync_data().GetDataType()); |
393 | 386 |
394 const sync_pb::ThemeSpecifics& theme_specifics = | 387 const sync_pb::ThemeSpecifics& theme_specifics = |
395 change_list[0].sync_data().GetSpecifics().theme(); | 388 changes[0].sync_data().GetSpecifics().theme(); |
396 EXPECT_TRUE(theme_specifics.use_custom_theme()); | 389 EXPECT_TRUE(theme_specifics.use_custom_theme()); |
397 EXPECT_EQ(theme_extension_->id(), theme_specifics.custom_theme_id()); | 390 EXPECT_EQ(theme_extension_->id(), theme_specifics.custom_theme_id()); |
398 EXPECT_EQ(theme_extension_->name(), theme_specifics.custom_theme_name()); | 391 EXPECT_EQ(theme_extension_->name(), theme_specifics.custom_theme_name()); |
399 EXPECT_EQ( | 392 EXPECT_EQ( |
400 extensions::ManifestURL::GetUpdateURL(theme_extension_.get()).spec(), | 393 extensions::ManifestURL::GetUpdateURL(theme_extension_.get()).spec(), |
401 theme_specifics.custom_theme_update_url()); | 394 theme_specifics.custom_theme_update_url()); |
402 } | 395 } |
403 | 396 |
404 TEST_F(ThemeSyncableServiceTest, GetAllSyncData) { | 397 TEST_F(ThemeSyncableServiceTest, GetAllSyncData) { |
405 // Set up theme service to use custom theme. | 398 // Set up theme service to use custom theme. |
(...skipping 12 matching lines...) Expand all Loading... |
418 extensions::ManifestURL::GetUpdateURL(theme_extension_.get()).spec(), | 411 extensions::ManifestURL::GetUpdateURL(theme_extension_.get()).spec(), |
419 theme_specifics.custom_theme_update_url()); | 412 theme_specifics.custom_theme_update_url()); |
420 } | 413 } |
421 | 414 |
422 TEST_F(ThemeSyncableServiceTest, ProcessSyncThemeChange) { | 415 TEST_F(ThemeSyncableServiceTest, ProcessSyncThemeChange) { |
423 // Set up theme service to use default theme. | 416 // Set up theme service to use default theme. |
424 fake_theme_service_->UseDefaultTheme(); | 417 fake_theme_service_->UseDefaultTheme(); |
425 fake_theme_service_->MarkClean(); | 418 fake_theme_service_->MarkClean(); |
426 | 419 |
427 // Start syncing. | 420 // Start syncing. |
428 syncer::SyncError error = theme_sync_service_->MergeDataAndStartSyncing( | 421 syncer::SyncError error = |
429 syncer::THEMES, MakeThemeDataList(sync_pb::ThemeSpecifics()), | 422 theme_sync_service_->MergeDataAndStartSyncing( |
430 fake_change_processor_.Pass(), | 423 syncer::THEMES, |
431 scoped_ptr<syncer::SyncErrorFactory>(new syncer::SyncErrorFactoryMock())). | 424 MakeThemeDataList(sync_pb::ThemeSpecifics()), |
432 error(); | 425 scoped_ptr<syncer::SyncChangeProcessor>( |
| 426 new syncer::SyncChangeProcessorDelegator( |
| 427 fake_change_processor_.get())), |
| 428 scoped_ptr<syncer::SyncErrorFactory>( |
| 429 new syncer::SyncErrorFactoryMock())).error(); |
433 EXPECT_FALSE(error.IsSet()) << error.message(); | 430 EXPECT_FALSE(error.IsSet()) << error.message(); |
434 // Don't expect theme change initially because specifics are equal. | 431 // Don't expect theme change initially because specifics are equal. |
435 EXPECT_FALSE(fake_theme_service_->is_dirty()); | 432 EXPECT_FALSE(fake_theme_service_->is_dirty()); |
436 | 433 |
437 // Change specifics to use custom theme and update. | 434 // Change specifics to use custom theme and update. |
438 sync_pb::ThemeSpecifics theme_specifics; | 435 sync_pb::ThemeSpecifics theme_specifics; |
439 theme_specifics.set_use_custom_theme(true); | 436 theme_specifics.set_use_custom_theme(true); |
440 theme_specifics.set_custom_theme_id(theme_extension_->id()); | 437 theme_specifics.set_custom_theme_id(theme_extension_->id()); |
441 theme_specifics.set_custom_theme_name(kCustomThemeName); | 438 theme_specifics.set_custom_theme_name(kCustomThemeName); |
442 theme_specifics.set_custom_theme_name(kCustomThemeUrl); | 439 theme_specifics.set_custom_theme_name(kCustomThemeUrl); |
443 sync_pb::EntitySpecifics entity_specifics; | 440 sync_pb::EntitySpecifics entity_specifics; |
444 entity_specifics.mutable_theme()->CopyFrom(theme_specifics); | 441 entity_specifics.mutable_theme()->CopyFrom(theme_specifics); |
445 syncer::SyncChangeList change_list; | 442 syncer::SyncChangeList change_list; |
446 change_list.push_back(syncer::SyncChange( | 443 change_list.push_back(syncer::SyncChange( |
447 FROM_HERE, | 444 FROM_HERE, |
448 syncer::SyncChange::ACTION_UPDATE, | 445 syncer::SyncChange::ACTION_UPDATE, |
449 syncer::SyncData::CreateRemoteData( | 446 syncer::SyncData::CreateRemoteData( |
450 1, entity_specifics, base::Time()))); | 447 1, entity_specifics, base::Time()))); |
451 error = theme_sync_service_->ProcessSyncChanges(FROM_HERE, change_list); | 448 error = theme_sync_service_->ProcessSyncChanges(FROM_HERE, change_list); |
452 EXPECT_FALSE(error.IsSet()) << error.message(); | 449 EXPECT_FALSE(error.IsSet()) << error.message(); |
453 EXPECT_EQ(fake_theme_service_->theme_extension(), theme_extension_.get()); | 450 EXPECT_EQ(fake_theme_service_->theme_extension(), theme_extension_.get()); |
454 } | 451 } |
455 | 452 |
456 TEST_F(ThemeSyncableServiceTest, OnThemeChangeByUser) { | 453 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. | 454 // Set up theme service to use default theme. |
462 fake_theme_service_->UseDefaultTheme(); | 455 fake_theme_service_->UseDefaultTheme(); |
463 | 456 |
464 // Start syncing. | 457 // Start syncing. |
465 syncer::SyncError error = theme_sync_service_->MergeDataAndStartSyncing( | 458 syncer::SyncError error = |
466 syncer::THEMES, MakeThemeDataList(sync_pb::ThemeSpecifics()), | 459 theme_sync_service_->MergeDataAndStartSyncing( |
467 fake_change_processor_.Pass(), | 460 syncer::THEMES, |
468 scoped_ptr<syncer::SyncErrorFactory>(new syncer::SyncErrorFactoryMock())). | 461 MakeThemeDataList(sync_pb::ThemeSpecifics()), |
469 error(); | 462 scoped_ptr<syncer::SyncChangeProcessor>( |
| 463 new syncer::SyncChangeProcessorDelegator( |
| 464 fake_change_processor_.get())), |
| 465 scoped_ptr<syncer::SyncErrorFactory>( |
| 466 new syncer::SyncErrorFactoryMock())).error(); |
470 EXPECT_FALSE(error.IsSet()) << error.message(); | 467 EXPECT_FALSE(error.IsSet()) << error.message(); |
471 EXPECT_EQ(0u, change_list.size()); | 468 const syncer::SyncChangeList& changes = fake_change_processor_->changes(); |
| 469 EXPECT_EQ(0u, changes.size()); |
472 | 470 |
473 // Change current theme to custom theme and notify theme_sync_service_. | 471 // Change current theme to custom theme and notify theme_sync_service_. |
474 fake_theme_service_->SetTheme(theme_extension_.get()); | 472 fake_theme_service_->SetTheme(theme_extension_.get()); |
475 theme_sync_service_->OnThemeChange(); | 473 theme_sync_service_->OnThemeChange(); |
476 EXPECT_EQ(1u, change_list.size()); | 474 EXPECT_EQ(1u, changes.size()); |
477 const sync_pb::ThemeSpecifics& change_specifics = | 475 const sync_pb::ThemeSpecifics& change_specifics = |
478 change_list[0].sync_data().GetSpecifics().theme(); | 476 changes[0].sync_data().GetSpecifics().theme(); |
479 EXPECT_TRUE(change_specifics.use_custom_theme()); | 477 EXPECT_TRUE(change_specifics.use_custom_theme()); |
480 EXPECT_EQ(theme_extension_->id(), change_specifics.custom_theme_id()); | 478 EXPECT_EQ(theme_extension_->id(), change_specifics.custom_theme_id()); |
481 EXPECT_EQ(theme_extension_->name(), change_specifics.custom_theme_name()); | 479 EXPECT_EQ(theme_extension_->name(), change_specifics.custom_theme_name()); |
482 EXPECT_EQ( | 480 EXPECT_EQ( |
483 extensions::ManifestURL::GetUpdateURL(theme_extension_.get()).spec(), | 481 extensions::ManifestURL::GetUpdateURL(theme_extension_.get()).spec(), |
484 change_specifics.custom_theme_update_url()); | 482 change_specifics.custom_theme_update_url()); |
485 } | 483 } |
486 | 484 |
487 TEST_F(ThemeSyncableServiceTest, StopSync) { | 485 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. | 486 // Set up theme service to use default theme. |
493 fake_theme_service_->UseDefaultTheme(); | 487 fake_theme_service_->UseDefaultTheme(); |
494 | 488 |
495 // Start syncing. | 489 // Start syncing. |
496 syncer::SyncError error = theme_sync_service_->MergeDataAndStartSyncing( | 490 syncer::SyncError error = |
497 syncer::THEMES, MakeThemeDataList(sync_pb::ThemeSpecifics()), | 491 theme_sync_service_->MergeDataAndStartSyncing( |
498 fake_change_processor_.Pass(), | 492 syncer::THEMES, |
499 scoped_ptr<syncer::SyncErrorFactory>(new syncer::SyncErrorFactoryMock())). | 493 MakeThemeDataList(sync_pb::ThemeSpecifics()), |
500 error(); | 494 scoped_ptr<syncer::SyncChangeProcessor>( |
| 495 new syncer::SyncChangeProcessorDelegator( |
| 496 fake_change_processor_.get())), |
| 497 scoped_ptr<syncer::SyncErrorFactory>( |
| 498 new syncer::SyncErrorFactoryMock())).error(); |
501 EXPECT_FALSE(error.IsSet()) << error.message(); | 499 EXPECT_FALSE(error.IsSet()) << error.message(); |
502 EXPECT_EQ(0u, change_list.size()); | 500 const syncer::SyncChangeList& changes = fake_change_processor_->changes(); |
| 501 EXPECT_EQ(0u, changes.size()); |
503 | 502 |
504 // Stop syncing. | 503 // Stop syncing. |
505 theme_sync_service_->StopSyncing(syncer::THEMES); | 504 theme_sync_service_->StopSyncing(syncer::THEMES); |
506 | 505 |
507 // Change current theme to custom theme and notify theme_sync_service_. | 506 // Change current theme to custom theme and notify theme_sync_service_. |
508 // No change is output because sync has stopped. | 507 // No change is output because sync has stopped. |
509 fake_theme_service_->SetTheme(theme_extension_.get()); | 508 fake_theme_service_->SetTheme(theme_extension_.get()); |
510 theme_sync_service_->OnThemeChange(); | 509 theme_sync_service_->OnThemeChange(); |
511 EXPECT_EQ(0u, change_list.size()); | 510 EXPECT_EQ(0u, changes.size()); |
512 | 511 |
513 // ProcessSyncChanges() should return error when sync has stopped. | 512 // ProcessSyncChanges() should return error when sync has stopped. |
514 error = theme_sync_service_->ProcessSyncChanges(FROM_HERE, change_list); | 513 error = theme_sync_service_->ProcessSyncChanges(FROM_HERE, changes); |
515 EXPECT_TRUE(error.IsSet()); | 514 EXPECT_TRUE(error.IsSet()); |
516 EXPECT_EQ(syncer::THEMES, error.model_type()); | 515 EXPECT_EQ(syncer::THEMES, error.model_type()); |
517 EXPECT_EQ("datatype error was encountered: Theme syncable service is not " | 516 EXPECT_EQ("datatype error was encountered: Theme syncable service is not " |
518 "started.", | 517 "started.", |
519 error.message()); | 518 error.message()); |
520 } | 519 } |
521 | 520 |
522 TEST_F(ThemeSyncableServiceTest, RestoreSystemThemeBitWhenChangeToCustomTheme) { | 521 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. | 522 // Initialize to use system theme. |
528 fake_theme_service_->UseDefaultTheme(); | 523 fake_theme_service_->UseDefaultTheme(); |
529 sync_pb::ThemeSpecifics theme_specifics; | 524 sync_pb::ThemeSpecifics theme_specifics; |
530 theme_specifics.set_use_system_theme_by_default(true); | 525 theme_specifics.set_use_system_theme_by_default(true); |
531 syncer::SyncError error = theme_sync_service_->MergeDataAndStartSyncing( | 526 syncer::SyncError error = |
532 syncer::THEMES, MakeThemeDataList(theme_specifics), | 527 theme_sync_service_->MergeDataAndStartSyncing( |
533 fake_change_processor_.Pass(), | 528 syncer::THEMES, |
534 scoped_ptr<syncer::SyncErrorFactory>(new syncer::SyncErrorFactoryMock())). | 529 MakeThemeDataList(theme_specifics), |
535 error(); | 530 scoped_ptr<syncer::SyncChangeProcessor>( |
| 531 new syncer::SyncChangeProcessorDelegator( |
| 532 fake_change_processor_.get())), |
| 533 scoped_ptr<syncer::SyncErrorFactory>( |
| 534 new syncer::SyncErrorFactoryMock())).error(); |
536 | 535 |
537 // Change to custom theme and notify theme_sync_service_. | 536 // Change to custom theme and notify theme_sync_service_. |
538 // use_system_theme_by_default bit should be preserved. | 537 // use_system_theme_by_default bit should be preserved. |
539 fake_theme_service_->SetTheme(theme_extension_.get()); | 538 fake_theme_service_->SetTheme(theme_extension_.get()); |
540 theme_sync_service_->OnThemeChange(); | 539 theme_sync_service_->OnThemeChange(); |
541 EXPECT_EQ(1u, change_list.size()); | 540 const syncer::SyncChangeList& changes = fake_change_processor_->changes(); |
| 541 EXPECT_EQ(1u, changes.size()); |
542 const sync_pb::ThemeSpecifics& change_specifics = | 542 const sync_pb::ThemeSpecifics& change_specifics = |
543 change_list[0].sync_data().GetSpecifics().theme(); | 543 changes[0].sync_data().GetSpecifics().theme(); |
544 EXPECT_TRUE(change_specifics.use_system_theme_by_default()); | 544 EXPECT_TRUE(change_specifics.use_system_theme_by_default()); |
545 } | 545 } |
546 | 546 |
547 #if defined(TOOLKIT_GTK) | 547 #if defined(TOOLKIT_GTK) |
548 TEST_F(ThemeSyncableServiceTest, | 548 TEST_F(ThemeSyncableServiceTest, |
549 GtkUpdateSystemThemeBitWhenChangeBetweenSystemAndDefault) { | 549 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. | 550 // Initialize to use native theme. |
555 fake_theme_service_->SetNativeTheme(); | 551 fake_theme_service_->SetNativeTheme(); |
556 fake_theme_service_->MarkClean(); | 552 fake_theme_service_->MarkClean(); |
557 sync_pb::ThemeSpecifics theme_specifics; | 553 sync_pb::ThemeSpecifics theme_specifics; |
558 theme_specifics.set_use_system_theme_by_default(true); | 554 theme_specifics.set_use_system_theme_by_default(true); |
559 syncer::SyncError error = theme_sync_service_->MergeDataAndStartSyncing( | 555 syncer::SyncError error = theme_sync_service_->MergeDataAndStartSyncing( |
560 syncer::THEMES, MakeThemeDataList(theme_specifics), | 556 syncer::THEMES, MakeThemeDataList(theme_specifics), |
561 fake_change_processor_.Pass(), | 557 fake_change_processor_.Pass(), |
562 scoped_ptr<syncer::SyncErrorFactory>(new syncer::SyncErrorFactoryMock())). | 558 scoped_ptr<syncer::SyncErrorFactory>(new syncer::SyncErrorFactoryMock())). |
563 error(); | 559 error(); |
564 EXPECT_FALSE(fake_theme_service_->is_dirty()); | 560 EXPECT_FALSE(fake_theme_service_->is_dirty()); |
565 | 561 |
566 // Change to default theme and notify theme_sync_service_. | 562 // Change to default theme and notify theme_sync_service_. |
567 // use_system_theme_by_default bit should be false. | 563 // use_system_theme_by_default bit should be false. |
568 fake_theme_service_->UseDefaultTheme(); | 564 fake_theme_service_->UseDefaultTheme(); |
569 theme_sync_service_->OnThemeChange(); | 565 theme_sync_service_->OnThemeChange(); |
570 EXPECT_EQ(1u, change_list.size()); | 566 const syncer::SyncChangeList& changes = fake_change_processor_->changes(); |
571 EXPECT_FALSE(change_list[0].sync_data().GetSpecifics().theme() | 567 EXPECT_EQ(1u, changes.size()); |
572 .use_system_theme_by_default()); | 568 EXPECT_FALSE(changes[0] |
| 569 .sync_data() |
| 570 .GetSpecifics() |
| 571 .theme() |
| 572 .use_system_theme_by_default()); |
573 | 573 |
574 // Change to native theme and notify theme_sync_service_. | 574 // Change to native theme and notify theme_sync_service_. |
575 // use_system_theme_by_default bit should be true. | 575 // use_system_theme_by_default bit should be true. |
576 change_list.clear(); | 576 changes.clear(); |
577 fake_theme_service_->SetNativeTheme(); | 577 fake_theme_service_->SetNativeTheme(); |
578 theme_sync_service_->OnThemeChange(); | 578 theme_sync_service_->OnThemeChange(); |
579 EXPECT_EQ(1u, change_list.size()); | 579 EXPECT_EQ(1u, changes.size()); |
580 EXPECT_TRUE(change_list[0].sync_data().GetSpecifics().theme() | 580 EXPECT_TRUE(changes[0] |
581 .use_system_theme_by_default()); | 581 .sync_data() |
| 582 .GetSpecifics() |
| 583 .theme() |
| 584 .use_system_theme_by_default()); |
582 } | 585 } |
583 #endif | 586 #endif |
584 | 587 |
585 #ifndef TOOLKIT_GTK | 588 #ifndef TOOLKIT_GTK |
586 TEST_F(ThemeSyncableServiceTest, | 589 TEST_F(ThemeSyncableServiceTest, |
587 NonGtkPreserveSystemThemeBitWhenChangeToDefaultTheme) { | 590 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. | 591 // Set up theme service to use default theme. |
593 fake_theme_service_->UseDefaultTheme(); | 592 fake_theme_service_->UseDefaultTheme(); |
594 | 593 |
595 // Initialize to use custom theme with use_system_theme_by_default set true. | 594 // Initialize to use custom theme with use_system_theme_by_default set true. |
596 sync_pb::ThemeSpecifics theme_specifics; | 595 sync_pb::ThemeSpecifics theme_specifics; |
597 theme_specifics.set_use_custom_theme(true); | 596 theme_specifics.set_use_custom_theme(true); |
598 theme_specifics.set_custom_theme_id(theme_extension_->id()); | 597 theme_specifics.set_custom_theme_id(theme_extension_->id()); |
599 theme_specifics.set_custom_theme_name(kCustomThemeName); | 598 theme_specifics.set_custom_theme_name(kCustomThemeName); |
600 theme_specifics.set_custom_theme_name(kCustomThemeUrl); | 599 theme_specifics.set_custom_theme_name(kCustomThemeUrl); |
601 theme_specifics.set_use_system_theme_by_default(true); | 600 theme_specifics.set_use_system_theme_by_default(true); |
602 syncer::SyncError error = theme_sync_service_->MergeDataAndStartSyncing( | 601 syncer::SyncError error = |
603 syncer::THEMES, MakeThemeDataList(theme_specifics), | 602 theme_sync_service_->MergeDataAndStartSyncing( |
604 fake_change_processor_.Pass(), | 603 syncer::THEMES, |
605 scoped_ptr<syncer::SyncErrorFactory>(new syncer::SyncErrorFactoryMock())). | 604 MakeThemeDataList(theme_specifics), |
606 error(); | 605 scoped_ptr<syncer::SyncChangeProcessor>( |
| 606 new syncer::SyncChangeProcessorDelegator( |
| 607 fake_change_processor_.get())), |
| 608 scoped_ptr<syncer::SyncErrorFactory>( |
| 609 new syncer::SyncErrorFactoryMock())).error(); |
607 EXPECT_EQ(fake_theme_service_->theme_extension(), theme_extension_.get()); | 610 EXPECT_EQ(fake_theme_service_->theme_extension(), theme_extension_.get()); |
608 | 611 |
609 // Change to default theme and notify theme_sync_service_. | 612 // Change to default theme and notify theme_sync_service_. |
610 // use_system_theme_by_default bit should be preserved. | 613 // use_system_theme_by_default bit should be preserved. |
611 fake_theme_service_->UseDefaultTheme(); | 614 fake_theme_service_->UseDefaultTheme(); |
612 theme_sync_service_->OnThemeChange(); | 615 theme_sync_service_->OnThemeChange(); |
613 EXPECT_EQ(1u, change_list.size()); | 616 const syncer::SyncChangeList& changes = fake_change_processor_->changes(); |
| 617 EXPECT_EQ(1u, changes.size()); |
614 const sync_pb::ThemeSpecifics& change_specifics = | 618 const sync_pb::ThemeSpecifics& change_specifics = |
615 change_list[0].sync_data().GetSpecifics().theme(); | 619 changes[0].sync_data().GetSpecifics().theme(); |
616 EXPECT_FALSE(change_specifics.use_custom_theme()); | 620 EXPECT_FALSE(change_specifics.use_custom_theme()); |
617 EXPECT_TRUE(change_specifics.use_system_theme_by_default()); | 621 EXPECT_TRUE(change_specifics.use_system_theme_by_default()); |
618 } | 622 } |
619 #endif | 623 #endif |
620 | 624 |
621 TEST_F(PolicyInstalledThemeTest, InstallThemeByPolicy) { | 625 TEST_F(PolicyInstalledThemeTest, InstallThemeByPolicy) { |
622 // Set up theme service to use custom theme that was installed by policy. | 626 // Set up theme service to use custom theme that was installed by policy. |
623 fake_theme_service_->SetTheme(theme_extension_.get()); | 627 fake_theme_service_->SetTheme(theme_extension_.get()); |
624 | 628 |
625 syncer::SyncDataList data_list = | 629 syncer::SyncDataList data_list = |
626 theme_sync_service_->GetAllSyncData(syncer::THEMES); | 630 theme_sync_service_->GetAllSyncData(syncer::THEMES); |
627 | 631 |
628 ASSERT_EQ(0u, data_list.size()); | 632 ASSERT_EQ(0u, data_list.size()); |
629 } | 633 } |
OLD | NEW |