blob: b85f47a52cf770f249e1e404a9b180bc07e95f1b [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
avi9ef8bb02015-12-24 05:29:3610#include "base/macros.h"
Ilya Sherman557b2de72018-01-18 20:57:1711#include "base/time/time.h"
[email protected]ecde2742010-04-02 17:36:1812#include "base/values.h"
brettwf00b9b42016-02-01 22:11:3813#include "components/prefs/json_pref_store.h"
14#include "components/prefs/mock_pref_change_callback.h"
15#include "components/prefs/pref_change_registrar.h"
Min Qincaa1e2e2018-09-14 20:56:4816#include "components/prefs/pref_notifier_impl.h"
brettwf00b9b42016-02-01 22:11:3817#include "components/prefs/pref_registry_simple.h"
18#include "components/prefs/pref_service_factory.h"
19#include "components/prefs/pref_value_store.h"
20#include "components/prefs/testing_pref_service.h"
21#include "components/prefs/testing_pref_store.h"
[email protected]ecde2742010-04-02 17:36:1822#include "testing/gmock/include/gmock/gmock.h"
initial.commit09911bf2008-07-26 23:55:2923#include "testing/gtest/include/gtest/gtest.h"
24
[email protected]ecde2742010-04-02 17:36:1825using testing::_;
26using testing::Mock;
[email protected]12a3c022010-11-03 10:24:1127
Min Qincaa1e2e2018-09-14 20:56:4828namespace {
29
[email protected]aaa552312013-02-13 16:25:4030const char kPrefName[] = "pref.name";
Min Qincaa1e2e2018-09-14 20:56:4831const char kManagedPref[] = "managed_pref";
32const char kRecommendedPref[] = "recommended_pref";
33const char kSupervisedPref[] = "supervised_pref";
34
35} // namespace
[email protected]aaa552312013-02-13 16:25:4036
[email protected]277404c22010-04-22 13:09:4537TEST(PrefServiceTest, NoObserverFire) {
[email protected]5b199522012-12-22 17:24:4438 TestingPrefServiceSimple prefs;
[email protected]7aa0a962010-04-21 17:24:4239
[email protected]57ecc4b2010-08-11 03:02:5140 const char pref_name[] = "homepage";
[email protected]b1de2c72013-02-06 02:45:4741 prefs.registry()->RegisterStringPref(pref_name, std::string());
[email protected]7aa0a962010-04-21 17:24:4242
[email protected]acd78969c2010-12-08 09:49:1143 const char new_pref_value[] = "http://www.google.com/";
[email protected]96a5c342012-12-04 18:14:0244 MockPrefChangeCallback obs(&prefs);
[email protected]2fb7dc982010-09-29 12:24:2845 PrefChangeRegistrar registrar;
46 registrar.Init(&prefs);
[email protected]96a5c342012-12-04 18:14:0247 registrar.Add(pref_name, obs.GetCallback());
[email protected]7aa0a962010-04-21 17:24:4248
[email protected]96a5c342012-12-04 18:14:0249 // This should fire the checks in MockPrefChangeCallback::OnPreferenceChanged.
jdoerrie122c4da2017-03-06 11:12:0450 const base::Value expected_value(new_pref_value);
[email protected]96a5c342012-12-04 18:14:0251 obs.Expect(pref_name, &expected_value);
[email protected]acd78969c2010-12-08 09:49:1152 prefs.SetString(pref_name, new_pref_value);
53 Mock::VerifyAndClearExpectations(&obs);
[email protected]7aa0a962010-04-21 17:24:4254
55 // Setting the pref to the same value should not set the pref value a second
56 // time.
[email protected]96a5c342012-12-04 18:14:0257 EXPECT_CALL(obs, OnPreferenceChanged(_)).Times(0);
[email protected]7aa0a962010-04-21 17:24:4258 prefs.SetString(pref_name, new_pref_value);
[email protected]acd78969c2010-12-08 09:49:1159 Mock::VerifyAndClearExpectations(&obs);
[email protected]7aa0a962010-04-21 17:24:4260
61 // Clearing the pref should cause the pref to fire.
jdoerrie122c4da2017-03-06 11:12:0462 const base::Value expected_default_value((std::string()));
[email protected]96a5c342012-12-04 18:14:0263 obs.Expect(pref_name, &expected_default_value);
[email protected]7aa0a962010-04-21 17:24:4264 prefs.ClearPref(pref_name);
[email protected]acd78969c2010-12-08 09:49:1165 Mock::VerifyAndClearExpectations(&obs);
[email protected]7aa0a962010-04-21 17:24:4266
67 // Clearing the pref again should not cause the pref to fire.
[email protected]96a5c342012-12-04 18:14:0268 EXPECT_CALL(obs, OnPreferenceChanged(_)).Times(0);
[email protected]7aa0a962010-04-21 17:24:4269 prefs.ClearPref(pref_name);
[email protected]acd78969c2010-12-08 09:49:1170 Mock::VerifyAndClearExpectations(&obs);
[email protected]7aa0a962010-04-21 17:24:4271}
72
[email protected]277404c22010-04-22 13:09:4573TEST(PrefServiceTest, HasPrefPath) {
[email protected]5b199522012-12-22 17:24:4474 TestingPrefServiceSimple prefs;
[email protected]7aa0a962010-04-21 17:24:4275
[email protected]57ecc4b2010-08-11 03:02:5176 const char path[] = "fake.path";
[email protected]7aa0a962010-04-21 17:24:4277
78 // Shouldn't initially have a path.
79 EXPECT_FALSE(prefs.HasPrefPath(path));
80
81 // Register the path. This doesn't set a value, so the path still shouldn't
82 // exist.
[email protected]b1de2c72013-02-06 02:45:4783 prefs.registry()->RegisterStringPref(path, std::string());
[email protected]7aa0a962010-04-21 17:24:4284 EXPECT_FALSE(prefs.HasPrefPath(path));
85
86 // Set a value and make sure we have a path.
[email protected]ddd231e2010-06-29 20:35:1987 prefs.SetString(path, "blah");
[email protected]7aa0a962010-04-21 17:24:4288 EXPECT_TRUE(prefs.HasPrefPath(path));
89}
90
[email protected]277404c22010-04-22 13:09:4591TEST(PrefServiceTest, Observers) {
[email protected]57ecc4b2010-08-11 03:02:5192 const char pref_name[] = "homepage";
[email protected]277404c22010-04-22 13:09:4593
[email protected]5b199522012-12-22 17:24:4494 TestingPrefServiceSimple prefs;
vabr8684c9a2017-03-29 13:14:5795 prefs.SetUserPref(pref_name,
Jinho Bang84b58bd2018-01-01 21:44:4896 std::make_unique<base::Value>("http://www.cnn.com"));
[email protected]b1de2c72013-02-06 02:45:4797 prefs.registry()->RegisterStringPref(pref_name, std::string());
[email protected]277404c22010-04-22 13:09:4598
[email protected]acd78969c2010-12-08 09:49:1199 const char new_pref_value[] = "http://www.google.com/";
jdoerrie122c4da2017-03-06 11:12:04100 const base::Value expected_new_pref_value(new_pref_value);
[email protected]96a5c342012-12-04 18:14:02101 MockPrefChangeCallback obs(&prefs);
[email protected]2fb7dc982010-09-29 12:24:28102 PrefChangeRegistrar registrar;
103 registrar.Init(&prefs);
[email protected]96a5c342012-12-04 18:14:02104 registrar.Add(pref_name, obs.GetCallback());
[email protected]277404c22010-04-22 13:09:45105
[email protected]54ffd94a2012-11-12 15:29:20106 PrefChangeRegistrar registrar_two;
107 registrar_two.Init(&prefs);
108
[email protected]96a5c342012-12-04 18:14:02109 // This should fire the checks in MockPrefChangeCallback::OnPreferenceChanged.
110 obs.Expect(pref_name, &expected_new_pref_value);
[email protected]acd78969c2010-12-08 09:49:11111 prefs.SetString(pref_name, new_pref_value);
112 Mock::VerifyAndClearExpectations(&obs);
[email protected]277404c22010-04-22 13:09:45113
114 // Now try adding a second pref observer.
[email protected]acd78969c2010-12-08 09:49:11115 const char new_pref_value2[] = "http://www.youtube.com/";
jdoerrie122c4da2017-03-06 11:12:04116 const base::Value expected_new_pref_value2(new_pref_value2);
[email protected]96a5c342012-12-04 18:14:02117 MockPrefChangeCallback obs2(&prefs);
118 obs.Expect(pref_name, &expected_new_pref_value2);
119 obs2.Expect(pref_name, &expected_new_pref_value2);
120 registrar_two.Add(pref_name, obs2.GetCallback());
[email protected]277404c22010-04-22 13:09:45121 // This should fire the checks in obs and obs2.
122 prefs.SetString(pref_name, new_pref_value2);
[email protected]acd78969c2010-12-08 09:49:11123 Mock::VerifyAndClearExpectations(&obs);
124 Mock::VerifyAndClearExpectations(&obs2);
[email protected]277404c22010-04-22 13:09:45125
[email protected]7ca0f362012-07-30 10:14:03126 // Set a recommended value.
jdoerrie122c4da2017-03-06 11:12:04127 const base::Value recommended_pref_value("http://www.gmail.com/");
[email protected]96a5c342012-12-04 18:14:02128 obs.Expect(pref_name, &expected_new_pref_value2);
129 obs2.Expect(pref_name, &expected_new_pref_value2);
[email protected]7ca0f362012-07-30 10:14:03130 // This should fire the checks in obs and obs2 but with an unchanged value
131 // as the recommended value is being overridden by the user-set value.
vabr8684c9a2017-03-29 13:14:57132 prefs.SetRecommendedPref(pref_name, recommended_pref_value.CreateDeepCopy());
[email protected]7ca0f362012-07-30 10:14:03133 Mock::VerifyAndClearExpectations(&obs);
134 Mock::VerifyAndClearExpectations(&obs2);
135
[email protected]277404c22010-04-22 13:09:45136 // Make sure obs2 still works after removing obs.
[email protected]54ffd94a2012-11-12 15:29:20137 registrar.Remove(pref_name);
[email protected]96a5c342012-12-04 18:14:02138 EXPECT_CALL(obs, OnPreferenceChanged(_)).Times(0);
139 obs2.Expect(pref_name, &expected_new_pref_value);
[email protected]277404c22010-04-22 13:09:45140 // This should only fire the observer in obs2.
141 prefs.SetString(pref_name, new_pref_value);
[email protected]acd78969c2010-12-08 09:49:11142 Mock::VerifyAndClearExpectations(&obs);
143 Mock::VerifyAndClearExpectations(&obs2);
[email protected]277404c22010-04-22 13:09:45144}
145
[email protected]9a8c4022011-01-25 14:25:33146// Make sure that if a preference changes type, so the wrong type is stored in
147// the user pref file, it uses the correct fallback value instead.
148TEST(PrefServiceTest, GetValueChangedType) {
149 const int kTestValue = 10;
[email protected]5b199522012-12-22 17:24:44150 TestingPrefServiceSimple prefs;
[email protected]aaa552312013-02-13 16:25:40151 prefs.registry()->RegisterIntegerPref(kPrefName, kTestValue);
[email protected]9a8c4022011-01-25 14:25:33152
153 // Check falling back to a recommended value.
Jinho Bang84b58bd2018-01-01 21:44:48154 prefs.SetUserPref(kPrefName, std::make_unique<base::Value>("not an integer"));
[email protected]aaa552312013-02-13 16:25:40155 const PrefService::Preference* pref = prefs.FindPreference(kPrefName);
[email protected]9a8c4022011-01-25 14:25:33156 ASSERT_TRUE(pref);
[email protected]a43a667b2013-06-14 17:56:08157 const base::Value* value = pref->GetValue();
[email protected]9a8c4022011-01-25 14:25:33158 ASSERT_TRUE(value);
jdoerrie76cee9c2017-10-06 22:42:42159 EXPECT_EQ(base::Value::Type::INTEGER, value->type());
[email protected]9a8c4022011-01-25 14:25:33160 int actual_int_value = -1;
161 EXPECT_TRUE(value->GetAsInteger(&actual_int_value));
162 EXPECT_EQ(kTestValue, actual_int_value);
163}
164
[email protected]7ca0f362012-07-30 10:14:03165TEST(PrefServiceTest, GetValueAndGetRecommendedValue) {
166 const int kDefaultValue = 5;
167 const int kUserValue = 10;
168 const int kRecommendedValue = 15;
[email protected]5b199522012-12-22 17:24:44169 TestingPrefServiceSimple prefs;
[email protected]aaa552312013-02-13 16:25:40170 prefs.registry()->RegisterIntegerPref(kPrefName, kDefaultValue);
[email protected]7ca0f362012-07-30 10:14:03171
172 // Create pref with a default value only.
[email protected]aaa552312013-02-13 16:25:40173 const PrefService::Preference* pref = prefs.FindPreference(kPrefName);
[email protected]7ca0f362012-07-30 10:14:03174 ASSERT_TRUE(pref);
175
176 // Check that GetValue() returns the default value.
[email protected]a43a667b2013-06-14 17:56:08177 const base::Value* value = pref->GetValue();
[email protected]7ca0f362012-07-30 10:14:03178 ASSERT_TRUE(value);
jdoerrie76cee9c2017-10-06 22:42:42179 EXPECT_EQ(base::Value::Type::INTEGER, value->type());
[email protected]7ca0f362012-07-30 10:14:03180 int actual_int_value = -1;
181 EXPECT_TRUE(value->GetAsInteger(&actual_int_value));
182 EXPECT_EQ(kDefaultValue, actual_int_value);
183
184 // Check that GetRecommendedValue() returns no value.
185 value = pref->GetRecommendedValue();
186 ASSERT_FALSE(value);
187
188 // Set a user-set value.
Jinho Bang84b58bd2018-01-01 21:44:48189 prefs.SetUserPref(kPrefName, std::make_unique<base::Value>(kUserValue));
[email protected]7ca0f362012-07-30 10:14:03190
191 // Check that GetValue() returns the user-set value.
192 value = pref->GetValue();
193 ASSERT_TRUE(value);
jdoerrie76cee9c2017-10-06 22:42:42194 EXPECT_EQ(base::Value::Type::INTEGER, value->type());
[email protected]7ca0f362012-07-30 10:14:03195 actual_int_value = -1;
196 EXPECT_TRUE(value->GetAsInteger(&actual_int_value));
197 EXPECT_EQ(kUserValue, actual_int_value);
198
199 // Check that GetRecommendedValue() returns no value.
200 value = pref->GetRecommendedValue();
201 ASSERT_FALSE(value);
202
203 // Set a recommended value.
vabr8684c9a2017-03-29 13:14:57204 prefs.SetRecommendedPref(kPrefName,
Jinho Bang84b58bd2018-01-01 21:44:48205 std::make_unique<base::Value>(kRecommendedValue));
[email protected]7ca0f362012-07-30 10:14:03206
207 // Check that GetValue() returns the user-set value.
208 value = pref->GetValue();
209 ASSERT_TRUE(value);
jdoerrie76cee9c2017-10-06 22:42:42210 EXPECT_EQ(base::Value::Type::INTEGER, value->type());
[email protected]7ca0f362012-07-30 10:14:03211 actual_int_value = -1;
212 EXPECT_TRUE(value->GetAsInteger(&actual_int_value));
213 EXPECT_EQ(kUserValue, actual_int_value);
214
215 // Check that GetRecommendedValue() returns the recommended value.
216 value = pref->GetRecommendedValue();
217 ASSERT_TRUE(value);
jdoerrie76cee9c2017-10-06 22:42:42218 EXPECT_EQ(base::Value::Type::INTEGER, value->type());
[email protected]7ca0f362012-07-30 10:14:03219 actual_int_value = -1;
220 EXPECT_TRUE(value->GetAsInteger(&actual_int_value));
221 EXPECT_EQ(kRecommendedValue, actual_int_value);
222
223 // Remove the user-set value.
[email protected]aaa552312013-02-13 16:25:40224 prefs.RemoveUserPref(kPrefName);
[email protected]7ca0f362012-07-30 10:14:03225
226 // Check that GetValue() returns the recommended value.
227 value = pref->GetValue();
228 ASSERT_TRUE(value);
jdoerrie76cee9c2017-10-06 22:42:42229 EXPECT_EQ(base::Value::Type::INTEGER, value->type());
[email protected]7ca0f362012-07-30 10:14:03230 actual_int_value = -1;
231 EXPECT_TRUE(value->GetAsInteger(&actual_int_value));
232 EXPECT_EQ(kRecommendedValue, actual_int_value);
233
234 // Check that GetRecommendedValue() returns the recommended value.
235 value = pref->GetRecommendedValue();
236 ASSERT_TRUE(value);
jdoerrie76cee9c2017-10-06 22:42:42237 EXPECT_EQ(base::Value::Type::INTEGER, value->type());
[email protected]7ca0f362012-07-30 10:14:03238 actual_int_value = -1;
239 EXPECT_TRUE(value->GetAsInteger(&actual_int_value));
240 EXPECT_EQ(kRecommendedValue, actual_int_value);
241}
242
Ilya Sherman557b2de72018-01-18 20:57:17243TEST(PrefServiceTest, SetTimeValue_RegularTime) {
244 TestingPrefServiceSimple prefs;
245
246 // Register a null time as the default.
247 prefs.registry()->RegisterTimePref(kPrefName, base::Time());
248 EXPECT_TRUE(prefs.GetTime(kPrefName).is_null());
249
250 // Set a time and make sure that we can read it without any loss of precision.
251 const base::Time time = base::Time::Now();
252 prefs.SetTime(kPrefName, time);
253 EXPECT_EQ(time, prefs.GetTime(kPrefName));
254}
255
256TEST(PrefServiceTest, SetTimeValue_NullTime) {
257 TestingPrefServiceSimple prefs;
258
259 // Register a non-null time as the default.
260 const base::Time default_time = base::Time::FromDeltaSinceWindowsEpoch(
261 base::TimeDelta::FromMicroseconds(12345));
262 prefs.registry()->RegisterTimePref(kPrefName, default_time);
263 EXPECT_FALSE(prefs.GetTime(kPrefName).is_null());
264
265 // Set a null time and make sure that it remains null upon deserialization.
266 prefs.SetTime(kPrefName, base::Time());
267 EXPECT_TRUE(prefs.GetTime(kPrefName).is_null());
268}
269
Sky Maliceaff2af142018-06-18 18:37:29270TEST(PrefServiceTest, SetTimeDeltaValue_RegularTimeDelta) {
271 TestingPrefServiceSimple prefs;
272
273 // Register a zero time delta as the default.
274 prefs.registry()->RegisterTimeDeltaPref(kPrefName, base::TimeDelta());
275 EXPECT_TRUE(prefs.GetTimeDelta(kPrefName).is_zero());
276
277 // Set a time delta and make sure that we can read it without any loss of
278 // precision.
279 const base::TimeDelta delta = base::Time::Now() - base::Time();
280 prefs.SetTimeDelta(kPrefName, delta);
281 EXPECT_EQ(delta, prefs.GetTimeDelta(kPrefName));
282}
283
284TEST(PrefServiceTest, SetTimeDeltaValue_ZeroTimeDelta) {
285 TestingPrefServiceSimple prefs;
286
287 // Register a non-zero time delta as the default.
288 const base::TimeDelta default_delta =
289 base::TimeDelta::FromMicroseconds(12345);
290 prefs.registry()->RegisterTimeDeltaPref(kPrefName, default_delta);
291 EXPECT_FALSE(prefs.GetTimeDelta(kPrefName).is_zero());
292
293 // Set a zero time delta and make sure that it remains zero upon
294 // deserialization.
295 prefs.SetTimeDelta(kPrefName, base::TimeDelta());
296 EXPECT_TRUE(prefs.GetTimeDelta(kPrefName).is_zero());
297}
298
raymesf3a929b02015-05-07 03:54:45299// A PrefStore which just stores the last write flags that were used to write
300// values to it.
301class WriteFlagChecker : public TestingPrefStore {
302 public:
303 WriteFlagChecker() {}
304
avi9ef8bb02015-12-24 05:29:36305 void ReportValueChanged(const std::string& key, uint32_t flags) override {
raymesf3a929b02015-05-07 03:54:45306 SetLastWriteFlags(flags);
307 }
308
309 void SetValue(const std::string& key,
dcheng5f043bc2016-04-22 19:09:06310 std::unique_ptr<base::Value> value,
avi9ef8bb02015-12-24 05:29:36311 uint32_t flags) override {
raymesf3a929b02015-05-07 03:54:45312 SetLastWriteFlags(flags);
raymesf3a929b02015-05-07 03:54:45313 }
314
315 void SetValueSilently(const std::string& key,
dcheng5f043bc2016-04-22 19:09:06316 std::unique_ptr<base::Value> value,
avi9ef8bb02015-12-24 05:29:36317 uint32_t flags) override {
raymesf3a929b02015-05-07 03:54:45318 SetLastWriteFlags(flags);
raymesf3a929b02015-05-07 03:54:45319 }
320
avi9ef8bb02015-12-24 05:29:36321 void RemoveValue(const std::string& key, uint32_t flags) override {
raymesf3a929b02015-05-07 03:54:45322 SetLastWriteFlags(flags);
323 }
324
avi9ef8bb02015-12-24 05:29:36325 uint32_t GetLastFlagsAndClear() {
raymesf3a929b02015-05-07 03:54:45326 CHECK(last_write_flags_set_);
avi9ef8bb02015-12-24 05:29:36327 uint32_t result = last_write_flags_;
raymesf3a929b02015-05-07 03:54:45328 last_write_flags_set_ = false;
329 last_write_flags_ = WriteablePrefStore::DEFAULT_PREF_WRITE_FLAGS;
330 return result;
331 }
332
333 bool last_write_flags_set() { return last_write_flags_set_; }
334
335 private:
336 ~WriteFlagChecker() override {}
337
avi9ef8bb02015-12-24 05:29:36338 void SetLastWriteFlags(uint32_t flags) {
raymesf3a929b02015-05-07 03:54:45339 CHECK(!last_write_flags_set_);
340 last_write_flags_set_ = true;
341 last_write_flags_ = flags;
342 }
343
344 bool last_write_flags_set_ = false;
avi9ef8bb02015-12-24 05:29:36345 uint32_t last_write_flags_ = WriteablePrefStore::DEFAULT_PREF_WRITE_FLAGS;
raymesf3a929b02015-05-07 03:54:45346};
347
348TEST(PrefServiceTest, WriteablePrefStoreFlags) {
349 scoped_refptr<WriteFlagChecker> flag_checker(new WriteFlagChecker);
350 scoped_refptr<PrefRegistrySimple> registry(new PrefRegistrySimple);
brettw066508682016-02-03 08:22:02351 PrefServiceFactory factory;
raymesf3a929b02015-05-07 03:54:45352 factory.set_user_prefs(flag_checker);
dcheng5f043bc2016-04-22 19:09:06353 std::unique_ptr<PrefService> prefs(factory.Create(registry.get()));
raymesf3a929b02015-05-07 03:54:45354
355 // The first 8 bits of write flags are reserved for subclasses. Create a
356 // custom flag in this range
avi9ef8bb02015-12-24 05:29:36357 uint32_t kCustomRegistrationFlag = 1 << 2;
raymesf3a929b02015-05-07 03:54:45358
359 // A map of the registration flags that will be tested and the write flags
360 // they are expected to convert to.
361 struct RegistrationToWriteFlags {
362 const char* pref_name;
avi9ef8bb02015-12-24 05:29:36363 uint32_t registration_flags;
364 uint32_t write_flags;
raymesf3a929b02015-05-07 03:54:45365 };
366 const RegistrationToWriteFlags kRegistrationToWriteFlags[] = {
367 {"none",
368 PrefRegistry::NO_REGISTRATION_FLAGS,
369 WriteablePrefStore::DEFAULT_PREF_WRITE_FLAGS},
370 {"lossy",
371 PrefRegistry::LOSSY_PREF,
372 WriteablePrefStore::LOSSY_PREF_WRITE_FLAG},
373 {"custom",
374 kCustomRegistrationFlag,
375 WriteablePrefStore::DEFAULT_PREF_WRITE_FLAGS},
376 {"lossyandcustom",
377 PrefRegistry::LOSSY_PREF | kCustomRegistrationFlag,
378 WriteablePrefStore::LOSSY_PREF_WRITE_FLAG}};
379
380 for (size_t i = 0; i < arraysize(kRegistrationToWriteFlags); ++i) {
381 RegistrationToWriteFlags entry = kRegistrationToWriteFlags[i];
vabr88e507212017-03-29 13:22:26382 registry->RegisterDictionaryPref(entry.pref_name,
Jinho Bang84b58bd2018-01-01 21:44:48383 std::make_unique<base::DictionaryValue>(),
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,
Jinho Bang84b58bd2018-01-01 21:44:48402 std::make_unique<base::DictionaryValue>());
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}