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