Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(203)

Side by Side Diff: chrome/browser/prefs/preferences_manager_unittest.cc

Issue 2474653003: PreferencesManager (Closed)
Patch Set: Update PreferencesManager to account for base::Value API change Created 3 years, 12 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
(Empty)
1 // Copyright 2016 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.
4
5 #include "chrome/browser/prefs/preferences_manager.h"
6
7 #include "base/macros.h"
8 #include "base/run_loop.h"
9 #include "base/strings/utf_string_conversions.h"
10 #include "base/values.h"
11 #include "chrome/browser/prefs/browser_prefs.h"
12 #include "chrome/test/base/testing_browser_process.h"
13 #include "chrome/test/base/testing_profile.h"
14 #include "chrome/test/base/testing_profile_manager.h"
15 #include "components/pref_registry/pref_registry_syncable.h"
16 #include "components/prefs/pref_change_registrar.h"
17 #include "components/prefs/pref_service.h"
18 #include "components/sync_preferences/testing_pref_service_syncable.h"
19 #include "content/public/test/test_browser_thread_bundle.h"
20 #include "mojo/public/cpp/bindings/binding.h"
21 #include "services/preferences/public/interfaces/preferences.mojom.h"
22 #include "testing/gtest/include/gtest/gtest.h"
23
24 namespace {
25
26 // Test implementation of prefs::mojom::PreferencesObserver which just tracks
27 // calls to OnPreferencesChanged.
28 class TestPreferencesObserver : public prefs::mojom::PreferencesObserver {
29 public:
30 TestPreferencesObserver(
31 mojo::InterfaceRequest<prefs::mojom::PreferencesObserver> request)
32 : on_preferences_changed_called_(false),
33 binding_(this, std::move(request)) {}
34 ~TestPreferencesObserver() override {}
35
36 // Returns true is |key| was in the last set of preferences changed.
37 bool KeyReceived(const std::string& key);
38
39 // Clears the values set from the last OnPreferencesChanged.
40 void Reset();
41
42 bool on_preferences_changed_called() {
43 return on_preferences_changed_called_;
44 }
45
46 const base::Value* on_preferences_changed_values() {
47 return on_preferences_changed_values_.get();
48 }
49
50 private:
51 // prefs::mojom::PreferencesObserver:
52 void OnPreferencesChanged(
53 std::unique_ptr<base::DictionaryValue> preferences) override {
54 on_preferences_changed_called_ = true;
55 on_preferences_changed_values_ = std::move(preferences);
56 }
57
58 bool on_preferences_changed_called_;
59 std::unique_ptr<base::Value> on_preferences_changed_values_;
60
61 mojo::Binding<PreferencesObserver> binding_;
62
63 DISALLOW_COPY_AND_ASSIGN(TestPreferencesObserver);
64 };
65
66 bool TestPreferencesObserver::KeyReceived(const std::string& key) {
67 base::DictionaryValue* dictionary = nullptr;
68 on_preferences_changed_values_->GetAsDictionary(&dictionary);
69 return dictionary->HasKey(key);
70 }
71
72 void TestPreferencesObserver::Reset() {
73 on_preferences_changed_called_ = false;
74 on_preferences_changed_values_.reset();
75 }
76
77 } // namespace
78
79 namespace test {
80 class PreferencesManagerTest : public testing::Test {
81 public:
82 PreferencesManagerTest();
83 ~PreferencesManagerTest() override;
84
85 // Initializes the connection between |observer_| and |manager_|, subscribing
86 // to changes to |preferences|.
87 void InitObserver(const std::vector<std::string>& preferences);
88
89 // Initializes a preference with |registry_| with a default |value|.
90 void InitPreference(const std::string& key, int value);
91
92 // Has |manager_| update the PrefStore with |preferences|.
93 void SetPreferences(std::unique_ptr<base::DictionaryValue> preferences);
94
95 PreferencesManager* manager() { return manager_.get(); }
96 TestPreferencesObserver* observer() { return observer_.get(); }
97 PrefChangeRegistrar* preferences_change_registrar() {
98 return manager_->preferences_change_registrar_.get();
99 }
100 TestingProfile* profile() { return profile_; }
101 user_prefs::PrefRegistrySyncable* registry() { return registry_; }
102 PrefService* service() { return profile_->GetPrefs(); }
103
104 // testing::Test:
105 void SetUp() override;
106 void TearDown() override;
107
108 private:
109 // Sets up threads needed for |testing_profile_manager_|
110 content::TestBrowserThreadBundle thread_bundle_;
111
112 // Handles creation of profiles for testing.
113 TestingProfileManager testing_profile_manager_;
114
115 // Not owned
116 TestingProfile* profile_;
117 user_prefs::PrefRegistrySyncable* registry_;
118
119 prefs::mojom::PreferencesObserverPtr proxy_;
120 std::unique_ptr<TestPreferencesObserver> observer_;
121 std::unique_ptr<PreferencesManager> manager_;
122
123 DISALLOW_COPY_AND_ASSIGN(PreferencesManagerTest);
124 };
125
126 PreferencesManagerTest::PreferencesManagerTest()
127 : testing_profile_manager_(TestingBrowserProcess::GetGlobal()) {}
128
129 PreferencesManagerTest::~PreferencesManagerTest() {}
130
131 void PreferencesManagerTest::InitObserver(
132 const std::vector<std::string>& preferences) {
133 manager_->Subscribe(preferences);
134 base::RunLoop().RunUntilIdle();
135 }
136
137 void PreferencesManagerTest::InitPreference(const std::string& key, int value) {
138 registry_->RegisterIntegerPref(key, value);
139 base::FundamentalValue fundamental_value(value);
140 profile_->GetPrefs()->Set(key, fundamental_value);
141 }
142
143 void PreferencesManagerTest::SetPreferences(
144 std::unique_ptr<base::DictionaryValue> preferences) {
145 manager_->SetPreferences(std::move(preferences));
146 base::RunLoop().RunUntilIdle();
147 }
148
149 void PreferencesManagerTest::SetUp() {
150 ASSERT_TRUE(testing_profile_manager_.SetUp());
151
152 std::unique_ptr<sync_preferences::TestingPrefServiceSyncable> service(
153 base::MakeUnique<sync_preferences::TestingPrefServiceSyncable>());
154 registry_ = service->registry();
155 chrome::RegisterUserProfilePrefs(registry_);
156
157 const std::string kName = "navi";
158 profile_ = testing_profile_manager_.CreateTestingProfile(
159 kName, std::move(service), base::UTF8ToUTF16(kName), 0, std::string(),
160 TestingProfile::TestingFactories());
161 ASSERT_NE(nullptr, profile_->GetPrefs());
162
163 observer_.reset(new TestPreferencesObserver(mojo::MakeRequest(&proxy_)));
164 manager_ = base::MakeUnique<PreferencesManager>(profile_);
165 ASSERT_TRUE(manager_->preferences_change_registrar_->IsEmpty());
166 manager_->AddObserver(std::move(proxy_));
167 }
168
169 void PreferencesManagerTest::TearDown() {
170 testing_profile_manager_.DeleteAllTestingProfiles();
171 }
172
173 // Tests that when the PrefService is empty that no subscriptions are made.
174 TEST_F(PreferencesManagerTest, EmptyService) {
175 const std::string kKey = "hey";
176 std::vector<std::string> preferences;
177 preferences.push_back(kKey);
178 InitObserver(preferences);
179 EXPECT_FALSE(preferences_change_registrar()->IsObserved(kKey));
180 EXPECT_FALSE(observer()->on_preferences_changed_called());
181 }
182
183 // Tests that when the PrefService has the desired key, that a subscription is
184 // setup and that the PreferenceObserver is notified.
185 TEST_F(PreferencesManagerTest, ServiceHasValues) {
186 const std::string kKey = "hey";
187 const int kValue = 42;
188 InitPreference(kKey, kValue);
189
190 std::vector<std::string> preferences;
191 preferences.push_back(kKey);
192 InitObserver(preferences);
193 EXPECT_TRUE(preferences_change_registrar()->IsObserved(kKey));
194 EXPECT_TRUE(observer()->on_preferences_changed_called());
195 EXPECT_TRUE(observer()->KeyReceived(kKey));
196 }
197
198 // Tests that mulitple keys can be subscribed to.
199 TEST_F(PreferencesManagerTest, MultipleSubscriptions) {
200 const std::string kKey1 = "hey";
201 const int kValue1 = 42;
202 InitPreference(kKey1, kValue1);
203
204 const std::string kKey2 = "listen";
205 const int kValue2 = 9001;
206 InitPreference(kKey2, kValue2);
207
208 std::vector<std::string> preferences;
209 preferences.push_back(kKey1);
210 preferences.push_back(kKey2);
211 InitObserver(preferences);
212 EXPECT_TRUE(preferences_change_registrar()->IsObserved(kKey1));
213 EXPECT_TRUE(preferences_change_registrar()->IsObserved(kKey2));
214 EXPECT_TRUE(observer()->KeyReceived(kKey1));
215 EXPECT_TRUE(observer()->KeyReceived(kKey2));
216 }
217
218 // Tests that when all keys are not in the PrefService that subscriptions are
219 // set for the available key.
220 TEST_F(PreferencesManagerTest, PartialSubsriptionAvailable) {
221 const std::string kKey1 = "hey";
222 const int kValue1 = 42;
223 InitPreference(kKey1, kValue1);
224
225 const std::string kKey2 = "listen";
226 std::vector<std::string> preferences;
227 preferences.push_back(kKey1);
228 preferences.push_back(kKey2);
229 InitObserver(preferences);
230 EXPECT_TRUE(preferences_change_registrar()->IsObserved(kKey1));
231 EXPECT_FALSE(preferences_change_registrar()->IsObserved(kKey2));
232 EXPECT_TRUE(observer()->KeyReceived(kKey1));
233 EXPECT_FALSE(observer()->KeyReceived(kKey2));
234 }
235
236 // Tests that when a preference is changed that the PreferenceObserver is
237 // notified.
238 TEST_F(PreferencesManagerTest, PreferenceChanged) {
239 const std::string kKey = "hey";
240 const int kValue = 42;
241 InitPreference(kKey, kValue);
242
243 std::vector<std::string> preferences;
244 preferences.push_back(kKey);
245 InitObserver(preferences);
246 observer()->Reset();
247
248 const int kNewValue = 1337;
249 service()->SetInteger(kKey, kNewValue);
250 base::RunLoop().RunUntilIdle();
251
252 EXPECT_TRUE(observer()->on_preferences_changed_called());
253 const base::Value* values = observer()->on_preferences_changed_values();
254 const base::DictionaryValue* dictionary = nullptr;
255 values->GetAsDictionary(&dictionary);
256 int result = 0;
257 dictionary->GetInteger(kKey, &result);
258 EXPECT_EQ(kNewValue, result);
259 }
260
261 // Tests that when a non subscribed preference is changed that the
262 // PreferenceObserver is not notified.
263 TEST_F(PreferencesManagerTest, UnrelatedPreferenceChanged) {
264 const std::string kKey1 = "hey";
265 const int kValue1 = 42;
266 InitPreference(kKey1, kValue1);
267
268 const std::string kKey2 = "listen";
269 const int kValue2 = 9001;
270 InitPreference(kKey2, kValue2);
271
272 std::vector<std::string> preferences;
273 preferences.push_back(kKey1);
274 InitObserver(preferences);
275 observer()->Reset();
276
277 const int kNewValue = 1337;
278 service()->SetInteger(kKey2, kNewValue);
279 base::RunLoop().RunUntilIdle();
280
281 EXPECT_FALSE(observer()->on_preferences_changed_called());
282 }
283
284 // Tests that when the PreferenceManager updates a preference that the
285 // PreferenceObserver is not notified.
286 TEST_F(PreferencesManagerTest, NoNotificationsForSelfChange) {
287 const std::string kKey = "hey";
288 const int kValue = 42;
289 InitPreference(kKey, kValue);
290
291 std::vector<std::string> preferences;
292 preferences.push_back(kKey);
293 InitObserver(preferences);
294 observer()->Reset();
295
296 const int kNewValue = 1337;
297 std::unique_ptr<base::DictionaryValue> dictionary =
298 base::MakeUnique<base::DictionaryValue>();
299 dictionary->SetInteger(kKey, kNewValue);
300 SetPreferences(std::move(dictionary));
301
302 EXPECT_FALSE(observer()->on_preferences_changed_called());
303 EXPECT_EQ(kNewValue, service()->GetInteger(kKey));
304 }
305
306 } // namespace test
OLDNEW
« no previous file with comments | « chrome/browser/prefs/preferences_manager.cc ('k') | chrome/browser/prefs/preferences_manifest.json » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698