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

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

Issue 2474653003: PreferencesManager (Closed)
Patch Set: Updates Created 4 years 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 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<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_->Subscribe(preferences);
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<PreferencesManager>(profile_);
164 ASSERT_TRUE(manager_->preferences_change_registrar_->IsEmpty());
165 manager_->AddObserver(std::move(proxy_));
166 }
167
168 void PreferencesManagerTest::TearDown() {
169 testing_profile_manager_.DeleteAllTestingProfiles();
170 }
171
172 // Tests that when the PrefService is empty that no subscriptions are made.
173 TEST_F(PreferencesManagerTest, EmptyService) {
174 const std::string kKey = "hey";
175 std::vector<std::string> preferences;
176 preferences.push_back(kKey);
177 InitObserver(preferences);
178 EXPECT_FALSE(preferences_change_registrar()->IsObserved(kKey));
179 EXPECT_FALSE(observer()->on_preferences_changed_called());
180 }
181
182 // Tests that when the PrefService has the desired key, that a subscription is
183 // setup and that the PreferenceObserver is notified.
184 TEST_F(PreferencesManagerTest, ServiceHasValues) {
185 const std::string kKey = "hey";
186 const int kValue = 42;
187 InitPreference(kKey, kValue);
188
189 std::vector<std::string> preferences;
190 preferences.push_back(kKey);
191 InitObserver(preferences);
192 EXPECT_TRUE(preferences_change_registrar()->IsObserved(kKey));
193 EXPECT_TRUE(observer()->on_preferences_changed_called());
194 EXPECT_TRUE(observer()->KeyReceived(kKey));
195 }
196
197 // Tests that mulitple keys can be subscribed to.
198 TEST_F(PreferencesManagerTest, MultipleSubscriptions) {
199 const std::string kKey1 = "hey";
200 const int kValue1 = 42;
201 InitPreference(kKey1, kValue1);
202
203 const std::string kKey2 = "listen";
204 const int kValue2 = 9001;
205 InitPreference(kKey2, kValue2);
206
207 std::vector<std::string> preferences;
208 preferences.push_back(kKey1);
209 preferences.push_back(kKey2);
210 InitObserver(preferences);
211 EXPECT_TRUE(preferences_change_registrar()->IsObserved(kKey1));
212 EXPECT_TRUE(preferences_change_registrar()->IsObserved(kKey2));
213 EXPECT_TRUE(observer()->KeyReceived(kKey1));
214 EXPECT_TRUE(observer()->KeyReceived(kKey2));
215 }
216
217 // Tests that when all keys are not in the PrefService that subscriptions are
218 // set for the available key.
219 TEST_F(PreferencesManagerTest, PartialSubsriptionAvailable) {
220 const std::string kKey1 = "hey";
221 const int kValue1 = 42;
222 InitPreference(kKey1, kValue1);
223
224 const std::string kKey2 = "listen";
225 std::vector<std::string> preferences;
226 preferences.push_back(kKey1);
227 preferences.push_back(kKey2);
228 InitObserver(preferences);
229 EXPECT_TRUE(preferences_change_registrar()->IsObserved(kKey1));
230 EXPECT_FALSE(preferences_change_registrar()->IsObserved(kKey2));
231 EXPECT_TRUE(observer()->KeyReceived(kKey1));
232 EXPECT_FALSE(observer()->KeyReceived(kKey2));
233 }
234
235 // Tests that when a preference is changed that the PreferenceObserver is
236 // notified.
237 TEST_F(PreferencesManagerTest, PreferenceChanged) {
238 const std::string kKey = "hey";
239 const int kValue = 42;
240 InitPreference(kKey, kValue);
241
242 std::vector<std::string> preferences;
243 preferences.push_back(kKey);
244 InitObserver(preferences);
245 observer()->Reset();
246
247 const int kNewValue = 1337;
248 service()->SetInteger(kKey, kNewValue);
249 base::RunLoop().RunUntilIdle();
250
251 EXPECT_TRUE(observer()->on_preferences_changed_called());
252 const base::Value* values = observer()->on_preferences_changed_values();
253 const base::DictionaryValue* dictionary = nullptr;
254 values->GetAsDictionary(&dictionary);
255 int result = 0;
256 dictionary->GetInteger(kKey, &result);
257 EXPECT_EQ(kNewValue, result);
258 }
259
260 // Tests that when a non subscribed preference is changed that the
261 // PreferenceObserver is not notified.
262 TEST_F(PreferencesManagerTest, UnrelatedPreferenceChanged) {
263 const std::string kKey1 = "hey";
264 const int kValue1 = 42;
265 InitPreference(kKey1, kValue1);
266
267 const std::string kKey2 = "listen";
268 const int kValue2 = 9001;
269 InitPreference(kKey2, kValue2);
270
271 std::vector<std::string> preferences;
272 preferences.push_back(kKey1);
273 InitObserver(preferences);
274 observer()->Reset();
275
276 const int kNewValue = 1337;
277 service()->SetInteger(kKey2, kNewValue);
278 base::RunLoop().RunUntilIdle();
279
280 EXPECT_FALSE(observer()->on_preferences_changed_called());
281 }
282
283 // Tests that when the PreferenceManager updates a preference that the
284 // PreferenceObserver is not notified.
285 TEST_F(PreferencesManagerTest, NoNotificationsForSelfChange) {
286 const std::string kKey = "hey";
287 const int kValue = 42;
288 InitPreference(kKey, kValue);
289
290 std::vector<std::string> preferences;
291 preferences.push_back(kKey);
292 InitObserver(preferences);
293 observer()->Reset();
294
295 const int kNewValue = 1337;
296 base::DictionaryValue dictionary;
297 dictionary.SetInteger(kKey, kNewValue);
298 SetPreferences(dictionary);
299
300 EXPECT_FALSE(observer()->on_preferences_changed_called());
301 EXPECT_EQ(kNewValue, service()->GetInteger(kKey));
302 }
303
304 } // namespace test
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698