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

Side by Side Diff: chrome/browser/extensions/extension_pref_store_unittest.cc

Issue 5213002: Fix for Bug 50726 "Save extension list and "winning" prefs from extensions" (Closed) Base URL: http://git.chromium.org/git/chromium.git@trunk
Patch Set: Same patch but without stuff that is already included in 5204006 Created 10 years 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 unified diff | Download patch | Annotate | Revision Log
OLDNEW
(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 <string>
6 #include <vector>
7
8 #include "base/scoped_ptr.h"
9 #include "base/scoped_temp_dir.h"
10 #include "base/values.h"
11 #include "chrome/browser/extensions/extension_pref_store.h"
12 #include "chrome/browser/prefs/in_memory_pref_store.h"
13 #include "chrome/browser/prefs/pref_service.h"
14 #include "chrome/browser/prefs/pref_value_store.h"
15 #include "chrome/common/extensions/extension.h"
16 #include "chrome/test/testing_pref_service.h"
17 #include "chrome/test/testing_pref_value_store.h"
18 #include "testing/gmock/include/gmock/gmock.h"
19 #include "testing/gtest/include/gtest/gtest.h"
20
21 namespace keys = extension_manifest_keys;
22
23 namespace {
24
25 class TestExtensionPrefStore : public ExtensionPrefStore {
26 public:
27 TestExtensionPrefStore()
28 : ExtensionPrefStore(NULL, PrefNotifier::EXTENSION_STORE),
29 ext1(NULL),
30 ext2(NULL),
31 ext3(NULL),
32 pref_service_(NULL) {
33 // Can't use ASSERT_TRUE here because a constructor can't return a value.
34 if (!temp_dir_.CreateUniqueTempDir()) {
35 ADD_FAILURE() << "Failed to create temp dir";
36 return;
37 }
38 DictionaryValue simple_dict;
39 std::string error;
40
41 simple_dict.SetString(keys::kVersion, "1.0.0.0");
42 simple_dict.SetString(keys::kName, "unused");
43
44 ext1_scoped_ = Extension::Create(
45 temp_dir_.path().AppendASCII("ext1"), Extension::INVALID,
46 simple_dict, false, &error);
47 ext2_scoped_ = Extension::Create(
48 temp_dir_.path().AppendASCII("ext2"), Extension::INVALID,
49 simple_dict, false, &error);
50 ext3_scoped_ = Extension::Create(
51 temp_dir_.path().AppendASCII("ext3"), Extension::INVALID,
52 simple_dict, false, &error);
53
54 ext1 = ext1_scoped_.get();
55 ext2 = ext2_scoped_.get();
56 ext3 = ext3_scoped_.get();
57 }
58
59 typedef std::vector<std::string> ExtensionIDs;
60 void GetExtensionIDList(ExtensionIDs* result) {
61 GetExtensionIDs(result);
62 }
63
64 void SetPrefService(PrefService* pref_service) {
65 pref_service_ = pref_service;
66 }
67
68 // Overridden from ExtensionPrefStore.
69 virtual PrefService* GetPrefService() {
70 return pref_service_;
71 }
72
73 // Weak references, for convenience.
74 Extension* ext1;
75 Extension* ext2;
76 Extension* ext3;
77
78 private:
79 ScopedTempDir temp_dir_;
80
81 scoped_refptr<Extension> ext1_scoped_;
82 scoped_refptr<Extension> ext2_scoped_;
83 scoped_refptr<Extension> ext3_scoped_;
84
85 // Weak reference.
86 PrefService* pref_service_;
87 };
88
89 // Mock PrefNotifier that allows the notifications to be tracked.
90 class MockPrefNotifier : public PrefNotifier {
91 public:
92 MockPrefNotifier(PrefService* service, PrefValueStore* value_store)
93 : PrefNotifier(service, value_store) {}
94
95 virtual ~MockPrefNotifier() {}
96
97 MOCK_METHOD1(FireObservers, void(const char* path));
98 };
99
100 // Mock PrefService that allows the PrefNotifier to be injected.
101 class MockPrefService : public PrefService {
102 public:
103 explicit MockPrefService(PrefValueStore* pref_value_store)
104 : PrefService(pref_value_store) {
105 }
106
107 void SetPrefNotifier(MockPrefNotifier* notifier) {
108 pref_notifier_.reset(notifier);
109 }
110 };
111
112 // Use constants to avoid confusing std::map with hard-coded strings.
113 const char kPref1[] = "path1.subpath";
114 const char kPref2[] = "path2";
115 const char kPref3[] = "path3";
116 const char kPref4[] = "path4";
117
118 } // namespace
119
120 TEST(ExtensionPrefStoreTest, InstallOneExtension) {
121 TestExtensionPrefStore eps;
122 ASSERT_TRUE(eps.ext1 != NULL);
123 eps.InstallExtensionPref(eps.ext1, kPref1, Value::CreateStringValue("val1"));
124
125 TestExtensionPrefStore::ExtensionIDs ids;
126 eps.GetExtensionIDList(&ids);
127 EXPECT_EQ(1u, ids.size());
128 EXPECT_EQ(eps.ext1->id(), ids[0]);
129
130 DictionaryValue* prefs = eps.prefs();
131 ASSERT_EQ(1u, prefs->size());
132 std::string actual;
133 ASSERT_TRUE(prefs->GetString(kPref1, &actual));
134 EXPECT_EQ("val1", actual);
135 }
136
137 // Make sure the last-installed extension wins.
138 TEST(ExtensionPrefStoreTest, InstallMultipleExtensions) {
139 TestExtensionPrefStore eps;
140 ASSERT_TRUE(eps.ext1 != NULL);
141 eps.InstallExtensionPref(eps.ext1, kPref1, Value::CreateStringValue("val1"));
142 eps.InstallExtensionPref(eps.ext2, kPref1, Value::CreateStringValue("val2"));
143 eps.InstallExtensionPref(eps.ext3, kPref1, Value::CreateStringValue("val3"));
144
145 TestExtensionPrefStore::ExtensionIDs ids;
146 eps.GetExtensionIDList(&ids);
147 EXPECT_EQ(3u, ids.size());
148 EXPECT_EQ(eps.ext3->id(), ids[0]);
149 EXPECT_EQ(eps.ext2->id(), ids[1]);
150 EXPECT_EQ(eps.ext1->id(), ids[2]);
151
152 DictionaryValue* prefs = eps.prefs();
153 ASSERT_EQ(1u, prefs->size());
154 std::string actual;
155 ASSERT_TRUE(prefs->GetString(kPref1, &actual));
156 EXPECT_EQ("val3", actual);
157 }
158
159 // Make sure the last-installed extension wins for each preference.
160 TEST(ExtensionPrefStoreTest, InstallOverwrittenExtensions) {
161 TestExtensionPrefStore eps;
162 ASSERT_TRUE(eps.ext1 != NULL);
163 eps.InstallExtensionPref(eps.ext1, kPref1, Value::CreateStringValue("val1"));
164 eps.InstallExtensionPref(eps.ext2, kPref1, Value::CreateStringValue("val2"));
165 eps.InstallExtensionPref(eps.ext3, kPref1, Value::CreateStringValue("val3"));
166
167 eps.InstallExtensionPref(eps.ext1, kPref2, Value::CreateStringValue("val4"));
168 eps.InstallExtensionPref(eps.ext2, kPref2, Value::CreateStringValue("val5"));
169
170 eps.InstallExtensionPref(eps.ext1, kPref1, Value::CreateStringValue("val6"));
171 eps.InstallExtensionPref(eps.ext1, kPref2, Value::CreateStringValue("val7"));
172 eps.InstallExtensionPref(eps.ext1, kPref3, Value::CreateStringValue("val8"));
173
174 TestExtensionPrefStore::ExtensionIDs ids;
175 eps.GetExtensionIDList(&ids);
176 EXPECT_EQ(3u, ids.size());
177 EXPECT_EQ(eps.ext3->id(), ids[0]);
178 EXPECT_EQ(eps.ext2->id(), ids[1]);
179 EXPECT_EQ(eps.ext1->id(), ids[2]);
180
181 DictionaryValue* prefs = eps.prefs();
182 ASSERT_EQ(3u, prefs->size());
183 std::string actual;
184 EXPECT_TRUE(prefs->GetString(kPref1, &actual));
185 EXPECT_EQ("val3", actual);
186 EXPECT_TRUE(prefs->GetString(kPref2, &actual));
187 EXPECT_EQ("val5", actual);
188 EXPECT_TRUE(prefs->GetString(kPref3, &actual));
189 EXPECT_EQ("val8", actual);
190 }
191
192 // Make sure the last-installed extension wins even if other extensions set
193 // the same or different preferences later.
194 TEST(ExtensionPrefStoreTest, InstallInterleavedExtensions) {
195 TestExtensionPrefStore eps;
196 ASSERT_TRUE(eps.ext1 != NULL);
197 eps.InstallExtensionPref(eps.ext1, kPref1, Value::CreateStringValue("val1"));
198 eps.InstallExtensionPref(eps.ext2, kPref2, Value::CreateStringValue("val2"));
199 eps.InstallExtensionPref(eps.ext3, kPref3, Value::CreateStringValue("val3"));
200
201 eps.InstallExtensionPref(eps.ext3, kPref3, Value::CreateStringValue("val4"));
202 eps.InstallExtensionPref(eps.ext2, kPref3, Value::CreateStringValue("val5"));
203 eps.InstallExtensionPref(eps.ext1, kPref3, Value::CreateStringValue("val6"));
204
205 eps.InstallExtensionPref(eps.ext3, kPref1, Value::CreateStringValue("val7"));
206
207 TestExtensionPrefStore::ExtensionIDs ids;
208 eps.GetExtensionIDList(&ids);
209 EXPECT_EQ(3u, ids.size());
210 EXPECT_EQ(eps.ext3->id(), ids[0]);
211 EXPECT_EQ(eps.ext2->id(), ids[1]);
212 EXPECT_EQ(eps.ext1->id(), ids[2]);
213
214 DictionaryValue* prefs = eps.prefs();
215 ASSERT_EQ(3u, prefs->size());
216 std::string actual;
217 EXPECT_TRUE(prefs->GetString(kPref1, &actual));
218 EXPECT_EQ("val7", actual);
219 EXPECT_TRUE(prefs->GetString(kPref2, &actual));
220 EXPECT_EQ("val2", actual);
221 EXPECT_TRUE(prefs->GetString(kPref3, &actual));
222 EXPECT_EQ("val4", actual);
223 }
224
225 TEST(ExtensionPrefStoreTest, UninstallOnlyExtension) {
226 TestExtensionPrefStore eps;
227 ASSERT_TRUE(eps.ext1 != NULL);
228 eps.InstallExtensionPref(eps.ext1, kPref1, Value::CreateStringValue("val1"));
229 eps.InstallExtensionPref(eps.ext1, kPref2, Value::CreateStringValue("val2"));
230
231 // No need to check the state here; the Install* tests cover that.
232 eps.UninstallExtension(eps.ext1);
233
234 TestExtensionPrefStore::ExtensionIDs ids;
235 eps.GetExtensionIDList(&ids);
236 EXPECT_EQ(0u, ids.size());
237
238 DictionaryValue* prefs = eps.prefs();
239 std::string actual;
240 // "path1.name" has been removed, but an empty "path1" dictionary is still
241 // present.
242 ASSERT_EQ(1u, prefs->size());
243 EXPECT_FALSE(prefs->GetString(kPref1, &actual));
244 EXPECT_FALSE(prefs->GetString(kPref2, &actual));
245 }
246
247 // Tests uninstalling an extension that wasn't winning for any preferences.
248 TEST(ExtensionPrefStoreTest, UninstallIrrelevantExtension) {
249 TestExtensionPrefStore eps;
250 ASSERT_TRUE(eps.ext1 != NULL);
251 eps.InstallExtensionPref(eps.ext1, kPref1, Value::CreateStringValue("val1"));
252 eps.InstallExtensionPref(eps.ext2, kPref1, Value::CreateStringValue("val2"));
253
254 eps.InstallExtensionPref(eps.ext1, kPref2, Value::CreateStringValue("val3"));
255 eps.InstallExtensionPref(eps.ext2, kPref2, Value::CreateStringValue("val4"));
256
257 eps.UninstallExtension(eps.ext1);
258
259 TestExtensionPrefStore::ExtensionIDs ids;
260 eps.GetExtensionIDList(&ids);
261 EXPECT_EQ(1u, ids.size());
262 EXPECT_EQ(eps.ext2->id(), ids[0]);
263
264 DictionaryValue* prefs = eps.prefs();
265 ASSERT_EQ(2u, prefs->size());
266 std::string actual;
267 EXPECT_TRUE(prefs->GetString(kPref1, &actual));
268 EXPECT_EQ("val2", actual);
269 EXPECT_TRUE(prefs->GetString(kPref2, &actual));
270 EXPECT_EQ("val4", actual);
271 }
272
273 // Tests uninstalling an extension that was winning for all preferences.
274 TEST(ExtensionPrefStoreTest, UninstallExtensionFromTop) {
275 TestExtensionPrefStore eps;
276 ASSERT_TRUE(eps.ext1 != NULL);
277 eps.InstallExtensionPref(eps.ext1, kPref1, Value::CreateStringValue("val1"));
278 eps.InstallExtensionPref(eps.ext2, kPref1, Value::CreateStringValue("val2"));
279 eps.InstallExtensionPref(eps.ext3, kPref1, Value::CreateStringValue("val3"));
280
281 eps.InstallExtensionPref(eps.ext1, kPref2, Value::CreateStringValue("val4"));
282 eps.InstallExtensionPref(eps.ext3, kPref2, Value::CreateStringValue("val5"));
283
284 eps.UninstallExtension(eps.ext3);
285
286 TestExtensionPrefStore::ExtensionIDs ids;
287 eps.GetExtensionIDList(&ids);
288 EXPECT_EQ(2u, ids.size());
289 EXPECT_EQ(eps.ext2->id(), ids[0]);
290 EXPECT_EQ(eps.ext1->id(), ids[1]);
291
292 DictionaryValue* prefs = eps.prefs();
293 ASSERT_EQ(2u, prefs->size());
294 std::string actual;
295 EXPECT_TRUE(prefs->GetString(kPref1, &actual));
296 EXPECT_EQ("val2", actual);
297 EXPECT_TRUE(prefs->GetString(kPref2, &actual));
298 EXPECT_EQ("val4", actual);
299 }
300
301 // Tests uninstalling an extension that was winning for only some preferences.
302 TEST(ExtensionPrefStoreTest, UninstallExtensionFromMiddle) {
303 TestExtensionPrefStore eps;
304 ASSERT_TRUE(eps.ext1 != NULL);
305 eps.InstallExtensionPref(eps.ext1, kPref1, Value::CreateStringValue("val1"));
306 eps.InstallExtensionPref(eps.ext2, kPref1, Value::CreateStringValue("val2"));
307 eps.InstallExtensionPref(eps.ext3, kPref1, Value::CreateStringValue("val3"));
308
309 eps.InstallExtensionPref(eps.ext1, kPref2, Value::CreateStringValue("val4"));
310 eps.InstallExtensionPref(eps.ext2, kPref2, Value::CreateStringValue("val5"));
311
312 eps.InstallExtensionPref(eps.ext1, kPref3, Value::CreateStringValue("val6"));
313
314 eps.InstallExtensionPref(eps.ext2, kPref4, Value::CreateStringValue("val7"));
315
316 eps.UninstallExtension(eps.ext2);
317
318 TestExtensionPrefStore::ExtensionIDs ids;
319 eps.GetExtensionIDList(&ids);
320 EXPECT_EQ(2u, ids.size());
321 EXPECT_EQ(eps.ext3->id(), ids[0]);
322 EXPECT_EQ(eps.ext1->id(), ids[1]);
323
324 DictionaryValue* prefs = eps.prefs();
325 ASSERT_EQ(3u, prefs->size());
326 std::string actual;
327 EXPECT_TRUE(prefs->GetString(kPref1, &actual));
328 EXPECT_EQ("val3", actual);
329 EXPECT_TRUE(prefs->GetString(kPref2, &actual));
330 EXPECT_EQ("val4", actual);
331 EXPECT_TRUE(prefs->GetString(kPref3, &actual));
332 EXPECT_EQ("val6", actual);
333 EXPECT_FALSE(prefs->GetString(kPref4, &actual));
334 }
335
336 TEST(ExtensionPrefStoreTest, NotifyWhenNeeded) {
337 using testing::Mock;
338
339 TestExtensionPrefStore* eps = new TestExtensionPrefStore;
340 InMemoryPrefStore* dps = new InMemoryPrefStore;
341 ASSERT_TRUE(eps->ext1 != NULL);
342
343 // The PrefValueStore takes ownership of the PrefStores; in this case, that's
344 // only an ExtensionPrefStore. Likewise, the PrefService takes ownership of
345 // the PrefValueStore and PrefNotifier.
346 PrefValueStore* value_store =
347 new TestingPrefValueStore(NULL, NULL, eps, NULL, NULL, NULL, dps);
348 scoped_ptr<MockPrefService> pref_service(new MockPrefService(value_store));
349 MockPrefNotifier* pref_notifier = new MockPrefNotifier(pref_service.get(),
350 value_store);
351 pref_service->SetPrefNotifier(pref_notifier);
352
353 eps->SetPrefService(pref_service.get());
354 pref_service->RegisterStringPref(kPref1, std::string());
355
356 EXPECT_CALL(*pref_notifier, FireObservers(kPref1));
357 eps->InstallExtensionPref(eps->ext1, kPref1,
358 Value::CreateStringValue("https://www.chromium.org"));
359 Mock::VerifyAndClearExpectations(pref_notifier);
360
361 EXPECT_CALL(*pref_notifier, FireObservers(kPref1)).Times(0);
362 eps->InstallExtensionPref(eps->ext1, kPref1,
363 Value::CreateStringValue("https://www.chromium.org"));
364 Mock::VerifyAndClearExpectations(pref_notifier);
365
366 EXPECT_CALL(*pref_notifier, FireObservers(kPref1)).Times(2);
367 eps->InstallExtensionPref(eps->ext1, kPref1,
368 Value::CreateStringValue("chrome://newtab"));
369 eps->UninstallExtension(eps->ext1);
370 }
OLDNEW
« no previous file with comments | « chrome/browser/extensions/extension_pref_store.cc ('k') | chrome/browser/extensions/extension_prefs.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698