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