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

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

Issue 2474653003: PreferencesManager (Closed)
Patch Set: Rebase Created 4 years, 1 month 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(const base::DictionaryValue& preferences) override {
53 on_preferences_changed_called_ = true;
54 on_preferences_changed_values_ = preferences.CreateDeepCopy();
55 }
56
57 bool on_preferences_changed_called_;
58 std::unique_ptr<base::Value> on_preferences_changed_values_;
59
60 mojo::Binding<PreferencesObserver> binding_;
61
62 DISALLOW_COPY_AND_ASSIGN(TestPreferencesObserver);
63 };
64
65 bool TestPreferencesObserver::KeyReceived(const std::string& key) {
66 base::DictionaryValue* dictionary = nullptr;
67 on_preferences_changed_values_->GetAsDictionary(&dictionary);
68 return dictionary->HasKey(key);
69 }
70
71 void TestPreferencesObserver::Reset() {
72 on_preferences_changed_called_ = false;
73 on_preferences_changed_values_.reset();
74 }
75
76 } // namespace
77
78 namespace test {
79 class PreferencesManagerTest : public testing::Test {
80 public:
81 PreferencesManagerTest();
82 ~PreferencesManagerTest() override;
83
84 // Initializes the connection between |observer_| and |manager_|, subscribing
85 // to changes to |preferences|.
86 void InitObserver(const std::vector<std::string>& preferences);
87
88 // Initializes a preference with |registry_| with a default |value|.
89 void InitPreference(const std::string& key, int value);
90
91 // Has |manager_| update the PrefStore with |preferences|.
92 void SetPreferences(const base::DictionaryValue& preferences);
93
94 chrome::PreferencesManager* manager() { return manager_.get(); }
95 TestPreferencesObserver* observer() { return observer_.get(); }
96 PrefChangeRegistrar* preferences_change_registrar() {
97 return manager_->preferences_change_registrar_.get();
98 }
99 TestingProfile* profile() { return profile_; }
100 user_prefs::PrefRegistrySyncable* registry() { return registry_; }
101 PrefService* service() { return profile_->GetPrefs(); }
102
103 // testing::Test:
104 void SetUp() override;
105 void TearDown() override;
106
107 private:
108 // Sets up threads needed for |testing_profile_manager_|
109 content::TestBrowserThreadBundle thread_bundle_;
110
111 // Handles creation of profiles for testing.
112 TestingProfileManager testing_profile_manager_;
113
114 // Not owned
115 TestingProfile* profile_;
116 user_prefs::PrefRegistrySyncable* registry_;
117
118 prefs::mojom::PreferencesObserverPtr proxy_;
119 std::unique_ptr<TestPreferencesObserver> observer_;
120 std::unique_ptr<chrome::PreferencesManager> manager_;
121
122 DISALLOW_COPY_AND_ASSIGN(PreferencesManagerTest);
123 };
124
125 PreferencesManagerTest::PreferencesManagerTest()
126 : testing_profile_manager_(TestingBrowserProcess::GetGlobal()) {}
127
128 PreferencesManagerTest::~PreferencesManagerTest() {}
129
130 void PreferencesManagerTest::InitObserver(
131 const std::vector<std::string>& preferences) {
132 manager_->AddObserver(preferences, std::move(proxy_));
133 base::RunLoop().RunUntilIdle();
134 }
135
136 void PreferencesManagerTest::InitPreference(const std::string& key, int value) {
137 registry_->RegisterIntegerPref(key, value);
138 base::FundamentalValue fundamental_value(value);
139 profile_->GetPrefs()->Set(key, fundamental_value);
140 }
141
142 void PreferencesManagerTest::SetPreferences(
143 const base::DictionaryValue& preferences) {
144 manager_->SetPreferences(preferences);
145 base::RunLoop().RunUntilIdle();
146 }
147
148 void PreferencesManagerTest::SetUp() {
149 ASSERT_TRUE(testing_profile_manager_.SetUp());
150
151 std::unique_ptr<sync_preferences::TestingPrefServiceSyncable> service(
152 base::MakeUnique<sync_preferences::TestingPrefServiceSyncable>());
153 registry_ = service->registry();
154 chrome::RegisterUserProfilePrefs(registry_);
155
156 const std::string kName = "navi";
157 profile_ = testing_profile_manager_.CreateTestingProfile(
158 kName, std::move(service), base::UTF8ToUTF16(kName), 0, std::string(),
159 TestingProfile::TestingFactories());
160 ASSERT_NE(nullptr, profile_->GetPrefs());
161
162 observer_.reset(new TestPreferencesObserver(mojo::GetProxy(&proxy_)));
163 manager_ = base::MakeUnique<chrome::PreferencesManager>(profile_);
164 ASSERT_TRUE(manager_->preferences_change_registrar_->IsEmpty());
165 }
166
167 void PreferencesManagerTest::TearDown() {
168 testing_profile_manager_.DeleteAllTestingProfiles();
169 }
170
171 // Tests that when the PrefService is empty that no subscriptions are made.
172 TEST_F(PreferencesManagerTest, EmptyService) {
173 const std::string kKey = "hey";
174 std::vector<std::string> preferences;
175 preferences.push_back(kKey);
176 InitObserver(preferences);
177 EXPECT_FALSE(preferences_change_registrar()->IsObserved(kKey));
178 EXPECT_FALSE(observer()->on_preferences_changed_called());
179 }
180
181 // Tests that when the PrefService has the desired key, that a subscription is
182 // setup and that the PreferenceObserver is notified.
183 TEST_F(PreferencesManagerTest, ServiceHasValues) {
184 const std::string kKey = "hey";
185 const int kValue = 42;
186 InitPreference(kKey, kValue);
187
188 std::vector<std::string> preferences;
189 preferences.push_back(kKey);
190 InitObserver(preferences);
191 EXPECT_TRUE(preferences_change_registrar()->IsObserved(kKey));
192 EXPECT_TRUE(observer()->on_preferences_changed_called());
193 EXPECT_TRUE(observer()->KeyReceived(kKey));
194 }
195
196 // Tests that mulitple keys can be subscribed to.
197 TEST_F(PreferencesManagerTest, MultipleSubscriptions) {
198 const std::string kKey1 = "hey";
199 const int kValue1 = 42;
200 InitPreference(kKey1, kValue1);
201
202 const std::string kKey2 = "listen";
203 const int kValue2 = 9001;
204 InitPreference(kKey2, kValue2);
205
206 std::vector<std::string> preferences;
207 preferences.push_back(kKey1);
208 preferences.push_back(kKey2);
209 InitObserver(preferences);
210 EXPECT_TRUE(preferences_change_registrar()->IsObserved(kKey1));
211 EXPECT_TRUE(preferences_change_registrar()->IsObserved(kKey2));
212 EXPECT_TRUE(observer()->KeyReceived(kKey1));
213 EXPECT_TRUE(observer()->KeyReceived(kKey2));
214 }
215
216 // Tests that when all keys are not in the PrefService that subscriptions are
217 // set for the available key.
218 TEST_F(PreferencesManagerTest, PartialSubsriptionAvailable) {
219 const std::string kKey1 = "hey";
220 const int kValue1 = 42;
221 InitPreference(kKey1, kValue1);
222
223 const std::string kKey2 = "listen";
224 std::vector<std::string> preferences;
225 preferences.push_back(kKey1);
226 preferences.push_back(kKey2);
227 InitObserver(preferences);
228 EXPECT_TRUE(preferences_change_registrar()->IsObserved(kKey1));
229 EXPECT_FALSE(preferences_change_registrar()->IsObserved(kKey2));
230 EXPECT_TRUE(observer()->KeyReceived(kKey1));
231 EXPECT_FALSE(observer()->KeyReceived(kKey2));
232 }
233
234 // Tests that when a preference is changed that the PreferenceObserver is
235 // notified.
236 TEST_F(PreferencesManagerTest, PreferenceChanged) {
237 const std::string kKey = "hey";
238 const int kValue = 42;
239 InitPreference(kKey, kValue);
240
241 std::vector<std::string> preferences;
242 preferences.push_back(kKey);
243 InitObserver(preferences);
244 observer()->Reset();
245
246 const int kNewValue = 1337;
247 service()->SetInteger(kKey, kNewValue);
248 base::RunLoop().RunUntilIdle();
249
250 EXPECT_TRUE(observer()->on_preferences_changed_called());
251 const base::Value* values = observer()->on_preferences_changed_values();
252 const base::DictionaryValue* dictionary = nullptr;
253 values->GetAsDictionary(&dictionary);
254 int result = 0;
255 dictionary->GetInteger(kKey, &result);
256 EXPECT_EQ(kNewValue, result);
257 }
258
259 // Tests that when a non subscribed preference is changed that the
260 // PreferenceObserver is not notified.
261 TEST_F(PreferencesManagerTest, UnrelatedPreferenceChanged) {
262 const std::string kKey1 = "hey";
263 const int kValue1 = 42;
264 InitPreference(kKey1, kValue1);
265
266 const std::string kKey2 = "listen";
267 const int kValue2 = 9001;
268 InitPreference(kKey2, kValue2);
269
270 std::vector<std::string> preferences;
271 preferences.push_back(kKey1);
272 InitObserver(preferences);
273 observer()->Reset();
274
275 const int kNewValue = 1337;
276 service()->SetInteger(kKey2, kNewValue);
277 base::RunLoop().RunUntilIdle();
278
279 EXPECT_FALSE(observer()->on_preferences_changed_called());
280 }
281
282 // Tests that when the PreferenceManager updates a preference that the
283 // PreferenceObserver is not notified.
284 TEST_F(PreferencesManagerTest, NoNotificationsForSelfChange) {
285 const std::string kKey = "hey";
286 const int kValue = 42;
287 InitPreference(kKey, kValue);
288
289 std::vector<std::string> preferences;
290 preferences.push_back(kKey);
291 InitObserver(preferences);
292 observer()->Reset();
293
294 const int kNewValue = 1337;
295 base::DictionaryValue dictionary;
296 dictionary.SetInteger(kKey, kNewValue);
297 SetPreferences(dictionary);
298
299 EXPECT_FALSE(observer()->on_preferences_changed_called());
300 EXPECT_EQ(kNewValue, service()->GetInteger(kKey));
301 }
302
303 // Tests that when notified of shutdown that the PreferencesManager does not
304 // attempt to notify the PreferencesObserver of changes.
305 TEST_F(PreferencesManagerTest, NoNotificationsDuringShutdown) {
306 const std::string kKey = "hey";
307 const int kValue = 42;
308 InitPreference(kKey, kValue);
309
310 std::vector<std::string> preferences;
311 preferences.push_back(kKey);
312 InitObserver(preferences);
313 observer()->Reset();
314
315 manager()->OnProfileDestroyed();
316
317 const int kNewValue = 1337;
318 service()->SetInteger(kKey, kNewValue);
319 base::RunLoop().RunUntilIdle();
320 EXPECT_FALSE(observer()->on_preferences_changed_called());
321 }
322
323 } // namespace test
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698