OLD | NEW |
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 Loading... |
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 Loading... |
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 Loading... |
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 Loading... |
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 Loading... |
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 Loading... |
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 |
OLD | NEW |