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