preference_api_prefs_unittest.cc revision 7d4cd473f85ac64c3747c96c277f9e506a0d2246
17d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)// Copyright 2013 The Chromium Authors. All rights reserved.
27d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
37d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)// found in the LICENSE file.
47d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
57d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include <string>
67d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
77d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "base/memory/ref_counted.h"
87d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "base/memory/scoped_ptr.h"
97d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "base/prefs/mock_pref_change_callback.h"
107d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "base/values.h"
117d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "chrome/browser/extensions/api/preference/preference_api.h"
127d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "chrome/browser/extensions/extension_prefs.h"
137d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "chrome/browser/extensions/extension_prefs_unittest.h"
147d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "chrome/common/extensions/extension.h"
157d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "chrome/common/extensions/extension_manifest_constants.h"
167d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "chrome/test/base/testing_profile.h"
177d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "components/user_prefs/pref_registry_syncable.h"
187d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "testing/gtest/include/gtest/gtest.h"
197d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
207d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)using base::Value;
217d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
227d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)namespace keys = extension_manifest_keys;
237d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
247d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)namespace extensions {
257d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
267d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)namespace {
277d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
287d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)const char kPref1[] = "path1.subpath";
297d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)const char kPref2[] = "path2";
307d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)const char kPref3[] = "path3";
317d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)const char kPref4[] = "path4";
327d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
337d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)// Default values in case an extension pref value is not overridden.
347d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)const char kDefaultPref1[] = "default pref 1";
357d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)const char kDefaultPref2[] = "default pref 2";
367d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)const char kDefaultPref3[] = "default pref 3";
377d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)const char kDefaultPref4[] = "default pref 4";
387d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
397d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)}  // namespace
407d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
417d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)// An implementation of the PreferenceAPI which returns the ExtensionPrefs and
427d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)// ExtensionPrefValueMap from the TestExtensionPrefs, rather than from a
437d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)// profile (which we don't create in unittests).
447d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)class TestPreferenceAPI : public PreferenceAPIBase {
457d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) public:
467d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  explicit TestPreferenceAPI(TestExtensionPrefs* test_extension_prefs)
477d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      : test_extension_prefs_(test_extension_prefs) { }
487d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  ~TestPreferenceAPI() { }
497d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) private:
507d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  // PreferenceAPIBase implementation.
517d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  virtual ExtensionPrefs* extension_prefs() OVERRIDE {
527d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    return test_extension_prefs_->prefs();
537d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  }
547d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  virtual ExtensionPrefValueMap* extension_pref_value_map() OVERRIDE {
557d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    return test_extension_prefs_->extension_pref_value_map();
567d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  }
577d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
587d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  TestExtensionPrefs* test_extension_prefs_;
597d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
607d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(TestPreferenceAPI);
617d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)};
627d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
637d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)class ExtensionControlledPrefsTest : public PrefsPrepopulatedTestBase {
647d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) public:
657d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  ExtensionControlledPrefsTest();
667d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  virtual ~ExtensionControlledPrefsTest();
677d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
687d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  virtual void RegisterPreferences(user_prefs::PrefRegistrySyncable* registry)
697d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      OVERRIDE;
707d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  void InstallExtensionControlledPref(Extension* extension,
717d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)                                      const std::string& key,
727d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)                                      base::Value* value);
737d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  void InstallExtensionControlledPrefIncognito(Extension* extension,
747d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)                                               const std::string& key,
757d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)                                               base::Value* value);
767d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  void InstallExtensionControlledPrefIncognitoSessionOnly(
777d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      Extension* extension,
787d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      const std::string& key,
797d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      base::Value* value);
807d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  void InstallExtension(Extension* extension);
817d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  void UninstallExtension(const std::string& extension_id);
827d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
837d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) protected:
847d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  void EnsureExtensionInstalled(Extension* extension);
857d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  void EnsureExtensionUninstalled(const std::string& extension_id);
867d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
877d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  TestPreferenceAPI test_preference_api_;
887d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)};
897d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
907d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)ExtensionControlledPrefsTest::ExtensionControlledPrefsTest()
917d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    : PrefsPrepopulatedTestBase(),
927d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      test_preference_api_(&prefs_) {
937d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)}
947d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
957d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)ExtensionControlledPrefsTest::~ExtensionControlledPrefsTest() {
967d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)}
977d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
987d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)void ExtensionControlledPrefsTest::RegisterPreferences(
997d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    user_prefs::PrefRegistrySyncable* registry) {
1007d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  registry->RegisterStringPref(
1017d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      kPref1, kDefaultPref1, user_prefs::PrefRegistrySyncable::UNSYNCABLE_PREF);
1027d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  registry->RegisterStringPref(
1037d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      kPref2, kDefaultPref2, user_prefs::PrefRegistrySyncable::UNSYNCABLE_PREF);
1047d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  registry->RegisterStringPref(
1057d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      kPref3, kDefaultPref3, user_prefs::PrefRegistrySyncable::UNSYNCABLE_PREF);
1067d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  registry->RegisterStringPref(
1077d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      kPref4, kDefaultPref4, user_prefs::PrefRegistrySyncable::UNSYNCABLE_PREF);
1087d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)}
1097d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
1107d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)void ExtensionControlledPrefsTest::InstallExtensionControlledPref(
1117d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    Extension* extension,
1127d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    const std::string& key,
1137d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    Value* value) {
1147d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  EnsureExtensionInstalled(extension);
1157d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  test_preference_api_.SetExtensionControlledPref(
1167d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      extension->id(), key, kExtensionPrefsScopeRegular, value);
1177d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)}
1187d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
1197d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)void ExtensionControlledPrefsTest::InstallExtensionControlledPrefIncognito(
1207d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    Extension* extension,
1217d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    const std::string& key,
1227d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    Value* value) {
1237d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  EnsureExtensionInstalled(extension);
1247d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  test_preference_api_.SetExtensionControlledPref(
1257d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      extension->id(), key, kExtensionPrefsScopeIncognitoPersistent, value);
1267d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)}
1277d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
1287d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)void ExtensionControlledPrefsTest::
1297d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)InstallExtensionControlledPrefIncognitoSessionOnly(Extension* extension,
1307d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)                                                   const std::string& key,
1317d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)                                                   Value* value) {
1327d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  EnsureExtensionInstalled(extension);
1337d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  test_preference_api_.SetExtensionControlledPref(
1347d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      extension->id(), key, kExtensionPrefsScopeIncognitoSessionOnly, value);
1357d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)}
1367d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
1377d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)void ExtensionControlledPrefsTest::InstallExtension(Extension* extension) {
1387d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  EnsureExtensionInstalled(extension);
1397d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)}
1407d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
1417d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)void ExtensionControlledPrefsTest::UninstallExtension(
1427d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    const std::string& extension_id) {
1437d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  EnsureExtensionUninstalled(extension_id);
1447d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)}
1457d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
1467d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)void ExtensionControlledPrefsTest::EnsureExtensionInstalled(
1477d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    Extension* extension) {
1487d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  // Install extension the first time a preference is set for it.
1497d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  Extension* extensions[] = { extension1(),
1507d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)                              extension2(),
1517d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)                              extension3(),
1527d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)                              extension4() };
1537d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  for (size_t i = 0; i < kNumInstalledExtensions; ++i) {
1547d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    if (extension == extensions[i] && !installed_[i]) {
1557d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      prefs()->OnExtensionInstalled(extension, Extension::ENABLED,
1567d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)                                    syncer::StringOrdinal());
1577d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      installed_[i] = true;
1587d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      break;
1597d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    }
1607d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  }
1617d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)}
1627d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
1637d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)void ExtensionControlledPrefsTest::EnsureExtensionUninstalled(
1647d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    const std::string& extension_id) {
1657d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  Extension* extensions[] = { extension1(),
1667d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)                              extension2(),
1677d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)                              extension3(),
1687d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)                              extension4() };
1697d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  for (size_t i = 0; i < kNumInstalledExtensions; ++i) {
1707d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    if (extensions[i]->id() == extension_id) {
1717d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      installed_[i] = false;
1727d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      break;
1737d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    }
1747d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  }
1757d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  prefs()->OnExtensionUninstalled(extension_id, Manifest::INTERNAL, false);
1767d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)}
1777d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
1787d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)class ControlledPrefsInstallOneExtension
1797d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    : public ExtensionControlledPrefsTest {
1807d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  virtual void Initialize() OVERRIDE {
1817d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    InstallExtensionControlledPref(extension1(),
1827d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)                                   kPref1,
1837d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)                                   Value::CreateStringValue("val1"));
1847d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  }
1857d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  virtual void Verify() OVERRIDE {
1867d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    std::string actual = prefs()->pref_service()->GetString(kPref1);
1877d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    EXPECT_EQ("val1", actual);
1887d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  }
1897d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)};
1907d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)TEST_F(ControlledPrefsInstallOneExtension,
1917d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)       ControlledPrefsInstallOneExtension) { }
1927d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
1937d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)// Check that we do not forget persistent incognito values after a reload.
1947d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)class ControlledPrefsInstallIncognitoPersistent
1957d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    : public ExtensionControlledPrefsTest {
1967d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) public:
1977d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  virtual void Initialize() OVERRIDE {
1987d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    InstallExtensionControlledPref(
1997d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)        extension1(), kPref1, Value::CreateStringValue("val1"));
2007d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    InstallExtensionControlledPrefIncognito(
2017d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)        extension1(), kPref1, Value::CreateStringValue("val2"));
2027d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    scoped_ptr<PrefService> incog_prefs(prefs_.CreateIncognitoPrefService());
2037d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    std::string actual = incog_prefs->GetString(kPref1);
2047d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    EXPECT_EQ("val2", actual);
2057d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  }
2067d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
2077d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  virtual void Verify() OVERRIDE {
2087d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    // Main pref service shall see only non-incognito settings.
2097d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    std::string actual = prefs()->pref_service()->GetString(kPref1);
2107d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    EXPECT_EQ("val1", actual);
2117d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    // Incognito pref service shall see incognito values.
2127d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    scoped_ptr<PrefService> incog_prefs(prefs_.CreateIncognitoPrefService());
2137d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    actual = incog_prefs->GetString(kPref1);
2147d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    EXPECT_EQ("val2", actual);
2157d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  }
2167d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)};
2177d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)TEST_F(ControlledPrefsInstallIncognitoPersistent,
2187d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)       ControlledPrefsInstallIncognitoPersistent) { }
2197d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
2207d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)// Check that we forget 'session only' incognito values after a reload.
2217d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)class ControlledPrefsInstallIncognitoSessionOnly
2227d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    : public ExtensionControlledPrefsTest {
2237d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) public:
2247d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  ControlledPrefsInstallIncognitoSessionOnly() : iteration_(0) {}
2257d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
2267d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  virtual void Initialize() OVERRIDE {
2277d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    InstallExtensionControlledPref(
2287d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)        extension1(), kPref1, Value::CreateStringValue("val1"));
2297d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    InstallExtensionControlledPrefIncognitoSessionOnly(
2307d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)        extension1(), kPref1, Value::CreateStringValue("val2"));
2317d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    scoped_ptr<PrefService> incog_prefs(prefs_.CreateIncognitoPrefService());
2327d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    std::string actual = incog_prefs->GetString(kPref1);
2337d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    EXPECT_EQ("val2", actual);
2347d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  }
2357d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  virtual void Verify() OVERRIDE {
2367d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    // Main pref service shall see only non-incognito settings.
2377d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    std::string actual = prefs()->pref_service()->GetString(kPref1);
2387d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    EXPECT_EQ("val1", actual);
2397d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    // Incognito pref service shall see session-only incognito values only
2407d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    // during first run. Once the pref service was reloaded, all values shall be
2417d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    // discarded.
2427d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    scoped_ptr<PrefService> incog_prefs(prefs_.CreateIncognitoPrefService());
2437d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    actual = incog_prefs->GetString(kPref1);
2447d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    if (iteration_ == 0) {
2457d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      EXPECT_EQ("val2", actual);
2467d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    } else {
2477d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      EXPECT_EQ("val1", actual);
2487d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    }
2497d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    ++iteration_;
2507d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  }
2517d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  int iteration_;
2527d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)};
2537d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)TEST_F(ControlledPrefsInstallIncognitoSessionOnly,
2547d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)       ControlledPrefsInstallIncognitoSessionOnly) { }
2557d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
2567d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)class ControlledPrefsUninstallExtension : public ExtensionControlledPrefsTest {
2577d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  virtual void Initialize() OVERRIDE {
2587d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    InstallExtensionControlledPref(
2597d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)        extension1(), kPref1, Value::CreateStringValue("val1"));
2607d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    InstallExtensionControlledPref(
2617d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)        extension1(), kPref2, Value::CreateStringValue("val2"));
2627d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    ContentSettingsStore* store = prefs()->content_settings_store();
2637d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    ContentSettingsPattern pattern =
2647d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)        ContentSettingsPattern::FromString("http://[*.]example.com");
2657d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    store->SetExtensionContentSetting(extension1()->id(),
2667d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)                                      pattern, pattern,
2677d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)                                      CONTENT_SETTINGS_TYPE_IMAGES,
2687d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)                                      std::string(),
2697d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)                                      CONTENT_SETTING_BLOCK,
2707d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)                                      kExtensionPrefsScopeRegular);
2717d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
2727d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    UninstallExtension(extension1()->id());
2737d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  }
2747d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  virtual void Verify() OVERRIDE {
2757d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    EXPECT_FALSE(prefs()->HasPrefForExtension(extension1()->id()));
2767d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
2777d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    std::string actual;
2787d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    actual = prefs()->pref_service()->GetString(kPref1);
2797d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    EXPECT_EQ(kDefaultPref1, actual);
2807d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    actual = prefs()->pref_service()->GetString(kPref2);
2817d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    EXPECT_EQ(kDefaultPref2, actual);
2827d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  }
2837d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)};
2847d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)TEST_F(ControlledPrefsUninstallExtension,
2857d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)       ControlledPrefsUninstallExtension) { }
2867d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
2877d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)// Tests triggering of notifications to registered observers.
2887d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)class ControlledPrefsNotifyWhenNeeded : public ExtensionControlledPrefsTest {
2897d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  virtual void Initialize() OVERRIDE {
2907d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    using testing::_;
2917d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    using testing::Mock;
2927d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    using testing::StrEq;
2937d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
2947d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    MockPrefChangeCallback observer(prefs()->pref_service());
2957d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    PrefChangeRegistrar registrar;
2967d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    registrar.Init(prefs()->pref_service());
2977d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    registrar.Add(kPref1, observer.GetCallback());
2987d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
2997d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    MockPrefChangeCallback incognito_observer(prefs()->pref_service());
3007d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    scoped_ptr<PrefService> incog_prefs(prefs_.CreateIncognitoPrefService());
3017d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    PrefChangeRegistrar incognito_registrar;
3027d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    incognito_registrar.Init(incog_prefs.get());
3037d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    incognito_registrar.Add(kPref1, incognito_observer.GetCallback());
3047d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
3057d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    // Write value and check notification.
3067d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    EXPECT_CALL(observer, OnPreferenceChanged(_));
3077d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    EXPECT_CALL(incognito_observer, OnPreferenceChanged(_));
3087d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    InstallExtensionControlledPref(extension1(), kPref1,
3097d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)        Value::CreateStringValue("https://www.chromium.org"));
3107d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    Mock::VerifyAndClearExpectations(&observer);
3117d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    Mock::VerifyAndClearExpectations(&incognito_observer);
3127d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
3137d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    // Write same value.
3147d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    EXPECT_CALL(observer, OnPreferenceChanged(_)).Times(0);
3157d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    EXPECT_CALL(incognito_observer, OnPreferenceChanged(_)).Times(0);
3167d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    InstallExtensionControlledPref(extension1(), kPref1,
3177d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)        Value::CreateStringValue("https://www.chromium.org"));
3187d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    Mock::VerifyAndClearExpectations(&observer);
3197d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    Mock::VerifyAndClearExpectations(&incognito_observer);
3207d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
3217d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    // Change value.
3227d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    EXPECT_CALL(observer, OnPreferenceChanged(_));
3237d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    EXPECT_CALL(incognito_observer, OnPreferenceChanged(_));
3247d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    InstallExtensionControlledPref(extension1(), kPref1,
3257d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)        Value::CreateStringValue("chrome://newtab"));
3267d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    Mock::VerifyAndClearExpectations(&observer);
3277d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    Mock::VerifyAndClearExpectations(&incognito_observer);
3287d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    // Change only incognito persistent value.
3297d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    EXPECT_CALL(observer, OnPreferenceChanged(_)).Times(0);
3307d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    EXPECT_CALL(incognito_observer, OnPreferenceChanged(_));
3317d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    InstallExtensionControlledPrefIncognito(extension1(), kPref1,
3327d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)        Value::CreateStringValue("chrome://newtab2"));
3337d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    Mock::VerifyAndClearExpectations(&observer);
3347d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    Mock::VerifyAndClearExpectations(&incognito_observer);
3357d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
3367d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    // Change only incognito session-only value.
3377d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    EXPECT_CALL(observer, OnPreferenceChanged(_)).Times(0);
3387d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    EXPECT_CALL(incognito_observer, OnPreferenceChanged(_));
3397d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    InstallExtensionControlledPrefIncognito(extension1(), kPref1,
3407d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)        Value::CreateStringValue("chrome://newtab3"));
3417d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    Mock::VerifyAndClearExpectations(&observer);
3427d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    Mock::VerifyAndClearExpectations(&incognito_observer);
3437d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
3447d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    // Uninstall.
3457d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    EXPECT_CALL(observer, OnPreferenceChanged(_));
3467d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    EXPECT_CALL(incognito_observer, OnPreferenceChanged(_));
3477d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    UninstallExtension(extension1()->id());
3487d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    Mock::VerifyAndClearExpectations(&observer);
3497d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    Mock::VerifyAndClearExpectations(&incognito_observer);
3507d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
3517d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    registrar.Remove(kPref1);
3527d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    incognito_registrar.Remove(kPref1);
3537d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  }
3547d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  virtual void Verify() OVERRIDE {
3557d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    std::string actual = prefs()->pref_service()->GetString(kPref1);
3567d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    EXPECT_EQ(kDefaultPref1, actual);
3577d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  }
3587d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)};
3597d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)TEST_F(ControlledPrefsNotifyWhenNeeded,
3607d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)       ControlledPrefsNotifyWhenNeeded) { }
3617d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
3627d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)// Tests disabling an extension.
3637d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)class ControlledPrefsDisableExtension : public ExtensionControlledPrefsTest {
3647d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  virtual void Initialize() OVERRIDE {
3657d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    InstallExtensionControlledPref(
3667d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)        extension1(), kPref1, Value::CreateStringValue("val1"));
3677d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    std::string actual = prefs()->pref_service()->GetString(kPref1);
3687d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    EXPECT_EQ("val1", actual);
3697d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    prefs()->SetExtensionState(extension1()->id(), Extension::DISABLED);
3707d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  }
3717d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  virtual void Verify() OVERRIDE {
3727d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    std::string actual = prefs()->pref_service()->GetString(kPref1);
3737d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    EXPECT_EQ(kDefaultPref1, actual);
3747d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  }
3757d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)};
3767d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)TEST_F(ControlledPrefsDisableExtension, ControlledPrefsDisableExtension) { }
3777d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
3787d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)// Tests disabling and reenabling an extension.
3797d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)class ControlledPrefsReenableExtension : public ExtensionControlledPrefsTest {
3807d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  virtual void Initialize() OVERRIDE {
3817d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    InstallExtensionControlledPref(
3827d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)        extension1(), kPref1, Value::CreateStringValue("val1"));
3837d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    prefs()->SetExtensionState(extension1()->id(), Extension::DISABLED);
3847d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    prefs()->SetExtensionState(extension1()->id(), Extension::ENABLED);
3857d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  }
3867d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  virtual void Verify() OVERRIDE {
3877d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    std::string actual = prefs()->pref_service()->GetString(kPref1);
3887d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    EXPECT_EQ("val1", actual);
3897d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  }
3907d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)};
3917d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)TEST_F(ControlledPrefsDisableExtension, ControlledPrefsReenableExtension) { }
3927d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
3937d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)// Mock class to test whether objects are deleted correctly.
3947d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)class MockStringValue : public StringValue {
3957d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) public:
3967d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  explicit MockStringValue(const std::string& in_value)
3977d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      : StringValue(in_value) {
3987d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  }
3997d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  virtual ~MockStringValue() {
4007d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    Die();
4017d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  }
4027d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  MOCK_METHOD0(Die, void());
4037d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)};
4047d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
4057d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)class ControlledPrefsSetExtensionControlledPref
4067d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    : public ExtensionControlledPrefsTest {
4077d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) public:
4087d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  virtual void Initialize() OVERRIDE {
4097d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    MockStringValue* v1 = new MockStringValue("https://www.chromium.org");
4107d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    MockStringValue* v2 = new MockStringValue("https://www.chromium.org");
4117d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    MockStringValue* v1i = new MockStringValue("https://www.chromium.org");
4127d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    MockStringValue* v2i = new MockStringValue("https://www.chromium.org");
4137d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    // Ownership is taken, value shall not be deleted.
4147d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    EXPECT_CALL(*v1, Die()).Times(0);
4157d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    EXPECT_CALL(*v1i, Die()).Times(0);
4167d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    InstallExtensionControlledPref(extension1(), kPref1, v1);
4177d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    InstallExtensionControlledPrefIncognito(extension1(), kPref1, v1i);
4187d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    testing::Mock::VerifyAndClearExpectations(v1);
4197d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    testing::Mock::VerifyAndClearExpectations(v1i);
4207d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    // Make sure there is no memory leak and both values are deleted.
4217d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    EXPECT_CALL(*v1, Die()).Times(1);
4227d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    EXPECT_CALL(*v1i, Die()).Times(1);
4237d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    EXPECT_CALL(*v2, Die()).Times(1);
4247d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    EXPECT_CALL(*v2i, Die()).Times(1);
4257d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    InstallExtensionControlledPref(extension1(), kPref1, v2);
4267d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    InstallExtensionControlledPrefIncognito(extension1(), kPref1, v2i);
4277d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    prefs_.RecreateExtensionPrefs();
4287d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    testing::Mock::VerifyAndClearExpectations(v1);
4297d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    testing::Mock::VerifyAndClearExpectations(v1i);
4307d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    testing::Mock::VerifyAndClearExpectations(v2);
4317d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    testing::Mock::VerifyAndClearExpectations(v2i);
4327d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  }
4337d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
4347d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  virtual void Verify() OVERRIDE {
4357d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  }
4367d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)};
4377d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)TEST_F(ControlledPrefsSetExtensionControlledPref,
4387d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)       ControlledPrefsSetExtensionControlledPref) { }
4397d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
4407d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)// Tests that the switches::kDisableExtensions command-line flag prevents
4417d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)// extension controlled preferences from being enacted.
4427d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)class ControlledPrefsDisableExtensions : public ExtensionControlledPrefsTest {
4437d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) public:
4447d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  ControlledPrefsDisableExtensions()
4457d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      : iteration_(0) {}
4467d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  virtual ~ControlledPrefsDisableExtensions() {}
4477d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  virtual void Initialize() OVERRIDE {
4487d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    InstallExtensionControlledPref(
4497d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)        extension1(), kPref1, Value::CreateStringValue("val1"));
4507d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    // This becomes only active in the second verification phase.
4517d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    prefs_.set_extensions_disabled(true);
4527d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  }
4537d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  virtual void Verify() OVERRIDE {
4547d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    std::string actual = prefs()->pref_service()->GetString(kPref1);
4557d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    if (iteration_ == 0) {
4567d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      EXPECT_EQ("val1", actual);
4577d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      ++iteration_;
4587d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    } else {
4597d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      EXPECT_EQ(kDefaultPref1, actual);
4607d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    }
4617d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  }
4627d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
4637d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) private:
4647d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  int iteration_;
4657d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)};
4667d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)TEST_F(ControlledPrefsDisableExtensions, ControlledPrefsDisableExtensions) { }
4677d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
4687d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)}  // namespace extensions
469