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.
10 #include "base/macros.h"
11 #include "base/time/time.h"
12 #include "base/values.h"
13 #include "components/prefs/json_pref_store.h"
14 #include "components/prefs/mock_pref_change_callback.h"
15 #include "components/prefs/pref_change_registrar.h"
16 #include "components/prefs/pref_registry_simple.h"
17 #include "components/prefs/pref_service_factory.h"
18 #include "components/prefs/pref_value_store.h"
19 #include "components/prefs/testing_pref_service.h"
20 #include "components/prefs/testing_pref_store.h"
21 #include "testing/gmock/include/gmock/gmock.h"
22 #include "testing/gtest/include/gtest/gtest.h"
27 const char kPrefName[] = "pref.name";
29 TEST(PrefServiceTest, NoObserverFire) {
30 TestingPrefServiceSimple prefs;
32 const char pref_name[] = "homepage";
33 prefs.registry()->RegisterStringPref(pref_name, std::string());
35 const char new_pref_value[] = "http://www.google.com/";
36 MockPrefChangeCallback obs(&prefs);
37 PrefChangeRegistrar registrar;
38 registrar.Init(&prefs);
39 registrar.Add(pref_name, obs.GetCallback());
41 // This should fire the checks in MockPrefChangeCallback::OnPreferenceChanged.
42 const base::Value expected_value(new_pref_value);
43 obs.Expect(pref_name, &expected_value);
44 prefs.SetString(pref_name, new_pref_value);
45 Mock::VerifyAndClearExpectations(&obs);
47 // Setting the pref to the same value should not set the pref value a second
49 EXPECT_CALL(obs, OnPreferenceChanged(_)).Times(0);
50 prefs.SetString(pref_name, new_pref_value);
51 Mock::VerifyAndClearExpectations(&obs);
53 // Clearing the pref should cause the pref to fire.
54 const base::Value expected_default_value((std::string()));
55 obs.Expect(pref_name, &expected_default_value);
56 prefs.ClearPref(pref_name);
57 Mock::VerifyAndClearExpectations(&obs);
59 // Clearing the pref again should not cause the pref to fire.
60 EXPECT_CALL(obs, OnPreferenceChanged(_)).Times(0);
61 prefs.ClearPref(pref_name);
62 Mock::VerifyAndClearExpectations(&obs);
65 TEST(PrefServiceTest, HasPrefPath) {
66 TestingPrefServiceSimple prefs;
68 const char path[] = "fake.path";
70 // Shouldn't initially have a path.
71 EXPECT_FALSE(prefs.HasPrefPath(path));
73 // Register the path. This doesn't set a value, so the path still shouldn't
75 prefs.registry()->RegisterStringPref(path, std::string());
76 EXPECT_FALSE(prefs.HasPrefPath(path));
78 // Set a value and make sure we have a path.
79 prefs.SetString(path, "blah");
80 EXPECT_TRUE(prefs.HasPrefPath(path));
83 TEST(PrefServiceTest, Observers) {
84 const char pref_name[] = "homepage";
86 TestingPrefServiceSimple prefs;
87 prefs.SetUserPref(pref_name,
88 std::make_unique<base::Value>("http://www.cnn.com"));
89 prefs.registry()->RegisterStringPref(pref_name, std::string());
91 const char new_pref_value[] = "http://www.google.com/";
92 const base::Value expected_new_pref_value(new_pref_value);
93 MockPrefChangeCallback obs(&prefs);
94 PrefChangeRegistrar registrar;
95 registrar.Init(&prefs);
96 registrar.Add(pref_name, obs.GetCallback());
98 PrefChangeRegistrar registrar_two;
99 registrar_two.Init(&prefs);
101 // This should fire the checks in MockPrefChangeCallback::OnPreferenceChanged.
102 obs.Expect(pref_name, &expected_new_pref_value);
103 prefs.SetString(pref_name, new_pref_value);
104 Mock::VerifyAndClearExpectations(&obs);
106 // Now try adding a second pref observer.
107 const char new_pref_value2[] = "http://www.youtube.com/";
108 const base::Value expected_new_pref_value2(new_pref_value2);
109 MockPrefChangeCallback obs2(&prefs);
110 obs.Expect(pref_name, &expected_new_pref_value2);
111 obs2.Expect(pref_name, &expected_new_pref_value2);
112 registrar_two.Add(pref_name, obs2.GetCallback());
113 // This should fire the checks in obs and obs2.
114 prefs.SetString(pref_name, new_pref_value2);
115 Mock::VerifyAndClearExpectations(&obs);
116 Mock::VerifyAndClearExpectations(&obs2);
118 // Set a recommended value.
119 const base::Value recommended_pref_value("http://www.gmail.com/");
120 obs.Expect(pref_name, &expected_new_pref_value2);
121 obs2.Expect(pref_name, &expected_new_pref_value2);
122 // This should fire the checks in obs and obs2 but with an unchanged value
123 // as the recommended value is being overridden by the user-set value.
124 prefs.SetRecommendedPref(pref_name, recommended_pref_value.CreateDeepCopy());
125 Mock::VerifyAndClearExpectations(&obs);
126 Mock::VerifyAndClearExpectations(&obs2);
128 // Make sure obs2 still works after removing obs.
129 registrar.Remove(pref_name);
130 EXPECT_CALL(obs, OnPreferenceChanged(_)).Times(0);
131 obs2.Expect(pref_name, &expected_new_pref_value);
132 // This should only fire the observer in obs2.
133 prefs.SetString(pref_name, new_pref_value);
134 Mock::VerifyAndClearExpectations(&obs);
135 Mock::VerifyAndClearExpectations(&obs2);
138 // Make sure that if a preference changes type, so the wrong type is stored in
139 // the user pref file, it uses the correct fallback value instead.
140 TEST(PrefServiceTest, GetValueChangedType) {
141 const int kTestValue = 10;
142 TestingPrefServiceSimple prefs;
143 prefs.registry()->RegisterIntegerPref(kPrefName, kTestValue);
145 // Check falling back to a recommended value.
146 prefs.SetUserPref(kPrefName, std::make_unique<base::Value>("not an integer"));
147 const PrefService::Preference* pref = prefs.FindPreference(kPrefName);
149 const base::Value* value = pref->GetValue();
151 EXPECT_EQ(base::Value::Type::INTEGER, value->type());
152 int actual_int_value = -1;
153 EXPECT_TRUE(value->GetAsInteger(&actual_int_value));
154 EXPECT_EQ(kTestValue, actual_int_value);
157 TEST(PrefServiceTest, GetValueAndGetRecommendedValue) {
158 const int kDefaultValue = 5;
159 const int kUserValue = 10;
160 const int kRecommendedValue = 15;
161 TestingPrefServiceSimple prefs;
162 prefs.registry()->RegisterIntegerPref(kPrefName, kDefaultValue);
164 // Create pref with a default value only.
165 const PrefService::Preference* pref = prefs.FindPreference(kPrefName);
168 // Check that GetValue() returns the default value.
169 const base::Value* value = pref->GetValue();
171 EXPECT_EQ(base::Value::Type::INTEGER, value->type());
172 int actual_int_value = -1;
173 EXPECT_TRUE(value->GetAsInteger(&actual_int_value));
174 EXPECT_EQ(kDefaultValue, actual_int_value);
176 // Check that GetRecommendedValue() returns no value.
177 value = pref->GetRecommendedValue();
180 // Set a user-set value.
181 prefs.SetUserPref(kPrefName, std::make_unique<base::Value>(kUserValue));
183 // Check that GetValue() returns the user-set value.
184 value = pref->GetValue();
186 EXPECT_EQ(base::Value::Type::INTEGER, value->type());
187 actual_int_value = -1;
188 EXPECT_TRUE(value->GetAsInteger(&actual_int_value));
189 EXPECT_EQ(kUserValue, actual_int_value);
191 // Check that GetRecommendedValue() returns no value.
192 value = pref->GetRecommendedValue();
195 // Set a recommended value.
196 prefs.SetRecommendedPref(kPrefName,
197 std::make_unique<base::Value>(kRecommendedValue));
199 // Check that GetValue() returns the user-set value.
200 value = pref->GetValue();
202 EXPECT_EQ(base::Value::Type::INTEGER, value->type());
203 actual_int_value = -1;
204 EXPECT_TRUE(value->GetAsInteger(&actual_int_value));
205 EXPECT_EQ(kUserValue, actual_int_value);
207 // Check that GetRecommendedValue() returns the recommended value.
208 value = pref->GetRecommendedValue();
210 EXPECT_EQ(base::Value::Type::INTEGER, value->type());
211 actual_int_value = -1;
212 EXPECT_TRUE(value->GetAsInteger(&actual_int_value));
213 EXPECT_EQ(kRecommendedValue, actual_int_value);
215 // Remove the user-set value.
216 prefs.RemoveUserPref(kPrefName);
218 // Check that GetValue() returns the recommended value.
219 value = pref->GetValue();
221 EXPECT_EQ(base::Value::Type::INTEGER, value->type());
222 actual_int_value = -1;
223 EXPECT_TRUE(value->GetAsInteger(&actual_int_value));
224 EXPECT_EQ(kRecommendedValue, actual_int_value);
226 // Check that GetRecommendedValue() returns the recommended value.
227 value = pref->GetRecommendedValue();
229 EXPECT_EQ(base::Value::Type::INTEGER, value->type());
230 actual_int_value = -1;
231 EXPECT_TRUE(value->GetAsInteger(&actual_int_value));
232 EXPECT_EQ(kRecommendedValue, actual_int_value);
235 TEST(PrefServiceTest, SetTimeValue_RegularTime) {
236 TestingPrefServiceSimple prefs;
238 // Register a null time as the default.
239 prefs.registry()->RegisterTimePref(kPrefName, base::Time());
240 EXPECT_TRUE(prefs.GetTime(kPrefName).is_null());
242 // Set a time and make sure that we can read it without any loss of precision.
243 const base::Time time = base::Time::Now();
244 prefs.SetTime(kPrefName, time);
245 EXPECT_EQ(time, prefs.GetTime(kPrefName));
248 TEST(PrefServiceTest, SetTimeValue_NullTime) {
249 TestingPrefServiceSimple prefs;
251 // Register a non-null time as the default.
252 const base::Time default_time = base::Time::FromDeltaSinceWindowsEpoch(
253 base::TimeDelta::FromMicroseconds(12345));
254 prefs.registry()->RegisterTimePref(kPrefName, default_time);
255 EXPECT_FALSE(prefs.GetTime(kPrefName).is_null());
257 // Set a null time and make sure that it remains null upon deserialization.
258 prefs.SetTime(kPrefName, base::Time());
259 EXPECT_TRUE(prefs.GetTime(kPrefName).is_null());
262 TEST(PrefServiceTest, SetTimeDeltaValue_RegularTimeDelta) {
263 TestingPrefServiceSimple prefs;
265 // Register a zero time delta as the default.
266 prefs.registry()->RegisterTimeDeltaPref(kPrefName, base::TimeDelta());
267 EXPECT_TRUE(prefs.GetTimeDelta(kPrefName).is_zero());
269 // Set a time delta and make sure that we can read it without any loss of
271 const base::TimeDelta delta = base::Time::Now() - base::Time();
272 prefs.SetTimeDelta(kPrefName, delta);
273 EXPECT_EQ(delta, prefs.GetTimeDelta(kPrefName));
276 TEST(PrefServiceTest, SetTimeDeltaValue_ZeroTimeDelta) {
277 TestingPrefServiceSimple prefs;
279 // Register a non-zero time delta as the default.
280 const base::TimeDelta default_delta =
281 base::TimeDelta::FromMicroseconds(12345);
282 prefs.registry()->RegisterTimeDeltaPref(kPrefName, default_delta);
283 EXPECT_FALSE(prefs.GetTimeDelta(kPrefName).is_zero());
285 // Set a zero time delta and make sure that it remains zero upon
287 prefs.SetTimeDelta(kPrefName, base::TimeDelta());
288 EXPECT_TRUE(prefs.GetTimeDelta(kPrefName).is_zero());
291 // A PrefStore which just stores the last write flags that were used to write
293 class WriteFlagChecker : public TestingPrefStore {
295 WriteFlagChecker() {}
297 void ReportValueChanged(const std::string& key, uint32_t flags) override {
298 SetLastWriteFlags(flags);
301 void SetValue(const std::string& key,
302 std::unique_ptr<base::Value> value,
303 uint32_t flags) override {
304 SetLastWriteFlags(flags);
307 void SetValueSilently(const std::string& key,
308 std::unique_ptr<base::Value> value,
309 uint32_t flags) override {
310 SetLastWriteFlags(flags);
313 void RemoveValue(const std::string& key, uint32_t flags) override {
314 SetLastWriteFlags(flags);
317 uint32_t GetLastFlagsAndClear() {
318 CHECK(last_write_flags_set_);
319 uint32_t result = last_write_flags_;
320 last_write_flags_set_ = false;
321 last_write_flags_ = WriteablePrefStore::DEFAULT_PREF_WRITE_FLAGS;
325 bool last_write_flags_set() { return last_write_flags_set_; }
328 ~WriteFlagChecker() override {}
330 void SetLastWriteFlags(uint32_t flags) {
331 CHECK(!last_write_flags_set_);
332 last_write_flags_set_ = true;
333 last_write_flags_ = flags;
336 bool last_write_flags_set_ = false;
337 uint32_t last_write_flags_ = WriteablePrefStore::DEFAULT_PREF_WRITE_FLAGS;
340 TEST(PrefServiceTest, WriteablePrefStoreFlags) {
341 scoped_refptr<WriteFlagChecker> flag_checker(new WriteFlagChecker);
342 scoped_refptr<PrefRegistrySimple> registry(new PrefRegistrySimple);
343 PrefServiceFactory factory;
344 factory.set_user_prefs(flag_checker);
345 std::unique_ptr<PrefService> prefs(factory.Create(registry.get()));
347 // The first 8 bits of write flags are reserved for subclasses. Create a
348 // custom flag in this range
349 uint32_t kCustomRegistrationFlag = 1 << 2;
351 // A map of the registration flags that will be tested and the write flags
352 // they are expected to convert to.
353 struct RegistrationToWriteFlags {
354 const char* pref_name;
355 uint32_t registration_flags;
356 uint32_t write_flags;
358 const RegistrationToWriteFlags kRegistrationToWriteFlags[] = {
360 PrefRegistry::NO_REGISTRATION_FLAGS,
361 WriteablePrefStore::DEFAULT_PREF_WRITE_FLAGS},
363 PrefRegistry::LOSSY_PREF,
364 WriteablePrefStore::LOSSY_PREF_WRITE_FLAG},
366 kCustomRegistrationFlag,
367 WriteablePrefStore::DEFAULT_PREF_WRITE_FLAGS},
369 PrefRegistry::LOSSY_PREF | kCustomRegistrationFlag,
370 WriteablePrefStore::LOSSY_PREF_WRITE_FLAG}};
372 for (size_t i = 0; i < arraysize(kRegistrationToWriteFlags); ++i) {
373 RegistrationToWriteFlags entry = kRegistrationToWriteFlags[i];
374 registry->RegisterDictionaryPref(entry.pref_name,
375 std::make_unique<base::DictionaryValue>(),
376 entry.registration_flags);
378 SCOPED_TRACE("Currently testing pref with name: " +
379 std::string(entry.pref_name));
381 prefs->GetMutableUserPref(entry.pref_name, base::Value::Type::DICTIONARY);
382 EXPECT_TRUE(flag_checker->last_write_flags_set());
383 EXPECT_EQ(entry.write_flags, flag_checker->GetLastFlagsAndClear());
385 prefs->ReportUserPrefChanged(entry.pref_name);
386 EXPECT_TRUE(flag_checker->last_write_flags_set());
387 EXPECT_EQ(entry.write_flags, flag_checker->GetLastFlagsAndClear());
389 prefs->ClearPref(entry.pref_name);
390 EXPECT_TRUE(flag_checker->last_write_flags_set());
391 EXPECT_EQ(entry.write_flags, flag_checker->GetLastFlagsAndClear());
393 prefs->SetUserPrefValue(entry.pref_name,
394 std::make_unique<base::DictionaryValue>());
395 EXPECT_TRUE(flag_checker->last_write_flags_set());
396 EXPECT_EQ(entry.write_flags, flag_checker->GetLastFlagsAndClear());
400 class PrefServiceSetValueTest : public testing::Test {
402 static const char kName[];
403 static const char kValue[];
405 PrefServiceSetValueTest() : observer_(&prefs_) {}
407 TestingPrefServiceSimple prefs_;
408 MockPrefChangeCallback observer_;
411 const char PrefServiceSetValueTest::kName[] = "name";
412 const char PrefServiceSetValueTest::kValue[] = "value";
414 TEST_F(PrefServiceSetValueTest, SetStringValue) {
415 const char default_string[] = "default";
416 const base::Value default_value(default_string);
417 prefs_.registry()->RegisterStringPref(kName, default_string);
419 PrefChangeRegistrar registrar;
420 registrar.Init(&prefs_);
421 registrar.Add(kName, observer_.GetCallback());
423 // Changing the controlling store from default to user triggers notification.
424 observer_.Expect(kName, &default_value);
425 prefs_.Set(kName, default_value);
426 Mock::VerifyAndClearExpectations(&observer_);
428 EXPECT_CALL(observer_, OnPreferenceChanged(_)).Times(0);
429 prefs_.Set(kName, default_value);
430 Mock::VerifyAndClearExpectations(&observer_);
432 base::Value new_value(kValue);
433 observer_.Expect(kName, &new_value);
434 prefs_.Set(kName, new_value);
435 Mock::VerifyAndClearExpectations(&observer_);
438 TEST_F(PrefServiceSetValueTest, SetDictionaryValue) {
439 prefs_.registry()->RegisterDictionaryPref(kName);
440 PrefChangeRegistrar registrar;
441 registrar.Init(&prefs_);
442 registrar.Add(kName, observer_.GetCallback());
444 EXPECT_CALL(observer_, OnPreferenceChanged(_)).Times(0);
445 prefs_.RemoveUserPref(kName);
446 Mock::VerifyAndClearExpectations(&observer_);
448 base::DictionaryValue new_value;
449 new_value.SetString(kName, kValue);
450 observer_.Expect(kName, &new_value);
451 prefs_.Set(kName, new_value);
452 Mock::VerifyAndClearExpectations(&observer_);
454 EXPECT_CALL(observer_, OnPreferenceChanged(_)).Times(0);
455 prefs_.Set(kName, new_value);
456 Mock::VerifyAndClearExpectations(&observer_);
458 base::DictionaryValue empty;
459 observer_.Expect(kName, &empty);
460 prefs_.Set(kName, empty);
461 Mock::VerifyAndClearExpectations(&observer_);
464 TEST_F(PrefServiceSetValueTest, SetListValue) {
465 prefs_.registry()->RegisterListPref(kName);
466 PrefChangeRegistrar registrar;
467 registrar.Init(&prefs_);
468 registrar.Add(kName, observer_.GetCallback());
470 EXPECT_CALL(observer_, OnPreferenceChanged(_)).Times(0);
471 prefs_.RemoveUserPref(kName);
472 Mock::VerifyAndClearExpectations(&observer_);
474 base::ListValue new_value;
475 new_value.AppendString(kValue);
476 observer_.Expect(kName, &new_value);
477 prefs_.Set(kName, new_value);
478 Mock::VerifyAndClearExpectations(&observer_);
480 EXPECT_CALL(observer_, OnPreferenceChanged(_)).Times(0);
481 prefs_.Set(kName, new_value);
482 Mock::VerifyAndClearExpectations(&observer_);
484 base::ListValue empty;
485 observer_.Expect(kName, &empty);
486 prefs_.Set(kName, empty);
487 Mock::VerifyAndClearExpectations(&observer_);