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/callback_helpers.h"
11 #include "base/cxx17_backports.h"
12 #include "base/time/time.h"
13 #include "base/values.h"
14 #include "components/prefs/json_pref_store.h"
15 #include "components/prefs/mock_pref_change_callback.h"
16 #include "components/prefs/pref_change_registrar.h"
17 #include "components/prefs/pref_notifier_impl.h"
18 #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"
23 #include "testing/gmock/include/gmock/gmock.h"
24 #include "testing/gtest/include/gtest/gtest.h"
31 const char kPrefName[] = "pref.name";
32 const char kManagedPref[] = "managed_pref";
33 const char kRecommendedPref[] = "recommended_pref";
34 const char kSupervisedPref[] = "supervised_pref";
38 TEST(PrefServiceTest, NoObserverFire) {
39 TestingPrefServiceSimple prefs;
41 const char pref_name[] = "homepage";
42 prefs.registry()->RegisterStringPref(pref_name, std::string());
44 const char new_pref_value[] = "http://www.google.com/";
45 MockPrefChangeCallback obs(&prefs);
46 PrefChangeRegistrar registrar;
47 registrar.Init(&prefs);
48 registrar.Add(pref_name, obs.GetCallback());
50 // This should fire the checks in MockPrefChangeCallback::OnPreferenceChanged.
51 const base::Value expected_value(new_pref_value);
52 obs.Expect(pref_name, &expected_value);
53 prefs.SetString(pref_name, new_pref_value);
54 Mock::VerifyAndClearExpectations(&obs);
56 // Setting the pref to the same value should not set the pref value a second
58 EXPECT_CALL(obs, OnPreferenceChanged(_)).Times(0);
59 prefs.SetString(pref_name, new_pref_value);
60 Mock::VerifyAndClearExpectations(&obs);
62 // Clearing the pref should cause the pref to fire.
63 const base::Value expected_default_value((std::string()));
64 obs.Expect(pref_name, &expected_default_value);
65 prefs.ClearPref(pref_name);
66 Mock::VerifyAndClearExpectations(&obs);
68 // Clearing the pref again should not cause the pref to fire.
69 EXPECT_CALL(obs, OnPreferenceChanged(_)).Times(0);
70 prefs.ClearPref(pref_name);
71 Mock::VerifyAndClearExpectations(&obs);
74 TEST(PrefServiceTest, HasPrefPath) {
75 TestingPrefServiceSimple prefs;
77 const char path[] = "fake.path";
79 // Shouldn't initially have a path.
80 EXPECT_FALSE(prefs.HasPrefPath(path));
82 // Register the path. This doesn't set a value, so the path still shouldn't
84 prefs.registry()->RegisterStringPref(path, std::string());
85 EXPECT_FALSE(prefs.HasPrefPath(path));
87 // Set a value and make sure we have a path.
88 prefs.SetString(path, "blah");
89 EXPECT_TRUE(prefs.HasPrefPath(path));
92 TEST(PrefServiceTest, Observers) {
93 const char pref_name[] = "homepage";
95 TestingPrefServiceSimple prefs;
96 prefs.SetUserPref(pref_name,
97 std::make_unique<base::Value>("http://www.cnn.com"));
98 prefs.registry()->RegisterStringPref(pref_name, std::string());
100 const char new_pref_value[] = "http://www.google.com/";
101 const base::Value expected_new_pref_value(new_pref_value);
102 MockPrefChangeCallback obs(&prefs);
103 PrefChangeRegistrar registrar;
104 registrar.Init(&prefs);
105 registrar.Add(pref_name, obs.GetCallback());
107 PrefChangeRegistrar registrar_two;
108 registrar_two.Init(&prefs);
110 // This should fire the checks in MockPrefChangeCallback::OnPreferenceChanged.
111 obs.Expect(pref_name, &expected_new_pref_value);
112 prefs.SetString(pref_name, new_pref_value);
113 Mock::VerifyAndClearExpectations(&obs);
115 // Now try adding a second pref observer.
116 const char new_pref_value2[] = "http://www.youtube.com/";
117 const base::Value expected_new_pref_value2(new_pref_value2);
118 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());
122 // This should fire the checks in obs and obs2.
123 prefs.SetString(pref_name, new_pref_value2);
124 Mock::VerifyAndClearExpectations(&obs);
125 Mock::VerifyAndClearExpectations(&obs2);
127 // Set a recommended value.
128 const base::Value recommended_pref_value("http://www.gmail.com/");
129 obs.Expect(pref_name, &expected_new_pref_value2);
130 obs2.Expect(pref_name, &expected_new_pref_value2);
131 // 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.
133 prefs.SetRecommendedPref(pref_name, recommended_pref_value.CreateDeepCopy());
134 Mock::VerifyAndClearExpectations(&obs);
135 Mock::VerifyAndClearExpectations(&obs2);
137 // Make sure obs2 still works after removing obs.
138 registrar.Remove(pref_name);
139 EXPECT_CALL(obs, OnPreferenceChanged(_)).Times(0);
140 obs2.Expect(pref_name, &expected_new_pref_value);
141 // This should only fire the observer in obs2.
142 prefs.SetString(pref_name, new_pref_value);
143 Mock::VerifyAndClearExpectations(&obs);
144 Mock::VerifyAndClearExpectations(&obs2);
147 // 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.
149 TEST(PrefServiceTest, GetValueChangedType) {
150 const int kTestValue = 10;
151 TestingPrefServiceSimple prefs;
152 prefs.registry()->RegisterIntegerPref(kPrefName, kTestValue);
154 // Check falling back to a recommended value.
155 prefs.SetUserPref(kPrefName, std::make_unique<base::Value>("not an integer"));
156 const PrefService::Preference* pref = prefs.FindPreference(kPrefName);
158 const base::Value* value = pref->GetValue();
160 EXPECT_EQ(base::Value::Type::INTEGER, value->type());
161 ASSERT_TRUE(value->is_int());
162 EXPECT_EQ(kTestValue, value->GetInt());
165 TEST(PrefServiceTest, GetValueAndGetRecommendedValue) {
166 const int kDefaultValue = 5;
167 const int kUserValue = 10;
168 const int kRecommendedValue = 15;
169 TestingPrefServiceSimple prefs;
170 prefs.registry()->RegisterIntegerPref(kPrefName, kDefaultValue);
172 // Create pref with a default value only.
173 const PrefService::Preference* pref = prefs.FindPreference(kPrefName);
176 // Check that GetValue() returns the default value.
177 const base::Value* value = pref->GetValue();
179 EXPECT_EQ(base::Value::Type::INTEGER, value->type());
180 ASSERT_TRUE(value->is_int());
181 EXPECT_EQ(kDefaultValue, value->GetInt());
183 // Check that GetRecommendedValue() returns no value.
184 value = pref->GetRecommendedValue();
187 // Set a user-set value.
188 prefs.SetUserPref(kPrefName, std::make_unique<base::Value>(kUserValue));
190 // Check that GetValue() returns the user-set value.
191 value = pref->GetValue();
193 EXPECT_EQ(base::Value::Type::INTEGER, value->type());
194 ASSERT_TRUE(value->is_int());
195 EXPECT_EQ(kUserValue, value->GetInt());
197 // Check that GetRecommendedValue() returns no value.
198 value = pref->GetRecommendedValue();
201 // Set a recommended value.
202 prefs.SetRecommendedPref(kPrefName,
203 std::make_unique<base::Value>(kRecommendedValue));
205 // Check that GetValue() returns the user-set value.
206 value = pref->GetValue();
208 EXPECT_EQ(base::Value::Type::INTEGER, value->type());
209 ASSERT_TRUE(value->is_int());
210 EXPECT_EQ(kUserValue, value->GetInt());
212 // Check that GetRecommendedValue() returns the recommended value.
213 value = pref->GetRecommendedValue();
215 EXPECT_EQ(base::Value::Type::INTEGER, value->type());
216 ASSERT_TRUE(value->is_int());
217 EXPECT_EQ(kRecommendedValue, value->GetInt());
219 // Remove the user-set value.
220 prefs.RemoveUserPref(kPrefName);
222 // Check that GetValue() returns the recommended value.
223 value = pref->GetValue();
225 EXPECT_EQ(base::Value::Type::INTEGER, value->type());
226 ASSERT_TRUE(value->is_int());
227 EXPECT_EQ(kRecommendedValue, value->GetInt());
229 // Check that GetRecommendedValue() returns the recommended value.
230 value = pref->GetRecommendedValue();
232 EXPECT_EQ(base::Value::Type::INTEGER, value->type());
233 ASSERT_TRUE(value->is_int());
234 EXPECT_EQ(kRecommendedValue, value->GetInt());
237 TEST(PrefServiceTest, SetTimeValue_RegularTime) {
238 TestingPrefServiceSimple prefs;
240 // Register a null time as the default.
241 prefs.registry()->RegisterTimePref(kPrefName, base::Time());
242 EXPECT_TRUE(prefs.GetTime(kPrefName).is_null());
244 // Set a time and make sure that we can read it without any loss of precision.
245 const base::Time time = base::Time::Now();
246 prefs.SetTime(kPrefName, time);
247 EXPECT_EQ(time, prefs.GetTime(kPrefName));
250 TEST(PrefServiceTest, SetTimeValue_NullTime) {
251 TestingPrefServiceSimple prefs;
253 // Register a non-null time as the default.
254 const base::Time default_time = base::Time::FromDeltaSinceWindowsEpoch(
255 base::TimeDelta::FromMicroseconds(12345));
256 prefs.registry()->RegisterTimePref(kPrefName, default_time);
257 EXPECT_FALSE(prefs.GetTime(kPrefName).is_null());
259 // Set a null time and make sure that it remains null upon deserialization.
260 prefs.SetTime(kPrefName, base::Time());
261 EXPECT_TRUE(prefs.GetTime(kPrefName).is_null());
264 TEST(PrefServiceTest, SetTimeDeltaValue_RegularTimeDelta) {
265 TestingPrefServiceSimple prefs;
267 // Register a zero time delta as the default.
268 prefs.registry()->RegisterTimeDeltaPref(kPrefName, base::TimeDelta());
269 EXPECT_TRUE(prefs.GetTimeDelta(kPrefName).is_zero());
271 // Set a time delta and make sure that we can read it without any loss of
273 const base::TimeDelta delta = base::Time::Now() - base::Time();
274 prefs.SetTimeDelta(kPrefName, delta);
275 EXPECT_EQ(delta, prefs.GetTimeDelta(kPrefName));
278 TEST(PrefServiceTest, SetTimeDeltaValue_ZeroTimeDelta) {
279 TestingPrefServiceSimple prefs;
281 // Register a non-zero time delta as the default.
282 const base::TimeDelta default_delta =
283 base::TimeDelta::FromMicroseconds(12345);
284 prefs.registry()->RegisterTimeDeltaPref(kPrefName, default_delta);
285 EXPECT_FALSE(prefs.GetTimeDelta(kPrefName).is_zero());
287 // Set a zero time delta and make sure that it remains zero upon
289 prefs.SetTimeDelta(kPrefName, base::TimeDelta());
290 EXPECT_TRUE(prefs.GetTimeDelta(kPrefName).is_zero());
293 // A PrefStore which just stores the last write flags that were used to write
295 class WriteFlagChecker : public TestingPrefStore {
297 WriteFlagChecker() {}
299 void ReportValueChanged(const std::string& key, uint32_t flags) override {
300 SetLastWriteFlags(flags);
303 void SetValue(const std::string& key,
304 std::unique_ptr<base::Value> value,
305 uint32_t flags) override {
306 SetLastWriteFlags(flags);
309 void SetValueSilently(const std::string& key,
310 std::unique_ptr<base::Value> value,
311 uint32_t flags) override {
312 SetLastWriteFlags(flags);
315 void RemoveValue(const std::string& key, uint32_t flags) override {
316 SetLastWriteFlags(flags);
319 uint32_t GetLastFlagsAndClear() {
320 CHECK(last_write_flags_set_);
321 uint32_t result = last_write_flags_;
322 last_write_flags_set_ = false;
323 last_write_flags_ = WriteablePrefStore::DEFAULT_PREF_WRITE_FLAGS;
327 bool last_write_flags_set() { return last_write_flags_set_; }
330 ~WriteFlagChecker() override {}
332 void SetLastWriteFlags(uint32_t flags) {
333 CHECK(!last_write_flags_set_);
334 last_write_flags_set_ = true;
335 last_write_flags_ = flags;
338 bool last_write_flags_set_ = false;
339 uint32_t last_write_flags_ = WriteablePrefStore::DEFAULT_PREF_WRITE_FLAGS;
342 TEST(PrefServiceTest, WriteablePrefStoreFlags) {
343 scoped_refptr<WriteFlagChecker> flag_checker(new WriteFlagChecker);
344 scoped_refptr<PrefRegistrySimple> registry(new PrefRegistrySimple);
345 PrefServiceFactory factory;
346 factory.set_user_prefs(flag_checker);
347 std::unique_ptr<PrefService> prefs(factory.Create(registry.get()));
349 // The first 8 bits of write flags are reserved for subclasses. Create a
350 // custom flag in this range
351 uint32_t kCustomRegistrationFlag = 1 << 2;
353 // A map of the registration flags that will be tested and the write flags
354 // they are expected to convert to.
355 struct RegistrationToWriteFlags {
356 const char* pref_name;
357 uint32_t registration_flags;
358 uint32_t write_flags;
360 const RegistrationToWriteFlags kRegistrationToWriteFlags[] = {
362 PrefRegistry::NO_REGISTRATION_FLAGS,
363 WriteablePrefStore::DEFAULT_PREF_WRITE_FLAGS},
365 PrefRegistry::LOSSY_PREF,
366 WriteablePrefStore::LOSSY_PREF_WRITE_FLAG},
368 kCustomRegistrationFlag,
369 WriteablePrefStore::DEFAULT_PREF_WRITE_FLAGS},
371 PrefRegistry::LOSSY_PREF | kCustomRegistrationFlag,
372 WriteablePrefStore::LOSSY_PREF_WRITE_FLAG}};
374 for (size_t i = 0; i < base::size(kRegistrationToWriteFlags); ++i) {
375 RegistrationToWriteFlags entry = kRegistrationToWriteFlags[i];
376 registry->RegisterDictionaryPref(entry.pref_name,
377 entry.registration_flags);
379 SCOPED_TRACE("Currently testing pref with name: " +
380 std::string(entry.pref_name));
382 prefs->GetMutableUserPref(entry.pref_name, base::Value::Type::DICTIONARY);
383 EXPECT_TRUE(flag_checker->last_write_flags_set());
384 EXPECT_EQ(entry.write_flags, flag_checker->GetLastFlagsAndClear());
386 prefs->ReportUserPrefChanged(entry.pref_name);
387 EXPECT_TRUE(flag_checker->last_write_flags_set());
388 EXPECT_EQ(entry.write_flags, flag_checker->GetLastFlagsAndClear());
390 prefs->ClearPref(entry.pref_name);
391 EXPECT_TRUE(flag_checker->last_write_flags_set());
392 EXPECT_EQ(entry.write_flags, flag_checker->GetLastFlagsAndClear());
394 prefs->SetUserPrefValue(entry.pref_name,
395 base::Value(base::Value::Type::DICTIONARY));
396 EXPECT_TRUE(flag_checker->last_write_flags_set());
397 EXPECT_EQ(entry.write_flags, flag_checker->GetLastFlagsAndClear());
401 class PrefServiceSetValueTest : public testing::Test {
403 static const char kName[];
404 static const char kValue[];
406 PrefServiceSetValueTest() : observer_(&prefs_) {}
408 TestingPrefServiceSimple prefs_;
409 MockPrefChangeCallback observer_;
412 const char PrefServiceSetValueTest::kName[] = "name";
413 const char PrefServiceSetValueTest::kValue[] = "value";
415 TEST_F(PrefServiceSetValueTest, SetStringValue) {
416 const char default_string[] = "default";
417 const base::Value default_value(default_string);
418 prefs_.registry()->RegisterStringPref(kName, default_string);
420 PrefChangeRegistrar registrar;
421 registrar.Init(&prefs_);
422 registrar.Add(kName, observer_.GetCallback());
424 // Changing the controlling store from default to user triggers notification.
425 observer_.Expect(kName, &default_value);
426 prefs_.Set(kName, default_value);
427 Mock::VerifyAndClearExpectations(&observer_);
429 EXPECT_CALL(observer_, OnPreferenceChanged(_)).Times(0);
430 prefs_.Set(kName, default_value);
431 Mock::VerifyAndClearExpectations(&observer_);
433 base::Value new_value(kValue);
434 observer_.Expect(kName, &new_value);
435 prefs_.Set(kName, new_value);
436 Mock::VerifyAndClearExpectations(&observer_);
439 TEST_F(PrefServiceSetValueTest, SetDictionaryValue) {
440 prefs_.registry()->RegisterDictionaryPref(kName);
441 PrefChangeRegistrar registrar;
442 registrar.Init(&prefs_);
443 registrar.Add(kName, observer_.GetCallback());
445 EXPECT_CALL(observer_, OnPreferenceChanged(_)).Times(0);
446 prefs_.RemoveUserPref(kName);
447 Mock::VerifyAndClearExpectations(&observer_);
449 base::DictionaryValue new_value;
450 new_value.SetString(kName, kValue);
451 observer_.Expect(kName, &new_value);
452 prefs_.Set(kName, new_value);
453 Mock::VerifyAndClearExpectations(&observer_);
455 EXPECT_CALL(observer_, OnPreferenceChanged(_)).Times(0);
456 prefs_.Set(kName, new_value);
457 Mock::VerifyAndClearExpectations(&observer_);
459 base::DictionaryValue empty;
460 observer_.Expect(kName, &empty);
461 prefs_.Set(kName, empty);
462 Mock::VerifyAndClearExpectations(&observer_);
465 TEST_F(PrefServiceSetValueTest, SetListValue) {
466 prefs_.registry()->RegisterListPref(kName);
467 PrefChangeRegistrar registrar;
468 registrar.Init(&prefs_);
469 registrar.Add(kName, observer_.GetCallback());
471 EXPECT_CALL(observer_, OnPreferenceChanged(_)).Times(0);
472 prefs_.RemoveUserPref(kName);
473 Mock::VerifyAndClearExpectations(&observer_);
475 base::ListValue new_value;
476 new_value.AppendString(kValue);
477 observer_.Expect(kName, &new_value);
478 prefs_.Set(kName, new_value);
479 Mock::VerifyAndClearExpectations(&observer_);
481 EXPECT_CALL(observer_, OnPreferenceChanged(_)).Times(0);
482 prefs_.Set(kName, new_value);
483 Mock::VerifyAndClearExpectations(&observer_);
485 base::ListValue empty;
486 observer_.Expect(kName, &empty);
487 prefs_.Set(kName, empty);
488 Mock::VerifyAndClearExpectations(&observer_);
491 class PrefValueStoreChangeTest : public testing::Test {
493 PrefValueStoreChangeTest()
494 : user_pref_store_(base::MakeRefCounted<TestingPrefStore>()),
495 pref_registry_(base::MakeRefCounted<PrefRegistrySimple>()) {}
497 ~PrefValueStoreChangeTest() override = default;
499 void SetUp() override {
500 auto pref_notifier = std::make_unique<PrefNotifierImpl>();
501 auto pref_value_store = std::make_unique<PrefValueStore>(
502 nullptr /* managed_prefs */, nullptr /* supervised_user_prefs */,
503 nullptr /* extension_prefs */, new TestingPrefStore(),
504 user_pref_store_.get(), nullptr /* recommended_prefs */,
505 pref_registry_->defaults().get(), pref_notifier.get());
506 pref_service_ = std::make_unique<PrefService>(
507 std::move(pref_notifier), std::move(pref_value_store), user_pref_store_,
508 pref_registry_, base::DoNothing(), false);
509 pref_registry_->RegisterIntegerPref(kManagedPref, 1);
510 pref_registry_->RegisterIntegerPref(kRecommendedPref, 2);
511 pref_registry_->RegisterIntegerPref(kSupervisedPref, 3);
514 std::unique_ptr<PrefService> pref_service_;
515 scoped_refptr<TestingPrefStore> user_pref_store_;
516 scoped_refptr<PrefRegistrySimple> pref_registry_;
519 // Check that value from the new PrefValueStore will be correctly retrieved.
520 TEST_F(PrefValueStoreChangeTest, ChangePrefValueStore) {
521 const PrefService::Preference* preference =
522 pref_service_->FindPreference(kManagedPref);
523 EXPECT_TRUE(preference->IsDefaultValue());
524 EXPECT_EQ(base::Value(1), *(preference->GetValue()));
525 const PrefService::Preference* supervised =
526 pref_service_->FindPreference(kSupervisedPref);
527 EXPECT_TRUE(supervised->IsDefaultValue());
528 EXPECT_EQ(base::Value(3), *(supervised->GetValue()));
529 const PrefService::Preference* recommended =
530 pref_service_->FindPreference(kRecommendedPref);
531 EXPECT_TRUE(recommended->IsDefaultValue());
532 EXPECT_EQ(base::Value(2), *(recommended->GetValue()));
534 user_pref_store_->SetInteger(kManagedPref, 10);
535 EXPECT_TRUE(preference->IsUserControlled());
536 ASSERT_EQ(base::Value(10), *(preference->GetValue()));
538 scoped_refptr<TestingPrefStore> managed_pref_store =
539 base::MakeRefCounted<TestingPrefStore>();
540 pref_service_->ChangePrefValueStore(
541 managed_pref_store.get(), nullptr /* supervised_user_prefs */,
542 nullptr /* extension_prefs */, nullptr /* recommended_prefs */);
543 EXPECT_TRUE(preference->IsUserControlled());
544 ASSERT_EQ(base::Value(10), *(preference->GetValue()));
546 // Test setting a managed pref after overriding the managed PrefStore.
547 managed_pref_store->SetInteger(kManagedPref, 20);
548 EXPECT_TRUE(preference->IsManaged());
549 ASSERT_EQ(base::Value(20), *(preference->GetValue()));
551 // Test overriding the supervised and recommended PrefStore with already set
553 scoped_refptr<TestingPrefStore> supervised_pref_store =
554 base::MakeRefCounted<TestingPrefStore>();
555 scoped_refptr<TestingPrefStore> recommened_pref_store =
556 base::MakeRefCounted<TestingPrefStore>();
557 supervised_pref_store->SetInteger(kManagedPref, 30);
558 supervised_pref_store->SetInteger(kSupervisedPref, 31);
559 recommened_pref_store->SetInteger(kManagedPref, 40);
560 recommened_pref_store->SetInteger(kRecommendedPref, 41);
561 pref_service_->ChangePrefValueStore(
562 nullptr /* managed_prefs */, supervised_pref_store.get(),
563 nullptr /* extension_prefs */, recommened_pref_store.get());
564 EXPECT_TRUE(preference->IsManaged());
565 ASSERT_EQ(base::Value(20), *(preference->GetValue()));
566 EXPECT_TRUE(supervised->IsManagedByCustodian());
567 EXPECT_EQ(base::Value(31), *(supervised->GetValue()));
568 EXPECT_TRUE(recommended->IsRecommended());
569 EXPECT_EQ(base::Value(41), *(recommended->GetValue()));
572 // Tests that PrefChangeRegistrar works after PrefValueStore is changed.
573 TEST_F(PrefValueStoreChangeTest, PrefChangeRegistrar) {
574 MockPrefChangeCallback obs(pref_service_.get());
575 PrefChangeRegistrar registrar;
576 registrar.Init(pref_service_.get());
577 registrar.Add(kManagedPref, obs.GetCallback());
578 registrar.Add(kSupervisedPref, obs.GetCallback());
579 registrar.Add(kRecommendedPref, obs.GetCallback());
581 base::Value expected_value(10);
582 obs.Expect(kManagedPref, &expected_value);
583 user_pref_store_->SetInteger(kManagedPref, 10);
584 Mock::VerifyAndClearExpectations(&obs);
585 expected_value = base::Value(11);
586 obs.Expect(kRecommendedPref, &expected_value);
587 user_pref_store_->SetInteger(kRecommendedPref, 11);
588 Mock::VerifyAndClearExpectations(&obs);
590 // Test overriding the managed and supervised PrefStore with already set
592 scoped_refptr<TestingPrefStore> managed_pref_store =
593 base::MakeRefCounted<TestingPrefStore>();
594 scoped_refptr<TestingPrefStore> supervised_pref_store =
595 base::MakeRefCounted<TestingPrefStore>();
596 // Update |kManagedPref| before changing the PrefValueStore, the
597 // PrefChangeRegistrar should get notified on |kManagedPref| as its value
599 managed_pref_store->SetInteger(kManagedPref, 20);
600 // Due to store precedence, the value of |kRecommendedPref| will not be
601 // changed so PrefChangeRegistrar will not be notified.
602 managed_pref_store->SetInteger(kRecommendedPref, 11);
603 supervised_pref_store->SetInteger(kManagedPref, 30);
604 supervised_pref_store->SetInteger(kRecommendedPref, 21);
605 expected_value = base::Value(20);
606 obs.Expect(kManagedPref, &expected_value);
607 pref_service_->ChangePrefValueStore(
608 managed_pref_store.get(), supervised_pref_store.get(),
609 nullptr /* extension_prefs */, nullptr /* recommended_prefs */);
610 Mock::VerifyAndClearExpectations(&obs);
612 // Update a pref value after PrefValueStore change, it should also work.
613 expected_value = base::Value(31);
614 obs.Expect(kSupervisedPref, &expected_value);
615 supervised_pref_store->SetInteger(kSupervisedPref, 31);
616 Mock::VerifyAndClearExpectations(&obs);