blob: 4dc3d1154ed7c4efd41efd1faeb21f4092eb9d20 [file] [log] [blame]
[email protected]d3b05ea2012-01-24 22:57:051// Copyright (c) 2012 The Chromium Authors. All rights reserved.
license.botbf09a502008-08-24 00:55:552// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
initial.commit09911bf2008-07-26 23:55:294
avi9ef8bb02015-12-24 05:29:365#include <stddef.h>
6#include <stdint.h>
7
[email protected]ecde2742010-04-02 17:36:188#include <string>
9
Sebastien Marchand17fa2782019-01-25 19:28:1010#include "base/bind_helpers.h"
Avi Drissmanec658402018-12-25 21:30:1411#include "base/stl_util.h"
Ilya Sherman557b2de72018-01-18 20:57:1712#include "base/time/time.h"
[email protected]ecde2742010-04-02 17:36:1813#include "base/values.h"
brettwf00b9b42016-02-01 22:11:3814#include "components/prefs/json_pref_store.h"
15#include "components/prefs/mock_pref_change_callback.h"
16#include "components/prefs/pref_change_registrar.h"
Min Qincaa1e2e2018-09-14 20:56:4817#include "components/prefs/pref_notifier_impl.h"
brettwf00b9b42016-02-01 22:11:3818#include "components/prefs/pref_registry_simple.h"
19#include "components/prefs/pref_service_factory.h"
20#include "components/prefs/pref_value_store.h"
21#include "components/prefs/testing_pref_service.h"
22#include "components/prefs/testing_pref_store.h"
[email protected]ecde2742010-04-02 17:36:1823#include "testing/gmock/include/gmock/gmock.h"
initial.commit09911bf2008-07-26 23:55:2924#include "testing/gtest/include/gtest/gtest.h"
25
[email protected]ecde2742010-04-02 17:36:1826using testing::_;
27using testing::Mock;
[email protected]12a3c022010-11-03 10:24:1128
Min Qincaa1e2e2018-09-14 20:56:4829namespace {
30
[email protected]aaa552312013-02-13 16:25:4031const char kPrefName[] = "pref.name";
Min Qincaa1e2e2018-09-14 20:56:4832const char kManagedPref[] = "managed_pref";
33const char kRecommendedPref[] = "recommended_pref";
34const char kSupervisedPref[] = "supervised_pref";
35
36} // namespace
[email protected]aaa552312013-02-13 16:25:4037
[email protected]277404c22010-04-22 13:09:4538TEST(PrefServiceTest, NoObserverFire) {
[email protected]5b199522012-12-22 17:24:4439 TestingPrefServiceSimple prefs;
[email protected]7aa0a962010-04-21 17:24:4240
[email protected]57ecc4b2010-08-11 03:02:5141 const char pref_name[] = "homepage";
[email protected]b1de2c72013-02-06 02:45:4742 prefs.registry()->RegisterStringPref(pref_name, std::string());
[email protected]7aa0a962010-04-21 17:24:4243
[email protected]acd78969c2010-12-08 09:49:1144 const char new_pref_value[] = "http://www.google.com/";
[email protected]96a5c342012-12-04 18:14:0245 MockPrefChangeCallback obs(&prefs);
[email protected]2fb7dc982010-09-29 12:24:2846 PrefChangeRegistrar registrar;
47 registrar.Init(&prefs);
[email protected]96a5c342012-12-04 18:14:0248 registrar.Add(pref_name, obs.GetCallback());
[email protected]7aa0a962010-04-21 17:24:4249
[email protected]96a5c342012-12-04 18:14:0250 // This should fire the checks in MockPrefChangeCallback::OnPreferenceChanged.
jdoerrie122c4da2017-03-06 11:12:0451 const base::Value expected_value(new_pref_value);
[email protected]96a5c342012-12-04 18:14:0252 obs.Expect(pref_name, &expected_value);
[email protected]acd78969c2010-12-08 09:49:1153 prefs.SetString(pref_name, new_pref_value);
54 Mock::VerifyAndClearExpectations(&obs);
[email protected]7aa0a962010-04-21 17:24:4255
56 // Setting the pref to the same value should not set the pref value a second
57 // time.
[email protected]96a5c342012-12-04 18:14:0258 EXPECT_CALL(obs, OnPreferenceChanged(_)).Times(0);
[email protected]7aa0a962010-04-21 17:24:4259 prefs.SetString(pref_name, new_pref_value);
[email protected]acd78969c2010-12-08 09:49:1160 Mock::VerifyAndClearExpectations(&obs);
[email protected]7aa0a962010-04-21 17:24:4261
62 // Clearing the pref should cause the pref to fire.
jdoerrie122c4da2017-03-06 11:12:0463 const base::Value expected_default_value((std::string()));
[email protected]96a5c342012-12-04 18:14:0264 obs.Expect(pref_name, &expected_default_value);
[email protected]7aa0a962010-04-21 17:24:4265 prefs.ClearPref(pref_name);
[email protected]acd78969c2010-12-08 09:49:1166 Mock::VerifyAndClearExpectations(&obs);
[email protected]7aa0a962010-04-21 17:24:4267
68 // Clearing the pref again should not cause the pref to fire.
[email protected]96a5c342012-12-04 18:14:0269 EXPECT_CALL(obs, OnPreferenceChanged(_)).Times(0);
[email protected]7aa0a962010-04-21 17:24:4270 prefs.ClearPref(pref_name);
[email protected]acd78969c2010-12-08 09:49:1171 Mock::VerifyAndClearExpectations(&obs);
[email protected]7aa0a962010-04-21 17:24:4272}
73
[email protected]277404c22010-04-22 13:09:4574TEST(PrefServiceTest, HasPrefPath) {
[email protected]5b199522012-12-22 17:24:4475 TestingPrefServiceSimple prefs;
[email protected]7aa0a962010-04-21 17:24:4276
[email protected]57ecc4b2010-08-11 03:02:5177 const char path[] = "fake.path";
[email protected]7aa0a962010-04-21 17:24:4278
79 // Shouldn't initially have a path.
80 EXPECT_FALSE(prefs.HasPrefPath(path));
81
82 // Register the path. This doesn't set a value, so the path still shouldn't
83 // exist.
[email protected]b1de2c72013-02-06 02:45:4784 prefs.registry()->RegisterStringPref(path, std::string());
[email protected]7aa0a962010-04-21 17:24:4285 EXPECT_FALSE(prefs.HasPrefPath(path));
86
87 // Set a value and make sure we have a path.
[email protected]ddd231e2010-06-29 20:35:1988 prefs.SetString(path, "blah");
[email protected]7aa0a962010-04-21 17:24:4289 EXPECT_TRUE(prefs.HasPrefPath(path));
90}
91
[email protected]277404c22010-04-22 13:09:4592TEST(PrefServiceTest, Observers) {
[email protected]57ecc4b2010-08-11 03:02:5193 const char pref_name[] = "homepage";
[email protected]277404c22010-04-22 13:09:4594
[email protected]5b199522012-12-22 17:24:4495 TestingPrefServiceSimple prefs;
vabr8684c9a2017-03-29 13:14:5796 prefs.SetUserPref(pref_name,
Jinho Bang84b58bd2018-01-01 21:44:4897 std::make_unique<base::Value>("http://www.cnn.com"));
[email protected]b1de2c72013-02-06 02:45:4798 prefs.registry()->RegisterStringPref(pref_name, std::string());
[email protected]277404c22010-04-22 13:09:4599
[email protected]acd78969c2010-12-08 09:49:11100 const char new_pref_value[] = "http://www.google.com/";
jdoerrie122c4da2017-03-06 11:12:04101 const base::Value expected_new_pref_value(new_pref_value);
[email protected]96a5c342012-12-04 18:14:02102 MockPrefChangeCallback obs(&prefs);
[email protected]2fb7dc982010-09-29 12:24:28103 PrefChangeRegistrar registrar;
104 registrar.Init(&prefs);
[email protected]96a5c342012-12-04 18:14:02105 registrar.Add(pref_name, obs.GetCallback());
[email protected]277404c22010-04-22 13:09:45106
[email protected]54ffd94a2012-11-12 15:29:20107 PrefChangeRegistrar registrar_two;
108 registrar_two.Init(&prefs);
109
[email protected]96a5c342012-12-04 18:14:02110 // This should fire the checks in MockPrefChangeCallback::OnPreferenceChanged.
111 obs.Expect(pref_name, &expected_new_pref_value);
[email protected]acd78969c2010-12-08 09:49:11112 prefs.SetString(pref_name, new_pref_value);
113 Mock::VerifyAndClearExpectations(&obs);
[email protected]277404c22010-04-22 13:09:45114
115 // Now try adding a second pref observer.
[email protected]acd78969c2010-12-08 09:49:11116 const char new_pref_value2[] = "http://www.youtube.com/";
jdoerrie122c4da2017-03-06 11:12:04117 const base::Value expected_new_pref_value2(new_pref_value2);
[email protected]96a5c342012-12-04 18:14:02118 MockPrefChangeCallback obs2(&prefs);
119 obs.Expect(pref_name, &expected_new_pref_value2);
120 obs2.Expect(pref_name, &expected_new_pref_value2);
121 registrar_two.Add(pref_name, obs2.GetCallback());
[email protected]277404c22010-04-22 13:09:45122 // This should fire the checks in obs and obs2.
123 prefs.SetString(pref_name, new_pref_value2);
[email protected]acd78969c2010-12-08 09:49:11124 Mock::VerifyAndClearExpectations(&obs);
125 Mock::VerifyAndClearExpectations(&obs2);
[email protected]277404c22010-04-22 13:09:45126
[email protected]7ca0f362012-07-30 10:14:03127 // Set a recommended value.
jdoerrie122c4da2017-03-06 11:12:04128 const base::Value recommended_pref_value("http://www.gmail.com/");
[email protected]96a5c342012-12-04 18:14:02129 obs.Expect(pref_name, &expected_new_pref_value2);
130 obs2.Expect(pref_name, &expected_new_pref_value2);
[email protected]7ca0f362012-07-30 10:14:03131 // This should fire the checks in obs and obs2 but with an unchanged value
132 // as the recommended value is being overridden by the user-set value.
vabr8684c9a2017-03-29 13:14:57133 prefs.SetRecommendedPref(pref_name, recommended_pref_value.CreateDeepCopy());
[email protected]7ca0f362012-07-30 10:14:03134 Mock::VerifyAndClearExpectations(&obs);
135 Mock::VerifyAndClearExpectations(&obs2);
136
[email protected]277404c22010-04-22 13:09:45137 // Make sure obs2 still works after removing obs.
[email protected]54ffd94a2012-11-12 15:29:20138 registrar.Remove(pref_name);
[email protected]96a5c342012-12-04 18:14:02139 EXPECT_CALL(obs, OnPreferenceChanged(_)).Times(0);
140 obs2.Expect(pref_name, &expected_new_pref_value);
[email protected]277404c22010-04-22 13:09:45141 // This should only fire the observer in obs2.
142 prefs.SetString(pref_name, new_pref_value);
[email protected]acd78969c2010-12-08 09:49:11143 Mock::VerifyAndClearExpectations(&obs);
144 Mock::VerifyAndClearExpectations(&obs2);
[email protected]277404c22010-04-22 13:09:45145}
146
[email protected]9a8c4022011-01-25 14:25:33147// Make sure that if a preference changes type, so the wrong type is stored in
148// the user pref file, it uses the correct fallback value instead.
149TEST(PrefServiceTest, GetValueChangedType) {
150 const int kTestValue = 10;
[email protected]5b199522012-12-22 17:24:44151 TestingPrefServiceSimple prefs;
[email protected]aaa552312013-02-13 16:25:40152 prefs.registry()->RegisterIntegerPref(kPrefName, kTestValue);
[email protected]9a8c4022011-01-25 14:25:33153
154 // Check falling back to a recommended value.
Jinho Bang84b58bd2018-01-01 21:44:48155 prefs.SetUserPref(kPrefName, std::make_unique<base::Value>("not an integer"));
[email protected]aaa552312013-02-13 16:25:40156 const PrefService::Preference* pref = prefs.FindPreference(kPrefName);
[email protected]9a8c4022011-01-25 14:25:33157 ASSERT_TRUE(pref);
[email protected]a43a667b2013-06-14 17:56:08158 const base::Value* value = pref->GetValue();
[email protected]9a8c4022011-01-25 14:25:33159 ASSERT_TRUE(value);
jdoerrie76cee9c2017-10-06 22:42:42160 EXPECT_EQ(base::Value::Type::INTEGER, value->type());
[email protected]9a8c4022011-01-25 14:25:33161 int actual_int_value = -1;
162 EXPECT_TRUE(value->GetAsInteger(&actual_int_value));
163 EXPECT_EQ(kTestValue, actual_int_value);
164}
165
[email protected]7ca0f362012-07-30 10:14:03166TEST(PrefServiceTest, GetValueAndGetRecommendedValue) {
167 const int kDefaultValue = 5;
168 const int kUserValue = 10;
169 const int kRecommendedValue = 15;
[email protected]5b199522012-12-22 17:24:44170 TestingPrefServiceSimple prefs;
[email protected]aaa552312013-02-13 16:25:40171 prefs.registry()->RegisterIntegerPref(kPrefName, kDefaultValue);
[email protected]7ca0f362012-07-30 10:14:03172
173 // Create pref with a default value only.
[email protected]aaa552312013-02-13 16:25:40174 const PrefService::Preference* pref = prefs.FindPreference(kPrefName);
[email protected]7ca0f362012-07-30 10:14:03175 ASSERT_TRUE(pref);
176
177 // Check that GetValue() returns the default value.
[email protected]a43a667b2013-06-14 17:56:08178 const base::Value* value = pref->GetValue();
[email protected]7ca0f362012-07-30 10:14:03179 ASSERT_TRUE(value);
jdoerrie76cee9c2017-10-06 22:42:42180 EXPECT_EQ(base::Value::Type::INTEGER, value->type());
[email protected]7ca0f362012-07-30 10:14:03181 int actual_int_value = -1;
182 EXPECT_TRUE(value->GetAsInteger(&actual_int_value));
183 EXPECT_EQ(kDefaultValue, actual_int_value);
184
185 // Check that GetRecommendedValue() returns no value.
186 value = pref->GetRecommendedValue();
187 ASSERT_FALSE(value);
188
189 // Set a user-set value.
Jinho Bang84b58bd2018-01-01 21:44:48190 prefs.SetUserPref(kPrefName, std::make_unique<base::Value>(kUserValue));
[email protected]7ca0f362012-07-30 10:14:03191
192 // Check that GetValue() returns the user-set value.
193 value = pref->GetValue();
194 ASSERT_TRUE(value);
jdoerrie76cee9c2017-10-06 22:42:42195 EXPECT_EQ(base::Value::Type::INTEGER, value->type());
[email protected]7ca0f362012-07-30 10:14:03196 actual_int_value = -1;
197 EXPECT_TRUE(value->GetAsInteger(&actual_int_value));
198 EXPECT_EQ(kUserValue, actual_int_value);
199
200 // Check that GetRecommendedValue() returns no value.
201 value = pref->GetRecommendedValue();
202 ASSERT_FALSE(value);
203
204 // Set a recommended value.
vabr8684c9a2017-03-29 13:14:57205 prefs.SetRecommendedPref(kPrefName,
Jinho Bang84b58bd2018-01-01 21:44:48206 std::make_unique<base::Value>(kRecommendedValue));
[email protected]7ca0f362012-07-30 10:14:03207
208 // Check that GetValue() returns the user-set value.
209 value = pref->GetValue();
210 ASSERT_TRUE(value);
jdoerrie76cee9c2017-10-06 22:42:42211 EXPECT_EQ(base::Value::Type::INTEGER, value->type());
[email protected]7ca0f362012-07-30 10:14:03212 actual_int_value = -1;
213 EXPECT_TRUE(value->GetAsInteger(&actual_int_value));
214 EXPECT_EQ(kUserValue, actual_int_value);
215
216 // Check that GetRecommendedValue() returns the recommended value.
217 value = pref->GetRecommendedValue();
218 ASSERT_TRUE(value);
jdoerrie76cee9c2017-10-06 22:42:42219 EXPECT_EQ(base::Value::Type::INTEGER, value->type());
[email protected]7ca0f362012-07-30 10:14:03220 actual_int_value = -1;
221 EXPECT_TRUE(value->GetAsInteger(&actual_int_value));
222 EXPECT_EQ(kRecommendedValue, actual_int_value);
223
224 // Remove the user-set value.
[email protected]aaa552312013-02-13 16:25:40225 prefs.RemoveUserPref(kPrefName);
[email protected]7ca0f362012-07-30 10:14:03226
227 // Check that GetValue() returns the recommended value.
228 value = pref->GetValue();
229 ASSERT_TRUE(value);
jdoerrie76cee9c2017-10-06 22:42:42230 EXPECT_EQ(base::Value::Type::INTEGER, value->type());
[email protected]7ca0f362012-07-30 10:14:03231 actual_int_value = -1;
232 EXPECT_TRUE(value->GetAsInteger(&actual_int_value));
233 EXPECT_EQ(kRecommendedValue, actual_int_value);
234
235 // Check that GetRecommendedValue() returns the recommended value.
236 value = pref->GetRecommendedValue();
237 ASSERT_TRUE(value);
jdoerrie76cee9c2017-10-06 22:42:42238 EXPECT_EQ(base::Value::Type::INTEGER, value->type());
[email protected]7ca0f362012-07-30 10:14:03239 actual_int_value = -1;
240 EXPECT_TRUE(value->GetAsInteger(&actual_int_value));
241 EXPECT_EQ(kRecommendedValue, actual_int_value);
242}
243
Ilya Sherman557b2de72018-01-18 20:57:17244TEST(PrefServiceTest, SetTimeValue_RegularTime) {
245 TestingPrefServiceSimple prefs;
246
247 // Register a null time as the default.
248 prefs.registry()->RegisterTimePref(kPrefName, base::Time());
249 EXPECT_TRUE(prefs.GetTime(kPrefName).is_null());
250
251 // Set a time and make sure that we can read it without any loss of precision.
252 const base::Time time = base::Time::Now();
253 prefs.SetTime(kPrefName, time);
254 EXPECT_EQ(time, prefs.GetTime(kPrefName));
255}
256
257TEST(PrefServiceTest, SetTimeValue_NullTime) {
258 TestingPrefServiceSimple prefs;
259
260 // Register a non-null time as the default.
261 const base::Time default_time = base::Time::FromDeltaSinceWindowsEpoch(
262 base::TimeDelta::FromMicroseconds(12345));
263 prefs.registry()->RegisterTimePref(kPrefName, default_time);
264 EXPECT_FALSE(prefs.GetTime(kPrefName).is_null());
265
266 // Set a null time and make sure that it remains null upon deserialization.
267 prefs.SetTime(kPrefName, base::Time());
268 EXPECT_TRUE(prefs.GetTime(kPrefName).is_null());
269}
270
Sky Maliceaff2af142018-06-18 18:37:29271TEST(PrefServiceTest, SetTimeDeltaValue_RegularTimeDelta) {
272 TestingPrefServiceSimple prefs;
273
274 // Register a zero time delta as the default.
275 prefs.registry()->RegisterTimeDeltaPref(kPrefName, base::TimeDelta());
276 EXPECT_TRUE(prefs.GetTimeDelta(kPrefName).is_zero());
277
278 // Set a time delta and make sure that we can read it without any loss of
279 // precision.
280 const base::TimeDelta delta = base::Time::Now() - base::Time();
281 prefs.SetTimeDelta(kPrefName, delta);
282 EXPECT_EQ(delta, prefs.GetTimeDelta(kPrefName));
283}
284
285TEST(PrefServiceTest, SetTimeDeltaValue_ZeroTimeDelta) {
286 TestingPrefServiceSimple prefs;
287
288 // Register a non-zero time delta as the default.
289 const base::TimeDelta default_delta =
290 base::TimeDelta::FromMicroseconds(12345);
291 prefs.registry()->RegisterTimeDeltaPref(kPrefName, default_delta);
292 EXPECT_FALSE(prefs.GetTimeDelta(kPrefName).is_zero());
293
294 // Set a zero time delta and make sure that it remains zero upon
295 // deserialization.
296 prefs.SetTimeDelta(kPrefName, base::TimeDelta());
297 EXPECT_TRUE(prefs.GetTimeDelta(kPrefName).is_zero());
298}
299
raymesf3a929b02015-05-07 03:54:45300// A PrefStore which just stores the last write flags that were used to write
301// values to it.
302class WriteFlagChecker : public TestingPrefStore {
303 public:
304 WriteFlagChecker() {}
305
avi9ef8bb02015-12-24 05:29:36306 void ReportValueChanged(const std::string& key, uint32_t flags) override {
raymesf3a929b02015-05-07 03:54:45307 SetLastWriteFlags(flags);
308 }
309
310 void SetValue(const std::string& key,
dcheng5f043bc2016-04-22 19:09:06311 std::unique_ptr<base::Value> value,
avi9ef8bb02015-12-24 05:29:36312 uint32_t flags) override {
raymesf3a929b02015-05-07 03:54:45313 SetLastWriteFlags(flags);
raymesf3a929b02015-05-07 03:54:45314 }
315
316 void SetValueSilently(const std::string& key,
dcheng5f043bc2016-04-22 19:09:06317 std::unique_ptr<base::Value> value,
avi9ef8bb02015-12-24 05:29:36318 uint32_t flags) override {
raymesf3a929b02015-05-07 03:54:45319 SetLastWriteFlags(flags);
raymesf3a929b02015-05-07 03:54:45320 }
321
avi9ef8bb02015-12-24 05:29:36322 void RemoveValue(const std::string& key, uint32_t flags) override {
raymesf3a929b02015-05-07 03:54:45323 SetLastWriteFlags(flags);
324 }
325
avi9ef8bb02015-12-24 05:29:36326 uint32_t GetLastFlagsAndClear() {
raymesf3a929b02015-05-07 03:54:45327 CHECK(last_write_flags_set_);
avi9ef8bb02015-12-24 05:29:36328 uint32_t result = last_write_flags_;
raymesf3a929b02015-05-07 03:54:45329 last_write_flags_set_ = false;
330 last_write_flags_ = WriteablePrefStore::DEFAULT_PREF_WRITE_FLAGS;
331 return result;
332 }
333
334 bool last_write_flags_set() { return last_write_flags_set_; }
335
336 private:
337 ~WriteFlagChecker() override {}
338
avi9ef8bb02015-12-24 05:29:36339 void SetLastWriteFlags(uint32_t flags) {
raymesf3a929b02015-05-07 03:54:45340 CHECK(!last_write_flags_set_);
341 last_write_flags_set_ = true;
342 last_write_flags_ = flags;
343 }
344
345 bool last_write_flags_set_ = false;
avi9ef8bb02015-12-24 05:29:36346 uint32_t last_write_flags_ = WriteablePrefStore::DEFAULT_PREF_WRITE_FLAGS;
raymesf3a929b02015-05-07 03:54:45347};
348
349TEST(PrefServiceTest, WriteablePrefStoreFlags) {
350 scoped_refptr<WriteFlagChecker> flag_checker(new WriteFlagChecker);
351 scoped_refptr<PrefRegistrySimple> registry(new PrefRegistrySimple);
brettw066508682016-02-03 08:22:02352 PrefServiceFactory factory;
raymesf3a929b02015-05-07 03:54:45353 factory.set_user_prefs(flag_checker);
dcheng5f043bc2016-04-22 19:09:06354 std::unique_ptr<PrefService> prefs(factory.Create(registry.get()));
raymesf3a929b02015-05-07 03:54:45355
356 // The first 8 bits of write flags are reserved for subclasses. Create a
357 // custom flag in this range
avi9ef8bb02015-12-24 05:29:36358 uint32_t kCustomRegistrationFlag = 1 << 2;
raymesf3a929b02015-05-07 03:54:45359
360 // A map of the registration flags that will be tested and the write flags
361 // they are expected to convert to.
362 struct RegistrationToWriteFlags {
363 const char* pref_name;
avi9ef8bb02015-12-24 05:29:36364 uint32_t registration_flags;
365 uint32_t write_flags;
raymesf3a929b02015-05-07 03:54:45366 };
367 const RegistrationToWriteFlags kRegistrationToWriteFlags[] = {
368 {"none",
369 PrefRegistry::NO_REGISTRATION_FLAGS,
370 WriteablePrefStore::DEFAULT_PREF_WRITE_FLAGS},
371 {"lossy",
372 PrefRegistry::LOSSY_PREF,
373 WriteablePrefStore::LOSSY_PREF_WRITE_FLAG},
374 {"custom",
375 kCustomRegistrationFlag,
376 WriteablePrefStore::DEFAULT_PREF_WRITE_FLAGS},
377 {"lossyandcustom",
378 PrefRegistry::LOSSY_PREF | kCustomRegistrationFlag,
379 WriteablePrefStore::LOSSY_PREF_WRITE_FLAG}};
380
Avi Drissmanec658402018-12-25 21:30:14381 for (size_t i = 0; i < base::size(kRegistrationToWriteFlags); ++i) {
raymesf3a929b02015-05-07 03:54:45382 RegistrationToWriteFlags entry = kRegistrationToWriteFlags[i];
vabr88e507212017-03-29 13:22:26383 registry->RegisterDictionaryPref(entry.pref_name,
vabr88e507212017-03-29 13:22:26384 entry.registration_flags);
raymesf3a929b02015-05-07 03:54:45385
386 SCOPED_TRACE("Currently testing pref with name: " +
387 std::string(entry.pref_name));
388
jdoerriedc72ee942016-12-07 15:43:28389 prefs->GetMutableUserPref(entry.pref_name, base::Value::Type::DICTIONARY);
raymesf3a929b02015-05-07 03:54:45390 EXPECT_TRUE(flag_checker->last_write_flags_set());
391 EXPECT_EQ(entry.write_flags, flag_checker->GetLastFlagsAndClear());
392
393 prefs->ReportUserPrefChanged(entry.pref_name);
394 EXPECT_TRUE(flag_checker->last_write_flags_set());
395 EXPECT_EQ(entry.write_flags, flag_checker->GetLastFlagsAndClear());
396
397 prefs->ClearPref(entry.pref_name);
398 EXPECT_TRUE(flag_checker->last_write_flags_set());
399 EXPECT_EQ(entry.write_flags, flag_checker->GetLastFlagsAndClear());
400
vabrbce355c2017-03-23 18:52:43401 prefs->SetUserPrefValue(entry.pref_name,
Lei Zhang97a70e42019-10-11 20:59:12402 base::Value(base::Value::Type::DICTIONARY));
raymesf3a929b02015-05-07 03:54:45403 EXPECT_TRUE(flag_checker->last_write_flags_set());
404 EXPECT_EQ(entry.write_flags, flag_checker->GetLastFlagsAndClear());
405 }
406}
407
[email protected]ecde2742010-04-02 17:36:18408class PrefServiceSetValueTest : public testing::Test {
409 protected:
[email protected]12a3c022010-11-03 10:24:11410 static const char kName[];
411 static const char kValue[];
[email protected]ecde2742010-04-02 17:36:18412
[email protected]96a5c342012-12-04 18:14:02413 PrefServiceSetValueTest() : observer_(&prefs_) {}
414
[email protected]5b199522012-12-22 17:24:44415 TestingPrefServiceSimple prefs_;
[email protected]96a5c342012-12-04 18:14:02416 MockPrefChangeCallback observer_;
[email protected]ecde2742010-04-02 17:36:18417};
[email protected]ddd231e2010-06-29 20:35:19418
[email protected]12a3c022010-11-03 10:24:11419const char PrefServiceSetValueTest::kName[] = "name";
420const char PrefServiceSetValueTest::kValue[] = "value";
[email protected]ecde2742010-04-02 17:36:18421
422TEST_F(PrefServiceSetValueTest, SetStringValue) {
[email protected]20ce516d2010-06-18 02:20:04423 const char default_string[] = "default";
jdoerrie122c4da2017-03-06 11:12:04424 const base::Value default_value(default_string);
[email protected]b1de2c72013-02-06 02:45:47425 prefs_.registry()->RegisterStringPref(kName, default_string);
[email protected]2fb7dc982010-09-29 12:24:28426
427 PrefChangeRegistrar registrar;
428 registrar.Init(&prefs_);
[email protected]96a5c342012-12-04 18:14:02429 registrar.Add(kName, observer_.GetCallback());
[email protected]2fb7dc982010-09-29 12:24:28430
[email protected]c3b54f372010-09-14 08:25:07431 // Changing the controlling store from default to user triggers notification.
[email protected]96a5c342012-12-04 18:14:02432 observer_.Expect(kName, &default_value);
[email protected]acd78969c2010-12-08 09:49:11433 prefs_.Set(kName, default_value);
[email protected]c3b54f372010-09-14 08:25:07434 Mock::VerifyAndClearExpectations(&observer_);
435
[email protected]96a5c342012-12-04 18:14:02436 EXPECT_CALL(observer_, OnPreferenceChanged(_)).Times(0);
[email protected]acd78969c2010-12-08 09:49:11437 prefs_.Set(kName, default_value);
[email protected]ecde2742010-04-02 17:36:18438 Mock::VerifyAndClearExpectations(&observer_);
439
jdoerrie122c4da2017-03-06 11:12:04440 base::Value new_value(kValue);
[email protected]96a5c342012-12-04 18:14:02441 observer_.Expect(kName, &new_value);
[email protected]acd78969c2010-12-08 09:49:11442 prefs_.Set(kName, new_value);
443 Mock::VerifyAndClearExpectations(&observer_);
[email protected]ecde2742010-04-02 17:36:18444}
445
446TEST_F(PrefServiceSetValueTest, SetDictionaryValue) {
[email protected]b1de2c72013-02-06 02:45:47447 prefs_.registry()->RegisterDictionaryPref(kName);
[email protected]2fb7dc982010-09-29 12:24:28448 PrefChangeRegistrar registrar;
449 registrar.Init(&prefs_);
[email protected]96a5c342012-12-04 18:14:02450 registrar.Add(kName, observer_.GetCallback());
[email protected]ecde2742010-04-02 17:36:18451
[email protected]96a5c342012-12-04 18:14:02452 EXPECT_CALL(observer_, OnPreferenceChanged(_)).Times(0);
[email protected]9a8c4022011-01-25 14:25:33453 prefs_.RemoveUserPref(kName);
[email protected]ecde2742010-04-02 17:36:18454 Mock::VerifyAndClearExpectations(&observer_);
455
[email protected]a43a667b2013-06-14 17:56:08456 base::DictionaryValue new_value;
[email protected]12a3c022010-11-03 10:24:11457 new_value.SetString(kName, kValue);
[email protected]96a5c342012-12-04 18:14:02458 observer_.Expect(kName, &new_value);
[email protected]12a3c022010-11-03 10:24:11459 prefs_.Set(kName, new_value);
[email protected]ecde2742010-04-02 17:36:18460 Mock::VerifyAndClearExpectations(&observer_);
461
[email protected]96a5c342012-12-04 18:14:02462 EXPECT_CALL(observer_, OnPreferenceChanged(_)).Times(0);
[email protected]acd78969c2010-12-08 09:49:11463 prefs_.Set(kName, new_value);
464 Mock::VerifyAndClearExpectations(&observer_);
465
[email protected]a43a667b2013-06-14 17:56:08466 base::DictionaryValue empty;
[email protected]96a5c342012-12-04 18:14:02467 observer_.Expect(kName, &empty);
[email protected]9a8c4022011-01-25 14:25:33468 prefs_.Set(kName, empty);
[email protected]ecde2742010-04-02 17:36:18469 Mock::VerifyAndClearExpectations(&observer_);
[email protected]ecde2742010-04-02 17:36:18470}
471
472TEST_F(PrefServiceSetValueTest, SetListValue) {
[email protected]b1de2c72013-02-06 02:45:47473 prefs_.registry()->RegisterListPref(kName);
[email protected]2fb7dc982010-09-29 12:24:28474 PrefChangeRegistrar registrar;
475 registrar.Init(&prefs_);
[email protected]96a5c342012-12-04 18:14:02476 registrar.Add(kName, observer_.GetCallback());
[email protected]ecde2742010-04-02 17:36:18477
[email protected]96a5c342012-12-04 18:14:02478 EXPECT_CALL(observer_, OnPreferenceChanged(_)).Times(0);
[email protected]9a8c4022011-01-25 14:25:33479 prefs_.RemoveUserPref(kName);
[email protected]ecde2742010-04-02 17:36:18480 Mock::VerifyAndClearExpectations(&observer_);
481
[email protected]a43a667b2013-06-14 17:56:08482 base::ListValue new_value;
dcheng58241a812016-06-03 18:18:42483 new_value.AppendString(kValue);
[email protected]96a5c342012-12-04 18:14:02484 observer_.Expect(kName, &new_value);
[email protected]12a3c022010-11-03 10:24:11485 prefs_.Set(kName, new_value);
[email protected]ecde2742010-04-02 17:36:18486 Mock::VerifyAndClearExpectations(&observer_);
487
[email protected]96a5c342012-12-04 18:14:02488 EXPECT_CALL(observer_, OnPreferenceChanged(_)).Times(0);
[email protected]acd78969c2010-12-08 09:49:11489 prefs_.Set(kName, new_value);
490 Mock::VerifyAndClearExpectations(&observer_);
491
[email protected]a43a667b2013-06-14 17:56:08492 base::ListValue empty;
[email protected]96a5c342012-12-04 18:14:02493 observer_.Expect(kName, &empty);
[email protected]9a8c4022011-01-25 14:25:33494 prefs_.Set(kName, empty);
[email protected]ecde2742010-04-02 17:36:18495 Mock::VerifyAndClearExpectations(&observer_);
[email protected]ecde2742010-04-02 17:36:18496}
Min Qincaa1e2e2018-09-14 20:56:48497
498class PrefValueStoreChangeTest : public testing::Test {
499 protected:
500 PrefValueStoreChangeTest()
501 : user_pref_store_(base::MakeRefCounted<TestingPrefStore>()),
502 pref_registry_(base::MakeRefCounted<PrefRegistrySimple>()) {}
503
504 ~PrefValueStoreChangeTest() override = default;
505
506 void SetUp() override {
507 auto pref_notifier = std::make_unique<PrefNotifierImpl>();
508 auto pref_value_store = std::make_unique<PrefValueStore>(
509 nullptr /* managed_prefs */, nullptr /* supervised_user_prefs */,
510 nullptr /* extension_prefs */, new TestingPrefStore(),
511 user_pref_store_.get(), nullptr /* recommended_prefs */,
512 pref_registry_->defaults().get(), pref_notifier.get());
513 pref_service_ = std::make_unique<PrefService>(
514 std::move(pref_notifier), std::move(pref_value_store), user_pref_store_,
515 pref_registry_, base::DoNothing(), false);
516 pref_registry_->RegisterIntegerPref(kManagedPref, 1);
517 pref_registry_->RegisterIntegerPref(kRecommendedPref, 2);
518 pref_registry_->RegisterIntegerPref(kSupervisedPref, 3);
519 }
520
521 std::unique_ptr<PrefService> pref_service_;
522 scoped_refptr<TestingPrefStore> user_pref_store_;
523 scoped_refptr<PrefRegistrySimple> pref_registry_;
524};
525
526// Check that value from the new PrefValueStore will be correctly retrieved.
527TEST_F(PrefValueStoreChangeTest, ChangePrefValueStore) {
528 const PrefService::Preference* preference =
529 pref_service_->FindPreference(kManagedPref);
530 EXPECT_TRUE(preference->IsDefaultValue());
531 EXPECT_EQ(base::Value(1), *(preference->GetValue()));
532 const PrefService::Preference* supervised =
533 pref_service_->FindPreference(kSupervisedPref);
534 EXPECT_TRUE(supervised->IsDefaultValue());
535 EXPECT_EQ(base::Value(3), *(supervised->GetValue()));
536 const PrefService::Preference* recommended =
537 pref_service_->FindPreference(kRecommendedPref);
538 EXPECT_TRUE(recommended->IsDefaultValue());
539 EXPECT_EQ(base::Value(2), *(recommended->GetValue()));
540
541 user_pref_store_->SetInteger(kManagedPref, 10);
542 EXPECT_TRUE(preference->IsUserControlled());
543 ASSERT_EQ(base::Value(10), *(preference->GetValue()));
544
545 scoped_refptr<TestingPrefStore> managed_pref_store =
546 base::MakeRefCounted<TestingPrefStore>();
547 pref_service_->ChangePrefValueStore(
548 managed_pref_store.get(), nullptr /* supervised_user_prefs */,
549 nullptr /* extension_prefs */, nullptr /* recommended_prefs */);
550 EXPECT_TRUE(preference->IsUserControlled());
551 ASSERT_EQ(base::Value(10), *(preference->GetValue()));
552
553 // Test setting a managed pref after overriding the managed PrefStore.
554 managed_pref_store->SetInteger(kManagedPref, 20);
555 EXPECT_TRUE(preference->IsManaged());
556 ASSERT_EQ(base::Value(20), *(preference->GetValue()));
557
558 // Test overriding the supervised and recommended PrefStore with already set
559 // prefs.
560 scoped_refptr<TestingPrefStore> supervised_pref_store =
561 base::MakeRefCounted<TestingPrefStore>();
562 scoped_refptr<TestingPrefStore> recommened_pref_store =
563 base::MakeRefCounted<TestingPrefStore>();
564 supervised_pref_store->SetInteger(kManagedPref, 30);
565 supervised_pref_store->SetInteger(kSupervisedPref, 31);
566 recommened_pref_store->SetInteger(kManagedPref, 40);
567 recommened_pref_store->SetInteger(kRecommendedPref, 41);
568 pref_service_->ChangePrefValueStore(
569 nullptr /* managed_prefs */, supervised_pref_store.get(),
570 nullptr /* extension_prefs */, recommened_pref_store.get());
571 EXPECT_TRUE(preference->IsManaged());
572 ASSERT_EQ(base::Value(20), *(preference->GetValue()));
573 EXPECT_TRUE(supervised->IsManagedByCustodian());
574 EXPECT_EQ(base::Value(31), *(supervised->GetValue()));
575 EXPECT_TRUE(recommended->IsRecommended());
576 EXPECT_EQ(base::Value(41), *(recommended->GetValue()));
577}
578
579// Tests that PrefChangeRegistrar works after PrefValueStore is changed.
580TEST_F(PrefValueStoreChangeTest, PrefChangeRegistrar) {
581 MockPrefChangeCallback obs(pref_service_.get());
582 PrefChangeRegistrar registrar;
583 registrar.Init(pref_service_.get());
584 registrar.Add(kManagedPref, obs.GetCallback());
585 registrar.Add(kSupervisedPref, obs.GetCallback());
586 registrar.Add(kRecommendedPref, obs.GetCallback());
587
588 base::Value expected_value(10);
589 obs.Expect(kManagedPref, &expected_value);
590 user_pref_store_->SetInteger(kManagedPref, 10);
591 Mock::VerifyAndClearExpectations(&obs);
592 expected_value = base::Value(11);
593 obs.Expect(kRecommendedPref, &expected_value);
594 user_pref_store_->SetInteger(kRecommendedPref, 11);
595 Mock::VerifyAndClearExpectations(&obs);
596
597 // Test overriding the managed and supervised PrefStore with already set
598 // prefs.
599 scoped_refptr<TestingPrefStore> managed_pref_store =
600 base::MakeRefCounted<TestingPrefStore>();
601 scoped_refptr<TestingPrefStore> supervised_pref_store =
602 base::MakeRefCounted<TestingPrefStore>();
603 // Update |kManagedPref| before changing the PrefValueStore, the
604 // PrefChangeRegistrar should get notified on |kManagedPref| as its value
605 // changes.
606 managed_pref_store->SetInteger(kManagedPref, 20);
607 // Due to store precedence, the value of |kRecommendedPref| will not be
608 // changed so PrefChangeRegistrar will not be notified.
609 managed_pref_store->SetInteger(kRecommendedPref, 11);
610 supervised_pref_store->SetInteger(kManagedPref, 30);
611 supervised_pref_store->SetInteger(kRecommendedPref, 21);
612 expected_value = base::Value(20);
613 obs.Expect(kManagedPref, &expected_value);
614 pref_service_->ChangePrefValueStore(
615 managed_pref_store.get(), supervised_pref_store.get(),
616 nullptr /* extension_prefs */, nullptr /* recommended_prefs */);
617 Mock::VerifyAndClearExpectations(&obs);
618
619 // Update a pref value after PrefValueStore change, it should also work.
620 expected_value = base::Value(31);
621 obs.Expect(kSupervisedPref, &expected_value);
622 supervised_pref_store->SetInteger(kSupervisedPref, 31);
623 Mock::VerifyAndClearExpectations(&obs);
624}