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

Side by Side Diff: services/preferences/public/cpp/tests/pref_observer_store_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
1 // Copyright 2016 The Chromium Authors. All rights reserved. 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 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "services/preferences/public/cpp/pref_observer_store.h" 5 #include "services/preferences/public/cpp/pref_observer_store.h"
6 6
7 #include "base/macros.h" 7 #include "base/macros.h"
8 #include "base/memory/ptr_util.h" 8 #include "base/memory/ptr_util.h"
9 #include "base/message_loop/message_loop.h" 9 #include "base/message_loop/message_loop.h"
10 #include "base/run_loop.h" 10 #include "base/run_loop.h"
(...skipping 15 matching lines...) Expand all
26 binding_(this, std::move(request)) {} 26 binding_(this, std::move(request)) {}
27 ~TestPreferenceManager() override {} 27 ~TestPreferenceManager() override {}
28 28
29 bool add_observer_called() { return add_observer_called_; } 29 bool add_observer_called() { return add_observer_called_; }
30 const std::set<std::string>& last_preference_set() { 30 const std::set<std::string>& last_preference_set() {
31 return last_preference_set_; 31 return last_preference_set_;
32 } 32 }
33 bool set_preferences_called() { return set_preferences_called_; } 33 bool set_preferences_called() { return set_preferences_called_; }
34 34
35 // prefs::mojom::TestPreferenceManager: 35 // prefs::mojom::TestPreferenceManager:
36 void AddObserver(const std::vector<std::string>& preferences, 36 void AddObserver(prefs::mojom::PreferencesObserverPtr client) override;
37 prefs::mojom::PreferencesObserverPtr client) override;
38 void SetPreferences( 37 void SetPreferences(
39 std::unique_ptr<base::DictionaryValue> preferences) override; 38 std::unique_ptr<base::DictionaryValue> preferences) override;
39 void Subscribe(const std::vector<std::string>& preferences) override;
40 40
41 private: 41 private:
42 bool add_observer_called_; 42 bool add_observer_called_;
43 std::set<std::string> last_preference_set_; 43 std::set<std::string> last_preference_set_;
44 bool set_preferences_called_; 44 bool set_preferences_called_;
45 mojo::Binding<PreferencesManager> binding_; 45 mojo::Binding<PreferencesManager> binding_;
46 46
47 DISALLOW_COPY_AND_ASSIGN(TestPreferenceManager); 47 DISALLOW_COPY_AND_ASSIGN(TestPreferenceManager);
48 }; 48 };
49 49
50 void TestPreferenceManager::AddObserver( 50 void TestPreferenceManager::AddObserver(
51 const std::vector<std::string>& preferences,
52 prefs::mojom::PreferencesObserverPtr client) { 51 prefs::mojom::PreferencesObserverPtr client) {
53 add_observer_called_ = true; 52 add_observer_called_ = true;
54 last_preference_set_.clear();
55 last_preference_set_.insert(preferences.begin(), preferences.end());
56 } 53 }
57 54
58 void TestPreferenceManager::SetPreferences( 55 void TestPreferenceManager::SetPreferences(
59 std::unique_ptr<base::DictionaryValue> preferences) { 56 std::unique_ptr<base::DictionaryValue> preferences) {
60 set_preferences_called_ = true; 57 set_preferences_called_ = true;
61 } 58 }
62 59
60 void TestPreferenceManager::Subscribe(
61 const std::vector<std::string>& preferences) {
62 last_preference_set_.clear();
63 last_preference_set_.insert(preferences.begin(), preferences.end());
64 }
65
63 } // namespace 66 } // namespace
64 67
68 namespace preferences {
69
65 class PrefObserverStoreTest : public testing::Test { 70 class PrefObserverStoreTest : public testing::Test {
66 public: 71 public:
67 PrefObserverStoreTest() {} 72 PrefObserverStoreTest() {}
68 ~PrefObserverStoreTest() override {} 73 ~PrefObserverStoreTest() override {}
69 74
70 TestPreferenceManager* manager() { return manager_.get(); } 75 TestPreferenceManager* manager() { return manager_.get(); }
71 PrefStoreObserverMock* observer() { return &observer_; } 76 PrefStoreObserverMock* observer() { return &observer_; }
72 PrefObserverStore* store() { return store_.get(); } 77 PrefObserverStore* store() { return store_.get(); }
73 78
74 bool Initialized() { return store_->initialized_; } 79 bool Initialized() { return store_->initialized_; }
(...skipping 25 matching lines...) Expand all
100 void PrefObserverStoreTest::TearDown() { 105 void PrefObserverStoreTest::TearDown() {
101 store_->RemoveObserver(&observer_); 106 store_->RemoveObserver(&observer_);
102 } 107 }
103 108
104 // Tests that observers are notified upon the completion of initialization, and 109 // Tests that observers are notified upon the completion of initialization, and
105 // that values become available. 110 // that values become available.
106 TEST_F(PrefObserverStoreTest, Initialization) { 111 TEST_F(PrefObserverStoreTest, Initialization) {
107 std::set<std::string> keys; 112 std::set<std::string> keys;
108 const std::string key("hey"); 113 const std::string key("hey");
109 keys.insert(key); 114 keys.insert(key);
110 store()->Init(keys); 115 store()->Subscribe(keys);
111 116
112 EXPECT_FALSE(Initialized()); 117 EXPECT_FALSE(Initialized());
113 EXPECT_FALSE(observer()->initialized); 118 EXPECT_FALSE(observer()->initialized);
114 119
115 const int kValue = 42; 120 const int kValue = 42;
116 base::FundamentalValue pref(kValue); 121 base::FundamentalValue pref(kValue);
117 base::DictionaryValue prefs; 122 base::DictionaryValue prefs;
118 prefs.Set(key, pref.CreateDeepCopy()); 123 prefs.Set(key, pref.CreateDeepCopy());
119 124
120 // PreferenceManager notifies of PreferencesChanged, completing 125 // PreferenceManager notifies of PreferencesChanged, completing
(...skipping 12 matching lines...) Expand all
133 EXPECT_EQ(kValue, actual_value); 138 EXPECT_EQ(kValue, actual_value);
134 EXPECT_FALSE(manager()->set_preferences_called()); 139 EXPECT_FALSE(manager()->set_preferences_called());
135 } 140 }
136 141
137 // Tests that values set silently are also set on the preference manager, but 142 // Tests that values set silently are also set on the preference manager, but
138 // that no observers are notified. 143 // that no observers are notified.
139 TEST_F(PrefObserverStoreTest, SetValueSilently) { 144 TEST_F(PrefObserverStoreTest, SetValueSilently) {
140 std::set<std::string> keys; 145 std::set<std::string> keys;
141 const std::string key("hey"); 146 const std::string key("hey");
142 keys.insert(key); 147 keys.insert(key);
143 store()->Init(keys); 148 store()->Subscribe(keys);
144 149
145 const int kValue = 42; 150 const int kValue = 42;
146 base::FundamentalValue pref(kValue); 151 base::FundamentalValue pref(kValue);
147 store()->SetValueSilently(key, pref.CreateDeepCopy(), 0); 152 store()->SetValueSilently(key, pref.CreateDeepCopy(), 0);
148 base::RunLoop().RunUntilIdle(); 153 base::RunLoop().RunUntilIdle();
149 EXPECT_TRUE(manager()->set_preferences_called()); 154 EXPECT_TRUE(manager()->set_preferences_called());
150 EXPECT_TRUE(observer()->changed_keys.empty()); 155 EXPECT_TRUE(observer()->changed_keys.empty());
151 } 156 }
152 157
153 // Test that reporting values changed notifies observers, and the preference 158 // Test that reporting values changed notifies observers, and the preference
154 // manager. 159 // manager.
155 TEST_F(PrefObserverStoreTest, ReportValueChanged) { 160 TEST_F(PrefObserverStoreTest, ReportValueChanged) {
156 std::set<std::string> keys; 161 std::set<std::string> keys;
157 const std::string key("hey"); 162 const std::string key("hey");
158 keys.insert(key); 163 keys.insert(key);
159 store()->Init(keys); 164 store()->Subscribe(keys);
160 165
161 const int kValue = 42; 166 const int kValue = 42;
162 base::FundamentalValue pref(kValue); 167 base::FundamentalValue pref(kValue);
163 base::DictionaryValue prefs; 168 base::DictionaryValue prefs;
164 prefs.Set(key, pref.CreateDeepCopy()); 169 prefs.Set(key, pref.CreateDeepCopy());
165 OnPreferencesChanged(prefs); 170 OnPreferencesChanged(prefs);
166 observer()->changed_keys.clear(); 171 observer()->changed_keys.clear();
167 172
168 store()->ReportValueChanged(key, 0); 173 store()->ReportValueChanged(key, 0);
169 base::RunLoop().RunUntilIdle(); 174 base::RunLoop().RunUntilIdle();
170 EXPECT_TRUE(manager()->set_preferences_called()); 175 EXPECT_TRUE(manager()->set_preferences_called());
171 observer()->VerifyAndResetChangedKey(key); 176 observer()->VerifyAndResetChangedKey(key);
172 } 177 }
173 178
174 // Test that when initialized with multiple keys, that observers receive a 179 // Test that when initialized with multiple keys, that observers receive a
175 // notification for each key. 180 // notification for each key.
176 TEST_F(PrefObserverStoreTest, MultipleKeyInitialization) { 181 TEST_F(PrefObserverStoreTest, MultipleKeyInitialization) {
177 std::set<std::string> keys; 182 std::set<std::string> keys;
178 const std::string key1("hey"); 183 const std::string key1("hey");
179 const std::string key2("listen"); 184 const std::string key2("listen");
180 keys.insert(key1); 185 keys.insert(key1);
181 keys.insert(key2); 186 keys.insert(key2);
182 store()->Init(keys); 187 store()->Subscribe(keys);
183 188
184 EXPECT_FALSE(Initialized()); 189 EXPECT_FALSE(Initialized());
185 EXPECT_FALSE(observer()->initialized); 190 EXPECT_FALSE(observer()->initialized);
186 191
187 const int kValue = 42; 192 const int kValue = 42;
188 base::FundamentalValue pref1(kValue); 193 base::FundamentalValue pref1(kValue);
189 const std::string kStringValue("look"); 194 const std::string kStringValue("look");
190 base::StringValue pref2(kStringValue); 195 base::StringValue pref2(kStringValue);
191 196
192 base::DictionaryValue prefs; 197 base::DictionaryValue prefs;
(...skipping 12 matching lines...) Expand all
205 std::find(observer()->changed_keys.begin(), 210 std::find(observer()->changed_keys.begin(),
206 observer()->changed_keys.end(), key2)); 211 observer()->changed_keys.end(), key2));
207 } 212 }
208 213
209 // Tests that if OnPreferencesChanged is received with invalid keys, that they 214 // Tests that if OnPreferencesChanged is received with invalid keys, that they
210 // are ignored. 215 // are ignored.
211 TEST_F(PrefObserverStoreTest, InvalidInitialization) { 216 TEST_F(PrefObserverStoreTest, InvalidInitialization) {
212 std::set<std::string> keys; 217 std::set<std::string> keys;
213 const std::string key("hey"); 218 const std::string key("hey");
214 keys.insert(key); 219 keys.insert(key);
215 store()->Init(keys); 220 store()->Subscribe(keys);
216 221
217 const std::string kInvalidKey("look"); 222 const std::string kInvalidKey("look");
218 const int kValue = 42; 223 const int kValue = 42;
219 base::FundamentalValue pref(kValue); 224 base::FundamentalValue pref(kValue);
220 base::DictionaryValue prefs; 225 base::DictionaryValue prefs;
221 prefs.Set(kInvalidKey, pref.CreateDeepCopy()); 226 prefs.Set(kInvalidKey, pref.CreateDeepCopy());
222 227
223 OnPreferencesChanged(prefs); 228 OnPreferencesChanged(prefs);
224 EXPECT_TRUE(observer()->changed_keys.empty()); 229 EXPECT_TRUE(observer()->changed_keys.empty());
225 } 230 }
226 231
227 // Tests that when tracking preferences which nest other DictionaryValues, that 232 // Tests that when tracking preferences which nest other DictionaryValues, that
228 // modifications to the nested values properly notify the observer. 233 // modifications to the nested values properly notify the observer.
229 TEST_F(PrefObserverStoreTest, WriteToNestedPrefs) { 234 TEST_F(PrefObserverStoreTest, WriteToNestedPrefs) {
230 std::set<std::string> keys; 235 std::set<std::string> keys;
231 const std::string key1("hey"); 236 const std::string key1("hey");
232 const std::string key2("listen"); 237 const std::string key2("listen");
233 keys.insert(key1); 238 keys.insert(key1);
234 keys.insert(key2); 239 keys.insert(key2);
235 store()->Init(keys); 240 store()->Subscribe(keys);
236 241
237 EXPECT_FALSE(Initialized()); 242 EXPECT_FALSE(Initialized());
238 EXPECT_FALSE(observer()->initialized); 243 EXPECT_FALSE(observer()->initialized);
239 244
240 const std::string sub_key1("look"); 245 const std::string sub_key1("look");
241 const int kValue1 = 42; 246 const int kValue1 = 42;
242 base::FundamentalValue pref1(kValue1); 247 base::FundamentalValue pref1(kValue1);
243 base::DictionaryValue sub_dictionary1; 248 base::DictionaryValue sub_dictionary1;
244 sub_dictionary1.Set(sub_key1, pref1.CreateDeepCopy()); 249 sub_dictionary1.Set(sub_key1, pref1.CreateDeepCopy());
245 250
(...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after
286 } 291 }
287 292
288 // Tests that when tracking preferences that nest other DictionaryValues, that 293 // Tests that when tracking preferences that nest other DictionaryValues, that
289 // changes to the tracked keys properly notify the manager and observer. 294 // changes to the tracked keys properly notify the manager and observer.
290 TEST_F(PrefObserverStoreTest, UpdateOuterNestedPrefs) { 295 TEST_F(PrefObserverStoreTest, UpdateOuterNestedPrefs) {
291 std::set<std::string> keys; 296 std::set<std::string> keys;
292 const std::string key1("hey"); 297 const std::string key1("hey");
293 const std::string key2("listen"); 298 const std::string key2("listen");
294 keys.insert(key1); 299 keys.insert(key1);
295 keys.insert(key2); 300 keys.insert(key2);
296 store()->Init(keys); 301 store()->Subscribe(keys);
297 302
298 EXPECT_FALSE(Initialized()); 303 EXPECT_FALSE(Initialized());
299 EXPECT_FALSE(observer()->initialized); 304 EXPECT_FALSE(observer()->initialized);
300 305
301 const std::string sub_key1("look"); 306 const std::string sub_key1("look");
302 const int kValue1 = 42; 307 const int kValue1 = 42;
303 base::FundamentalValue pref1(kValue1); 308 base::FundamentalValue pref1(kValue1);
304 base::DictionaryValue sub_dictionary1; 309 base::DictionaryValue sub_dictionary1;
305 sub_dictionary1.Set(sub_key1, pref1.CreateDeepCopy()); 310 sub_dictionary1.Set(sub_key1, pref1.CreateDeepCopy());
306 311
(...skipping 20 matching lines...) Expand all
327 observer()->changed_keys.end(), key2)); 332 observer()->changed_keys.end(), key2));
328 333
329 observer()->changed_keys.clear(); 334 observer()->changed_keys.clear();
330 const int kValue3 = 9001; 335 const int kValue3 = 9001;
331 base::FundamentalValue pref3(kValue3); 336 base::FundamentalValue pref3(kValue3);
332 store()->SetValue(key1, pref3.CreateDeepCopy(), 0); 337 store()->SetValue(key1, pref3.CreateDeepCopy(), 0);
333 base::RunLoop().RunUntilIdle(); 338 base::RunLoop().RunUntilIdle();
334 EXPECT_EQ(1u, observer()->changed_keys.size()); 339 EXPECT_EQ(1u, observer()->changed_keys.size());
335 EXPECT_TRUE(manager()->set_preferences_called()); 340 EXPECT_TRUE(manager()->set_preferences_called());
336 } 341 }
342
343 // Tests that a PrefObserverStore can subscribe multiple times to different
344 // keys.
345 TEST_F(PrefObserverStoreTest, MultipleSubscriptions) {
346 std::set<std::string> keys1;
347 const std::string key1("hey");
348 keys1.insert(key1);
349 store()->Subscribe(keys1);
350 base::RunLoop().RunUntilIdle();
351 EXPECT_NE(manager()->last_preference_set().end(),
352 manager()->last_preference_set().find(key1));
353
354 std::set<std::string> keys2;
355 const std::string key2("listen");
356 keys2.insert(key2);
357 store()->Subscribe(keys2);
358 base::RunLoop().RunUntilIdle();
359 EXPECT_NE(manager()->last_preference_set().end(),
360 manager()->last_preference_set().find(key2));
361 }
362
363 // Tests that multiple PrefStore::Observers can be added to a PrefObserverStore
364 // and that they are each notified of changes.
365 TEST_F(PrefObserverStoreTest, MultipleObservers) {
366 PrefStoreObserverMock observer2;
367 store()->AddObserver(&observer2);
368
369 std::set<std::string> keys;
370 const std::string key("hey");
371 keys.insert(key);
372 store()->Subscribe(keys);
373
374 const int kValue = 42;
375 base::FundamentalValue pref(kValue);
376 base::DictionaryValue prefs;
377 prefs.Set(key, pref.CreateDeepCopy());
378
379 // PreferenceManager notifies of PreferencesChanged, completing
380 // initialization.
381 OnPreferencesChanged(prefs);
382 EXPECT_TRUE(observer()->initialized);
383 EXPECT_TRUE(observer2.initialized);
384 EXPECT_TRUE(observer()->initialization_success);
385 EXPECT_TRUE(observer2.initialization_success);
386 observer()->VerifyAndResetChangedKey(key);
387 observer2.VerifyAndResetChangedKey(key);
388
389 store()->RemoveObserver(&observer2);
390 }
391
392 } // namespace preferences
OLDNEW
« no previous file with comments | « services/preferences/public/cpp/pref_observer_store.cc ('k') | services/preferences/public/interfaces/preferences.mojom » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698