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

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

Powered by Google App Engine
This is Rietveld 408576698