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.
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"
15 const char kExt1[] = "ext1";
16 const char kExt2[] = "ext2";
17 const char kExt3[] = "ext3";
19 const char kPref1[] = "path1.subpath";
20 const char kPref2[] = "path2";
21 const char kPref3[] = "path3";
22 const char kPref4[] = "path4";
25 static Value* CreateVal(const char* str) {
26 return new base::StringValue(str);
29 static base::Time CreateTime(int64 t) {
30 return base::Time::FromInternalValue(t);
33 template <typename BASECLASS>
34 class ExtensionPrefValueMapTestBase : public BASECLASS {
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;
45 // Returns an empty string if the key is not set.
46 std::string GetValue(const char * key, bool incognito) const {
47 const Value *value = epvm_.GetEffectivePrefValue(key, incognito, NULL);
48 std::string string_value;
50 value->GetAsString(&string_value);
55 ExtensionPrefValueMap epvm_;
58 class ExtensionPrefValueMapTest
59 : public ExtensionPrefValueMapTestBase<testing::Test> {
62 // A gmock-ified implementation of PrefStore::Observer.
63 class ExtensionPrefValueMapObserverMock
64 : public ExtensionPrefValueMap::Observer {
66 ExtensionPrefValueMapObserverMock() {}
67 virtual ~ExtensionPrefValueMapObserverMock() {}
69 MOCK_METHOD1(OnPrefValueChanged, void(const std::string&));
70 MOCK_METHOD0(OnInitializationCompleted, void());
71 MOCK_METHOD0(OnExtensionPrefValueMapDestruction, void());
74 DISALLOW_COPY_AND_ASSIGN(ExtensionPrefValueMapObserverMock);
77 TEST_F(ExtensionPrefValueMapTest, SetAndGetPrefValue) {
78 epvm_.RegisterExtension(kExt1, CreateTime(10), true);
79 epvm_.SetExtensionPref(kExt1, kPref1, kRegular, CreateVal("val1"));
80 EXPECT_EQ("val1", GetValue(kPref1, false));
83 TEST_F(ExtensionPrefValueMapTest, GetNotSetPrefValue) {
84 epvm_.RegisterExtension(kExt1, CreateTime(10), true);
85 EXPECT_EQ("", GetValue(kPref1, false));
88 // Make sure the last-installed extension wins for each preference.
89 TEST_F(ExtensionPrefValueMapTest, Override) {
90 epvm_.RegisterExtension(kExt1, CreateTime(10), true);
91 epvm_.RegisterExtension(kExt2, CreateTime(20), true);
92 epvm_.RegisterExtension(kExt3, CreateTime(30), true);
94 epvm_.SetExtensionPref(kExt1, kPref1, kRegular, CreateVal("val1"));
95 epvm_.SetExtensionPref(kExt2, kPref1, kRegular, CreateVal("val2"));
96 epvm_.SetExtensionPref(kExt3, kPref1, kRegular, CreateVal("val3"));
98 epvm_.SetExtensionPref(kExt1, kPref2, kRegular, CreateVal("val4"));
99 epvm_.SetExtensionPref(kExt2, kPref2, kRegular, CreateVal("val5"));
101 epvm_.SetExtensionPref(kExt1, kPref1, kRegular, CreateVal("val6"));
102 epvm_.SetExtensionPref(kExt1, kPref2, kRegular, CreateVal("val7"));
103 epvm_.SetExtensionPref(kExt1, kPref3, kRegular, CreateVal("val8"));
105 EXPECT_EQ("val3", GetValue(kPref1, false));
106 EXPECT_EQ("val5", GetValue(kPref2, false));
107 EXPECT_EQ("val8", GetValue(kPref3, false));
110 TEST_F(ExtensionPrefValueMapTest, OverrideChecks) {
111 epvm_.RegisterExtension(kExt1, CreateTime(10), true);
112 epvm_.RegisterExtension(kExt2, CreateTime(20), true);
113 epvm_.RegisterExtension(kExt3, CreateTime(30), true);
115 EXPECT_FALSE(epvm_.DoesExtensionControlPref(kExt1, kPref1, NULL));
116 EXPECT_FALSE(epvm_.DoesExtensionControlPref(kExt2, kPref1, NULL));
117 EXPECT_FALSE(epvm_.DoesExtensionControlPref(kExt3, kPref1, NULL));
118 EXPECT_TRUE(epvm_.CanExtensionControlPref(kExt1, kPref1, false));
119 EXPECT_TRUE(epvm_.CanExtensionControlPref(kExt2, kPref1, false));
120 EXPECT_TRUE(epvm_.CanExtensionControlPref(kExt3, kPref1, false));
122 epvm_.SetExtensionPref(kExt2, kPref1, kRegular, CreateVal("val1"));
124 EXPECT_FALSE(epvm_.DoesExtensionControlPref(kExt1, kPref1, NULL));
125 EXPECT_TRUE(epvm_.DoesExtensionControlPref(kExt2, kPref1, NULL));
126 EXPECT_FALSE(epvm_.DoesExtensionControlPref(kExt3, kPref1, NULL));
127 EXPECT_FALSE(epvm_.CanExtensionControlPref(kExt1, kPref1, false));
128 EXPECT_TRUE(epvm_.CanExtensionControlPref(kExt2, kPref1, false));
129 EXPECT_TRUE(epvm_.CanExtensionControlPref(kExt3, kPref1, false));
132 TEST_F(ExtensionPrefValueMapTest, SetAndGetPrefValueIncognito) {
133 epvm_.RegisterExtension(kExt1, CreateTime(10), true);
134 epvm_.SetExtensionPref(kExt1, kPref1, kRegular, CreateVal("val1"));
135 EXPECT_EQ("val1", GetValue(kPref1, true));
138 TEST_F(ExtensionPrefValueMapTest, UninstallOnlyExtension) {
139 epvm_.RegisterExtension(kExt1, CreateTime(10), true);
140 epvm_.SetExtensionPref(kExt1, kPref1, kRegular, CreateVal("val1"));
141 epvm_.UnregisterExtension(kExt1);
143 EXPECT_EQ("", GetValue(kPref1, false));
146 // Tests uninstalling an extension that wasn't winning for any preferences.
147 TEST_F(ExtensionPrefValueMapTest, UninstallIrrelevantExtension) {
148 epvm_.RegisterExtension(kExt1, CreateTime(10), true);
149 epvm_.RegisterExtension(kExt2, CreateTime(10), true);
151 epvm_.SetExtensionPref(kExt1, kPref1, kRegular, CreateVal("val1"));
152 epvm_.SetExtensionPref(kExt2, kPref1, kRegular, CreateVal("val2"));
154 epvm_.SetExtensionPref(kExt1, kPref2, kRegular, CreateVal("val3"));
155 epvm_.SetExtensionPref(kExt2, kPref2, kRegular, CreateVal("val4"));
157 epvm_.UnregisterExtension(kExt1);
159 EXPECT_EQ("val2", GetValue(kPref1, false));
160 EXPECT_EQ("val4", GetValue(kPref2, false));
163 // Tests uninstalling an extension that was winning for all preferences.
164 TEST_F(ExtensionPrefValueMapTest, UninstallExtensionFromTop) {
165 epvm_.RegisterExtension(kExt1, CreateTime(10), true);
166 epvm_.RegisterExtension(kExt2, CreateTime(20), true);
167 epvm_.RegisterExtension(kExt3, CreateTime(30), true);
169 epvm_.SetExtensionPref(kExt1, kPref1, kRegular, CreateVal("val1"));
170 epvm_.SetExtensionPref(kExt2, kPref1, kRegular, CreateVal("val2"));
171 epvm_.SetExtensionPref(kExt3, kPref1, kRegular, CreateVal("val3"));
173 epvm_.SetExtensionPref(kExt1, kPref2, kRegular, CreateVal("val4"));
174 epvm_.SetExtensionPref(kExt3, kPref2, kRegular, CreateVal("val5"));
176 epvm_.UnregisterExtension(kExt3);
178 EXPECT_EQ("val2", GetValue(kPref1, false));
179 EXPECT_EQ("val4", GetValue(kPref2, false));
182 // Tests uninstalling an extension that was winning for only some preferences.
183 TEST_F(ExtensionPrefValueMapTest, UninstallExtensionFromMiddle) {
184 epvm_.RegisterExtension(kExt1, CreateTime(10), true);
185 epvm_.RegisterExtension(kExt2, CreateTime(20), true);
186 epvm_.RegisterExtension(kExt3, CreateTime(30), true);
188 epvm_.SetExtensionPref(kExt1, kPref1, kRegular, CreateVal("val1"));
189 epvm_.SetExtensionPref(kExt2, kPref1, kRegular, CreateVal("val2"));
190 epvm_.SetExtensionPref(kExt3, kPref1, kRegular, CreateVal("val3"));
192 epvm_.SetExtensionPref(kExt1, kPref2, kRegular, CreateVal("val4"));
193 epvm_.SetExtensionPref(kExt2, kPref2, kRegular, CreateVal("val5"));
195 epvm_.SetExtensionPref(kExt1, kPref3, kRegular, CreateVal("val6"));
197 epvm_.SetExtensionPref(kExt2, kPref4, kRegular, CreateVal("val7"));
199 epvm_.UnregisterExtension(kExt2);
201 EXPECT_EQ("val3", GetValue(kPref1, false));
202 EXPECT_EQ("val4", GetValue(kPref2, false));
203 EXPECT_EQ("val6", GetValue(kPref3, false));
204 EXPECT_EQ("", GetValue(kPref4, false));
207 // Tests triggering of notifications to registered observers.
208 TEST_F(ExtensionPrefValueMapTest, NotifyWhenNeeded) {
210 using testing::StrEq;
212 epvm_.RegisterExtension(kExt1, CreateTime(10), true);
214 ExtensionPrefValueMapObserverMock observer;
215 epvm_.AddObserver(&observer);
217 EXPECT_CALL(observer, OnPrefValueChanged(std::string(kPref1)));
218 epvm_.SetExtensionPref(kExt1, kPref1, kRegular, CreateVal("val1"));
219 Mock::VerifyAndClearExpectations(&observer);
221 // Write the same value again.
222 EXPECT_CALL(observer, OnPrefValueChanged(std::string(kPref1))).Times(0);
223 epvm_.SetExtensionPref(kExt1, kPref1, kRegular, CreateVal("val1"));
224 Mock::VerifyAndClearExpectations(&observer);
226 // Override incognito value.
227 EXPECT_CALL(observer, OnPrefValueChanged(std::string(kPref1)));
228 epvm_.SetExtensionPref(kExt1, kPref1, kRegular, CreateVal("val2"));
229 Mock::VerifyAndClearExpectations(&observer);
231 // Override non-incognito value.
232 EXPECT_CALL(observer, OnPrefValueChanged(std::string(kPref1)));
233 epvm_.SetExtensionPref(kExt1, kPref1, kRegular, CreateVal("val3"));
234 Mock::VerifyAndClearExpectations(&observer);
237 EXPECT_CALL(observer, OnPrefValueChanged(std::string(kPref1)));
238 epvm_.SetExtensionState(kExt1, false);
239 Mock::VerifyAndClearExpectations(&observer);
242 EXPECT_CALL(observer, OnPrefValueChanged(std::string(kPref1)));
243 epvm_.SetExtensionState(kExt1, true);
244 Mock::VerifyAndClearExpectations(&observer);
247 EXPECT_CALL(observer, OnPrefValueChanged(std::string(kPref1)));
248 epvm_.UnregisterExtension(kExt1);
249 Mock::VerifyAndClearExpectations(&observer);
251 epvm_.RemoveObserver(&observer);
253 // Write new value --> no notification after removing observer.
254 EXPECT_CALL(observer, OnPrefValueChanged(std::string(kPref1))).Times(0);
255 epvm_.RegisterExtension(kExt1, CreateTime(10), true);
256 epvm_.SetExtensionPref(kExt1, kPref1, kRegular, CreateVal("val4"));
257 Mock::VerifyAndClearExpectations(&observer);
260 // Tests disabling an extension.
261 TEST_F(ExtensionPrefValueMapTest, DisableExt) {
262 epvm_.RegisterExtension(kExt1, CreateTime(10), true);
264 epvm_.SetExtensionPref(kExt1, kPref1, kRegular, CreateVal("val1"));
265 epvm_.SetExtensionState(kExt1, false);
266 EXPECT_EQ("", GetValue(kPref1, false));
269 // Tests disabling and reenabling an extension.
270 TEST_F(ExtensionPrefValueMapTest, ReenableExt) {
271 epvm_.RegisterExtension(kExt1, CreateTime(10), true);
273 epvm_.SetExtensionPref(kExt1, kPref1, kRegular, CreateVal("val1"));
274 epvm_.SetExtensionState(kExt1, false);
275 epvm_.SetExtensionState(kExt1, true);
276 EXPECT_EQ("val1", GetValue(kPref1, false));
279 struct OverrideIncognitoTestCase {
280 OverrideIncognitoTestCase(int val_ext1_regular,
281 int val_ext1_regular_only,
282 int val_ext1_incognito_pers,
283 int val_ext1_incognito_sess,
284 int val_ext2_regular,
285 int val_ext2_regular_only,
286 int val_ext2_incognito_pers,
287 int val_ext2_incognito_sess,
288 int effective_value_regular,
289 int effective_value_incognito)
290 : val_ext1_regular_(val_ext1_regular),
291 val_ext1_regular_only_(val_ext1_regular_only),
292 val_ext1_incognito_pers_(val_ext1_incognito_pers),
293 val_ext1_incognito_sess_(val_ext1_incognito_sess),
294 val_ext2_regular_(val_ext2_regular),
295 val_ext2_regular_only_(val_ext2_regular_only),
296 val_ext2_incognito_pers_(val_ext2_incognito_pers),
297 val_ext2_incognito_sess_(val_ext2_incognito_sess),
298 effective_value_regular_(effective_value_regular),
299 effective_value_incognito_(effective_value_incognito) {}
301 // pers. = persistent
302 // sess. = session only
303 int val_ext1_regular_; // pref value of extension 1
304 int val_ext1_regular_only_; // pref value of extension 1 regular-only.
305 int val_ext1_incognito_pers_; // pref value of extension 1 incognito pers.
306 int val_ext1_incognito_sess_; // pref value of extension 1 incognito sess.
307 int val_ext2_regular_; // pref value of extension 2
308 int val_ext2_regular_only_; // pref value of extension 2 regular-only.
309 int val_ext2_incognito_pers_; // pref value of extension 2 incognito pers.
310 int val_ext2_incognito_sess_; // pref value of extension 2 incognito sess.
311 int effective_value_regular_; // desired winner regular
312 int effective_value_incognito_; // desired winner incognito
315 class ExtensionPrefValueMapTestIncognitoTests
316 : public ExtensionPrefValueMapTestBase<
317 testing::TestWithParam<OverrideIncognitoTestCase> > {
320 TEST_P(ExtensionPrefValueMapTestIncognitoTests, OverrideIncognito) {
321 OverrideIncognitoTestCase test = GetParam();
322 const char* strings[] = {
334 epvm_.RegisterExtension(kExt1, CreateTime(10), true);
335 epvm_.RegisterExtension(kExt2, CreateTime(20), true);
336 if (test.val_ext1_regular_) {
337 epvm_.SetExtensionPref(kExt1, kPref1, kRegular,
338 CreateVal(strings[test.val_ext1_regular_]));
340 if (test.val_ext1_regular_only_) {
341 epvm_.SetExtensionPref(kExt1, kPref1, kRegularOnly,
342 CreateVal(strings[test.val_ext1_regular_only_]));
344 if (test.val_ext1_incognito_pers_) {
345 epvm_.SetExtensionPref(kExt1, kPref1, kIncognitoPersistent,
346 CreateVal(strings[test.val_ext1_incognito_pers_]));
348 if (test.val_ext1_incognito_sess_) {
349 epvm_.SetExtensionPref(kExt1, kPref1, kIncognitoSessionOnly,
350 CreateVal(strings[test.val_ext1_incognito_sess_]));
352 if (test.val_ext2_regular_) {
353 epvm_.SetExtensionPref(kExt2, kPref1, kRegular,
354 CreateVal(strings[test.val_ext2_regular_]));
356 if (test.val_ext2_regular_only_) {
357 epvm_.SetExtensionPref(kExt2, kPref1, kRegularOnly,
358 CreateVal(strings[test.val_ext2_regular_only_]));
360 if (test.val_ext2_incognito_pers_) {
361 epvm_.SetExtensionPref(kExt2, kPref1, kIncognitoPersistent,
362 CreateVal(strings[test.val_ext2_incognito_pers_]));
364 if (test.val_ext2_incognito_sess_) {
365 epvm_.SetExtensionPref(kExt2, kPref1, kIncognitoSessionOnly,
366 CreateVal(strings[test.val_ext2_incognito_sess_]));
369 EXPECT_EQ(strings[test.effective_value_regular_], GetValue(kPref1, false));
370 EXPECT_EQ(strings[test.effective_value_incognito_], GetValue(kPref1, true));
371 epvm_.UnregisterExtension(kExt1);
372 epvm_.UnregisterExtension(kExt2);
375 INSTANTIATE_TEST_CASE_P(
376 ExtensionPrefValueMapTestIncognitoTestsInstance,
377 ExtensionPrefValueMapTestIncognitoTests,
379 // e.g. (1, 0, 0, 0, 0, 0, 7, 0, 1, 7), means:
380 // ext1 regular is set to "val1", ext2 incognito persistent is set to
382 // --> the winning regular value is "val1", the winning incognito
384 OverrideIncognitoTestCase(1, 0, 0, 0, 0, 0, 0, 0, 1, 1),
385 OverrideIncognitoTestCase(1, 2, 0, 0, 0, 0, 0, 0, 2, 1),
386 OverrideIncognitoTestCase(1, 0, 3, 0, 0, 0, 0, 0, 1, 3),
387 OverrideIncognitoTestCase(1, 0, 0, 4, 0, 0, 0, 0, 1, 4),
388 OverrideIncognitoTestCase(1, 0, 3, 4, 0, 0, 0, 0, 1, 4),
389 OverrideIncognitoTestCase(1, 2, 3, 0, 0, 0, 0, 0, 2, 3),
390 OverrideIncognitoTestCase(1, 0, 0, 0, 5, 0, 0, 0, 5, 5),
391 OverrideIncognitoTestCase(1, 2, 3, 0, 5, 0, 0, 0, 5, 5),
392 OverrideIncognitoTestCase(1, 0, 0, 0, 0, 6, 0, 0, 6, 1),
393 OverrideIncognitoTestCase(1, 0, 3, 0, 5, 6, 0, 0, 6, 5),
394 OverrideIncognitoTestCase(1, 0, 0, 4, 5, 6, 0, 0, 6, 5),
395 OverrideIncognitoTestCase(1, 0, 0, 0, 0, 0, 7, 0, 1, 7),
396 OverrideIncognitoTestCase(1, 2, 0, 0, 5, 0, 7, 0, 5, 7),
397 OverrideIncognitoTestCase(1, 2, 0, 0, 5, 0, 0, 8, 5, 8),
398 OverrideIncognitoTestCase(1, 2, 0, 0, 5, 0, 7, 8, 5, 8),
399 OverrideIncognitoTestCase(1, 2, 3, 0, 0, 6, 7, 0, 6, 7)));