OLD | NEW |
| (Empty) |
1 // Copyright (c) 2012 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 "base/basictypes.h" | |
6 #include "base/memory/ref_counted.h" | |
7 #include "base/memory/scoped_ptr.h" | |
8 #include "base/prefs/pref_store_observer_mock.h" | |
9 #include "base/values.h" | |
10 #include "chrome/browser/extensions/extension_pref_value_map.h" | |
11 #include "testing/gmock/include/gmock/gmock.h" | |
12 #include "testing/gtest/include/gtest/gtest.h" | |
13 | |
14 namespace { | |
15 const char kExt1[] = "ext1"; | |
16 const char kExt2[] = "ext2"; | |
17 const char kExt3[] = "ext3"; | |
18 | |
19 const char kPref1[] = "path1.subpath"; | |
20 const char kPref2[] = "path2"; | |
21 const char kPref3[] = "path3"; | |
22 const char kPref4[] = "path4"; | |
23 } // namespace | |
24 | |
25 static base::Value* CreateVal(const char* str) { | |
26 return new base::StringValue(str); | |
27 } | |
28 | |
29 static base::Time CreateTime(int64 t) { | |
30 return base::Time::FromInternalValue(t); | |
31 } | |
32 | |
33 template <typename BASECLASS> | |
34 class ExtensionPrefValueMapTestBase : public BASECLASS { | |
35 public: | |
36 static const extensions::ExtensionPrefsScope kRegular = | |
37 extensions::kExtensionPrefsScopeRegular; | |
38 static const extensions::ExtensionPrefsScope kRegularOnly = | |
39 extensions::kExtensionPrefsScopeRegularOnly; | |
40 static const extensions::ExtensionPrefsScope kIncognitoPersistent = | |
41 extensions::kExtensionPrefsScopeIncognitoPersistent; | |
42 static const extensions::ExtensionPrefsScope kIncognitoSessionOnly = | |
43 extensions::kExtensionPrefsScopeIncognitoSessionOnly; | |
44 | |
45 // Returns an empty string if the key is not set. | |
46 std::string GetValue(const char * key, bool incognito) const { | |
47 const base::Value *value = | |
48 epvm_.GetEffectivePrefValue(key, incognito, NULL); | |
49 std::string string_value; | |
50 if (value) | |
51 value->GetAsString(&string_value); | |
52 return string_value; | |
53 } | |
54 | |
55 protected: | |
56 ExtensionPrefValueMap epvm_; | |
57 }; | |
58 | |
59 class ExtensionPrefValueMapTest | |
60 : public ExtensionPrefValueMapTestBase<testing::Test> { | |
61 }; | |
62 | |
63 // A gmock-ified implementation of PrefStore::Observer. | |
64 class ExtensionPrefValueMapObserverMock | |
65 : public ExtensionPrefValueMap::Observer { | |
66 public: | |
67 ExtensionPrefValueMapObserverMock() {} | |
68 virtual ~ExtensionPrefValueMapObserverMock() {} | |
69 | |
70 MOCK_METHOD1(OnPrefValueChanged, void(const std::string&)); | |
71 MOCK_METHOD0(OnInitializationCompleted, void()); | |
72 MOCK_METHOD0(OnExtensionPrefValueMapDestruction, void()); | |
73 | |
74 private: | |
75 DISALLOW_COPY_AND_ASSIGN(ExtensionPrefValueMapObserverMock); | |
76 }; | |
77 | |
78 TEST_F(ExtensionPrefValueMapTest, SetAndGetPrefValue) { | |
79 epvm_.RegisterExtension(kExt1, CreateTime(10), true); | |
80 epvm_.SetExtensionPref(kExt1, kPref1, kRegular, CreateVal("val1")); | |
81 EXPECT_EQ("val1", GetValue(kPref1, false)); | |
82 }; | |
83 | |
84 TEST_F(ExtensionPrefValueMapTest, GetNotSetPrefValue) { | |
85 epvm_.RegisterExtension(kExt1, CreateTime(10), true); | |
86 EXPECT_EQ("", GetValue(kPref1, false)); | |
87 }; | |
88 | |
89 // Make sure the last-installed extension wins for each preference. | |
90 TEST_F(ExtensionPrefValueMapTest, Override) { | |
91 epvm_.RegisterExtension(kExt1, CreateTime(10), true); | |
92 epvm_.RegisterExtension(kExt2, CreateTime(20), true); | |
93 epvm_.RegisterExtension(kExt3, CreateTime(30), true); | |
94 | |
95 epvm_.SetExtensionPref(kExt1, kPref1, kRegular, CreateVal("val1")); | |
96 epvm_.SetExtensionPref(kExt2, kPref1, kRegular, CreateVal("val2")); | |
97 epvm_.SetExtensionPref(kExt3, kPref1, kRegular, CreateVal("val3")); | |
98 | |
99 epvm_.SetExtensionPref(kExt1, kPref2, kRegular, CreateVal("val4")); | |
100 epvm_.SetExtensionPref(kExt2, kPref2, kRegular, CreateVal("val5")); | |
101 | |
102 epvm_.SetExtensionPref(kExt1, kPref1, kRegular, CreateVal("val6")); | |
103 epvm_.SetExtensionPref(kExt1, kPref2, kRegular, CreateVal("val7")); | |
104 epvm_.SetExtensionPref(kExt1, kPref3, kRegular, CreateVal("val8")); | |
105 | |
106 EXPECT_EQ("val3", GetValue(kPref1, false)); | |
107 EXPECT_EQ("val5", GetValue(kPref2, false)); | |
108 EXPECT_EQ("val8", GetValue(kPref3, false)); | |
109 } | |
110 | |
111 TEST_F(ExtensionPrefValueMapTest, OverrideChecks) { | |
112 epvm_.RegisterExtension(kExt1, CreateTime(10), true); | |
113 epvm_.RegisterExtension(kExt2, CreateTime(20), true); | |
114 epvm_.RegisterExtension(kExt3, CreateTime(30), true); | |
115 | |
116 EXPECT_FALSE(epvm_.DoesExtensionControlPref(kExt1, kPref1, NULL)); | |
117 EXPECT_FALSE(epvm_.DoesExtensionControlPref(kExt2, kPref1, NULL)); | |
118 EXPECT_FALSE(epvm_.DoesExtensionControlPref(kExt3, kPref1, NULL)); | |
119 EXPECT_TRUE(epvm_.CanExtensionControlPref(kExt1, kPref1, false)); | |
120 EXPECT_TRUE(epvm_.CanExtensionControlPref(kExt2, kPref1, false)); | |
121 EXPECT_TRUE(epvm_.CanExtensionControlPref(kExt3, kPref1, false)); | |
122 | |
123 epvm_.SetExtensionPref(kExt2, kPref1, kRegular, CreateVal("val1")); | |
124 | |
125 EXPECT_FALSE(epvm_.DoesExtensionControlPref(kExt1, kPref1, NULL)); | |
126 EXPECT_TRUE(epvm_.DoesExtensionControlPref(kExt2, kPref1, NULL)); | |
127 EXPECT_FALSE(epvm_.DoesExtensionControlPref(kExt3, kPref1, NULL)); | |
128 EXPECT_FALSE(epvm_.CanExtensionControlPref(kExt1, kPref1, false)); | |
129 EXPECT_TRUE(epvm_.CanExtensionControlPref(kExt2, kPref1, false)); | |
130 EXPECT_TRUE(epvm_.CanExtensionControlPref(kExt3, kPref1, false)); | |
131 } | |
132 | |
133 TEST_F(ExtensionPrefValueMapTest, SetAndGetPrefValueIncognito) { | |
134 epvm_.RegisterExtension(kExt1, CreateTime(10), true); | |
135 epvm_.SetExtensionPref(kExt1, kPref1, kRegular, CreateVal("val1")); | |
136 EXPECT_EQ("val1", GetValue(kPref1, true)); | |
137 } | |
138 | |
139 TEST_F(ExtensionPrefValueMapTest, UninstallOnlyExtension) { | |
140 epvm_.RegisterExtension(kExt1, CreateTime(10), true); | |
141 epvm_.SetExtensionPref(kExt1, kPref1, kRegular, CreateVal("val1")); | |
142 epvm_.UnregisterExtension(kExt1); | |
143 | |
144 EXPECT_EQ("", GetValue(kPref1, false)); | |
145 } | |
146 | |
147 // Tests uninstalling an extension that wasn't winning for any preferences. | |
148 TEST_F(ExtensionPrefValueMapTest, UninstallIrrelevantExtension) { | |
149 epvm_.RegisterExtension(kExt1, CreateTime(10), true); | |
150 epvm_.RegisterExtension(kExt2, CreateTime(10), true); | |
151 | |
152 epvm_.SetExtensionPref(kExt1, kPref1, kRegular, CreateVal("val1")); | |
153 epvm_.SetExtensionPref(kExt2, kPref1, kRegular, CreateVal("val2")); | |
154 | |
155 epvm_.SetExtensionPref(kExt1, kPref2, kRegular, CreateVal("val3")); | |
156 epvm_.SetExtensionPref(kExt2, kPref2, kRegular, CreateVal("val4")); | |
157 | |
158 epvm_.UnregisterExtension(kExt1); | |
159 | |
160 EXPECT_EQ("val2", GetValue(kPref1, false)); | |
161 EXPECT_EQ("val4", GetValue(kPref2, false)); | |
162 } | |
163 | |
164 // Tests uninstalling an extension that was winning for all preferences. | |
165 TEST_F(ExtensionPrefValueMapTest, UninstallExtensionFromTop) { | |
166 epvm_.RegisterExtension(kExt1, CreateTime(10), true); | |
167 epvm_.RegisterExtension(kExt2, CreateTime(20), true); | |
168 epvm_.RegisterExtension(kExt3, CreateTime(30), true); | |
169 | |
170 epvm_.SetExtensionPref(kExt1, kPref1, kRegular, CreateVal("val1")); | |
171 epvm_.SetExtensionPref(kExt2, kPref1, kRegular, CreateVal("val2")); | |
172 epvm_.SetExtensionPref(kExt3, kPref1, kRegular, CreateVal("val3")); | |
173 | |
174 epvm_.SetExtensionPref(kExt1, kPref2, kRegular, CreateVal("val4")); | |
175 epvm_.SetExtensionPref(kExt3, kPref2, kRegular, CreateVal("val5")); | |
176 | |
177 epvm_.UnregisterExtension(kExt3); | |
178 | |
179 EXPECT_EQ("val2", GetValue(kPref1, false)); | |
180 EXPECT_EQ("val4", GetValue(kPref2, false)); | |
181 } | |
182 | |
183 // Tests uninstalling an extension that was winning for only some preferences. | |
184 TEST_F(ExtensionPrefValueMapTest, UninstallExtensionFromMiddle) { | |
185 epvm_.RegisterExtension(kExt1, CreateTime(10), true); | |
186 epvm_.RegisterExtension(kExt2, CreateTime(20), true); | |
187 epvm_.RegisterExtension(kExt3, CreateTime(30), true); | |
188 | |
189 epvm_.SetExtensionPref(kExt1, kPref1, kRegular, CreateVal("val1")); | |
190 epvm_.SetExtensionPref(kExt2, kPref1, kRegular, CreateVal("val2")); | |
191 epvm_.SetExtensionPref(kExt3, kPref1, kRegular, CreateVal("val3")); | |
192 | |
193 epvm_.SetExtensionPref(kExt1, kPref2, kRegular, CreateVal("val4")); | |
194 epvm_.SetExtensionPref(kExt2, kPref2, kRegular, CreateVal("val5")); | |
195 | |
196 epvm_.SetExtensionPref(kExt1, kPref3, kRegular, CreateVal("val6")); | |
197 | |
198 epvm_.SetExtensionPref(kExt2, kPref4, kRegular, CreateVal("val7")); | |
199 | |
200 epvm_.UnregisterExtension(kExt2); | |
201 | |
202 EXPECT_EQ("val3", GetValue(kPref1, false)); | |
203 EXPECT_EQ("val4", GetValue(kPref2, false)); | |
204 EXPECT_EQ("val6", GetValue(kPref3, false)); | |
205 EXPECT_EQ("", GetValue(kPref4, false)); | |
206 } | |
207 | |
208 // Tests triggering of notifications to registered observers. | |
209 TEST_F(ExtensionPrefValueMapTest, NotifyWhenNeeded) { | |
210 using testing::Mock; | |
211 using testing::StrEq; | |
212 | |
213 epvm_.RegisterExtension(kExt1, CreateTime(10), true); | |
214 | |
215 ExtensionPrefValueMapObserverMock observer; | |
216 epvm_.AddObserver(&observer); | |
217 | |
218 EXPECT_CALL(observer, OnPrefValueChanged(std::string(kPref1))); | |
219 epvm_.SetExtensionPref(kExt1, kPref1, kRegular, CreateVal("val1")); | |
220 Mock::VerifyAndClearExpectations(&observer); | |
221 | |
222 // Write the same value again. | |
223 EXPECT_CALL(observer, OnPrefValueChanged(std::string(kPref1))).Times(0); | |
224 epvm_.SetExtensionPref(kExt1, kPref1, kRegular, CreateVal("val1")); | |
225 Mock::VerifyAndClearExpectations(&observer); | |
226 | |
227 // Override incognito value. | |
228 EXPECT_CALL(observer, OnPrefValueChanged(std::string(kPref1))); | |
229 epvm_.SetExtensionPref(kExt1, kPref1, kRegular, CreateVal("val2")); | |
230 Mock::VerifyAndClearExpectations(&observer); | |
231 | |
232 // Override non-incognito value. | |
233 EXPECT_CALL(observer, OnPrefValueChanged(std::string(kPref1))); | |
234 epvm_.SetExtensionPref(kExt1, kPref1, kRegular, CreateVal("val3")); | |
235 Mock::VerifyAndClearExpectations(&observer); | |
236 | |
237 // Disable. | |
238 EXPECT_CALL(observer, OnPrefValueChanged(std::string(kPref1))); | |
239 epvm_.SetExtensionState(kExt1, false); | |
240 Mock::VerifyAndClearExpectations(&observer); | |
241 | |
242 // Enable. | |
243 EXPECT_CALL(observer, OnPrefValueChanged(std::string(kPref1))); | |
244 epvm_.SetExtensionState(kExt1, true); | |
245 Mock::VerifyAndClearExpectations(&observer); | |
246 | |
247 // Uninstall | |
248 EXPECT_CALL(observer, OnPrefValueChanged(std::string(kPref1))); | |
249 epvm_.UnregisterExtension(kExt1); | |
250 Mock::VerifyAndClearExpectations(&observer); | |
251 | |
252 epvm_.RemoveObserver(&observer); | |
253 | |
254 // Write new value --> no notification after removing observer. | |
255 EXPECT_CALL(observer, OnPrefValueChanged(std::string(kPref1))).Times(0); | |
256 epvm_.RegisterExtension(kExt1, CreateTime(10), true); | |
257 epvm_.SetExtensionPref(kExt1, kPref1, kRegular, CreateVal("val4")); | |
258 Mock::VerifyAndClearExpectations(&observer); | |
259 } | |
260 | |
261 // Tests disabling an extension. | |
262 TEST_F(ExtensionPrefValueMapTest, DisableExt) { | |
263 epvm_.RegisterExtension(kExt1, CreateTime(10), true); | |
264 | |
265 epvm_.SetExtensionPref(kExt1, kPref1, kRegular, CreateVal("val1")); | |
266 epvm_.SetExtensionState(kExt1, false); | |
267 EXPECT_EQ("", GetValue(kPref1, false)); | |
268 } | |
269 | |
270 // Tests disabling and reenabling an extension. | |
271 TEST_F(ExtensionPrefValueMapTest, ReenableExt) { | |
272 epvm_.RegisterExtension(kExt1, CreateTime(10), true); | |
273 | |
274 epvm_.SetExtensionPref(kExt1, kPref1, kRegular, CreateVal("val1")); | |
275 epvm_.SetExtensionState(kExt1, false); | |
276 epvm_.SetExtensionState(kExt1, true); | |
277 EXPECT_EQ("val1", GetValue(kPref1, false)); | |
278 } | |
279 | |
280 struct OverrideIncognitoTestCase { | |
281 OverrideIncognitoTestCase(int val_ext1_regular, | |
282 int val_ext1_regular_only, | |
283 int val_ext1_incognito_pers, | |
284 int val_ext1_incognito_sess, | |
285 int val_ext2_regular, | |
286 int val_ext2_regular_only, | |
287 int val_ext2_incognito_pers, | |
288 int val_ext2_incognito_sess, | |
289 int effective_value_regular, | |
290 int effective_value_incognito) | |
291 : val_ext1_regular_(val_ext1_regular), | |
292 val_ext1_regular_only_(val_ext1_regular_only), | |
293 val_ext1_incognito_pers_(val_ext1_incognito_pers), | |
294 val_ext1_incognito_sess_(val_ext1_incognito_sess), | |
295 val_ext2_regular_(val_ext2_regular), | |
296 val_ext2_regular_only_(val_ext2_regular_only), | |
297 val_ext2_incognito_pers_(val_ext2_incognito_pers), | |
298 val_ext2_incognito_sess_(val_ext2_incognito_sess), | |
299 effective_value_regular_(effective_value_regular), | |
300 effective_value_incognito_(effective_value_incognito) {} | |
301 | |
302 // pers. = persistent | |
303 // sess. = session only | |
304 int val_ext1_regular_; // pref value of extension 1 | |
305 int val_ext1_regular_only_; // pref value of extension 1 regular-only. | |
306 int val_ext1_incognito_pers_; // pref value of extension 1 incognito pers. | |
307 int val_ext1_incognito_sess_; // pref value of extension 1 incognito sess. | |
308 int val_ext2_regular_; // pref value of extension 2 | |
309 int val_ext2_regular_only_; // pref value of extension 2 regular-only. | |
310 int val_ext2_incognito_pers_; // pref value of extension 2 incognito pers. | |
311 int val_ext2_incognito_sess_; // pref value of extension 2 incognito sess. | |
312 int effective_value_regular_; // desired winner regular | |
313 int effective_value_incognito_; // desired winner incognito | |
314 }; | |
315 | |
316 class ExtensionPrefValueMapTestIncognitoTests | |
317 : public ExtensionPrefValueMapTestBase< | |
318 testing::TestWithParam<OverrideIncognitoTestCase> > { | |
319 }; | |
320 | |
321 TEST_P(ExtensionPrefValueMapTestIncognitoTests, OverrideIncognito) { | |
322 OverrideIncognitoTestCase test = GetParam(); | |
323 const char* strings[] = { | |
324 "undefined", | |
325 "val1", | |
326 "val2", | |
327 "val3", | |
328 "val4", | |
329 "val5", | |
330 "val6", | |
331 "val7", | |
332 "val8", | |
333 }; | |
334 | |
335 epvm_.RegisterExtension(kExt1, CreateTime(10), true); | |
336 epvm_.RegisterExtension(kExt2, CreateTime(20), true); | |
337 if (test.val_ext1_regular_) { | |
338 epvm_.SetExtensionPref(kExt1, kPref1, kRegular, | |
339 CreateVal(strings[test.val_ext1_regular_])); | |
340 } | |
341 if (test.val_ext1_regular_only_) { | |
342 epvm_.SetExtensionPref(kExt1, kPref1, kRegularOnly, | |
343 CreateVal(strings[test.val_ext1_regular_only_])); | |
344 } | |
345 if (test.val_ext1_incognito_pers_) { | |
346 epvm_.SetExtensionPref(kExt1, kPref1, kIncognitoPersistent, | |
347 CreateVal(strings[test.val_ext1_incognito_pers_])); | |
348 } | |
349 if (test.val_ext1_incognito_sess_) { | |
350 epvm_.SetExtensionPref(kExt1, kPref1, kIncognitoSessionOnly, | |
351 CreateVal(strings[test.val_ext1_incognito_sess_])); | |
352 } | |
353 if (test.val_ext2_regular_) { | |
354 epvm_.SetExtensionPref(kExt2, kPref1, kRegular, | |
355 CreateVal(strings[test.val_ext2_regular_])); | |
356 } | |
357 if (test.val_ext2_regular_only_) { | |
358 epvm_.SetExtensionPref(kExt2, kPref1, kRegularOnly, | |
359 CreateVal(strings[test.val_ext2_regular_only_])); | |
360 } | |
361 if (test.val_ext2_incognito_pers_) { | |
362 epvm_.SetExtensionPref(kExt2, kPref1, kIncognitoPersistent, | |
363 CreateVal(strings[test.val_ext2_incognito_pers_])); | |
364 } | |
365 if (test.val_ext2_incognito_sess_) { | |
366 epvm_.SetExtensionPref(kExt2, kPref1, kIncognitoSessionOnly, | |
367 CreateVal(strings[test.val_ext2_incognito_sess_])); | |
368 } | |
369 std::string actual; | |
370 EXPECT_EQ(strings[test.effective_value_regular_], GetValue(kPref1, false)); | |
371 EXPECT_EQ(strings[test.effective_value_incognito_], GetValue(kPref1, true)); | |
372 epvm_.UnregisterExtension(kExt1); | |
373 epvm_.UnregisterExtension(kExt2); | |
374 } | |
375 | |
376 INSTANTIATE_TEST_CASE_P( | |
377 ExtensionPrefValueMapTestIncognitoTestsInstance, | |
378 ExtensionPrefValueMapTestIncognitoTests, | |
379 testing::Values( | |
380 // e.g. (1, 0, 0, 0, 0, 0, 7, 0, 1, 7), means: | |
381 // ext1 regular is set to "val1", ext2 incognito persistent is set to | |
382 // "val7" | |
383 // --> the winning regular value is "val1", the winning incognito | |
384 // value is "val7". | |
385 OverrideIncognitoTestCase(1, 0, 0, 0, 0, 0, 0, 0, 1, 1), | |
386 OverrideIncognitoTestCase(1, 2, 0, 0, 0, 0, 0, 0, 2, 1), | |
387 OverrideIncognitoTestCase(1, 0, 3, 0, 0, 0, 0, 0, 1, 3), | |
388 OverrideIncognitoTestCase(1, 0, 0, 4, 0, 0, 0, 0, 1, 4), | |
389 OverrideIncognitoTestCase(1, 0, 3, 4, 0, 0, 0, 0, 1, 4), | |
390 OverrideIncognitoTestCase(1, 2, 3, 0, 0, 0, 0, 0, 2, 3), | |
391 OverrideIncognitoTestCase(1, 0, 0, 0, 5, 0, 0, 0, 5, 5), | |
392 OverrideIncognitoTestCase(1, 2, 3, 0, 5, 0, 0, 0, 5, 5), | |
393 OverrideIncognitoTestCase(1, 0, 0, 0, 0, 6, 0, 0, 6, 1), | |
394 OverrideIncognitoTestCase(1, 0, 3, 0, 5, 6, 0, 0, 6, 5), | |
395 OverrideIncognitoTestCase(1, 0, 0, 4, 5, 6, 0, 0, 6, 5), | |
396 OverrideIncognitoTestCase(1, 0, 0, 0, 0, 0, 7, 0, 1, 7), | |
397 OverrideIncognitoTestCase(1, 2, 0, 0, 5, 0, 7, 0, 5, 7), | |
398 OverrideIncognitoTestCase(1, 2, 0, 0, 5, 0, 0, 8, 5, 8), | |
399 OverrideIncognitoTestCase(1, 2, 0, 0, 5, 0, 7, 8, 5, 8), | |
400 OverrideIncognitoTestCase(1, 2, 3, 0, 0, 6, 7, 0, 6, 7))); | |
OLD | NEW |