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