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