1 // Copyright 2010 The Chromium Authors
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
5 #include "components/prefs/pref_change_registrar.h"
9 #include "base/functional/bind.h"
10 #include "base/functional/callback_helpers.h"
11 #include "components/prefs/pref_observer.h"
12 #include "components/prefs/pref_registry_simple.h"
13 #include "components/prefs/testing_pref_service.h"
14 #include "testing/gmock/include/gmock/gmock.h"
15 #include "testing/gtest/include/gtest/gtest.h"
23 const char kHomePage[] = "homepage";
24 const char kHomePageIsNewTabPage[] = "homepage_is_newtabpage";
25 const char kApplicationLocale[] = "intl.app_locale";
27 // A mock provider that allows us to capture pref observer changes.
28 class MockPrefService : public TestingPrefServiceSimple {
31 ~MockPrefService() override {}
33 MOCK_METHOD2(AddPrefObserver, void(const std::string&, PrefObserver*));
34 MOCK_METHOD2(RemovePrefObserver, void(const std::string&, PrefObserver*));
37 // Due to overloads, base::DoNothing() cannot be passed directly to
38 // PrefChangeRegistrar::Add() as it is convertible to all callbacks.
39 base::RepeatingClosure DoNothingClosure() {
40 return base::DoNothing();
45 class PrefChangeRegistrarTest : public testing::Test {
47 PrefChangeRegistrarTest() {}
48 ~PrefChangeRegistrarTest() override {}
51 void SetUp() override;
53 MockPrefService* service() const { return service_.get(); }
56 std::unique_ptr<MockPrefService> service_;
59 void PrefChangeRegistrarTest::SetUp() {
60 service_ = std::make_unique<MockPrefService>();
63 TEST_F(PrefChangeRegistrarTest, AddAndRemove) {
64 PrefChangeRegistrar registrar;
65 registrar.Init(service());
68 EXPECT_CALL(*service(),
69 AddPrefObserver(Eq(std::string("test.pref.1")), ®istrar));
70 EXPECT_CALL(*service(),
71 AddPrefObserver(Eq(std::string("test.pref.2")), ®istrar));
72 registrar.Add("test.pref.1", DoNothingClosure());
73 registrar.Add("test.pref.2", DoNothingClosure());
74 EXPECT_FALSE(registrar.IsEmpty());
77 Mock::VerifyAndClearExpectations(service());
78 EXPECT_CALL(*service(),
79 RemovePrefObserver(Eq(std::string("test.pref.1")), ®istrar));
80 EXPECT_CALL(*service(),
81 RemovePrefObserver(Eq(std::string("test.pref.2")), ®istrar));
82 registrar.Remove("test.pref.1");
83 registrar.Remove("test.pref.2");
84 EXPECT_TRUE(registrar.IsEmpty());
86 // Explicitly check the expectations now to make sure that the Removes
87 // worked (rather than the registrar destructor doing the work).
88 Mock::VerifyAndClearExpectations(service());
91 TEST_F(PrefChangeRegistrarTest, AutoRemove) {
92 PrefChangeRegistrar registrar;
93 registrar.Init(service());
95 // Setup of auto-remove.
96 EXPECT_CALL(*service(),
97 AddPrefObserver(Eq(std::string("test.pref.1")), ®istrar));
98 registrar.Add("test.pref.1", DoNothingClosure());
99 Mock::VerifyAndClearExpectations(service());
100 EXPECT_FALSE(registrar.IsEmpty());
102 // Test auto-removing.
103 EXPECT_CALL(*service(),
104 RemovePrefObserver(Eq(std::string("test.pref.1")), ®istrar));
107 TEST_F(PrefChangeRegistrarTest, RemoveAll) {
108 PrefChangeRegistrar registrar;
109 registrar.Init(service());
111 EXPECT_CALL(*service(),
112 AddPrefObserver(Eq(std::string("test.pref.1")), ®istrar));
113 EXPECT_CALL(*service(),
114 AddPrefObserver(Eq(std::string("test.pref.2")), ®istrar));
115 registrar.Add("test.pref.1", DoNothingClosure());
116 registrar.Add("test.pref.2", DoNothingClosure());
117 Mock::VerifyAndClearExpectations(service());
119 EXPECT_CALL(*service(),
120 RemovePrefObserver(Eq(std::string("test.pref.1")), ®istrar));
121 EXPECT_CALL(*service(),
122 RemovePrefObserver(Eq(std::string("test.pref.2")), ®istrar));
123 registrar.RemoveAll();
124 EXPECT_TRUE(registrar.IsEmpty());
126 // Explicitly check the expectations now to make sure that the RemoveAll
127 // worked (rather than the registrar destructor doing the work).
128 Mock::VerifyAndClearExpectations(service());
131 class ObserveSetOfPreferencesTest : public testing::Test {
133 void SetUp() override {
134 pref_service_ = std::make_unique<TestingPrefServiceSimple>();
135 PrefRegistrySimple* registry = pref_service_->registry();
136 registry->RegisterStringPref(kHomePage, "http://google.com");
137 registry->RegisterBooleanPref(kHomePageIsNewTabPage, false);
138 registry->RegisterStringPref(kApplicationLocale, std::string());
141 PrefChangeRegistrar* CreatePrefChangeRegistrar() {
142 PrefChangeRegistrar* pref_set = new PrefChangeRegistrar();
143 pref_set->Init(pref_service_.get());
144 pref_set->Add(kHomePage, DoNothingClosure());
145 pref_set->Add(kHomePageIsNewTabPage, DoNothingClosure());
149 MOCK_METHOD1(OnPreferenceChanged, void(const std::string&));
151 std::unique_ptr<TestingPrefServiceSimple> pref_service_;
154 TEST_F(ObserveSetOfPreferencesTest, IsObserved) {
155 std::unique_ptr<PrefChangeRegistrar> pref_set(CreatePrefChangeRegistrar());
156 EXPECT_TRUE(pref_set->IsObserved(kHomePage));
157 EXPECT_TRUE(pref_set->IsObserved(kHomePageIsNewTabPage));
158 EXPECT_FALSE(pref_set->IsObserved(kApplicationLocale));
161 TEST_F(ObserveSetOfPreferencesTest, Observe) {
165 PrefChangeRegistrar pref_set;
166 PrefChangeRegistrar::NamedChangeCallback callback =
167 base::BindRepeating(&ObserveSetOfPreferencesTest::OnPreferenceChanged,
168 base::Unretained(this));
169 pref_set.Init(pref_service_.get());
170 pref_set.Add(kHomePage, callback);
171 pref_set.Add(kHomePageIsNewTabPage, callback);
173 EXPECT_CALL(*this, OnPreferenceChanged(kHomePage));
174 pref_service_->SetUserPref(kHomePage,
175 std::make_unique<Value>("http://crbug.com"));
176 Mock::VerifyAndClearExpectations(this);
178 EXPECT_CALL(*this, OnPreferenceChanged(kHomePageIsNewTabPage));
179 pref_service_->SetUserPref(kHomePageIsNewTabPage,
180 std::make_unique<Value>(true));
181 Mock::VerifyAndClearExpectations(this);
183 EXPECT_CALL(*this, OnPreferenceChanged(_)).Times(0);
184 pref_service_->SetUserPref(kApplicationLocale,
185 std::make_unique<Value>("en_US.utf8"));
186 Mock::VerifyAndClearExpectations(this);