| 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 |