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

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

Issue 2644893003: Unify Preferences Mojom Naming to PreferencesService (Closed)
Patch Set: / Created 3 years, 11 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
« no previous file with comments | « chrome/browser/prefs/preferences_manager.cc ('k') | chrome/browser/prefs/preferences_service.h » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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/memory/ptr_util.h"
9 #include "base/run_loop.h"
10 #include "base/strings/utf_string_conversions.h"
11 #include "base/values.h"
12 #include "chrome/browser/prefs/browser_prefs.h"
13 #include "chrome/test/base/testing_browser_process.h"
14 #include "chrome/test/base/testing_profile.h"
15 #include "chrome/test/base/testing_profile_manager.h"
16 #include "components/pref_registry/pref_registry_syncable.h"
17 #include "components/prefs/pref_change_registrar.h"
18 #include "components/prefs/pref_service.h"
19 #include "components/sync_preferences/testing_pref_service_syncable.h"
20 #include "content/public/test/test_browser_thread_bundle.h"
21 #include "mojo/public/cpp/bindings/binding.h"
22 #include "services/preferences/public/interfaces/preferences.mojom.h"
23 #include "testing/gtest/include/gtest/gtest.h"
24
25 namespace {
26
27 // Test implementation of prefs::mojom::PreferencesObserver which just tracks
28 // calls to OnPreferencesChanged.
29 class TestPreferencesObserver : public prefs::mojom::PreferencesObserver {
30 public:
31 TestPreferencesObserver(
32 mojo::InterfaceRequest<prefs::mojom::PreferencesObserver> request)
33 : on_preferences_changed_called_(false),
34 binding_(this, std::move(request)) {}
35 ~TestPreferencesObserver() override {}
36
37 // Returns true is |key| was in the last set of preferences changed.
38 bool KeyReceived(const std::string& key);
39
40 // Clears the values set from the last OnPreferencesChanged.
41 void Reset();
42
43 bool on_preferences_changed_called() {
44 return on_preferences_changed_called_;
45 }
46
47 const base::Value* on_preferences_changed_values() {
48 return on_preferences_changed_values_.get();
49 }
50
51 private:
52 // prefs::mojom::PreferencesObserver:
53 void OnPreferencesChanged(
54 std::unique_ptr<base::DictionaryValue> preferences) override {
55 on_preferences_changed_called_ = true;
56 on_preferences_changed_values_ = std::move(preferences);
57 }
58
59 bool on_preferences_changed_called_;
60 std::unique_ptr<base::Value> on_preferences_changed_values_;
61
62 mojo::Binding<PreferencesObserver> binding_;
63
64 DISALLOW_COPY_AND_ASSIGN(TestPreferencesObserver);
65 };
66
67 bool TestPreferencesObserver::KeyReceived(const std::string& key) {
68 base::DictionaryValue* dictionary = nullptr;
69 on_preferences_changed_values_->GetAsDictionary(&dictionary);
70 return dictionary->HasKey(key);
71 }
72
73 void TestPreferencesObserver::Reset() {
74 on_preferences_changed_called_ = false;
75 on_preferences_changed_values_.reset();
76 }
77
78 } // namespace
79
80 namespace test {
81 class PreferencesManagerTest : public testing::Test {
82 public:
83 PreferencesManagerTest();
84 ~PreferencesManagerTest() override;
85
86 // Initializes the connection between |observer_| and |manager_|, subscribing
87 // to changes to |preferences|.
88 void InitObserver(const std::vector<std::string>& preferences);
89
90 // Initializes a preference with |registry_| with a default |value|.
91 void InitPreference(const std::string& key, int value);
92
93 // Has |manager_| update the PrefStore with |preferences|.
94 void SetPreferences(std::unique_ptr<base::DictionaryValue> preferences);
95
96 PreferencesManager* manager() { return manager_.get(); }
97 TestPreferencesObserver* observer() { return observer_.get(); }
98 PrefChangeRegistrar* preferences_change_registrar() {
99 return manager_->preferences_change_registrar_.get();
100 }
101 TestingProfile* profile() { return profile_; }
102 user_prefs::PrefRegistrySyncable* registry() { return registry_; }
103 PrefService* service() { return profile_->GetPrefs(); }
104
105 // testing::Test:
106 void SetUp() override;
107 void TearDown() override;
108
109 private:
110 // Sets up threads needed for |testing_profile_manager_|
111 content::TestBrowserThreadBundle thread_bundle_;
112
113 // Handles creation of profiles for testing.
114 TestingProfileManager testing_profile_manager_;
115
116 // Not owned
117 TestingProfile* profile_;
118 user_prefs::PrefRegistrySyncable* registry_;
119
120 prefs::mojom::PreferencesObserverPtr proxy_;
121 std::unique_ptr<TestPreferencesObserver> observer_;
122 std::unique_ptr<PreferencesManager> manager_;
123
124 DISALLOW_COPY_AND_ASSIGN(PreferencesManagerTest);
125 };
126
127 PreferencesManagerTest::PreferencesManagerTest()
128 : testing_profile_manager_(TestingBrowserProcess::GetGlobal()) {}
129
130 PreferencesManagerTest::~PreferencesManagerTest() {}
131
132 void PreferencesManagerTest::InitObserver(
133 const std::vector<std::string>& preferences) {
134 manager_->Subscribe(preferences);
135 base::RunLoop().RunUntilIdle();
136 }
137
138 void PreferencesManagerTest::InitPreference(const std::string& key, int value) {
139 registry_->RegisterIntegerPref(key, value);
140 base::FundamentalValue fundamental_value(value);
141 profile_->GetPrefs()->Set(key, fundamental_value);
142 }
143
144 void PreferencesManagerTest::SetPreferences(
145 std::unique_ptr<base::DictionaryValue> preferences) {
146 manager_->SetPreferences(std::move(preferences));
147 base::RunLoop().RunUntilIdle();
148 }
149
150 void PreferencesManagerTest::SetUp() {
151 ASSERT_TRUE(testing_profile_manager_.SetUp());
152
153 std::unique_ptr<sync_preferences::TestingPrefServiceSyncable> service(
154 base::MakeUnique<sync_preferences::TestingPrefServiceSyncable>());
155 registry_ = service->registry();
156 chrome::RegisterUserProfilePrefs(registry_);
157
158 const std::string kName = "navi";
159 profile_ = testing_profile_manager_.CreateTestingProfile(
160 kName, std::move(service), base::UTF8ToUTF16(kName), 0, std::string(),
161 TestingProfile::TestingFactories());
162 ASSERT_NE(nullptr, profile_->GetPrefs());
163
164 observer_.reset(new TestPreferencesObserver(mojo::MakeRequest(&proxy_)));
165 manager_ = base::MakeUnique<PreferencesManager>(std::move(proxy_), profile_);
166 ASSERT_TRUE(manager_->preferences_change_registrar_->IsEmpty());
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_service.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698