Index: chrome/browser/extensions/extension_pref_store_unittest.cc |
diff --git a/chrome/browser/extensions/extension_pref_store_unittest.cc b/chrome/browser/extensions/extension_pref_store_unittest.cc |
index 90bed623ba78d4942840500f5c7aa4c271ec0674..2ffabaa353221841464e7b1cac0895974012aa46 100644 |
--- a/chrome/browser/extensions/extension_pref_store_unittest.cc |
+++ b/chrome/browser/extensions/extension_pref_store_unittest.cc |
@@ -21,6 +21,61 @@ namespace keys = extension_manifest_keys; |
namespace { |
+class TestExtensionPrefStore; |
+class MockPrefService; |
+ |
+// Use constants to avoid confusing std::map with hard-coded strings. |
+const char kPref1[] = "path1.subpath"; |
+const char kPref2[] = "path2"; |
+const char kPref3[] = "path3"; |
+const char kPref4[] = "path4"; |
+ |
+class ExtensionPrefStoreTest : public testing::Test { |
+ public: |
+ ExtensionPrefStoreTest() |
+ : ui_thread_(BrowserThread::UI, &message_loop_), |
+ eps_(NULL), |
+ dps_(NULL), |
+ value_store_(NULL), |
+ pref_service_(NULL) |
+ {} |
+ |
+ protected: |
+ virtual void SetUp(); |
+ virtual void TearDown(); |
+ |
+ MessageLoop message_loop_; |
+ BrowserThread ui_thread_; |
+ TestExtensionPrefStore* eps_; // Owned by value_store_. |
+ DefaultPrefStore* dps_; // Owned by value_store_. |
+ DefaultPrefStore* ups_; // Owned by value_store_. |
+ PrefValueStore* value_store_; // Owned by pref_service_. |
+ scoped_ptr<MockPrefService> pref_service_; |
+}; |
+ |
+// Mock PrefNotifier that allows the notifications to be tracked. |
+class MockPrefNotifier : public PrefNotifier { |
+ public: |
+ MockPrefNotifier(PrefService* service, PrefValueStore* value_store) |
+ : PrefNotifier(service, value_store) {} |
+ |
+ virtual ~MockPrefNotifier() {} |
+ |
+ MOCK_METHOD1(FireObservers, void(const char* path)); |
+}; |
+ |
+// Mock PrefService that allows the PrefNotifier to be injected. |
+class MockPrefService : public PrefService { |
+ public: |
+ explicit MockPrefService(PrefValueStore* pref_value_store) |
+ : PrefService(pref_value_store) { |
+ } |
+ |
+ void SetPrefNotifier(MockPrefNotifier* notifier) { |
+ pref_notifier_.reset(notifier); |
+ } |
+}; |
+ |
class TestExtensionPrefStore : public ExtensionPrefStore { |
public: |
TestExtensionPrefStore() |
@@ -65,10 +120,12 @@ class TestExtensionPrefStore : public ExtensionPrefStore { |
} |
// Overridden from ExtensionPrefStore. |
- virtual PrefService* GetPrefService() { |
+ virtual PrefService* GetPrefService() const { |
return pref_service_; |
} |
+ MOCK_METHOD0(SchedulePersist, void()); |
+ |
// Weak references, for convenience. |
Extension* ext1; |
Extension* ext2; |
@@ -85,45 +142,95 @@ class TestExtensionPrefStore : public ExtensionPrefStore { |
PrefService* pref_service_; |
}; |
-// Mock PrefNotifier that allows the notifications to be tracked. |
-class MockPrefNotifier : public PrefNotifier { |
- public: |
- MockPrefNotifier(PrefService* service, PrefValueStore* value_store) |
- : PrefNotifier(service, value_store) {} |
- virtual ~MockPrefNotifier() {} |
+void ExtensionPrefStoreTest::SetUp() { |
+ testing::Test::SetUp(); |
+ // NiceMock because only TestPersistence counts calls of mock methods. |
+ eps_ = new testing::NiceMock<TestExtensionPrefStore>; |
+ dps_ = new DefaultPrefStore; |
+ ups_ = new DefaultPrefStore; |
+ value_store_ = new TestingPrefService::TestingPrefValueStore( |
+ NULL, eps_, NULL, ups_, NULL, dps_); |
+ pref_service_.reset(new MockPrefService(value_store_)); |
+ eps_->SetPrefService(pref_service_.get()); |
+ |
+ pref_service_->RegisterStringPref(kPref1, "default pref 1"); |
+ pref_service_->RegisterStringPref(kPref2, "default pref 2"); |
+ pref_service_->RegisterStringPref(kPref3, "default pref 3"); |
+ pref_service_->RegisterStringPref(kPref4, "default pref 4"); |
+} |
- MOCK_METHOD1(FireObservers, void(const char* path)); |
-}; |
+void ExtensionPrefStoreTest::TearDown() { |
+ testing::Test::TearDown(); |
+ pref_service_.reset(NULL); // Frees eps_, dps_, value_store_. |
+} |
-// Mock PrefService that allows the PrefNotifier to be injected. |
-class MockPrefService : public PrefService { |
- public: |
- explicit MockPrefService(PrefValueStore* pref_value_store) |
- : PrefService(pref_value_store) { |
- } |
+} // namespace |
- void SetPrefNotifier(MockPrefNotifier* notifier) { |
- pref_notifier_.reset(notifier); |
- } |
-}; |
+TEST_F(ExtensionPrefStoreTest, ExtensionPrefs) { |
+ scoped_ptr<DictionaryValue> dict( |
+ ExtensionPrefStore::ExtensionPrefs::Create("ext1")); |
+ scoped_ptr<ExtensionPrefStore::ExtensionPrefs> ep( |
+ new ExtensionPrefStore::ExtensionPrefs(dict.release())); |
+ EXPECT_EQ("ext1", ep->extension_id()); |
+ EXPECT_EQ(0u, ep->pref_values()->size()); |
+ |
+ // test set/get |
+ ep->Set("key", Value::CreateStringValue("value")); |
+ std::string value; |
+ ASSERT_TRUE(ep->Get("key") != NULL); |
+ ASSERT_TRUE(ep->Get("key")->GetAsString(&value)); |
+ EXPECT_EQ("value", value); |
+ ASSERT_EQ(1u, ep->pref_values()->size()); |
+ EXPECT_EQ(NULL, ep->Get("non_existing_key")); |
+ |
+ // test delete |
+ ep->Set("key", NULL); |
+ ASSERT_EQ(NULL, ep->Get("key")); |
+ ASSERT_EQ(0u, ep->pref_values()->size()); |
+} |
-// Use constants to avoid confusing std::map with hard-coded strings. |
-const char kPref1[] = "path1.subpath"; |
-const char kPref2[] = "path2"; |
-const char kPref3[] = "path3"; |
-const char kPref4[] = "path4"; |
+TEST_F(ExtensionPrefStoreTest, ExtensionStack) { |
+ scoped_ptr<ListValue> extension_stack_list(new ListValue()); |
-} // namespace |
+ ExtensionPrefStore::ExtensionStack es; |
+ EXPECT_FALSE(es.IsInitialized()); |
+ es.Init(extension_stack_list.get()); |
+ ASSERT_TRUE(es.IsInitialized()); |
+ EXPECT_EQ(0u, es.Size()); |
+ |
+ ExtensionPrefStore::ExtensionPrefs tmp = es.CreateEntry("ext1"); |
+ ASSERT_EQ(1u, es.Size()); |
+ EXPECT_EQ("ext1", tmp.extension_id()); |
-TEST(ExtensionPrefStoreTest, InstallOneExtension) { |
- TestExtensionPrefStore eps; |
+ // See whether we can retrieve it as well without triggering a CHECK |
+ // exception. |
+ ExtensionPrefStore::ExtensionPrefs ep1 = es.Get(0); |
+ |
+ // Check whether it has been set up properly. |
+ EXPECT_EQ("ext1", ep1.extension_id()); |
+ |
+ ExtensionPrefStore::ExtensionPrefs ep2 = es.CreateEntry("ext2"); |
+ EXPECT_EQ("ext2", ep2.extension_id()); |
+ |
+ // Check that order is correct. |
+ EXPECT_EQ("ext2", es.Get(0).extension_id()); |
+ EXPECT_EQ("ext1", es.Get(1).extension_id()); |
+ |
+ // Check delete. |
+ es.Remove(0); |
+ EXPECT_EQ(1u, es.Size()); |
+ EXPECT_EQ("ext1", es.Get(0).extension_id()); |
+} |
+ |
+TEST_F(ExtensionPrefStoreTest, InstallOneExtension) { |
+ TestExtensionPrefStore& eps = *eps_; |
ASSERT_TRUE(eps.ext1 != NULL); |
eps.InstallExtensionPref(eps.ext1, kPref1, Value::CreateStringValue("val1")); |
TestExtensionPrefStore::ExtensionIDs ids; |
eps.GetExtensionIDList(&ids); |
- EXPECT_EQ(1u, ids.size()); |
+ ASSERT_EQ(1u, ids.size()); |
EXPECT_EQ(eps.ext1->id(), ids[0]); |
DictionaryValue* prefs = eps.prefs(); |
@@ -134,8 +241,8 @@ TEST(ExtensionPrefStoreTest, InstallOneExtension) { |
} |
// Make sure the last-installed extension wins. |
-TEST(ExtensionPrefStoreTest, InstallMultipleExtensions) { |
- TestExtensionPrefStore eps; |
+TEST_F(ExtensionPrefStoreTest, InstallMultipleExtensions) { |
+ TestExtensionPrefStore& eps = *eps_; |
ASSERT_TRUE(eps.ext1 != NULL); |
eps.InstallExtensionPref(eps.ext1, kPref1, Value::CreateStringValue("val1")); |
eps.InstallExtensionPref(eps.ext2, kPref1, Value::CreateStringValue("val2")); |
@@ -143,7 +250,7 @@ TEST(ExtensionPrefStoreTest, InstallMultipleExtensions) { |
TestExtensionPrefStore::ExtensionIDs ids; |
eps.GetExtensionIDList(&ids); |
- EXPECT_EQ(3u, ids.size()); |
+ ASSERT_EQ(3u, ids.size()); |
EXPECT_EQ(eps.ext3->id(), ids[0]); |
EXPECT_EQ(eps.ext2->id(), ids[1]); |
EXPECT_EQ(eps.ext1->id(), ids[2]); |
@@ -156,8 +263,8 @@ TEST(ExtensionPrefStoreTest, InstallMultipleExtensions) { |
} |
// Make sure the last-installed extension wins for each preference. |
-TEST(ExtensionPrefStoreTest, InstallOverwrittenExtensions) { |
- TestExtensionPrefStore eps; |
+TEST_F(ExtensionPrefStoreTest, InstallOverwrittenExtensions) { |
+ TestExtensionPrefStore& eps = *eps_; |
ASSERT_TRUE(eps.ext1 != NULL); |
eps.InstallExtensionPref(eps.ext1, kPref1, Value::CreateStringValue("val1")); |
eps.InstallExtensionPref(eps.ext2, kPref1, Value::CreateStringValue("val2")); |
@@ -172,7 +279,7 @@ TEST(ExtensionPrefStoreTest, InstallOverwrittenExtensions) { |
TestExtensionPrefStore::ExtensionIDs ids; |
eps.GetExtensionIDList(&ids); |
- EXPECT_EQ(3u, ids.size()); |
+ ASSERT_EQ(3u, ids.size()); |
EXPECT_EQ(eps.ext3->id(), ids[0]); |
EXPECT_EQ(eps.ext2->id(), ids[1]); |
EXPECT_EQ(eps.ext1->id(), ids[2]); |
@@ -190,8 +297,8 @@ TEST(ExtensionPrefStoreTest, InstallOverwrittenExtensions) { |
// Make sure the last-installed extension wins even if other extensions set |
// the same or different preferences later. |
-TEST(ExtensionPrefStoreTest, InstallInterleavedExtensions) { |
- TestExtensionPrefStore eps; |
+TEST_F(ExtensionPrefStoreTest, InstallInterleavedExtensions) { |
+ TestExtensionPrefStore& eps = *eps_; |
ASSERT_TRUE(eps.ext1 != NULL); |
eps.InstallExtensionPref(eps.ext1, kPref1, Value::CreateStringValue("val1")); |
eps.InstallExtensionPref(eps.ext2, kPref2, Value::CreateStringValue("val2")); |
@@ -205,7 +312,7 @@ TEST(ExtensionPrefStoreTest, InstallInterleavedExtensions) { |
TestExtensionPrefStore::ExtensionIDs ids; |
eps.GetExtensionIDList(&ids); |
- EXPECT_EQ(3u, ids.size()); |
+ ASSERT_EQ(3u, ids.size()); |
EXPECT_EQ(eps.ext3->id(), ids[0]); |
EXPECT_EQ(eps.ext2->id(), ids[1]); |
EXPECT_EQ(eps.ext1->id(), ids[2]); |
@@ -221,8 +328,8 @@ TEST(ExtensionPrefStoreTest, InstallInterleavedExtensions) { |
EXPECT_EQ("val4", actual); |
} |
-TEST(ExtensionPrefStoreTest, UninstallOnlyExtension) { |
- TestExtensionPrefStore eps; |
+TEST_F(ExtensionPrefStoreTest, UninstallOnlyExtension) { |
+ TestExtensionPrefStore& eps = *eps_; |
ASSERT_TRUE(eps.ext1 != NULL); |
eps.InstallExtensionPref(eps.ext1, kPref1, Value::CreateStringValue("val1")); |
eps.InstallExtensionPref(eps.ext1, kPref2, Value::CreateStringValue("val2")); |
@@ -244,8 +351,8 @@ TEST(ExtensionPrefStoreTest, UninstallOnlyExtension) { |
} |
// Tests uninstalling an extension that wasn't winning for any preferences. |
-TEST(ExtensionPrefStoreTest, UninstallIrrelevantExtension) { |
- TestExtensionPrefStore eps; |
+TEST_F(ExtensionPrefStoreTest, UninstallIrrelevantExtension) { |
+ TestExtensionPrefStore& eps = *eps_; |
ASSERT_TRUE(eps.ext1 != NULL); |
eps.InstallExtensionPref(eps.ext1, kPref1, Value::CreateStringValue("val1")); |
eps.InstallExtensionPref(eps.ext2, kPref1, Value::CreateStringValue("val2")); |
@@ -257,7 +364,7 @@ TEST(ExtensionPrefStoreTest, UninstallIrrelevantExtension) { |
TestExtensionPrefStore::ExtensionIDs ids; |
eps.GetExtensionIDList(&ids); |
- EXPECT_EQ(1u, ids.size()); |
+ ASSERT_EQ(1u, ids.size()); |
EXPECT_EQ(eps.ext2->id(), ids[0]); |
DictionaryValue* prefs = eps.prefs(); |
@@ -270,8 +377,8 @@ TEST(ExtensionPrefStoreTest, UninstallIrrelevantExtension) { |
} |
// Tests uninstalling an extension that was winning for all preferences. |
-TEST(ExtensionPrefStoreTest, UninstallExtensionFromTop) { |
- TestExtensionPrefStore eps; |
+TEST_F(ExtensionPrefStoreTest, UninstallExtensionFromTop) { |
+ TestExtensionPrefStore& eps = *eps_; |
ASSERT_TRUE(eps.ext1 != NULL); |
eps.InstallExtensionPref(eps.ext1, kPref1, Value::CreateStringValue("val1")); |
eps.InstallExtensionPref(eps.ext2, kPref1, Value::CreateStringValue("val2")); |
@@ -284,7 +391,7 @@ TEST(ExtensionPrefStoreTest, UninstallExtensionFromTop) { |
TestExtensionPrefStore::ExtensionIDs ids; |
eps.GetExtensionIDList(&ids); |
- EXPECT_EQ(2u, ids.size()); |
+ ASSERT_EQ(2u, ids.size()); |
EXPECT_EQ(eps.ext2->id(), ids[0]); |
EXPECT_EQ(eps.ext1->id(), ids[1]); |
@@ -298,8 +405,8 @@ TEST(ExtensionPrefStoreTest, UninstallExtensionFromTop) { |
} |
// Tests uninstalling an extension that was winning for only some preferences. |
-TEST(ExtensionPrefStoreTest, UninstallExtensionFromMiddle) { |
- TestExtensionPrefStore eps; |
+TEST_F(ExtensionPrefStoreTest, UninstallExtensionFromMiddle) { |
+ TestExtensionPrefStore& eps = *eps_; |
ASSERT_TRUE(eps.ext1 != NULL); |
eps.InstallExtensionPref(eps.ext1, kPref1, Value::CreateStringValue("val1")); |
eps.InstallExtensionPref(eps.ext2, kPref1, Value::CreateStringValue("val2")); |
@@ -316,7 +423,7 @@ TEST(ExtensionPrefStoreTest, UninstallExtensionFromMiddle) { |
TestExtensionPrefStore::ExtensionIDs ids; |
eps.GetExtensionIDList(&ids); |
- EXPECT_EQ(2u, ids.size()); |
+ ASSERT_EQ(2u, ids.size()); |
EXPECT_EQ(eps.ext3->id(), ids[0]); |
EXPECT_EQ(eps.ext1->id(), ids[1]); |
@@ -332,25 +439,17 @@ TEST(ExtensionPrefStoreTest, UninstallExtensionFromMiddle) { |
EXPECT_FALSE(prefs->GetString(kPref4, &actual)); |
} |
-TEST(ExtensionPrefStoreTest, NotifyWhenNeeded) { |
+TEST_F(ExtensionPrefStoreTest, NotifyWhenNeeded) { |
using testing::Mock; |
+ using testing::StrEq; |
- TestExtensionPrefStore* eps = new TestExtensionPrefStore; |
- DefaultPrefStore* dps = new DefaultPrefStore; |
+ TestExtensionPrefStore* eps = eps_; |
ASSERT_TRUE(eps->ext1 != NULL); |
- // The PrefValueStore takes ownership of the PrefStores; in this case, that's |
- // only an ExtensionPrefStore. Likewise, the PrefService takes ownership of |
- // the PrefValueStore and PrefNotifier. |
- PrefValueStore* value_store = new TestingPrefService::TestingPrefValueStore( |
- NULL, eps, NULL, NULL, NULL, dps); |
- scoped_ptr<MockPrefService> pref_service(new MockPrefService(value_store)); |
- MockPrefNotifier* pref_notifier = new MockPrefNotifier(pref_service.get(), |
- value_store); |
- pref_service->SetPrefNotifier(pref_notifier); |
- |
- eps->SetPrefService(pref_service.get()); |
- pref_service->RegisterStringPref(kPref1, std::string()); |
+ // The PrefService takes ownership of the PrefNotifier. |
+ MockPrefNotifier* pref_notifier = new MockPrefNotifier(pref_service_.get(), |
+ value_store_); |
+ pref_service_->SetPrefNotifier(pref_notifier); |
EXPECT_CALL(*pref_notifier, FireObservers(kPref1)); |
eps->InstallExtensionPref(eps->ext1, kPref1, |
@@ -362,8 +461,189 @@ TEST(ExtensionPrefStoreTest, NotifyWhenNeeded) { |
Value::CreateStringValue("https://www.chromium.org")); |
Mock::VerifyAndClearExpectations(pref_notifier); |
- EXPECT_CALL(*pref_notifier, FireObservers(kPref1)).Times(2); |
+ EXPECT_CALL(*pref_notifier, FireObservers(StrEq(kPref1))).Times(2); |
eps->InstallExtensionPref(eps->ext1, kPref1, |
Value::CreateStringValue("chrome://newtab")); |
eps->UninstallExtension(eps->ext1); |
} |
+ |
+// Make sure the precedence is respected when extensions are loaded |
+// and the precedence of extensions has been defined in the pref stores already. |
+TEST_F(ExtensionPrefStoreTest, InstallRegisteredExtensions) { |
+ TestExtensionPrefStore& eps = *eps_; |
+ ASSERT_TRUE(eps.ext1 != NULL); |
+ |
+ ListValue* extensionPrefs = new ListValue(); |
+ ups_->prefs()->Set(ExtensionPrefStore::kExtensionPreferencesKey, |
+ extensionPrefs); |
+ |
+ ExtensionPrefStore::ExtensionStack es; |
+ es.Init(extensionPrefs); |
+ |
+ ExtensionPrefStore::ExtensionPrefs ext3 = es.CreateEntry(eps.ext3->id()); |
+ ExtensionPrefStore::ExtensionPrefs ext1 = es.CreateEntry(eps.ext1->id()); |
+ ExtensionPrefStore::ExtensionPrefs ext2 = es.CreateEntry(eps.ext2->id()); |
+ // Precedence: 3 < 1 < 2 --> 3 wins. |
+ |
+ TestExtensionPrefStore::ExtensionIDs ids; |
+ eps.GetExtensionIDList(&ids); |
+ ASSERT_EQ(3u, ids.size()); |
+ EXPECT_EQ(eps.ext2->id(), ids[0]); |
+ EXPECT_EQ(eps.ext1->id(), ids[1]); |
+ EXPECT_EQ(eps.ext3->id(), ids[2]); |
+ |
+ eps.InstallExtensionPref(eps.ext1, kPref1, Value::CreateStringValue("val1")); |
+ { |
+ DictionaryValue* prefs = eps.prefs(); |
+ ASSERT_EQ(1u, prefs->size()); |
+ std::string actual; |
+ EXPECT_TRUE(prefs->GetString(kPref1, &actual)); |
+ EXPECT_EQ("val1", actual); |
+ } |
+ |
+ // ext2 has higher higher precedence --> override. |
+ eps.InstallExtensionPref(eps.ext2, kPref1, Value::CreateStringValue("val2")); |
+ { |
+ DictionaryValue* prefs = eps.prefs(); |
+ ASSERT_EQ(1u, prefs->size()); |
+ std::string actual; |
+ EXPECT_TRUE(prefs->GetString(kPref1, &actual)); |
+ EXPECT_EQ("val2", actual); |
+ } |
+ |
+ // ext3 has lower precedence --> does not override. |
+ eps.InstallExtensionPref(eps.ext3, kPref1, Value::CreateStringValue("val3")); |
+ { |
+ DictionaryValue* prefs = eps.prefs(); |
+ ASSERT_EQ(1u, prefs->size()); |
+ std::string actual; |
+ EXPECT_TRUE(prefs->GetString(kPref1, &actual)); |
+ EXPECT_EQ("val2", actual); |
+ } |
+ |
+ ids.clear(); |
+ eps.GetExtensionIDList(&ids); |
+ ASSERT_EQ(3u, ids.size()); |
+ EXPECT_EQ(eps.ext2->id(), ids[0]); |
+ EXPECT_EQ(eps.ext1->id(), ids[1]); |
+ EXPECT_EQ(eps.ext3->id(), ids[2]); |
+} |
+ |
+// Make sure the precedence is respected when extensions are loaded and |
+// uninstalled later. |
+TEST_F(ExtensionPrefStoreTest, UninstallRegisteredExtensions) { |
+ TestExtensionPrefStore& eps = *eps_; |
+ ASSERT_TRUE(eps.ext1 != NULL); |
+ |
+ ListValue *extensionPrefs = new ListValue(); |
+ ups_->prefs()->Set(ExtensionPrefStore::kExtensionPreferencesKey, |
+ extensionPrefs); |
+ |
+ ExtensionPrefStore::ExtensionStack es; |
+ es.Init(extensionPrefs); |
+ |
+ ExtensionPrefStore::ExtensionPrefs ext3 = es.CreateEntry(eps.ext3->id()); |
+ ExtensionPrefStore::ExtensionPrefs ext1 = es.CreateEntry(eps.ext1->id()); |
+ ExtensionPrefStore::ExtensionPrefs ext2 = es.CreateEntry(eps.ext2->id()); |
+ // precedence: 3 < 1 < 2 --> 3 wins |
+ |
+ eps.InstallExtensionPref(eps.ext1, kPref1, Value::CreateStringValue("val1")); |
+ eps.InstallExtensionPref(eps.ext2, kPref1, Value::CreateStringValue("val2")); |
+ eps.InstallExtensionPref(eps.ext3, kPref1, Value::CreateStringValue("val3")); |
+ |
+ // Correct state of this setup is ensured by InstallRegisteredExtensions test |
+ |
+ eps.UninstallExtension(eps.ext2); |
+ { |
+ DictionaryValue* prefs = eps.prefs(); |
+ ASSERT_EQ(1u, prefs->size()); |
+ std::string actual; |
+ EXPECT_TRUE(prefs->GetString(kPref1, &actual)); |
+ EXPECT_EQ("val1", actual); |
+ } |
+ |
+ TestExtensionPrefStore::ExtensionIDs ids; |
+ eps.GetExtensionIDList(&ids); |
+ ASSERT_EQ(2u, ids.size()); |
+ EXPECT_EQ(eps.ext1->id(), ids[0]); |
+ EXPECT_EQ(eps.ext3->id(), ids[1]); |
+} |
+ |
+// Make sure that preregistered preference values are available before extension |
+// is registered. |
+TEST_F(ExtensionPrefStoreTest, ReadFromRegisteredExtensions) { |
+ TestExtensionPrefStore& eps = *eps_; |
+ ASSERT_TRUE(eps.ext1 != NULL); |
+ |
+ ListValue *extensionPrefs = new ListValue(); |
+ ups_->prefs()->Set(ExtensionPrefStore::kExtensionPreferencesKey, |
+ extensionPrefs); |
+ |
+ ExtensionPrefStore::ExtensionStack es; |
+ es.Init(extensionPrefs); |
+ |
+ ExtensionPrefStore::ExtensionPrefs ext1 = es.CreateEntry(eps.ext1->id()); |
+ ext1.Set(kPref1, Value::CreateStringValue("val1")); |
+ |
+ TestExtensionPrefStore::ExtensionIDs ids; |
+ eps.GetExtensionIDList(&ids); |
+ ASSERT_EQ(1u, ids.size()); |
+ EXPECT_EQ(eps.ext1->id(), ids[0]); |
+ |
+ // Check value is available before extension is started. |
+ { |
+ DictionaryValue* prefs = eps.prefs(); |
+ ASSERT_EQ(1u, prefs->size()); |
+ std::string actual; |
+ EXPECT_TRUE(prefs->GetString(kPref1, &actual)); |
+ EXPECT_EQ("val1", actual); |
+ } |
+ |
+ // Check value can be overriden when extension is started. |
+ eps.InstallExtensionPref(eps.ext1, kPref1, Value::CreateStringValue("val2")); |
+ { |
+ DictionaryValue* prefs = eps.prefs(); |
+ ASSERT_EQ(1u, prefs->size()); |
+ std::string actual; |
+ EXPECT_TRUE(prefs->GetString(kPref1, &actual)); |
+ EXPECT_EQ("val2", actual); |
+ } |
+ |
+ ids.clear(); |
+ eps.GetExtensionIDList(&ids); |
+ ASSERT_EQ(1u, ids.size()); |
+ EXPECT_EQ(eps.ext1->id(), ids[0]); |
+} |
+ |
+TEST_F(ExtensionPrefStoreTest, TestPersistence) { |
+ // Check whether changes are persisted. |
+ using testing::Mock; |
+ |
+ TestExtensionPrefStore& eps = *eps_; |
+ |
+ // install pref |
+ EXPECT_CALL(eps, SchedulePersist()); |
+ eps.InstallExtensionPref(eps.ext1, kPref1, Value::CreateStringValue("val1")); |
+ Mock::VerifyAndClearExpectations(&eps); |
+ |
+ // overwrite by different extension |
+ EXPECT_CALL(eps, SchedulePersist()); |
+ eps.InstallExtensionPref(eps.ext2, kPref1, Value::CreateStringValue("val2")); |
+ Mock::VerifyAndClearExpectations(&eps); |
+ |
+ // overwrite |
+ EXPECT_CALL(eps, SchedulePersist()); |
+ eps.InstallExtensionPref(eps.ext1, kPref1, Value::CreateStringValue("val3")); |
+ Mock::VerifyAndClearExpectations(&eps); |
+ |
+ // add second pref |
+ EXPECT_CALL(eps, SchedulePersist()); |
+ eps.InstallExtensionPref(eps.ext1, kPref2, Value::CreateStringValue("val4")); |
+ Mock::VerifyAndClearExpectations(&eps); |
+ |
+ // uninstall |
+ EXPECT_CALL(eps, SchedulePersist()); |
+ eps.UninstallExtension(eps.ext1); |
+ Mock::VerifyAndClearExpectations(&eps); |
+} |
+ |