Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(256)

Unified Diff: chrome/browser/extensions/extension_pref_store_unittest.cc

Issue 2823037: Add an ExtensionPrefStore, layered between the user prefs nad the managed pre... (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src/
Patch Set: '' Created 10 years, 5 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: chrome/browser/extensions/extension_pref_store_unittest.cc
===================================================================
--- chrome/browser/extensions/extension_pref_store_unittest.cc (revision 0)
+++ chrome/browser/extensions/extension_pref_store_unittest.cc (revision 0)
@@ -0,0 +1,279 @@
+// Copyright (c) 2010 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 <gtest/gtest.h>
+
+#include <string>
+#include <vector>
+
+#include "base/values.h"
+#include "chrome/browser/extensions/extension_pref_store.h"
+#include "chrome/browser/pref_service.h"
+#include "chrome/browser/pref_value_store.h"
+
+namespace {
+
+class TestExtensionPrefStore : public ExtensionPrefStore {
+ public:
+ TestExtensionPrefStore() : ExtensionPrefStore(NULL) {}
+
+ typedef std::vector<std::string> ExtensionIDs;
+ void GetExtensionIDList(ExtensionIDs* result) {
+ GetExtensionIDs(result);
+ }
+};
+
+class MockPrefService : public PrefService {
+ public:
+ explicit MockPrefService(PrefValueStore* value_store)
+ : PrefService(value_store) {}
+
+ // Tracks whether the observers would have been notified.
+ virtual void FireObserversIfChanged(const wchar_t* pref_name,
+ const Value* old_value) {
+ fired_observers_ = PrefIsChanged(pref_name, old_value);
+ }
+
+ bool fired_observers_;
+};
+
+// Use static constants to avoid confusing std::map with hard-coded strings.
+static const wchar_t* kPref1 = L"path1.subpath";
+static const wchar_t* kPref2 = L"path2";
+static const wchar_t* kPref3 = L"path3";
+static const wchar_t* kPref4 = L"path4";
+
+} // namespace
+
+TEST(ExtensionPrefStoreTest, InstallOneExtension) {
+ TestExtensionPrefStore eps;
+ eps.InstallExtensionPref("id1", kPref1, Value::CreateStringValue("val1"));
+
+ TestExtensionPrefStore::ExtensionIDs ids;
+ eps.GetExtensionIDList(&ids);
+ EXPECT_EQ(1u, ids.size());
+ EXPECT_EQ("id1", ids[0]);
+
+ DictionaryValue* prefs = eps.prefs();
+ ASSERT_EQ(1u, prefs->size());
+ std::string actual;
+ ASSERT_TRUE(prefs->GetString(kPref1, &actual));
+ EXPECT_EQ("val1", actual);
+}
+
+// Make sure the last-installed extension wins.
+TEST(ExtensionPrefStoreTest, InstallMultipleExtensions) {
+ TestExtensionPrefStore eps;
+ eps.InstallExtensionPref("id1", kPref1, Value::CreateStringValue("val1"));
+ eps.InstallExtensionPref("id2", kPref1, Value::CreateStringValue("val2"));
+ eps.InstallExtensionPref("id3", kPref1, Value::CreateStringValue("val3"));
+
+ TestExtensionPrefStore::ExtensionIDs ids;
+ eps.GetExtensionIDList(&ids);
+ EXPECT_EQ(3u, ids.size());
+ EXPECT_EQ("id3", ids[0]);
+ EXPECT_EQ("id2", ids[1]);
+ EXPECT_EQ("id1", ids[2]);
+
+ DictionaryValue* prefs = eps.prefs();
+ ASSERT_EQ(1u, prefs->size());
+ std::string actual;
+ ASSERT_TRUE(prefs->GetString(kPref1, &actual));
+ EXPECT_EQ("val3", actual);
+}
+
+// Make sure the last-installed extension wins for each preference.
+TEST(ExtensionPrefStoreTest, InstallOverwrittenExtensions) {
+ TestExtensionPrefStore eps;
+ eps.InstallExtensionPref("id1", kPref1, Value::CreateStringValue("val1"));
+ eps.InstallExtensionPref("id2", kPref1, Value::CreateStringValue("val2"));
+ eps.InstallExtensionPref("id3", kPref1, Value::CreateStringValue("val3"));
+
+ eps.InstallExtensionPref("id1", kPref2, Value::CreateStringValue("val4"));
+ eps.InstallExtensionPref("id2", kPref2, Value::CreateStringValue("val5"));
+
+ eps.InstallExtensionPref("id1", kPref1, Value::CreateStringValue("val6"));
+ eps.InstallExtensionPref("id1", kPref2, Value::CreateStringValue("val7"));
+ eps.InstallExtensionPref("id1", kPref3, Value::CreateStringValue("val8"));
+
+ TestExtensionPrefStore::ExtensionIDs ids;
+ eps.GetExtensionIDList(&ids);
+ EXPECT_EQ(3u, ids.size());
+ EXPECT_EQ("id3", ids[0]);
+ EXPECT_EQ("id2", ids[1]);
+ EXPECT_EQ("id1", ids[2]);
+
+ DictionaryValue* prefs = eps.prefs();
+ ASSERT_EQ(3u, prefs->size());
+ std::string actual;
+ EXPECT_TRUE(prefs->GetString(kPref1, &actual));
+ EXPECT_EQ("val3", actual);
+ EXPECT_TRUE(prefs->GetString(kPref2, &actual));
+ EXPECT_EQ("val5", actual);
+ EXPECT_TRUE(prefs->GetString(kPref3, &actual));
+ EXPECT_EQ("val8", actual);
+}
+
+// Make sure the last-installed extension wins even if other extensions set
+// the same or different preferences later.
+TEST(ExtensionPrefStoreTest, InstallInterleavedExtensions) {
+ TestExtensionPrefStore eps;
+ eps.InstallExtensionPref("id1", kPref1, Value::CreateStringValue("val1"));
+ eps.InstallExtensionPref("id2", kPref2, Value::CreateStringValue("val2"));
+ eps.InstallExtensionPref("id3", kPref3, Value::CreateStringValue("val3"));
+
+ eps.InstallExtensionPref("id3", kPref3, Value::CreateStringValue("val4"));
+ eps.InstallExtensionPref("id2", kPref3, Value::CreateStringValue("val5"));
+ eps.InstallExtensionPref("id1", kPref3, Value::CreateStringValue("val6"));
+
+ eps.InstallExtensionPref("id3", kPref1, Value::CreateStringValue("val7"));
+
+ TestExtensionPrefStore::ExtensionIDs ids;
+ eps.GetExtensionIDList(&ids);
+ EXPECT_EQ(3u, ids.size());
+ EXPECT_EQ("id3", ids[0]);
+ EXPECT_EQ("id2", ids[1]);
+ EXPECT_EQ("id1", ids[2]);
+
+ DictionaryValue* prefs = eps.prefs();
+ ASSERT_EQ(3u, prefs->size());
+ std::string actual;
+ EXPECT_TRUE(prefs->GetString(kPref1, &actual));
+ EXPECT_EQ("val7", actual);
+ EXPECT_TRUE(prefs->GetString(kPref2, &actual));
+ EXPECT_EQ("val2", actual);
+ EXPECT_TRUE(prefs->GetString(kPref3, &actual));
+ EXPECT_EQ("val4", actual);
+}
+
+TEST(ExtensionPrefStoreTest, UninstallOnlyExtension) {
+ TestExtensionPrefStore eps;
+ eps.InstallExtensionPref("id1", kPref1, Value::CreateStringValue("val1"));
+ eps.InstallExtensionPref("id1", kPref2, Value::CreateStringValue("val2"));
+
+ // No need to check the state here; the InstallOneExtension already has.
+ eps.UninstallExtension("id1");
+
+ TestExtensionPrefStore::ExtensionIDs ids;
+ eps.GetExtensionIDList(&ids);
+ EXPECT_EQ(0u, ids.size());
+
+ DictionaryValue* prefs = eps.prefs();
+ std::string actual;
+ // "path1.name" has been removed, but an empty "path1" dictionary is still
+ // present.
+ ASSERT_EQ(1u, prefs->size());
+ EXPECT_FALSE(prefs->GetString(kPref1, &actual));
+ EXPECT_FALSE(prefs->GetString(kPref2, &actual));
+}
+
+// Tests uninstalling an extension that wasn't winning for any preferences.
+TEST(ExtensionPrefStoreTest, UninstallIrrelevantExtension) {
+ TestExtensionPrefStore eps;
+ eps.InstallExtensionPref("id1", kPref1, Value::CreateStringValue("val1"));
+ eps.InstallExtensionPref("id2", kPref1, Value::CreateStringValue("val2"));
+
+ eps.InstallExtensionPref("id1", kPref2, Value::CreateStringValue("val3"));
+ eps.InstallExtensionPref("id2", kPref2, Value::CreateStringValue("val4"));
+
+ eps.UninstallExtension("id1");
+
+ TestExtensionPrefStore::ExtensionIDs ids;
+ eps.GetExtensionIDList(&ids);
+ EXPECT_EQ(1u, ids.size());
+ EXPECT_EQ("id2", ids[0]);
+
+ DictionaryValue* prefs = eps.prefs();
+ ASSERT_EQ(2u, prefs->size());
+ std::string actual;
+ EXPECT_TRUE(prefs->GetString(kPref1, &actual));
+ EXPECT_EQ("val2", actual);
+ EXPECT_TRUE(prefs->GetString(kPref2, &actual));
+ EXPECT_EQ("val4", actual);
+}
+
+// Tests uninstalling an extension that was winning for all preferences.
+TEST(ExtensionPrefStoreTest, UninstallExtensionFromTop) {
+ TestExtensionPrefStore eps;
+ eps.InstallExtensionPref("id1", kPref1, Value::CreateStringValue("val1"));
+ eps.InstallExtensionPref("id2", kPref1, Value::CreateStringValue("val2"));
+ eps.InstallExtensionPref("id3", kPref1, Value::CreateStringValue("val3"));
+
+ eps.InstallExtensionPref("id1", kPref2, Value::CreateStringValue("val4"));
+ eps.InstallExtensionPref("id3", kPref2, Value::CreateStringValue("val5"));
+
+ eps.UninstallExtension("id3");
+
+ TestExtensionPrefStore::ExtensionIDs ids;
+ eps.GetExtensionIDList(&ids);
+ EXPECT_EQ(2u, ids.size());
+ EXPECT_EQ("id2", ids[0]);
+ EXPECT_EQ("id1", ids[1]);
+
+ DictionaryValue* prefs = eps.prefs();
+ ASSERT_EQ(2u, prefs->size());
+ std::string actual;
+ EXPECT_TRUE(prefs->GetString(kPref1, &actual));
+ EXPECT_EQ("val2", actual);
+ EXPECT_TRUE(prefs->GetString(kPref2, &actual));
+ EXPECT_EQ("val4", actual);
+}
+
+// Tests uninstalling an extension that was winning for only some preferences.
+TEST(ExtensionPrefStoreTest, UninstallExtensionFromMiddle) {
+ TestExtensionPrefStore eps;
+ eps.InstallExtensionPref("id1", kPref1, Value::CreateStringValue("val1"));
+ eps.InstallExtensionPref("id2", kPref1, Value::CreateStringValue("val2"));
+ eps.InstallExtensionPref("id3", kPref1, Value::CreateStringValue("val3"));
+
+ eps.InstallExtensionPref("id1", kPref2, Value::CreateStringValue("val4"));
+ eps.InstallExtensionPref("id2", kPref2, Value::CreateStringValue("val5"));
+
+ eps.InstallExtensionPref("id1", kPref3, Value::CreateStringValue("val6"));
+
+ eps.InstallExtensionPref("id2", kPref4, Value::CreateStringValue("val7"));
+
+ eps.UninstallExtension("id2");
+
+ TestExtensionPrefStore::ExtensionIDs ids;
+ eps.GetExtensionIDList(&ids);
+ EXPECT_EQ(2u, ids.size());
+ EXPECT_EQ("id3", ids[0]);
+ EXPECT_EQ("id1", ids[1]);
+
+ DictionaryValue* prefs = eps.prefs();
+ ASSERT_EQ(3u, prefs->size());
+ std::string actual;
+ EXPECT_TRUE(prefs->GetString(kPref1, &actual));
+ EXPECT_EQ("val3", actual);
+ EXPECT_TRUE(prefs->GetString(kPref2, &actual));
+ EXPECT_EQ("val4", actual);
+ EXPECT_TRUE(prefs->GetString(kPref3, &actual));
+ EXPECT_EQ("val6", actual);
+ EXPECT_FALSE(prefs->GetString(kPref4, &actual));
+}
+
+TEST(ExtensionPrefStoreTest, NotifyWhenNeeded) {
+ TestExtensionPrefStore eps;
+
+ // The PrefValueStore takes ownership of the PrefStores; in this case, that's
+ // only an ExtensionPrefStore.
+ PrefValueStore* value_store = new PrefValueStore(NULL, &eps, NULL, NULL);
+ MockPrefService* pref_service = new MockPrefService(value_store);
+ eps.SetPrefService(pref_service);
+ pref_service->RegisterStringPref(kPref1, std::string());
+
+ eps.InstallExtensionPref("abc", kPref1,
+ Value::CreateStringValue("https://www.chromium.org"));
+ EXPECT_TRUE(pref_service->fired_observers_);
+ eps.InstallExtensionPref("abc", kPref1,
+ Value::CreateStringValue("https://www.chromium.org"));
+ EXPECT_FALSE(pref_service->fired_observers_);
+ eps.InstallExtensionPref("abc", kPref1,
+ Value::CreateStringValue("chrome://newtab"));
+ EXPECT_TRUE(pref_service->fired_observers_);
+
+ eps.UninstallExtension("abc");
+ EXPECT_TRUE(pref_service->fired_observers_);
+}
Property changes on: chrome\browser\extensions\extension_pref_store_unittest.cc
___________________________________________________________________
Added: svn:eol-style
+ LF
« no previous file with comments | « chrome/browser/extensions/extension_pref_store.cc ('k') | chrome/browser/extensions/extensions_service_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698