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

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

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

Powered by Google App Engine
This is Rietveld 408576698