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

Side by Side Diff: services/preferences/public/cpp/tests/pref_observer_store_unittest.cc

Issue 2092453002: Mojom interface for Preferences (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Const ref nit 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 "services/preferences/public/cpp/pref_observer_store.h"
6
7 #include "base/macros.h"
8 #include "base/memory/ptr_util.h"
9 #include "base/message_loop/message_loop.h"
10 #include "base/run_loop.h"
11 #include "base/values.h"
12 #include "components/prefs/pref_store_observer_mock.h"
13 #include "services/preferences/public/interfaces/preferences.mojom.h"
14 #include "testing/gtest/include/gtest/gtest.h"
15
16 namespace {
17
18 // Test implmentation of prefs::mojom::PreferenceManager which simply tracks
19 // calls. Allows for testing to be done in process, without mojo IPC.
20 class TestPreferenceManager : public prefs::mojom::PreferencesManager {
21 public:
22 TestPreferenceManager(
23 mojo::InterfaceRequest<prefs::mojom::PreferencesManager> request)
24 : add_observer_called_(false),
25 set_preferences_called_(false),
26 binding_(this, std::move(request)) {}
27 ~TestPreferenceManager() override {}
28
29 bool add_observer_called() { return add_observer_called_; }
30 const std::set<std::string>& last_preference_set() {
31 return last_preference_set_;
32 }
33 bool set_preferences_called() { return set_preferences_called_; }
34
35 // prefs::mojom::TestPreferenceManager:
36 void AddObserver(const std::vector<std::string>& preferences,
37 prefs::mojom::PreferencesObserverPtr client) override;
38 void SetPreferences(const base::DictionaryValue& preferences) override;
39
40 private:
41 bool add_observer_called_;
42 std::set<std::string> last_preference_set_;
43 bool set_preferences_called_;
44 mojo::Binding<PreferencesManager> binding_;
45
46 DISALLOW_COPY_AND_ASSIGN(TestPreferenceManager);
47 };
48
49 void TestPreferenceManager::AddObserver(
50 const std::vector<std::string>& preferences,
51 prefs::mojom::PreferencesObserverPtr client) {
52 add_observer_called_ = true;
53 last_preference_set_.clear();
54 last_preference_set_.insert(preferences.begin(), preferences.end());
55 }
56
57 void TestPreferenceManager::SetPreferences(
58 const base::DictionaryValue& preferences) {
59 set_preferences_called_ = true;
60 }
61
62 } // namespace
63
64 class PrefObserverStoreTest : public testing::Test {
65 public:
66 PrefObserverStoreTest() {}
67 ~PrefObserverStoreTest() override {}
68
69 TestPreferenceManager* manager() { return manager_.get(); }
70 PrefStoreObserverMock* observer() { return &observer_; }
71 PrefObserverStore* store() { return store_.get(); }
72
73 bool Initialized() { return store_->initialized_; }
74 void OnPreferencesChanged(const base::DictionaryValue& preferences) {
75 store_->OnPreferencesChanged(std::move(preferences));
76 }
77
78 // testing::Test:
79 void SetUp() override;
80 void TearDown() override;
81
82 private:
83 scoped_refptr<PrefObserverStore> store_;
84 prefs::mojom::PreferencesManagerPtr proxy_;
85 std::unique_ptr<TestPreferenceManager> manager_;
86 PrefStoreObserverMock observer_;
87 // Required by mojo binding code within PrefObserverStore.
88 base::MessageLoop message_loop_;
89
90 DISALLOW_COPY_AND_ASSIGN(PrefObserverStoreTest);
91 };
92
93 void PrefObserverStoreTest::SetUp() {
94 manager_.reset(new TestPreferenceManager(mojo::GetProxy(&proxy_)));
95 store_ = new PrefObserverStore(std::move(proxy_));
96 store_->AddObserver(&observer_);
97 }
98
99 void PrefObserverStoreTest::TearDown() {
100 store_->RemoveObserver(&observer_);
101 }
102
103 // Tests that observers are notified upon the completion of initialization, and
104 // that values become available.
105 TEST_F(PrefObserverStoreTest, Initialization) {
106 std::set<std::string> keys;
107 const std::string key("hey");
108 keys.insert(key);
109 store()->Init(keys);
110
111 EXPECT_FALSE(Initialized());
112 EXPECT_FALSE(observer()->initialized);
113
114 const int kValue = 42;
115 base::FundamentalValue pref(kValue);
116 base::DictionaryValue prefs;
117 prefs.Set(key, pref.CreateDeepCopy());
118
119 // PreferenceManager notifies of PreferencesChanged, completing
120 // initialization.
121 OnPreferencesChanged(prefs);
122 EXPECT_TRUE(Initialized());
123 EXPECT_TRUE(observer()->initialized);
124 EXPECT_TRUE(observer()->initialization_success);
125 observer()->VerifyAndResetChangedKey(key);
126
127 const base::Value* value = nullptr;
128 int actual_value;
129 EXPECT_TRUE(store()->GetValue(key, &value));
130 EXPECT_NE(nullptr, value);
131 EXPECT_TRUE(value->GetAsInteger(&actual_value));
132 EXPECT_EQ(kValue, actual_value);
133 EXPECT_FALSE(manager()->set_preferences_called());
134 }
135
136 // Tests that values set silently are also set on the preference manager, but
137 // that no observers are notified.
138 TEST_F(PrefObserverStoreTest, SetValueSilently) {
139 std::set<std::string> keys;
140 const std::string key("hey");
141 keys.insert(key);
142 store()->Init(keys);
143
144 const int kValue = 42;
145 base::FundamentalValue pref(kValue);
146 store()->SetValueSilently(key, pref.CreateDeepCopy(), 0);
147 base::RunLoop().RunUntilIdle();
148 EXPECT_TRUE(manager()->set_preferences_called());
149 EXPECT_TRUE(observer()->changed_keys.empty());
150 }
151
152 // Test that reporting values changed notifies observers, and the preference
153 // manager.
154 TEST_F(PrefObserverStoreTest, ReportValueChanged) {
155 std::set<std::string> keys;
156 const std::string key("hey");
157 keys.insert(key);
158 store()->Init(keys);
159
160 const int kValue = 42;
161 base::FundamentalValue pref(kValue);
162 base::DictionaryValue prefs;
163 prefs.Set(key, pref.CreateDeepCopy());
164 OnPreferencesChanged(prefs);
165 observer()->changed_keys.clear();
166
167 store()->ReportValueChanged(key, 0);
168 base::RunLoop().RunUntilIdle();
169 EXPECT_TRUE(manager()->set_preferences_called());
170 observer()->VerifyAndResetChangedKey(key);
171 }
172
173 // Test that when initialized with multiple keys, that observers receive a
174 // notification for each key.
175 TEST_F(PrefObserverStoreTest, MultipleKeyInitialization) {
176 std::set<std::string> keys;
177 const std::string key1("hey");
178 const std::string key2("listen");
179 keys.insert(key1);
180 keys.insert(key2);
181 store()->Init(keys);
182
183 EXPECT_FALSE(Initialized());
184 EXPECT_FALSE(observer()->initialized);
185
186 const int kValue = 42;
187 base::FundamentalValue pref1(kValue);
188 const std::string kStringValue("look");
189 base::StringValue pref2(kStringValue);
190
191 base::DictionaryValue prefs;
192 prefs.Set(key1, pref1.CreateDeepCopy());
193 prefs.Set(key2, pref2.CreateDeepCopy());
194
195 // The observer should be notified of all keys set.
196 OnPreferencesChanged(prefs);
197 EXPECT_TRUE(Initialized());
198 EXPECT_TRUE(observer()->initialized);
199 EXPECT_EQ(2u, observer()->changed_keys.size());
200 EXPECT_NE(observer()->changed_keys.end(),
201 std::find(observer()->changed_keys.begin(),
202 observer()->changed_keys.end(), key1));
203 EXPECT_NE(observer()->changed_keys.end(),
204 std::find(observer()->changed_keys.begin(),
205 observer()->changed_keys.end(), key2));
206 }
207
208 // Tests that if OnPreferencesChanged is received with invalid keys, that they
209 // are ignored.
210 TEST_F(PrefObserverStoreTest, InvalidInitialization) {
211 std::set<std::string> keys;
212 const std::string key("hey");
213 keys.insert(key);
214 store()->Init(keys);
215
216 const std::string kInvalidKey("look");
217 const int kValue = 42;
218 base::FundamentalValue pref(kValue);
219 base::DictionaryValue prefs;
220 prefs.Set(kInvalidKey, pref.CreateDeepCopy());
221
222 OnPreferencesChanged(prefs);
223 EXPECT_TRUE(observer()->changed_keys.empty());
224 }
225
226 // Tests that when tracking preferences which nest other DictionaryValues, that
227 // modifications to the nested values properly notify the observer.
228 TEST_F(PrefObserverStoreTest, WriteToNestedPrefs) {
229 std::set<std::string> keys;
230 const std::string key1("hey");
231 const std::string key2("listen");
232 keys.insert(key1);
233 keys.insert(key2);
234 store()->Init(keys);
235
236 EXPECT_FALSE(Initialized());
237 EXPECT_FALSE(observer()->initialized);
238
239 const std::string sub_key1("look");
240 const int kValue1 = 42;
241 base::FundamentalValue pref1(kValue1);
242 base::DictionaryValue sub_dictionary1;
243 sub_dictionary1.Set(sub_key1, pref1.CreateDeepCopy());
244
245 const std::string sub_key2("Watch out!\n");
246 const int kValue2 = 1337;
247 base::FundamentalValue pref2(kValue2);
248 base::DictionaryValue sub_dictionary2;
249 sub_dictionary2.Set(sub_key2, pref2.CreateDeepCopy());
250
251 base::DictionaryValue prefs;
252 prefs.Set(key1, sub_dictionary1.CreateDeepCopy());
253 prefs.Set(key2, sub_dictionary2.CreateDeepCopy());
254
255 // Initialize with the nested dictionaries
256 OnPreferencesChanged(prefs);
257 EXPECT_TRUE(Initialized());
258 EXPECT_TRUE(observer()->initialized);
259 EXPECT_EQ(2u, observer()->changed_keys.size());
260 EXPECT_NE(observer()->changed_keys.end(),
261 std::find(observer()->changed_keys.begin(),
262 observer()->changed_keys.end(), key1));
263 EXPECT_NE(observer()->changed_keys.end(),
264 std::find(observer()->changed_keys.begin(),
265 observer()->changed_keys.end(), key2));
266
267 // Change an item within the nested dictionary
268 base::Value* result = nullptr;
269 store()->GetMutableValue(key1, &result);
270 EXPECT_EQ(base::Value::TYPE_DICTIONARY, result->GetType());
271 EXPECT_TRUE(result->Equals(&sub_dictionary1));
272
273 base::DictionaryValue* dictionary_result = nullptr;
274 result->GetAsDictionary(&dictionary_result);
275 EXPECT_NE(nullptr, dictionary_result);
276
277 const std::string sub_key3("????");
278 const int kValue3 = 9001;
279 base::FundamentalValue pref3(kValue3);
280 dictionary_result->Set(sub_key3, pref3.CreateDeepCopy());
281
282 observer()->changed_keys.clear();
283 store()->ReportValueChanged(key1, 0);
284 EXPECT_EQ(1u, observer()->changed_keys.size());
285 }
286
287 // Tests that when tracking preferences that nest other DictionaryValues, that
288 // changes to the tracked keys properly notify the manager and observer.
289 TEST_F(PrefObserverStoreTest, UpdateOuterNestedPrefs) {
290 std::set<std::string> keys;
291 const std::string key1("hey");
292 const std::string key2("listen");
293 keys.insert(key1);
294 keys.insert(key2);
295 store()->Init(keys);
296
297 EXPECT_FALSE(Initialized());
298 EXPECT_FALSE(observer()->initialized);
299
300 const std::string sub_key1("look");
301 const int kValue1 = 42;
302 base::FundamentalValue pref1(kValue1);
303 base::DictionaryValue sub_dictionary1;
304 sub_dictionary1.Set(sub_key1, pref1.CreateDeepCopy());
305
306 const std::string sub_key2("Watch out!\n");
307 const int kValue2 = 1337;
308 base::FundamentalValue pref2(kValue2);
309 base::DictionaryValue sub_dictionary2;
310 sub_dictionary2.Set(sub_key2, pref2.CreateDeepCopy());
311
312 base::DictionaryValue prefs;
313 prefs.Set(key1, sub_dictionary1.CreateDeepCopy());
314 prefs.Set(key2, sub_dictionary2.CreateDeepCopy());
315
316 // Initialize with the nested dictionaries
317 OnPreferencesChanged(prefs);
318 EXPECT_TRUE(Initialized());
319 EXPECT_TRUE(observer()->initialized);
320 EXPECT_EQ(2u, observer()->changed_keys.size());
321 EXPECT_NE(observer()->changed_keys.end(),
322 std::find(observer()->changed_keys.begin(),
323 observer()->changed_keys.end(), key1));
324 EXPECT_NE(observer()->changed_keys.end(),
325 std::find(observer()->changed_keys.begin(),
326 observer()->changed_keys.end(), key2));
327
328 observer()->changed_keys.clear();
329 const int kValue3 = 9001;
330 base::FundamentalValue pref3(kValue3);
331 store()->SetValue(key1, pref3.CreateDeepCopy(), 0);
332 base::RunLoop().RunUntilIdle();
333 EXPECT_EQ(1u, observer()->changed_keys.size());
334 EXPECT_TRUE(manager()->set_preferences_called());
335 }
OLDNEW
« no previous file with comments | « services/preferences/public/cpp/tests/BUILD.gn ('k') | services/preferences/public/interfaces/BUILD.gn » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698