Chromium Code Reviews| 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..aa448f5fb264bb7f1f468b022ebb8fbd8f1f9289 100644 |
| --- a/chrome/browser/extensions/extension_pref_store_unittest.cc |
| +++ b/chrome/browser/extensions/extension_pref_store_unittest.cc |
| @@ -21,6 +21,60 @@ 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), |
|
Bernhard Bauer
2010/11/12 18:16:57
Nit: every parameter on its own line.
battre (please use the other)
2010/11/12 19:07:09
Done.
|
| + value_store_(NULL), pref_service_(NULL) {} |
| + |
| + protected: |
| + // Sets up the test fixture. |
|
Bernhard Bauer
2010/11/12 18:16:57
Nit: comment unnecessary.
battre (please use the other)
2010/11/12 19:07:09
Done.
|
| + virtual void SetUp(); |
| + |
| + // Tears down the test fixture. |
| + 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 +119,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 +141,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_); |
|
Bernhard Bauer
2010/11/12 18:16:57
I wouldn't be too opposed to keeping all parameter
battre (please use the other)
2010/11/12 19:07:09
Done.
|
| + 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::SetUp(); |
| + 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.is_initialized()); |
| + es.init(extension_stack_list.get()); |
| + ASSERT_TRUE(es.is_initialized()); |
| + 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 +240,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 +249,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 +262,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 +278,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 +296,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 +311,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 +327,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 +350,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 +363,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 +376,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 +390,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 +404,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 +422,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 +438,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 +460,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); |
|
Bernhard Bauer
2010/11/12 18:16:57
Nit: Just ASSERT_TRUE(eps.ext1);
battre (please use the other)
2010/11/12 19:07:09
did a grep over the source and ASSERT_TRUE(foo !=
|
| + |
| + ListValue *extensionPrefs = new ListValue(); |
|
Bernhard Bauer
2010/11/12 18:16:57
Nit: ListValue* extensionPrefs
battre (please use the other)
2010/11/12 19:07:09
Done.
|
| + 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); |
| +} |
| + |