15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved. 25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file. 45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/themes/theme_syncable_service.h" 65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/command_line.h" 85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/compiler_specific.h" 92a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/files/file_path.h" 105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/memory/scoped_ptr.h" 117dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#include "base/time/time.h" 125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/extensions/extension_service.h" 135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/extensions/test_extension_system.h" 145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/profiles/profile.h" 155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/themes/theme_service.h" 165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/themes/theme_service_factory.h" 172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/common/extensions/manifest_url_handler.h" 185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/test/base/testing_profile.h" 195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/test/test_browser_thread.h" 20cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "extensions/browser/extension_prefs.h" 21f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "extensions/common/extension.h" 223551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)#include "extensions/common/manifest_constants.h" 234e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#include "extensions/common/permissions/api_permission_set.h" 241e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)#include "extensions/common/permissions/permission_set.h" 25a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch#include "sync/api/attachments/attachment_id.h" 26a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "sync/api/fake_sync_change_processor.h" 27a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "sync/api/sync_change_processor_wrapper_for_test.h" 285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "sync/api/sync_error.h" 292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "sync/api/sync_error_factory_mock.h" 305f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#include "sync/internal_api/public/attachments/attachment_service_proxy_for_test.h" 315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "sync/protocol/sync.pb.h" 325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "sync/protocol/theme_specifics.pb.h" 335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "testing/gtest/include/gtest/gtest.h" 345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 35c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#if defined(OS_CHROMEOS) 366e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)#include "chrome/browser/chromeos/login/users/scoped_test_user_manager.h" 37c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "chrome/browser/chromeos/settings/cros_settings.h" 38c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "chrome/browser/chromeos/settings/device_settings_service.h" 39c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#endif 40c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using std::string; 425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace { 445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static const char kCustomThemeName[] = "name"; 465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static const char kCustomThemeUrl[] = "http://update.url/foo"; 475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_WIN) 492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)const base::FilePath::CharType kExtensionFilePath[] = 502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) FILE_PATH_LITERAL("c:\\foo"); 515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#elif defined(OS_POSIX) 522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)const base::FilePath::CharType kExtensionFilePath[] = FILE_PATH_LITERAL("/oo"); 535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class FakeThemeService : public ThemeService { 565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FakeThemeService() : 58cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) using_system_theme_(false), 595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) using_default_theme_(false), 605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) theme_extension_(NULL), 615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) is_dirty_(false) {} 625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // ThemeService implementation 645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void SetTheme(const extensions::Extension* extension) OVERRIDE { 655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) is_dirty_ = true; 665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) theme_extension_ = extension; 67cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) using_system_theme_ = false; 685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) using_default_theme_ = false; 695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void UseDefaultTheme() OVERRIDE { 725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) is_dirty_ = true; 735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) using_default_theme_ = true; 74cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) using_system_theme_ = false; 755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) theme_extension_ = NULL; 765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 78cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) virtual void UseSystemTheme() OVERRIDE { 795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) is_dirty_ = true; 80cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) using_system_theme_ = true; 815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) using_default_theme_ = false; 825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) theme_extension_ = NULL; 835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual bool UsingDefaultTheme() const OVERRIDE { 865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return using_default_theme_; 875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 89cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) virtual bool UsingSystemTheme() const OVERRIDE { 90cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) return using_system_theme_; 915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual string GetThemeID() const OVERRIDE { 94868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) if (theme_extension_.get()) 955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return theme_extension_->id(); 965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) else 97c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return std::string(); 985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const extensions::Extension* theme_extension() const { 1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return theme_extension_.get(); 1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool is_dirty() const { 1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return is_dirty_; 1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void MarkClean() { 1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) is_dirty_ = false; 1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private: 113cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) bool using_system_theme_; 1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool using_default_theme_; 1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_refptr<const extensions::Extension> theme_extension_; 1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool is_dirty_; 1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 119a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)KeyedService* BuildMockThemeService(content::BrowserContext* profile) { 1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return new FakeThemeService; 1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)scoped_refptr<extensions::Extension> MakeThemeExtension( 1242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const base::FilePath& extension_path, 1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const string& name, 1262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) extensions::Manifest::Location location, 1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const string& update_url) { 1285d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::DictionaryValue source; 1293551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) source.SetString(extensions::manifest_keys::kName, name); 1305d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) source.Set(extensions::manifest_keys::kTheme, new base::DictionaryValue()); 1313551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) source.SetString(extensions::manifest_keys::kUpdateURL, update_url); 1323551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) source.SetString(extensions::manifest_keys::kVersion, "0.0.0.0"); 1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) string error; 1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_refptr<extensions::Extension> extension = 1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) extensions::Extension::Create( 1362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) extension_path, location, source, 1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) extensions::Extension::NO_FLAGS, &error); 138868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) EXPECT_TRUE(extension.get()); 1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("", error); 1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return extension; 1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace 1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class ThemeSyncableServiceTest : public testing::Test { 1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) protected: 1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ThemeSyncableServiceTest() 1485d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) : ui_thread_(content::BrowserThread::UI, &loop_), 1497d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) file_thread_(content::BrowserThread::FILE, &loop_), 1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) fake_theme_service_(NULL) {} 1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual ~ThemeSyncableServiceTest() {} 1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void SetUp() { 1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) profile_.reset(new TestingProfile); 1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) fake_theme_service_ = BuildForProfile(profile_.get()); 1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) theme_sync_service_.reset(new ThemeSyncableService(profile_.get(), 1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) fake_theme_service_)); 159a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) fake_change_processor_.reset(new syncer::FakeSyncChangeProcessor); 1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SetUpExtension(); 1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void TearDown() { 1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) profile_.reset(); 1652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) loop_.RunUntilIdle(); 1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void SetUpExtension() { 1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CommandLine command_line(CommandLine::NO_PROGRAM); 1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) extensions::TestExtensionSystem* test_ext_system = 1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static_cast<extensions::TestExtensionSystem*>( 1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) extensions::ExtensionSystem::Get(profile_.get())); 1732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ExtensionService* service = test_ext_system->CreateExtensionService( 1742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) &command_line, base::FilePath(kExtensionFilePath), false); 1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(service->extensions_enabled()); 1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) service->Init(); 1772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) loop_.RunUntilIdle(); 1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Create and add custom theme extension so the ThemeSyncableService can 1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // find it. 1812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) theme_extension_ = MakeThemeExtension(base::FilePath(kExtensionFilePath), 1822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) kCustomThemeName, 1832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) GetThemeLocation(), 1842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) kCustomThemeUrl); 1852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) extensions::APIPermissionSet empty_set; 186f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) extensions::ManifestPermissionSet empty_manifest_permissions; 1872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) extensions::URLPatternSet empty_extent; 1882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_refptr<extensions::PermissionSet> permissions = 189f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) new extensions::PermissionSet(empty_set, empty_manifest_permissions, 190f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) empty_extent, empty_extent); 191a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) extensions::ExtensionPrefs::Get(profile_.get()) 192a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) ->AddGrantedPermissions(theme_extension_->id(), permissions.get()); 193868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) service->AddExtension(theme_extension_.get()); 1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(1u, service->extensions()->size()); 1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Overridden in PolicyInstalledThemeTest below. 1982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual extensions::Manifest::Location GetThemeLocation() { 1992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return extensions::Manifest::INTERNAL; 2002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 2012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FakeThemeService* BuildForProfile(Profile* profile) { 2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return static_cast<FakeThemeService*>( 2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ThemeServiceFactory::GetInstance()->SetTestingFactoryAndUse( 2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) profile, &BuildMockThemeService)); 2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) syncer::SyncDataList MakeThemeDataList( 2095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const sync_pb::ThemeSpecifics& theme_specifics) { 2105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) syncer::SyncDataList list; 2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sync_pb::EntitySpecifics entity_specifics; 2125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) entity_specifics.mutable_theme()->CopyFrom(theme_specifics); 2135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) list.push_back(syncer::SyncData::CreateLocalData( 2145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ThemeSyncableService::kCurrentThemeClientTag, 2155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ThemeSyncableService::kCurrentThemeNodeTitle, 2165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) entity_specifics)); 2175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return list; 2185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Needed for setting up extension service. 22190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) base::MessageLoop loop_; 2225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::TestBrowserThread ui_thread_; 2235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::TestBrowserThread file_thread_; 2245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 225c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#if defined OS_CHROMEOS 226c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) chromeos::ScopedTestDeviceSettingsService test_device_settings_service_; 227c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) chromeos::ScopedTestCrosSettings test_cros_settings_; 228c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) chromeos::ScopedTestUserManager test_user_manager_; 229c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#endif 230c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 2315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<TestingProfile> profile_; 2325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FakeThemeService* fake_theme_service_; 2335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_refptr<extensions::Extension> theme_extension_; 2345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<ThemeSyncableService> theme_sync_service_; 235a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) scoped_ptr<syncer::FakeSyncChangeProcessor> fake_change_processor_; 2365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 2375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class PolicyInstalledThemeTest : public ThemeSyncableServiceTest { 2392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual extensions::Manifest::Location GetThemeLocation() OVERRIDE { 2402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return extensions::Manifest::EXTERNAL_POLICY_DOWNLOAD; 2412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 2422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}; 2432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ThemeSyncableServiceTest, AreThemeSpecificsEqual) { 2455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sync_pb::ThemeSpecifics a, b; 2465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(ThemeSyncableService::AreThemeSpecificsEqual(a, b, false)); 2475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(ThemeSyncableService::AreThemeSpecificsEqual(a, b, true)); 2485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Custom vs. non-custom. 2505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) a.set_use_custom_theme(true); 2525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(ThemeSyncableService::AreThemeSpecificsEqual(a, b, false)); 2535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(ThemeSyncableService::AreThemeSpecificsEqual(a, b, true)); 2545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Custom theme equality. 2565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) b.set_use_custom_theme(true); 2585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(ThemeSyncableService::AreThemeSpecificsEqual(a, b, false)); 2595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(ThemeSyncableService::AreThemeSpecificsEqual(a, b, true)); 2605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) a.set_custom_theme_id("id"); 2625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(ThemeSyncableService::AreThemeSpecificsEqual(a, b, false)); 2635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(ThemeSyncableService::AreThemeSpecificsEqual(a, b, true)); 2645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) b.set_custom_theme_id("id"); 2665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(ThemeSyncableService::AreThemeSpecificsEqual(a, b, false)); 2675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(ThemeSyncableService::AreThemeSpecificsEqual(a, b, true)); 2685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) a.set_custom_theme_update_url("http://update.url"); 2705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(ThemeSyncableService::AreThemeSpecificsEqual(a, b, false)); 2715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(ThemeSyncableService::AreThemeSpecificsEqual(a, b, true)); 2725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) a.set_custom_theme_name("name"); 2745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(ThemeSyncableService::AreThemeSpecificsEqual(a, b, false)); 2755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(ThemeSyncableService::AreThemeSpecificsEqual(a, b, true)); 2765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Non-custom theme equality. 2785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) a.set_use_custom_theme(false); 2805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) b.set_use_custom_theme(false); 2815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(ThemeSyncableService::AreThemeSpecificsEqual(a, b, false)); 2825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(ThemeSyncableService::AreThemeSpecificsEqual(a, b, true)); 2835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) a.set_use_system_theme_by_default(true); 2855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(ThemeSyncableService::AreThemeSpecificsEqual(a, b, false)); 2865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(ThemeSyncableService::AreThemeSpecificsEqual(a, b, true)); 2875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) b.set_use_system_theme_by_default(true); 2895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(ThemeSyncableService::AreThemeSpecificsEqual(a, b, false)); 2905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(ThemeSyncableService::AreThemeSpecificsEqual(a, b, true)); 2915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ThemeSyncableServiceTest, SetCurrentThemeDefaultTheme) { 2945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Set up theme service to use custom theme. 2955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) fake_theme_service_->SetTheme(theme_extension_.get()); 2965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 297a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) syncer::SyncError error = 298a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) theme_sync_service_ 299a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) ->MergeDataAndStartSyncing( 300a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) syncer::THEMES, 301a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) MakeThemeDataList(sync_pb::ThemeSpecifics()), 302a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) scoped_ptr<syncer::SyncChangeProcessor>( 303a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) new syncer::SyncChangeProcessorWrapperForTest( 304a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) fake_change_processor_.get())), 305a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) scoped_ptr<syncer::SyncErrorFactory>( 306a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) new syncer::SyncErrorFactoryMock())) 307a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) .error(); 3085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(error.IsSet()) << error.message(); 3095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(fake_theme_service_->UsingDefaultTheme()); 3105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ThemeSyncableServiceTest, SetCurrentThemeSystemTheme) { 3135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sync_pb::ThemeSpecifics theme_specifics; 3145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) theme_specifics.set_use_system_theme_by_default(true); 3155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Set up theme service to use custom theme. 3175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) fake_theme_service_->SetTheme(theme_extension_.get()); 318a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) syncer::SyncError error = 319a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) theme_sync_service_ 320a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) ->MergeDataAndStartSyncing( 321a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) syncer::THEMES, 322a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) MakeThemeDataList(theme_specifics), 323a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) scoped_ptr<syncer::SyncChangeProcessor>( 324a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) new syncer::SyncChangeProcessorWrapperForTest( 325a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) fake_change_processor_.get())), 326a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) scoped_ptr<syncer::SyncErrorFactory>( 327a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) new syncer::SyncErrorFactoryMock())) 328a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) .error(); 3295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(error.IsSet()) << error.message(); 330cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) EXPECT_TRUE(fake_theme_service_->UsingSystemTheme()); 3315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ThemeSyncableServiceTest, SetCurrentThemeCustomTheme) { 3345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sync_pb::ThemeSpecifics theme_specifics; 3355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) theme_specifics.set_use_custom_theme(true); 3365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) theme_specifics.set_custom_theme_id(theme_extension_->id()); 3375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) theme_specifics.set_custom_theme_name(kCustomThemeName); 3385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) theme_specifics.set_custom_theme_name(kCustomThemeUrl); 3395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Set up theme service to use default theme. 3415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) fake_theme_service_->UseDefaultTheme(); 342a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) syncer::SyncError error = 343a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) theme_sync_service_ 344a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) ->MergeDataAndStartSyncing( 345a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) syncer::THEMES, 346a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) MakeThemeDataList(theme_specifics), 347a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) scoped_ptr<syncer::SyncChangeProcessor>( 348a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) new syncer::SyncChangeProcessorWrapperForTest( 349a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) fake_change_processor_.get())), 350a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) scoped_ptr<syncer::SyncErrorFactory>( 351a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) new syncer::SyncErrorFactoryMock())) 352a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) .error(); 3535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(error.IsSet()) << error.message(); 3545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(fake_theme_service_->theme_extension(), theme_extension_.get()); 3555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ThemeSyncableServiceTest, DontResetThemeWhenSpecificsAreEqual) { 3585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Set up theme service to use default theme and expect no changes. 3595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) fake_theme_service_->UseDefaultTheme(); 3605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) fake_theme_service_->MarkClean(); 361a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) syncer::SyncError error = 362a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) theme_sync_service_ 363a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) ->MergeDataAndStartSyncing( 364a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) syncer::THEMES, 365a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) MakeThemeDataList(sync_pb::ThemeSpecifics()), 366a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) scoped_ptr<syncer::SyncChangeProcessor>( 367a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) new syncer::SyncChangeProcessorWrapperForTest( 368a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) fake_change_processor_.get())), 369a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) scoped_ptr<syncer::SyncErrorFactory>( 370a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) new syncer::SyncErrorFactoryMock())) 371a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) .error(); 3725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(error.IsSet()) << error.message(); 3735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(fake_theme_service_->is_dirty()); 3745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ThemeSyncableServiceTest, UpdateThemeSpecificsFromCurrentTheme) { 3775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Set up theme service to use custom theme. 3785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) fake_theme_service_->SetTheme(theme_extension_.get()); 3795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 380a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) syncer::SyncError error = 381a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) theme_sync_service_ 382a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) ->MergeDataAndStartSyncing( 383a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) syncer::THEMES, 384a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) syncer::SyncDataList(), 385a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) scoped_ptr<syncer::SyncChangeProcessor>( 386a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) new syncer::SyncChangeProcessorWrapperForTest( 387a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) fake_change_processor_.get())), 388a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) scoped_ptr<syncer::SyncErrorFactory>( 389a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) new syncer::SyncErrorFactoryMock())) 390a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) .error(); 3915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(error.IsSet()) << error.message(); 392a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) const syncer::SyncChangeList& changes = fake_change_processor_->changes(); 393a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) ASSERT_EQ(1u, changes.size()); 394a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) EXPECT_TRUE(changes[0].IsValid()); 395a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) EXPECT_EQ(syncer::SyncChange::ACTION_ADD, changes[0].change_type()); 396a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) EXPECT_EQ(syncer::THEMES, changes[0].sync_data().GetDataType()); 3975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const sync_pb::ThemeSpecifics& theme_specifics = 399a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) changes[0].sync_data().GetSpecifics().theme(); 4005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(theme_specifics.use_custom_theme()); 4015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(theme_extension_->id(), theme_specifics.custom_theme_id()); 4025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(theme_extension_->name(), theme_specifics.custom_theme_name()); 403868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) EXPECT_EQ( 404868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) extensions::ManifestURL::GetUpdateURL(theme_extension_.get()).spec(), 405868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) theme_specifics.custom_theme_update_url()); 4065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ThemeSyncableServiceTest, GetAllSyncData) { 4095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Set up theme service to use custom theme. 4105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) fake_theme_service_->SetTheme(theme_extension_.get()); 4115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) syncer::SyncDataList data_list = 4135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) theme_sync_service_->GetAllSyncData(syncer::THEMES); 4145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(1u, data_list.size()); 4165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const sync_pb::ThemeSpecifics& theme_specifics = 4175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) data_list[0].GetSpecifics().theme(); 4185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(theme_specifics.use_custom_theme()); 4195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(theme_extension_->id(), theme_specifics.custom_theme_id()); 4205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(theme_extension_->name(), theme_specifics.custom_theme_name()); 421868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) EXPECT_EQ( 422868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) extensions::ManifestURL::GetUpdateURL(theme_extension_.get()).spec(), 423868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) theme_specifics.custom_theme_update_url()); 4245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ThemeSyncableServiceTest, ProcessSyncThemeChange) { 4275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Set up theme service to use default theme. 4285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) fake_theme_service_->UseDefaultTheme(); 4295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) fake_theme_service_->MarkClean(); 4305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Start syncing. 432a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) syncer::SyncError error = 433a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) theme_sync_service_ 434a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) ->MergeDataAndStartSyncing( 435a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) syncer::THEMES, 436a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) MakeThemeDataList(sync_pb::ThemeSpecifics()), 437a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) scoped_ptr<syncer::SyncChangeProcessor>( 438a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) new syncer::SyncChangeProcessorWrapperForTest( 439a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) fake_change_processor_.get())), 440a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) scoped_ptr<syncer::SyncErrorFactory>( 441a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) new syncer::SyncErrorFactoryMock())) 442a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) .error(); 4435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(error.IsSet()) << error.message(); 4445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Don't expect theme change initially because specifics are equal. 4455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(fake_theme_service_->is_dirty()); 4465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Change specifics to use custom theme and update. 4485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sync_pb::ThemeSpecifics theme_specifics; 4495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) theme_specifics.set_use_custom_theme(true); 4505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) theme_specifics.set_custom_theme_id(theme_extension_->id()); 4515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) theme_specifics.set_custom_theme_name(kCustomThemeName); 4525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) theme_specifics.set_custom_theme_name(kCustomThemeUrl); 4535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sync_pb::EntitySpecifics entity_specifics; 4545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) entity_specifics.mutable_theme()->CopyFrom(theme_specifics); 4555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) syncer::SyncChangeList change_list; 456a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch change_list.push_back( 457a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch syncer::SyncChange(FROM_HERE, 458a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch syncer::SyncChange::ACTION_UPDATE, 459a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch syncer::SyncData::CreateRemoteData( 460a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch 1, 461a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch entity_specifics, 462a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch base::Time(), 463a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch syncer::AttachmentIdList(), 464a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch syncer::AttachmentServiceProxyForTest::Create()))); 4655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) error = theme_sync_service_->ProcessSyncChanges(FROM_HERE, change_list); 4665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(error.IsSet()) << error.message(); 4675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(fake_theme_service_->theme_extension(), theme_extension_.get()); 4685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ThemeSyncableServiceTest, OnThemeChangeByUser) { 4715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Set up theme service to use default theme. 4725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) fake_theme_service_->UseDefaultTheme(); 4735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Start syncing. 475a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) syncer::SyncError error = 476a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) theme_sync_service_ 477a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) ->MergeDataAndStartSyncing( 478a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) syncer::THEMES, 479a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) MakeThemeDataList(sync_pb::ThemeSpecifics()), 480a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) scoped_ptr<syncer::SyncChangeProcessor>( 481a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) new syncer::SyncChangeProcessorWrapperForTest( 482a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) fake_change_processor_.get())), 483a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) scoped_ptr<syncer::SyncErrorFactory>( 484a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) new syncer::SyncErrorFactoryMock())) 485a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) .error(); 4865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(error.IsSet()) << error.message(); 487a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) const syncer::SyncChangeList& changes = fake_change_processor_->changes(); 488a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) EXPECT_EQ(0u, changes.size()); 4895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Change current theme to custom theme and notify theme_sync_service_. 4915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) fake_theme_service_->SetTheme(theme_extension_.get()); 4925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) theme_sync_service_->OnThemeChange(); 493a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) EXPECT_EQ(1u, changes.size()); 4945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const sync_pb::ThemeSpecifics& change_specifics = 495a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) changes[0].sync_data().GetSpecifics().theme(); 4965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(change_specifics.use_custom_theme()); 4975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(theme_extension_->id(), change_specifics.custom_theme_id()); 4985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(theme_extension_->name(), change_specifics.custom_theme_name()); 499868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) EXPECT_EQ( 500868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) extensions::ManifestURL::GetUpdateURL(theme_extension_.get()).spec(), 501868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) change_specifics.custom_theme_update_url()); 5025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 5035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ThemeSyncableServiceTest, StopSync) { 5055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Set up theme service to use default theme. 5065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) fake_theme_service_->UseDefaultTheme(); 5075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Start syncing. 509a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) syncer::SyncError error = 510a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) theme_sync_service_ 511a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) ->MergeDataAndStartSyncing( 512a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) syncer::THEMES, 513a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) MakeThemeDataList(sync_pb::ThemeSpecifics()), 514a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) scoped_ptr<syncer::SyncChangeProcessor>( 515a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) new syncer::SyncChangeProcessorWrapperForTest( 516a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) fake_change_processor_.get())), 517a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) scoped_ptr<syncer::SyncErrorFactory>( 518a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) new syncer::SyncErrorFactoryMock())) 519a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) .error(); 5205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(error.IsSet()) << error.message(); 521a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) const syncer::SyncChangeList& changes = fake_change_processor_->changes(); 522a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) EXPECT_EQ(0u, changes.size()); 5235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Stop syncing. 5255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) theme_sync_service_->StopSyncing(syncer::THEMES); 5265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Change current theme to custom theme and notify theme_sync_service_. 5285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // No change is output because sync has stopped. 5295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) fake_theme_service_->SetTheme(theme_extension_.get()); 5305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) theme_sync_service_->OnThemeChange(); 531a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) EXPECT_EQ(0u, changes.size()); 5325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // ProcessSyncChanges() should return error when sync has stopped. 534a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) error = theme_sync_service_->ProcessSyncChanges(FROM_HERE, changes); 5355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(error.IsSet()); 536eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch EXPECT_EQ(syncer::THEMES, error.model_type()); 5375f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) EXPECT_EQ("Theme syncable service is not started.", error.message()); 5385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 5395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ThemeSyncableServiceTest, RestoreSystemThemeBitWhenChangeToCustomTheme) { 5415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Initialize to use system theme. 5425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) fake_theme_service_->UseDefaultTheme(); 5435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sync_pb::ThemeSpecifics theme_specifics; 5445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) theme_specifics.set_use_system_theme_by_default(true); 545a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) syncer::SyncError error = 546a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) theme_sync_service_ 547a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) ->MergeDataAndStartSyncing( 548a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) syncer::THEMES, 549a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) MakeThemeDataList(theme_specifics), 550a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) scoped_ptr<syncer::SyncChangeProcessor>( 551a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) new syncer::SyncChangeProcessorWrapperForTest( 552a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) fake_change_processor_.get())), 553a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) scoped_ptr<syncer::SyncErrorFactory>( 554a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) new syncer::SyncErrorFactoryMock())) 555a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) .error(); 5565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Change to custom theme and notify theme_sync_service_. 5585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // use_system_theme_by_default bit should be preserved. 5595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) fake_theme_service_->SetTheme(theme_extension_.get()); 5605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) theme_sync_service_->OnThemeChange(); 561a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) const syncer::SyncChangeList& changes = fake_change_processor_->changes(); 562a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) EXPECT_EQ(1u, changes.size()); 5635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const sync_pb::ThemeSpecifics& change_specifics = 564a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) changes[0].sync_data().GetSpecifics().theme(); 5655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(change_specifics.use_system_theme_by_default()); 5665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 5675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(TOOLKIT_GTK) 5695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ThemeSyncableServiceTest, 5705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GtkUpdateSystemThemeBitWhenChangeBetweenSystemAndDefault) { 5715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Initialize to use native theme. 572cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) fake_theme_service_->UseSystemTheme(); 5735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) fake_theme_service_->MarkClean(); 5745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sync_pb::ThemeSpecifics theme_specifics; 5755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) theme_specifics.set_use_system_theme_by_default(true); 576a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) syncer::SyncError error = 577a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) theme_sync_service_ 578a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) ->MergeDataAndStartSyncing( 579a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) syncer::THEMES, 580a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) MakeThemeDataList(theme_specifics), 581a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) scoped_ptr<syncer::SyncChangeProcessor>( 582a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) new syncer::SyncChangeProcessorWrapperForTest( 583a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) fake_change_processor_.get())), 584a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) scoped_ptr<syncer::SyncErrorFactory>( 585a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) new syncer::SyncErrorFactoryMock())) 586a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) .error(); 5875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(fake_theme_service_->is_dirty()); 5885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Change to default theme and notify theme_sync_service_. 5905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // use_system_theme_by_default bit should be false. 5915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) fake_theme_service_->UseDefaultTheme(); 5925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) theme_sync_service_->OnThemeChange(); 593a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) syncer::SyncChangeList& changes = fake_change_processor_->changes(); 594a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) EXPECT_EQ(1u, changes.size()); 595a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) EXPECT_FALSE(changes[0] 596a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) .sync_data() 597a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) .GetSpecifics() 598a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) .theme() 599a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) .use_system_theme_by_default()); 6005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Change to native theme and notify theme_sync_service_. 6025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // use_system_theme_by_default bit should be true. 603a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) changes.clear(); 604cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) fake_theme_service_->UseSystemTheme(); 6055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) theme_sync_service_->OnThemeChange(); 606a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) EXPECT_EQ(1u, changes.size()); 607a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) EXPECT_TRUE(changes[0] 608a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) .sync_data() 609a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) .GetSpecifics() 610a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) .theme() 611a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) .use_system_theme_by_default()); 6125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 6135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 6145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifndef TOOLKIT_GTK 6165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ThemeSyncableServiceTest, 6175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NonGtkPreserveSystemThemeBitWhenChangeToDefaultTheme) { 6185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Set up theme service to use default theme. 6195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) fake_theme_service_->UseDefaultTheme(); 6205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Initialize to use custom theme with use_system_theme_by_default set true. 6225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sync_pb::ThemeSpecifics theme_specifics; 6235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) theme_specifics.set_use_custom_theme(true); 6245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) theme_specifics.set_custom_theme_id(theme_extension_->id()); 6255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) theme_specifics.set_custom_theme_name(kCustomThemeName); 6265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) theme_specifics.set_custom_theme_name(kCustomThemeUrl); 6275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) theme_specifics.set_use_system_theme_by_default(true); 628a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) syncer::SyncError error = 629a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) theme_sync_service_ 630a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) ->MergeDataAndStartSyncing( 631a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) syncer::THEMES, 632a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) MakeThemeDataList(theme_specifics), 633a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) scoped_ptr<syncer::SyncChangeProcessor>( 634a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) new syncer::SyncChangeProcessorWrapperForTest( 635a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) fake_change_processor_.get())), 636a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) scoped_ptr<syncer::SyncErrorFactory>( 637a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) new syncer::SyncErrorFactoryMock())) 638a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) .error(); 6395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(fake_theme_service_->theme_extension(), theme_extension_.get()); 6405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Change to default theme and notify theme_sync_service_. 6425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // use_system_theme_by_default bit should be preserved. 6435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) fake_theme_service_->UseDefaultTheme(); 6445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) theme_sync_service_->OnThemeChange(); 645a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) const syncer::SyncChangeList& changes = fake_change_processor_->changes(); 646a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) EXPECT_EQ(1u, changes.size()); 6475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const sync_pb::ThemeSpecifics& change_specifics = 648a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) changes[0].sync_data().GetSpecifics().theme(); 6495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(change_specifics.use_custom_theme()); 6505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(change_specifics.use_system_theme_by_default()); 6515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 6525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 6532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 6542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(PolicyInstalledThemeTest, InstallThemeByPolicy) { 6552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Set up theme service to use custom theme that was installed by policy. 6562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) fake_theme_service_->SetTheme(theme_extension_.get()); 6572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 6582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) syncer::SyncDataList data_list = 6592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) theme_sync_service_->GetAllSyncData(syncer::THEMES); 6602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 6612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_EQ(0u, data_list.size()); 6622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 663