diff options
Diffstat (limited to 'chromium/extensions/browser/extension_pref_value_map_unittest.cc')
-rw-r--r-- | chromium/extensions/browser/extension_pref_value_map_unittest.cc | 443 |
1 files changed, 443 insertions, 0 deletions
diff --git a/chromium/extensions/browser/extension_pref_value_map_unittest.cc b/chromium/extensions/browser/extension_pref_value_map_unittest.cc new file mode 100644 index 00000000000..984448ba63b --- /dev/null +++ b/chromium/extensions/browser/extension_pref_value_map_unittest.cc @@ -0,0 +1,443 @@ +// Copyright 2014 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include <stdint.h> + +#include "base/macros.h" +#include "base/memory/ref_counted.h" +#include "base/memory/scoped_ptr.h" +#include "base/values.h" +#include "components/prefs/pref_store_observer_mock.h" +#include "extensions/browser/extension_pref_value_map.h" +#include "testing/gmock/include/gmock/gmock.h" +#include "testing/gtest/include/gtest/gtest.h" + +namespace { +const char kExt1[] = "ext1"; +const char kExt2[] = "ext2"; +const char kExt3[] = "ext3"; + +const char kPref1[] = "path1.subpath"; +const char kPref2[] = "path2"; +const char kPref3[] = "path3"; +const char kPref4[] = "path4"; +} // namespace + +static base::Value* CreateVal(const char* str) { + return new base::StringValue(str); +} + +static base::Time CreateTime(int64_t t) { + return base::Time::FromInternalValue(t); +} + +template <typename BASECLASS> +class ExtensionPrefValueMapTestBase : public BASECLASS { + public: + static const extensions::ExtensionPrefsScope kRegular = + extensions::kExtensionPrefsScopeRegular; + static const extensions::ExtensionPrefsScope kRegularOnly = + extensions::kExtensionPrefsScopeRegularOnly; + static const extensions::ExtensionPrefsScope kIncognitoPersistent = + extensions::kExtensionPrefsScopeIncognitoPersistent; + static const extensions::ExtensionPrefsScope kIncognitoSessionOnly = + extensions::kExtensionPrefsScopeIncognitoSessionOnly; + + // Returns an empty string if the key is not set. + std::string GetValue(const char * key, bool incognito) const { + const base::Value *value = + epvm_.GetEffectivePrefValue(key, incognito, NULL); + std::string string_value; + if (value) + value->GetAsString(&string_value); + return string_value; + } + + // Registers the extension as enabled but without incognito permission. + void RegisterExtension(const std::string& ext_id, + const base::Time& install_time) { + epvm_.RegisterExtension( + ext_id, install_time, true /*enabled*/, false /*incognito*/); + } + + protected: + ExtensionPrefValueMap epvm_; +}; + +class ExtensionPrefValueMapTest + : public ExtensionPrefValueMapTestBase<testing::Test> { +}; + +// A gmock-ified implementation of PrefStore::Observer. +class ExtensionPrefValueMapObserverMock + : public ExtensionPrefValueMap::Observer { + public: + ExtensionPrefValueMapObserverMock() {} + virtual ~ExtensionPrefValueMapObserverMock() {} + + MOCK_METHOD1(OnPrefValueChanged, void(const std::string&)); + MOCK_METHOD0(OnInitializationCompleted, void()); + MOCK_METHOD0(OnExtensionPrefValueMapDestruction, void()); + + private: + DISALLOW_COPY_AND_ASSIGN(ExtensionPrefValueMapObserverMock); +}; + +TEST_F(ExtensionPrefValueMapTest, SetAndGetPrefValue) { + RegisterExtension(kExt1, CreateTime(10)); + epvm_.SetExtensionPref(kExt1, kPref1, kRegular, CreateVal("val1")); + EXPECT_EQ("val1", GetValue(kPref1, false)); +}; + +TEST_F(ExtensionPrefValueMapTest, GetNotSetPrefValue) { + RegisterExtension(kExt1, CreateTime(10)); + EXPECT_EQ(std::string(), GetValue(kPref1, false)); +}; + +// Make sure the last-installed extension wins for each preference. +TEST_F(ExtensionPrefValueMapTest, Override) { + RegisterExtension(kExt1, CreateTime(10)); + RegisterExtension(kExt2, CreateTime(20)); + RegisterExtension(kExt3, CreateTime(30)); + + epvm_.SetExtensionPref(kExt1, kPref1, kRegular, CreateVal("val1")); + epvm_.SetExtensionPref(kExt2, kPref1, kRegular, CreateVal("val2")); + epvm_.SetExtensionPref(kExt3, kPref1, kRegular, CreateVal("val3")); + + epvm_.SetExtensionPref(kExt1, kPref2, kRegular, CreateVal("val4")); + epvm_.SetExtensionPref(kExt2, kPref2, kRegular, CreateVal("val5")); + + epvm_.SetExtensionPref(kExt1, kPref1, kRegular, CreateVal("val6")); + epvm_.SetExtensionPref(kExt1, kPref2, kRegular, CreateVal("val7")); + epvm_.SetExtensionPref(kExt1, kPref3, kRegular, CreateVal("val8")); + + EXPECT_EQ("val3", GetValue(kPref1, false)); + EXPECT_EQ("val5", GetValue(kPref2, false)); + EXPECT_EQ("val8", GetValue(kPref3, false)); +} + +TEST_F(ExtensionPrefValueMapTest, OverrideChecks) { + RegisterExtension(kExt1, CreateTime(10)); + RegisterExtension(kExt2, CreateTime(20)); + RegisterExtension(kExt3, CreateTime(30)); + + EXPECT_FALSE(epvm_.DoesExtensionControlPref(kExt1, kPref1, NULL)); + EXPECT_FALSE(epvm_.DoesExtensionControlPref(kExt2, kPref1, NULL)); + EXPECT_FALSE(epvm_.DoesExtensionControlPref(kExt3, kPref1, NULL)); + EXPECT_TRUE(epvm_.CanExtensionControlPref(kExt1, kPref1, false)); + EXPECT_TRUE(epvm_.CanExtensionControlPref(kExt2, kPref1, false)); + EXPECT_TRUE(epvm_.CanExtensionControlPref(kExt3, kPref1, false)); + + epvm_.SetExtensionPref(kExt2, kPref1, kRegular, CreateVal("val1")); + + EXPECT_FALSE(epvm_.DoesExtensionControlPref(kExt1, kPref1, NULL)); + EXPECT_TRUE(epvm_.DoesExtensionControlPref(kExt2, kPref1, NULL)); + EXPECT_FALSE(epvm_.DoesExtensionControlPref(kExt3, kPref1, NULL)); + EXPECT_FALSE(epvm_.CanExtensionControlPref(kExt1, kPref1, false)); + EXPECT_TRUE(epvm_.CanExtensionControlPref(kExt2, kPref1, false)); + EXPECT_TRUE(epvm_.CanExtensionControlPref(kExt3, kPref1, false)); +} + +TEST_F(ExtensionPrefValueMapTest, SetAndGetPrefValueIncognito) { + RegisterExtension(kExt1, CreateTime(10)); + epvm_.SetExtensionPref(kExt1, kPref1, kRegular, CreateVal("val1")); + // Check that the value is not propagated until the extension gets incognito + // permission. + EXPECT_EQ(std::string(), GetValue(kPref1, true)); + epvm_.SetExtensionIncognitoState(kExt1, true); + EXPECT_EQ("val1", GetValue(kPref1, true)); + epvm_.SetExtensionIncognitoState(kExt1, false); + EXPECT_EQ(std::string(), GetValue(kPref1, true)); +} + +TEST_F(ExtensionPrefValueMapTest, UninstallOnlyExtension) { + RegisterExtension(kExt1, CreateTime(10)); + epvm_.SetExtensionPref(kExt1, kPref1, kRegular, CreateVal("val1")); + epvm_.UnregisterExtension(kExt1); + + EXPECT_EQ(std::string(), GetValue(kPref1, false)); +} + +// Tests uninstalling an extension that wasn't winning for any preferences. +TEST_F(ExtensionPrefValueMapTest, UninstallIrrelevantExtension) { + RegisterExtension(kExt1, CreateTime(10)); + RegisterExtension(kExt2, CreateTime(10)); + + epvm_.SetExtensionPref(kExt1, kPref1, kRegular, CreateVal("val1")); + epvm_.SetExtensionPref(kExt2, kPref1, kRegular, CreateVal("val2")); + + epvm_.SetExtensionPref(kExt1, kPref2, kRegular, CreateVal("val3")); + epvm_.SetExtensionPref(kExt2, kPref2, kRegular, CreateVal("val4")); + + epvm_.UnregisterExtension(kExt1); + + EXPECT_EQ("val2", GetValue(kPref1, false)); + EXPECT_EQ("val4", GetValue(kPref2, false)); +} + +// Tests uninstalling an extension that was winning for all preferences. +TEST_F(ExtensionPrefValueMapTest, UninstallExtensionFromTop) { + RegisterExtension(kExt1, CreateTime(10)); + RegisterExtension(kExt2, CreateTime(20)); + RegisterExtension(kExt3, CreateTime(30)); + + epvm_.SetExtensionPref(kExt1, kPref1, kRegular, CreateVal("val1")); + epvm_.SetExtensionPref(kExt2, kPref1, kRegular, CreateVal("val2")); + epvm_.SetExtensionPref(kExt3, kPref1, kRegular, CreateVal("val3")); + + epvm_.SetExtensionPref(kExt1, kPref2, kRegular, CreateVal("val4")); + epvm_.SetExtensionPref(kExt3, kPref2, kRegular, CreateVal("val5")); + + epvm_.UnregisterExtension(kExt3); + + EXPECT_EQ("val2", GetValue(kPref1, false)); + EXPECT_EQ("val4", GetValue(kPref2, false)); +} + +// Tests uninstalling an extension that was winning for only some preferences. +TEST_F(ExtensionPrefValueMapTest, UninstallExtensionFromMiddle) { + RegisterExtension(kExt1, CreateTime(10)); + RegisterExtension(kExt2, CreateTime(20)); + RegisterExtension(kExt3, CreateTime(30)); + + epvm_.SetExtensionPref(kExt1, kPref1, kRegular, CreateVal("val1")); + epvm_.SetExtensionPref(kExt2, kPref1, kRegular, CreateVal("val2")); + epvm_.SetExtensionPref(kExt3, kPref1, kRegular, CreateVal("val3")); + + epvm_.SetExtensionPref(kExt1, kPref2, kRegular, CreateVal("val4")); + epvm_.SetExtensionPref(kExt2, kPref2, kRegular, CreateVal("val5")); + + epvm_.SetExtensionPref(kExt1, kPref3, kRegular, CreateVal("val6")); + + epvm_.SetExtensionPref(kExt2, kPref4, kRegular, CreateVal("val7")); + + epvm_.UnregisterExtension(kExt2); + + EXPECT_EQ("val3", GetValue(kPref1, false)); + EXPECT_EQ("val4", GetValue(kPref2, false)); + EXPECT_EQ("val6", GetValue(kPref3, false)); + EXPECT_EQ(std::string(), GetValue(kPref4, false)); +} + +// Tests triggering of notifications to registered observers. +TEST_F(ExtensionPrefValueMapTest, NotifyWhenNeeded) { + using testing::Mock; + using testing::StrEq; + + RegisterExtension(kExt1, CreateTime(10)); + + ExtensionPrefValueMapObserverMock observer; + epvm_.AddObserver(&observer); + + EXPECT_CALL(observer, OnPrefValueChanged(std::string(kPref1))); + epvm_.SetExtensionPref(kExt1, kPref1, kRegular, CreateVal("val1")); + Mock::VerifyAndClearExpectations(&observer); + + // Write the same value again. + EXPECT_CALL(observer, OnPrefValueChanged(std::string(kPref1))).Times(0); + epvm_.SetExtensionPref(kExt1, kPref1, kRegular, CreateVal("val1")); + Mock::VerifyAndClearExpectations(&observer); + + // Override incognito value. + EXPECT_CALL(observer, OnPrefValueChanged(std::string(kPref1))); + epvm_.SetExtensionPref(kExt1, kPref1, kRegular, CreateVal("val2")); + Mock::VerifyAndClearExpectations(&observer); + + // Override non-incognito value. + EXPECT_CALL(observer, OnPrefValueChanged(std::string(kPref1))); + epvm_.SetExtensionPref(kExt1, kPref1, kRegular, CreateVal("val3")); + Mock::VerifyAndClearExpectations(&observer); + + // Disable. + EXPECT_CALL(observer, OnPrefValueChanged(std::string(kPref1))); + epvm_.SetExtensionState(kExt1, false); + Mock::VerifyAndClearExpectations(&observer); + + // Enable. + EXPECT_CALL(observer, OnPrefValueChanged(std::string(kPref1))); + epvm_.SetExtensionState(kExt1, true); + Mock::VerifyAndClearExpectations(&observer); + + // Uninstall + EXPECT_CALL(observer, OnPrefValueChanged(std::string(kPref1))); + epvm_.UnregisterExtension(kExt1); + Mock::VerifyAndClearExpectations(&observer); + + epvm_.RemoveObserver(&observer); + + // Write new value --> no notification after removing observer. + EXPECT_CALL(observer, OnPrefValueChanged(std::string(kPref1))).Times(0); + RegisterExtension(kExt1, CreateTime(10)); + epvm_.SetExtensionPref(kExt1, kPref1, kRegular, CreateVal("val4")); + Mock::VerifyAndClearExpectations(&observer); +} + +// Tests disabling an extension. +TEST_F(ExtensionPrefValueMapTest, DisableExt) { + RegisterExtension(kExt1, CreateTime(10)); + + epvm_.SetExtensionPref(kExt1, kPref1, kRegular, CreateVal("val1")); + epvm_.SetExtensionState(kExt1, false); + EXPECT_EQ(std::string(), GetValue(kPref1, false)); +} + +// Tests disabling and reenabling an extension. +TEST_F(ExtensionPrefValueMapTest, ReenableExt) { + RegisterExtension(kExt1, CreateTime(10)); + + epvm_.SetExtensionPref(kExt1, kPref1, kRegular, CreateVal("val1")); + epvm_.SetExtensionState(kExt1, false); + epvm_.SetExtensionState(kExt1, true); + EXPECT_EQ("val1", GetValue(kPref1, false)); +} + +struct OverrideIncognitoTestCase { + OverrideIncognitoTestCase(bool enable_ext1_in_incognito, + bool enable_ext2_in_incognito, + int val_ext1_regular, + int val_ext1_regular_only, + int val_ext1_incognito_pers, + int val_ext1_incognito_sess, + int val_ext2_regular, + int val_ext2_regular_only, + int val_ext2_incognito_pers, + int val_ext2_incognito_sess, + int effective_value_regular, + int effective_value_incognito) + : enable_ext1_in_incognito_(enable_ext1_in_incognito), + enable_ext2_in_incognito_(enable_ext2_in_incognito), + val_ext1_regular_(val_ext1_regular), + val_ext1_regular_only_(val_ext1_regular_only), + val_ext1_incognito_pers_(val_ext1_incognito_pers), + val_ext1_incognito_sess_(val_ext1_incognito_sess), + val_ext2_regular_(val_ext2_regular), + val_ext2_regular_only_(val_ext2_regular_only), + val_ext2_incognito_pers_(val_ext2_incognito_pers), + val_ext2_incognito_sess_(val_ext2_incognito_sess), + effective_value_regular_(effective_value_regular), + effective_value_incognito_(effective_value_incognito) {} + + bool enable_ext1_in_incognito_; + bool enable_ext2_in_incognito_; + + // pers. = persistent + // sess. = session only + int val_ext1_regular_; // pref value of extension 1 + int val_ext1_regular_only_; // pref value of extension 1 regular-only. + int val_ext1_incognito_pers_; // pref value of extension 1 incognito pers. + int val_ext1_incognito_sess_; // pref value of extension 1 incognito sess. + int val_ext2_regular_; // pref value of extension 2 + int val_ext2_regular_only_; // pref value of extension 2 regular-only. + int val_ext2_incognito_pers_; // pref value of extension 2 incognito pers. + int val_ext2_incognito_sess_; // pref value of extension 2 incognito sess. + int effective_value_regular_; // desired winner regular + int effective_value_incognito_; // desired winner incognito +}; + +class ExtensionPrefValueMapTestIncognitoTests + : public ExtensionPrefValueMapTestBase< + testing::TestWithParam<OverrideIncognitoTestCase> > { +}; + +TEST_P(ExtensionPrefValueMapTestIncognitoTests, OverrideIncognito) { + OverrideIncognitoTestCase test = GetParam(); + const char* strings[] = { + "", // undefined + "val1", + "val2", + "val3", + "val4", + "val5", + "val6", + "val7", + "val8", + }; + + const bool kEnabled = true; + epvm_.RegisterExtension( + kExt1, CreateTime(10), kEnabled, test.enable_ext1_in_incognito_); + epvm_.RegisterExtension( + kExt2, CreateTime(20), kEnabled, test.enable_ext2_in_incognito_); + if (test.val_ext1_regular_) { + epvm_.SetExtensionPref(kExt1, kPref1, kRegular, + CreateVal(strings[test.val_ext1_regular_])); + } + if (test.val_ext1_regular_only_) { + epvm_.SetExtensionPref(kExt1, kPref1, kRegularOnly, + CreateVal(strings[test.val_ext1_regular_only_])); + } + if (test.val_ext1_incognito_pers_) { + epvm_.SetExtensionPref(kExt1, kPref1, kIncognitoPersistent, + CreateVal(strings[test.val_ext1_incognito_pers_])); + } + if (test.val_ext1_incognito_sess_) { + epvm_.SetExtensionPref(kExt1, kPref1, kIncognitoSessionOnly, + CreateVal(strings[test.val_ext1_incognito_sess_])); + } + if (test.val_ext2_regular_) { + epvm_.SetExtensionPref(kExt2, kPref1, kRegular, + CreateVal(strings[test.val_ext2_regular_])); + } + if (test.val_ext2_regular_only_) { + epvm_.SetExtensionPref(kExt2, kPref1, kRegularOnly, + CreateVal(strings[test.val_ext2_regular_only_])); + } + if (test.val_ext2_incognito_pers_) { + epvm_.SetExtensionPref(kExt2, kPref1, kIncognitoPersistent, + CreateVal(strings[test.val_ext2_incognito_pers_])); + } + if (test.val_ext2_incognito_sess_) { + epvm_.SetExtensionPref(kExt2, kPref1, kIncognitoSessionOnly, + CreateVal(strings[test.val_ext2_incognito_sess_])); + } + std::string actual; + EXPECT_EQ(strings[test.effective_value_regular_], GetValue(kPref1, false)); + EXPECT_EQ(strings[test.effective_value_incognito_], GetValue(kPref1, true)); + epvm_.UnregisterExtension(kExt1); + epvm_.UnregisterExtension(kExt2); +} + +INSTANTIATE_TEST_CASE_P( + ExtensionPrefValueMapTestIncognitoTestsInstance, + ExtensionPrefValueMapTestIncognitoTests, + testing::Values( + // e.g. (true, 1, 0, 0, 0, 0, 0, 7, 0, 1, 7), means: + // ext1 regular is set to "val1", ext2 incognito persistent is set to + // "val7" + // --> the winning regular value is "val1", the winning incognito + // value is "val7". + OverrideIncognitoTestCase(true, true, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1), + OverrideIncognitoTestCase(true, true, 1, 2, 0, 0, 0, 0, 0, 0, 2, 1), + OverrideIncognitoTestCase(true, true, 1, 0, 3, 0, 0, 0, 0, 0, 1, 3), + OverrideIncognitoTestCase(true, true, 1, 0, 0, 4, 0, 0, 0, 0, 1, 4), + OverrideIncognitoTestCase(true, true, 1, 0, 3, 4, 0, 0, 0, 0, 1, 4), + OverrideIncognitoTestCase(true, true, 1, 2, 3, 0, 0, 0, 0, 0, 2, 3), + OverrideIncognitoTestCase(true, true, 1, 0, 0, 0, 5, 0, 0, 0, 5, 5), + OverrideIncognitoTestCase(true, true, 1, 2, 3, 0, 5, 0, 0, 0, 5, 5), + OverrideIncognitoTestCase(true, true, 1, 0, 0, 0, 0, 6, 0, 0, 6, 1), + OverrideIncognitoTestCase(true, true, 1, 0, 3, 0, 5, 6, 0, 0, 6, 5), + OverrideIncognitoTestCase(true, true, 1, 0, 0, 4, 5, 6, 0, 0, 6, 5), + OverrideIncognitoTestCase(true, true, 1, 0, 0, 0, 0, 0, 7, 0, 1, 7), + OverrideIncognitoTestCase(true, true, 1, 2, 0, 0, 5, 0, 7, 0, 5, 7), + OverrideIncognitoTestCase(true, true, 1, 2, 0, 0, 5, 0, 0, 8, 5, 8), + OverrideIncognitoTestCase(true, true, 1, 2, 0, 0, 5, 0, 7, 8, 5, 8), + OverrideIncognitoTestCase(true, true, 1, 2, 3, 0, 0, 6, 7, 0, 6, 7), + // Same tests as above but w/o incognito permission. + OverrideIncognitoTestCase(false, false, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0), + OverrideIncognitoTestCase(false, false, 1, 2, 0, 0, 0, 0, 0, 0, 2, 0), + OverrideIncognitoTestCase(false, false, 1, 0, 3, 0, 0, 0, 0, 0, 1, 0), + OverrideIncognitoTestCase(false, false, 1, 0, 0, 4, 0, 0, 0, 0, 1, 0), + OverrideIncognitoTestCase(false, false, 1, 0, 3, 4, 0, 0, 0, 0, 1, 0), + OverrideIncognitoTestCase(false, false, 1, 2, 3, 0, 0, 0, 0, 0, 2, 0), + OverrideIncognitoTestCase(false, false, 1, 0, 0, 0, 5, 0, 0, 0, 5, 0), + OverrideIncognitoTestCase(false, false, 1, 2, 3, 0, 5, 0, 0, 0, 5, 0), + OverrideIncognitoTestCase(false, false, 1, 0, 0, 0, 0, 6, 0, 0, 6, 0), + OverrideIncognitoTestCase(false, false, 1, 0, 3, 0, 5, 6, 0, 0, 6, 0), + OverrideIncognitoTestCase(false, false, 1, 0, 0, 4, 5, 6, 0, 0, 6, 0), + OverrideIncognitoTestCase(false, false, 1, 0, 0, 0, 0, 0, 7, 0, 1, 0), + OverrideIncognitoTestCase(false, false, 1, 2, 0, 0, 5, 0, 7, 0, 5, 0), + OverrideIncognitoTestCase(false, false, 1, 2, 0, 0, 5, 0, 0, 8, 5, 0), + OverrideIncognitoTestCase(false, false, 1, 2, 0, 0, 5, 0, 7, 8, 5, 0), + OverrideIncognitoTestCase(false, false, 1, 2, 3, 0, 0, 6, 7, 0, 6, 0) + )); |