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

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

Issue 2092453002: Mojom interface for Preferences (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Update test to provide Ptr directly Created 4 years, 1 month 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
(Empty)
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
3 // found in the LICENSE file.
4
5 #include "services/preferences/public/cpp/pref_observer_store.h"
6
7 #include "base/macros.h"
8 #include "base/memory/ptr_util.h"
9 #include "base/message_loop/message_loop.h"
10 #include "base/run_loop.h"
11 #include "base/values.h"
12 #include "components/prefs/pref_store_observer_mock.h"
13 #include "services/preferences/public/interfaces/preferences.mojom.h"
14 #include "testing/gtest/include/gtest/gtest.h"
15
16 namespace {
17
18 // Test implmentation of prefs::mojom::PreferenceManager which simply tracks
19 // calls. Allows for testing to be done in process, without mojo IPC.
20 class TestPreferenceManager : public prefs::mojom::PreferencesManager {
21 public:
22 TestPreferenceManager(
23 mojo::InterfaceRequest<prefs::mojom::PreferencesManager> request)
24 : add_observer_called_(false),
25 set_preferences_called_(false),
26 binding_(this, std::move(request)) {}
27 ~TestPreferenceManager() override {}
28
29 bool add_observer_called() { return add_observer_called_; }
30 const std::set<std::string>& last_preference_set() {
31 return last_preference_set_;
32 }
33 bool set_preferences_called() { return set_preferences_called_; }
34
35 // prefs::mojom::TestPreferenceManager:
36 void AddObserver(const std::vector<std::string>& preferences,
37 prefs::mojom::PreferencesObserverPtr client) override;
38 void SetPreferences(const base::DictionaryValue& preferences) override;
39
40 private:
41 bool add_observer_called_;
42 std::set<std::string> last_preference_set_;
43 bool set_preferences_called_;
44 mojo::Binding<PreferencesManager> binding_;
45
46 DISALLOW_COPY_AND_ASSIGN(TestPreferenceManager);
47 };
48
49 void TestPreferenceManager::AddObserver(
50 const std::vector<std::string>& preferences,
51 prefs::mojom::PreferencesObserverPtr client) {
52 add_observer_called_ = true;
53 last_preference_set_.clear();
54 last_preference_set_.insert(preferences.begin(), preferences.end());
55 }
56
57 void TestPreferenceManager::SetPreferences(
58 const base::DictionaryValue& preferences) {
59 set_preferences_called_ = true;
60 }
61
62 } // namespace
63
64 class PrefObserverStoreTest : public testing::Test {
65 public:
66 PrefObserverStoreTest() {}
67 ~PrefObserverStoreTest() override {}
68
69 TestPreferenceManager* manager() { return manager_.get(); }
70 PrefStoreObserverMock* observer() { return &observer_; }
71 PrefObserverStore* store() { return store_.get(); }
72
73 bool Initialized() { return store_->initialized_; }
74 void OnPreferencesChanged(const base::DictionaryValue& preferences) {
75 store_->OnPreferencesChanged(std::move(preferences));
76 }
77
78 // testing::Test:
79 void SetUp() override;
80 void TearDown() override;
81
82 private:
83 scoped_refptr<PrefObserverStore> store_;
84 prefs::mojom::PreferencesManagerPtr proxy_;
85 std::unique_ptr<TestPreferenceManager> manager_;
86 PrefStoreObserverMock observer_;
87 // Required by mojo binding code within PrefObserverStore.
88 base::MessageLoop message_loop_;
89
90 DISALLOW_COPY_AND_ASSIGN(PrefObserverStoreTest);
91 };
92
93 void PrefObserverStoreTest::SetUp() {
94 manager_.reset(new TestPreferenceManager(mojo::GetProxy(&proxy_)));
95 store_ = new PrefObserverStore(std::move(proxy_));
96 store_->AddObserver(&observer_);
97 }
98
99 void PrefObserverStoreTest::TearDown() {
100 store_->RemoveObserver(&observer_);
101 }
102
103 // Tests that observers are notified upon the completion of initialization, and
104 // that values become available.
105 TEST_F(PrefObserverStoreTest, Initialization) {
106 std::set<std::string> keys;
107 const std::string key("hey");
108 keys.insert(key);
109 store()->Init(keys);
110
111 EXPECT_FALSE(Initialized());
112 EXPECT_FALSE(observer()->initialized);
113
114 const int kValue = 42;
115 base::FundamentalValue pref(kValue);
116 base::DictionaryValue prefs;
117 prefs.Set(key, pref.CreateDeepCopy());
118
119 // PreferenceManager notifies of PreferencesChanged, completing
120 // initialization.
121 OnPreferencesChanged(prefs);
122 EXPECT_TRUE(Initialized());
123 EXPECT_TRUE(observer()->initialized);
124 EXPECT_TRUE(observer()->initialization_success);
125 observer()->VerifyAndResetChangedKey(key);
126
127 const base::Value* value = nullptr;
128 int actual_value;
129 EXPECT_TRUE(store()->GetValue(key, &value));
130 EXPECT_NE(nullptr, value);
131 EXPECT_TRUE(value->GetAsInteger(&actual_value));
132 EXPECT_EQ(kValue, actual_value);
133 EXPECT_FALSE(manager()->set_preferences_called());
134 }
135
136 // Tests that values set silently are also set on the preference manager, but
137 // that no observers are notified.
138 TEST_F(PrefObserverStoreTest, SetValueSilently) {
139 std::set<std::string> keys;
140 const std::string key("hey");
141 keys.insert(key);
142 store()->Init(keys);
143
144 const int kValue = 42;
145 base::FundamentalValue pref(kValue);
146 store()->SetValueSilently(key, pref.CreateDeepCopy(), 0);
147 base::RunLoop().RunUntilIdle();
148 EXPECT_TRUE(manager()->set_preferences_called());
149 EXPECT_TRUE(observer()->changed_keys.empty());
150 }
151
152 // Test that reporting values changed notifies observers, but not the preference
153 // manager.
154 TEST_F(PrefObserverStoreTest, ReportValueChanged) {
155 std::set<std::string> keys;
156 const std::string key("hey");
157 keys.insert(key);
158 store()->Init(keys);
159
160 store()->ReportValueChanged(key, 0);
161 base::RunLoop().RunUntilIdle();
162 EXPECT_FALSE(manager()->set_preferences_called());
163 observer()->VerifyAndResetChangedKey(key);
164 }
165
166 // Test that when initialized with multiple keys, that observers receive a
167 // notification for each key.
168 TEST_F(PrefObserverStoreTest, MultipleKeyInitialization) {
169 std::set<std::string> keys;
170 const std::string key1("hey");
171 const std::string key2("listen");
172 keys.insert(key1);
173 keys.insert(key2);
174 store()->Init(keys);
175
176 EXPECT_FALSE(Initialized());
177 EXPECT_FALSE(observer()->initialized);
178
179 const int kValue = 42;
180 base::FundamentalValue pref1(kValue);
181 const std::string kStringValue("look");
182 base::StringValue pref2(kStringValue);
183
184 base::DictionaryValue prefs;
185 prefs.Set(key1, pref1.CreateDeepCopy());
186 prefs.Set(key2, pref2.CreateDeepCopy());
187
188 // The observer should be notified of all keys set.
189 OnPreferencesChanged(prefs);
190 EXPECT_TRUE(Initialized());
191 EXPECT_TRUE(observer()->initialized);
192 EXPECT_EQ(2u, observer()->changed_keys.size());
193 EXPECT_NE(observer()->changed_keys.end(),
194 std::find(observer()->changed_keys.begin(),
195 observer()->changed_keys.end(), key1));
196 EXPECT_NE(observer()->changed_keys.end(),
197 std::find(observer()->changed_keys.begin(),
198 observer()->changed_keys.end(), key2));
199 }
200
201 // Tests that if OnPreferencesChanged is received with invalid keys, that they
202 // are ignored.
203 TEST_F(PrefObserverStoreTest, InvalidInitialization) {
204 std::set<std::string> keys;
205 const std::string key("hey");
206 keys.insert(key);
207 store()->Init(keys);
208
209 const std::string kInvalidKey("look");
210 const int kValue = 42;
211 base::FundamentalValue pref(kValue);
212 base::DictionaryValue prefs;
213 prefs.Set(kInvalidKey, pref.CreateDeepCopy());
214
215 OnPreferencesChanged(prefs);
216 EXPECT_TRUE(observer()->changed_keys.empty());
217 }
218
219 // Tests that when tracking preferences which nest other DictionaryValues, that
220 // modifications to the nested values properly notify the observer.
221 TEST_F(PrefObserverStoreTest, WriteToNestedPrefs) {
222 std::set<std::string> keys;
223 const std::string key1("hey");
224 const std::string key2("listen");
225 keys.insert(key1);
226 keys.insert(key2);
227 store()->Init(keys);
228
229 EXPECT_FALSE(Initialized());
230 EXPECT_FALSE(observer()->initialized);
231
232 const std::string sub_key1("look");
233 const int kValue1 = 42;
234 base::FundamentalValue pref1(kValue1);
235 base::DictionaryValue sub_dictionary1;
236 sub_dictionary1.Set(sub_key1, pref1.CreateDeepCopy());
237
238 const std::string sub_key2("Watch out!\n");
239 const int kValue2 = 1337;
240 base::FundamentalValue pref2(kValue2);
241 base::DictionaryValue sub_dictionary2;
242 sub_dictionary2.Set(sub_key2, pref2.CreateDeepCopy());
243
244 base::DictionaryValue prefs;
245 prefs.Set(key1, sub_dictionary1.CreateDeepCopy());
246 prefs.Set(key2, sub_dictionary2.CreateDeepCopy());
247
248 // Initialize with the nested dictionaries
249 OnPreferencesChanged(prefs);
250 EXPECT_TRUE(Initialized());
251 EXPECT_TRUE(observer()->initialized);
252 EXPECT_EQ(2u, observer()->changed_keys.size());
253 EXPECT_NE(observer()->changed_keys.end(),
254 std::find(observer()->changed_keys.begin(),
255 observer()->changed_keys.end(), key1));
256 EXPECT_NE(observer()->changed_keys.end(),
257 std::find(observer()->changed_keys.begin(),
258 observer()->changed_keys.end(), key2));
259
260 // Change an item within the nested dictionary
261 base::Value* result = nullptr;
262 store()->GetMutableValue(key1, &result);
263 EXPECT_EQ(base::Value::TYPE_DICTIONARY, result->GetType());
264 EXPECT_TRUE(result->Equals(&sub_dictionary1));
265
266 base::DictionaryValue* dictionary_result = nullptr;
267 result->GetAsDictionary(&dictionary_result);
268 EXPECT_NE(nullptr, dictionary_result);
269
270 const std::string sub_key3("????");
271 const int kValue3 = 9001;
272 base::FundamentalValue pref3(kValue3);
273 dictionary_result->Set(sub_key3, pref3.CreateDeepCopy());
274
275 observer()->changed_keys.clear();
276 store()->ReportValueChanged(key1, 0);
277 EXPECT_EQ(1u, observer()->changed_keys.size());
278 }
279
280 // Tests that when tracking preferences that nest other DictionaryValues, that
281 // changes to the tracked keys properly notify the manager and observer.
282 TEST_F(PrefObserverStoreTest, UpdateOuterNestedPrefs) {
283 std::set<std::string> keys;
284 const std::string key1("hey");
285 const std::string key2("listen");
286 keys.insert(key1);
287 keys.insert(key2);
288 store()->Init(keys);
289
290 EXPECT_FALSE(Initialized());
291 EXPECT_FALSE(observer()->initialized);
292
293 const std::string sub_key1("look");
294 const int kValue1 = 42;
295 base::FundamentalValue pref1(kValue1);
296 base::DictionaryValue sub_dictionary1;
297 sub_dictionary1.Set(sub_key1, pref1.CreateDeepCopy());
298
299 const std::string sub_key2("Watch out!\n");
300 const int kValue2 = 1337;
301 base::FundamentalValue pref2(kValue2);
302 base::DictionaryValue sub_dictionary2;
303 sub_dictionary2.Set(sub_key2, pref2.CreateDeepCopy());
304
305 base::DictionaryValue prefs;
306 prefs.Set(key1, sub_dictionary1.CreateDeepCopy());
307 prefs.Set(key2, sub_dictionary2.CreateDeepCopy());
308
309 // Initialize with the nested dictionaries
310 OnPreferencesChanged(prefs);
311 EXPECT_TRUE(Initialized());
312 EXPECT_TRUE(observer()->initialized);
313 EXPECT_EQ(2u, observer()->changed_keys.size());
314 EXPECT_NE(observer()->changed_keys.end(),
315 std::find(observer()->changed_keys.begin(),
316 observer()->changed_keys.end(), key1));
317 EXPECT_NE(observer()->changed_keys.end(),
318 std::find(observer()->changed_keys.begin(),
319 observer()->changed_keys.end(), key2));
320
321 observer()->changed_keys.clear();
322 const int kValue3 = 9001;
323 base::FundamentalValue pref3(kValue3);
324 store()->SetValue(key1, pref3.CreateDeepCopy(), 0);
325 base::RunLoop().RunUntilIdle();
326 EXPECT_EQ(1u, observer()->changed_keys.size());
327 EXPECT_TRUE(manager()->set_preferences_called());
328 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698