OLD | NEW |
(Empty) | |
| 1 // Copyright (c) 2010 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. |
| 4 |
| 5 #include <gtest/gtest.h> |
| 6 |
| 7 #include <string> |
| 8 #include <vector> |
| 9 |
| 10 #include "base/values.h" |
| 11 #include "chrome/browser/extensions/extension_pref_store.h" |
| 12 #include "chrome/browser/pref_service.h" |
| 13 #include "chrome/browser/pref_value_store.h" |
| 14 |
| 15 namespace { |
| 16 |
| 17 class TestExtensionPrefStore : public ExtensionPrefStore { |
| 18 public: |
| 19 TestExtensionPrefStore() : ExtensionPrefStore(NULL) {} |
| 20 |
| 21 typedef std::vector<std::string> ExtensionIDs; |
| 22 void GetExtensionIDList(ExtensionIDs* result) { |
| 23 GetExtensionIDs(result); |
| 24 } |
| 25 }; |
| 26 |
| 27 class MockPrefService : public PrefService { |
| 28 public: |
| 29 explicit MockPrefService(PrefValueStore* value_store) |
| 30 : PrefService(value_store) {} |
| 31 |
| 32 // Tracks whether the observers would have been notified. |
| 33 virtual void FireObserversIfChanged(const wchar_t* pref_name, |
| 34 const Value* old_value) { |
| 35 fired_observers_ = PrefIsChanged(pref_name, old_value); |
| 36 } |
| 37 |
| 38 bool fired_observers_; |
| 39 }; |
| 40 |
| 41 // Use static constants to avoid confusing std::map with hard-coded strings. |
| 42 static const wchar_t* kPref1 = L"path1.subpath"; |
| 43 static const wchar_t* kPref2 = L"path2"; |
| 44 static const wchar_t* kPref3 = L"path3"; |
| 45 static const wchar_t* kPref4 = L"path4"; |
| 46 |
| 47 } // namespace |
| 48 |
| 49 TEST(ExtensionPrefStoreTest, InstallOneExtension) { |
| 50 TestExtensionPrefStore eps; |
| 51 eps.InstallExtensionPref("id1", kPref1, Value::CreateStringValue("val1")); |
| 52 |
| 53 TestExtensionPrefStore::ExtensionIDs ids; |
| 54 eps.GetExtensionIDList(&ids); |
| 55 EXPECT_EQ(1u, ids.size()); |
| 56 EXPECT_EQ("id1", ids[0]); |
| 57 |
| 58 DictionaryValue* prefs = eps.prefs(); |
| 59 ASSERT_EQ(1u, prefs->size()); |
| 60 std::string actual; |
| 61 ASSERT_TRUE(prefs->GetString(kPref1, &actual)); |
| 62 EXPECT_EQ("val1", actual); |
| 63 } |
| 64 |
| 65 // Make sure the last-installed extension wins. |
| 66 TEST(ExtensionPrefStoreTest, InstallMultipleExtensions) { |
| 67 TestExtensionPrefStore eps; |
| 68 eps.InstallExtensionPref("id1", kPref1, Value::CreateStringValue("val1")); |
| 69 eps.InstallExtensionPref("id2", kPref1, Value::CreateStringValue("val2")); |
| 70 eps.InstallExtensionPref("id3", kPref1, Value::CreateStringValue("val3")); |
| 71 |
| 72 TestExtensionPrefStore::ExtensionIDs ids; |
| 73 eps.GetExtensionIDList(&ids); |
| 74 EXPECT_EQ(3u, ids.size()); |
| 75 EXPECT_EQ("id3", ids[0]); |
| 76 EXPECT_EQ("id2", ids[1]); |
| 77 EXPECT_EQ("id1", ids[2]); |
| 78 |
| 79 DictionaryValue* prefs = eps.prefs(); |
| 80 ASSERT_EQ(1u, prefs->size()); |
| 81 std::string actual; |
| 82 ASSERT_TRUE(prefs->GetString(kPref1, &actual)); |
| 83 EXPECT_EQ("val3", actual); |
| 84 } |
| 85 |
| 86 // Make sure the last-installed extension wins for each preference. |
| 87 TEST(ExtensionPrefStoreTest, InstallOverwrittenExtensions) { |
| 88 TestExtensionPrefStore eps; |
| 89 eps.InstallExtensionPref("id1", kPref1, Value::CreateStringValue("val1")); |
| 90 eps.InstallExtensionPref("id2", kPref1, Value::CreateStringValue("val2")); |
| 91 eps.InstallExtensionPref("id3", kPref1, Value::CreateStringValue("val3")); |
| 92 |
| 93 eps.InstallExtensionPref("id1", kPref2, Value::CreateStringValue("val4")); |
| 94 eps.InstallExtensionPref("id2", kPref2, Value::CreateStringValue("val5")); |
| 95 |
| 96 eps.InstallExtensionPref("id1", kPref1, Value::CreateStringValue("val6")); |
| 97 eps.InstallExtensionPref("id1", kPref2, Value::CreateStringValue("val7")); |
| 98 eps.InstallExtensionPref("id1", kPref3, Value::CreateStringValue("val8")); |
| 99 |
| 100 TestExtensionPrefStore::ExtensionIDs ids; |
| 101 eps.GetExtensionIDList(&ids); |
| 102 EXPECT_EQ(3u, ids.size()); |
| 103 EXPECT_EQ("id3", ids[0]); |
| 104 EXPECT_EQ("id2", ids[1]); |
| 105 EXPECT_EQ("id1", ids[2]); |
| 106 |
| 107 DictionaryValue* prefs = eps.prefs(); |
| 108 ASSERT_EQ(3u, prefs->size()); |
| 109 std::string actual; |
| 110 EXPECT_TRUE(prefs->GetString(kPref1, &actual)); |
| 111 EXPECT_EQ("val3", actual); |
| 112 EXPECT_TRUE(prefs->GetString(kPref2, &actual)); |
| 113 EXPECT_EQ("val5", actual); |
| 114 EXPECT_TRUE(prefs->GetString(kPref3, &actual)); |
| 115 EXPECT_EQ("val8", actual); |
| 116 } |
| 117 |
| 118 // Make sure the last-installed extension wins even if other extensions set |
| 119 // the same or different preferences later. |
| 120 TEST(ExtensionPrefStoreTest, InstallInterleavedExtensions) { |
| 121 TestExtensionPrefStore eps; |
| 122 eps.InstallExtensionPref("id1", kPref1, Value::CreateStringValue("val1")); |
| 123 eps.InstallExtensionPref("id2", kPref2, Value::CreateStringValue("val2")); |
| 124 eps.InstallExtensionPref("id3", kPref3, Value::CreateStringValue("val3")); |
| 125 |
| 126 eps.InstallExtensionPref("id3", kPref3, Value::CreateStringValue("val4")); |
| 127 eps.InstallExtensionPref("id2", kPref3, Value::CreateStringValue("val5")); |
| 128 eps.InstallExtensionPref("id1", kPref3, Value::CreateStringValue("val6")); |
| 129 |
| 130 eps.InstallExtensionPref("id3", kPref1, Value::CreateStringValue("val7")); |
| 131 |
| 132 TestExtensionPrefStore::ExtensionIDs ids; |
| 133 eps.GetExtensionIDList(&ids); |
| 134 EXPECT_EQ(3u, ids.size()); |
| 135 EXPECT_EQ("id3", ids[0]); |
| 136 EXPECT_EQ("id2", ids[1]); |
| 137 EXPECT_EQ("id1", ids[2]); |
| 138 |
| 139 DictionaryValue* prefs = eps.prefs(); |
| 140 ASSERT_EQ(3u, prefs->size()); |
| 141 std::string actual; |
| 142 EXPECT_TRUE(prefs->GetString(kPref1, &actual)); |
| 143 EXPECT_EQ("val7", actual); |
| 144 EXPECT_TRUE(prefs->GetString(kPref2, &actual)); |
| 145 EXPECT_EQ("val2", actual); |
| 146 EXPECT_TRUE(prefs->GetString(kPref3, &actual)); |
| 147 EXPECT_EQ("val4", actual); |
| 148 } |
| 149 |
| 150 TEST(ExtensionPrefStoreTest, UninstallOnlyExtension) { |
| 151 TestExtensionPrefStore eps; |
| 152 eps.InstallExtensionPref("id1", kPref1, Value::CreateStringValue("val1")); |
| 153 eps.InstallExtensionPref("id1", kPref2, Value::CreateStringValue("val2")); |
| 154 |
| 155 // No need to check the state here; the InstallOneExtension already has. |
| 156 eps.UninstallExtension("id1"); |
| 157 |
| 158 TestExtensionPrefStore::ExtensionIDs ids; |
| 159 eps.GetExtensionIDList(&ids); |
| 160 EXPECT_EQ(0u, ids.size()); |
| 161 |
| 162 DictionaryValue* prefs = eps.prefs(); |
| 163 std::string actual; |
| 164 // "path1.name" has been removed, but an empty "path1" dictionary is still |
| 165 // present. |
| 166 ASSERT_EQ(1u, prefs->size()); |
| 167 EXPECT_FALSE(prefs->GetString(kPref1, &actual)); |
| 168 EXPECT_FALSE(prefs->GetString(kPref2, &actual)); |
| 169 } |
| 170 |
| 171 // Tests uninstalling an extension that wasn't winning for any preferences. |
| 172 TEST(ExtensionPrefStoreTest, UninstallIrrelevantExtension) { |
| 173 TestExtensionPrefStore eps; |
| 174 eps.InstallExtensionPref("id1", kPref1, Value::CreateStringValue("val1")); |
| 175 eps.InstallExtensionPref("id2", kPref1, Value::CreateStringValue("val2")); |
| 176 |
| 177 eps.InstallExtensionPref("id1", kPref2, Value::CreateStringValue("val3")); |
| 178 eps.InstallExtensionPref("id2", kPref2, Value::CreateStringValue("val4")); |
| 179 |
| 180 eps.UninstallExtension("id1"); |
| 181 |
| 182 TestExtensionPrefStore::ExtensionIDs ids; |
| 183 eps.GetExtensionIDList(&ids); |
| 184 EXPECT_EQ(1u, ids.size()); |
| 185 EXPECT_EQ("id2", ids[0]); |
| 186 |
| 187 DictionaryValue* prefs = eps.prefs(); |
| 188 ASSERT_EQ(2u, prefs->size()); |
| 189 std::string actual; |
| 190 EXPECT_TRUE(prefs->GetString(kPref1, &actual)); |
| 191 EXPECT_EQ("val2", actual); |
| 192 EXPECT_TRUE(prefs->GetString(kPref2, &actual)); |
| 193 EXPECT_EQ("val4", actual); |
| 194 } |
| 195 |
| 196 // Tests uninstalling an extension that was winning for all preferences. |
| 197 TEST(ExtensionPrefStoreTest, UninstallExtensionFromTop) { |
| 198 TestExtensionPrefStore eps; |
| 199 eps.InstallExtensionPref("id1", kPref1, Value::CreateStringValue("val1")); |
| 200 eps.InstallExtensionPref("id2", kPref1, Value::CreateStringValue("val2")); |
| 201 eps.InstallExtensionPref("id3", kPref1, Value::CreateStringValue("val3")); |
| 202 |
| 203 eps.InstallExtensionPref("id1", kPref2, Value::CreateStringValue("val4")); |
| 204 eps.InstallExtensionPref("id3", kPref2, Value::CreateStringValue("val5")); |
| 205 |
| 206 eps.UninstallExtension("id3"); |
| 207 |
| 208 TestExtensionPrefStore::ExtensionIDs ids; |
| 209 eps.GetExtensionIDList(&ids); |
| 210 EXPECT_EQ(2u, ids.size()); |
| 211 EXPECT_EQ("id2", ids[0]); |
| 212 EXPECT_EQ("id1", ids[1]); |
| 213 |
| 214 DictionaryValue* prefs = eps.prefs(); |
| 215 ASSERT_EQ(2u, prefs->size()); |
| 216 std::string actual; |
| 217 EXPECT_TRUE(prefs->GetString(kPref1, &actual)); |
| 218 EXPECT_EQ("val2", actual); |
| 219 EXPECT_TRUE(prefs->GetString(kPref2, &actual)); |
| 220 EXPECT_EQ("val4", actual); |
| 221 } |
| 222 |
| 223 // Tests uninstalling an extension that was winning for only some preferences. |
| 224 TEST(ExtensionPrefStoreTest, UninstallExtensionFromMiddle) { |
| 225 TestExtensionPrefStore eps; |
| 226 eps.InstallExtensionPref("id1", kPref1, Value::CreateStringValue("val1")); |
| 227 eps.InstallExtensionPref("id2", kPref1, Value::CreateStringValue("val2")); |
| 228 eps.InstallExtensionPref("id3", kPref1, Value::CreateStringValue("val3")); |
| 229 |
| 230 eps.InstallExtensionPref("id1", kPref2, Value::CreateStringValue("val4")); |
| 231 eps.InstallExtensionPref("id2", kPref2, Value::CreateStringValue("val5")); |
| 232 |
| 233 eps.InstallExtensionPref("id1", kPref3, Value::CreateStringValue("val6")); |
| 234 |
| 235 eps.InstallExtensionPref("id2", kPref4, Value::CreateStringValue("val7")); |
| 236 |
| 237 eps.UninstallExtension("id2"); |
| 238 |
| 239 TestExtensionPrefStore::ExtensionIDs ids; |
| 240 eps.GetExtensionIDList(&ids); |
| 241 EXPECT_EQ(2u, ids.size()); |
| 242 EXPECT_EQ("id3", ids[0]); |
| 243 EXPECT_EQ("id1", ids[1]); |
| 244 |
| 245 DictionaryValue* prefs = eps.prefs(); |
| 246 ASSERT_EQ(3u, prefs->size()); |
| 247 std::string actual; |
| 248 EXPECT_TRUE(prefs->GetString(kPref1, &actual)); |
| 249 EXPECT_EQ("val3", actual); |
| 250 EXPECT_TRUE(prefs->GetString(kPref2, &actual)); |
| 251 EXPECT_EQ("val4", actual); |
| 252 EXPECT_TRUE(prefs->GetString(kPref3, &actual)); |
| 253 EXPECT_EQ("val6", actual); |
| 254 EXPECT_FALSE(prefs->GetString(kPref4, &actual)); |
| 255 } |
| 256 |
| 257 TEST(ExtensionPrefStoreTest, NotifyWhenNeeded) { |
| 258 TestExtensionPrefStore eps; |
| 259 |
| 260 // The PrefValueStore takes ownership of the PrefStores; in this case, that's |
| 261 // only an ExtensionPrefStore. |
| 262 PrefValueStore* value_store = new PrefValueStore(NULL, &eps, NULL, NULL); |
| 263 MockPrefService* pref_service = new MockPrefService(value_store); |
| 264 eps.SetPrefService(pref_service); |
| 265 pref_service->RegisterStringPref(kPref1, std::string()); |
| 266 |
| 267 eps.InstallExtensionPref("abc", kPref1, |
| 268 Value::CreateStringValue("https://www.chromium.org")); |
| 269 EXPECT_TRUE(pref_service->fired_observers_); |
| 270 eps.InstallExtensionPref("abc", kPref1, |
| 271 Value::CreateStringValue("https://www.chromium.org")); |
| 272 EXPECT_FALSE(pref_service->fired_observers_); |
| 273 eps.InstallExtensionPref("abc", kPref1, |
| 274 Value::CreateStringValue("chrome://newtab")); |
| 275 EXPECT_TRUE(pref_service->fired_observers_); |
| 276 |
| 277 eps.UninstallExtension("abc"); |
| 278 EXPECT_TRUE(pref_service->fired_observers_); |
| 279 } |
OLD | NEW |