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

Side by Side Diff: components/prefs/pref_observer_store_unittest.cc

Issue 2092453002: Mojom interface for Preferences (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Created 4 years, 6 months 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 "components/prefs/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 "components/prefs/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::PreferenceManager {
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<mojo::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(prefs::mojom::PreferenceListPtr preferences,
33 prefs::mojom::PreferenceObserverPtr client) override;
34 void SetPreferences(prefs::mojom::PreferenceMapPtr preferences) override;
35
36 private:
37 bool add_observer_called_;
38 std::set<mojo::String> last_preference_set_;
39 bool set_preferences_called_;
40
41 DISALLOW_COPY_AND_ASSIGN(TestPreferenceManager);
42 };
43
44 void TestPreferenceManager::AddObserver(
45 prefs::mojom::PreferenceListPtr preferences,
46 prefs::mojom::PreferenceObserverPtr client) {
47 add_observer_called_ = true;
48 last_preference_set_ = preferences->preferences.To<std::set<mojo::String>>();
49 }
50
51 void TestPreferenceManager::SetPreferences(
52 prefs::mojom::PreferenceMapPtr preferences) {
53 set_preferences_called_ = true;
54 }
55
56 } // namespace
57
58 class PrefObserverStoreTest : public testing::Test {
59 public:
60 PrefObserverStoreTest() {}
61 ~PrefObserverStoreTest() override {}
62
63 TestPreferenceManager* manager() { return &manager_; }
64 PrefStoreObserverMock* observer() { return &observer_; }
65 PrefObserverStore* store() { return store_.get(); }
66
67 bool Initialized() { return store_->initialized_; }
68 void OnPreferencesChanged(prefs::mojom::PreferenceMapPtr preferences) {
69 store_->OnPreferencesChanged(std::move(preferences));
70 }
71
72 // testing::Test:
73 void SetUp() override;
74 void TearDown() override;
75
76 private:
77 scoped_refptr<PrefObserverStore> store_;
78 TestPreferenceManager manager_;
79 PrefStoreObserverMock observer_;
80 // Required by mojo binding code within PrefObserverStore.
81 base::MessageLoop message_loop_;
82
83 DISALLOW_COPY_AND_ASSIGN(PrefObserverStoreTest);
84 };
85
86 void PrefObserverStoreTest::SetUp() {
87 store_ = new PrefObserverStore(nullptr);
88 store_->AddObserver(&observer_);
89 store_->prefs_manager_ = &manager_;
90 }
91
92 void PrefObserverStoreTest::TearDown() {
93 store_->RemoveObserver(&observer_);
94 }
95
96 // Tests that though initialization has started, that there are no values
97 // available until they are set.
98 TEST_F(PrefObserverStoreTest, NoCacheUntilValuesSet) {
99 std::set<mojo::String> keys;
100 const std::string key("hey");
101 keys.insert(key);
102 store()->Init(keys);
103
104 EXPECT_TRUE(manager()->add_observer_called());
105 EXPECT_EQ(keys.size(), manager()->last_preference_set().size());
106
107 // There should be no values immediately after Init.
108 const base::Value* value = nullptr;
109 EXPECT_FALSE(store()->GetValue("hey", &value));
110 EXPECT_EQ(nullptr, value);
111
112 const int kValue = 42;
113 store()->SetValue(key, base::WrapUnique(new base::FundamentalValue(kValue)),
114 0);
115 int actual_value;
116 EXPECT_TRUE(store()->GetValue(key, &value));
117 EXPECT_NE(nullptr, value);
118 EXPECT_TRUE(value->GetAsInteger(&actual_value));
119 EXPECT_EQ(kValue, actual_value);
120 EXPECT_TRUE(manager()->set_preferences_called());
121 observer()->VerifyAndResetChangedKey(key);
122 }
123
124 // Tests that observers are notified upon the completion of initialization, and
125 // that values become available.
126 TEST_F(PrefObserverStoreTest, Initialization) {
127 std::set<mojo::String> keys;
128 const std::string key("hey");
129 keys.insert(key);
130 store()->Init(keys);
131
132 EXPECT_FALSE(Initialized());
133 EXPECT_FALSE(observer()->initialized);
134
135 const int kValue = 42;
136 prefs::mojom::PreferencePtr pref = prefs::mojom::Preference::New();
137 pref->type = prefs::mojom::Preference::PreferenceType::INT;
138 pref->integer_value_ = kValue;
139 prefs::mojom::PreferenceMapPtr pref_map = prefs::mojom::PreferenceMap::New();
140 pref_map->preferences.insert(key, std::move(pref));
141
142 // PreferenceManager notifies of PreferencesChanged, completing
143 // initialization.
144 OnPreferencesChanged(std::move(pref_map));
145 EXPECT_TRUE(Initialized());
146 EXPECT_TRUE(observer()->initialized);
147 EXPECT_TRUE(observer()->initialization_success);
148 observer()->VerifyAndResetChangedKey(key);
149
150 const base::Value* value = nullptr;
151 int actual_value;
152 EXPECT_TRUE(store()->GetValue(key, &value));
153 EXPECT_NE(nullptr, value);
154 EXPECT_TRUE(value->GetAsInteger(&actual_value));
155 EXPECT_EQ(kValue, actual_value);
156 EXPECT_FALSE(manager()->set_preferences_called());
157 }
158
159 // Tests that values set silently are also set on the preference manager, but
160 // that no observers are notified.
161 TEST_F(PrefObserverStoreTest, SetValueSilently) {
162 std::set<mojo::String> keys;
163 const std::string key("hey");
164 keys.insert(key);
165 store()->Init(keys);
166
167 const int kValue = 42;
168 store()->SetValueSilently(
169 key, base::WrapUnique(new base::FundamentalValue(kValue)), 0);
170 EXPECT_TRUE(manager()->set_preferences_called());
171 EXPECT_TRUE(observer()->changed_keys.empty());
172 }
173
174 // Test that reporting values changed notifies observers, but not the preference
175 // manager.
176 TEST_F(PrefObserverStoreTest, ReportValueChanged) {
177 std::set<mojo::String> keys;
178 const std::string key("hey");
179 keys.insert(key);
180 store()->Init(keys);
181
182 store()->ReportValueChanged(key, 0);
183 EXPECT_FALSE(manager()->set_preferences_called());
184 observer()->VerifyAndResetChangedKey(key);
185 }
186
187 // Tests that attempting to set a value for an invalid key does not make
188 // changes.
189 TEST_F(PrefObserverStoreTest, SetInvalidKey) {
190 std::set<mojo::String> keys;
191 const std::string key("hey");
192 keys.insert(key);
193 store()->Init(keys);
194
195 const std::string invalid_key("look");
196 store()->SetValue(invalid_key,
197 base::WrapUnique(new base::FundamentalValue(42)), 0);
198 EXPECT_FALSE(manager()->set_preferences_called());
199 EXPECT_TRUE(observer()->changed_keys.empty());
200 }
201
202 // Test that when initialized with multiple keys, that observers receive a
203 // notification for each key.
204 TEST_F(PrefObserverStoreTest, MultipleKeyInitialization) {
205 std::set<mojo::String> keys;
206 const std::string key1("hey");
207 const std::string key2("listen");
208 keys.insert(key1);
209 keys.insert(key2);
210 store()->Init(keys);
211
212 EXPECT_FALSE(Initialized());
213 EXPECT_FALSE(observer()->initialized);
214
215 const int kValue = 42;
216 prefs::mojom::PreferencePtr pref1 = prefs::mojom::Preference::New();
217 pref1->type = prefs::mojom::Preference::PreferenceType::INT;
218 pref1->integer_value_ = kValue;
219
220 const std::string kStringValue("look");
221 prefs::mojom::PreferencePtr pref2 = prefs::mojom::Preference::New();
222 pref2->type = prefs::mojom::Preference::PreferenceType::STRING;
223 pref2->string_value_ = kStringValue;
224
225 prefs::mojom::PreferenceMapPtr pref_map = prefs::mojom::PreferenceMap::New();
226 pref_map->preferences.insert(key1, std::move(pref1));
227 pref_map->preferences.insert(key2, std::move(pref2));
228
229 // The observer should be notified of all keys set.
230 OnPreferencesChanged(std::move(pref_map));
231 EXPECT_TRUE(Initialized());
232 EXPECT_TRUE(observer()->initialized);
233 EXPECT_EQ(2u, observer()->changed_keys.size());
234 EXPECT_EQ(key1, observer()->changed_keys.front());
235 EXPECT_EQ(key2, observer()->changed_keys.back());
236 }
237
238 // Tests that if OnPreferencesChanged is received with invalid keys, that they
239 // are ignored.
240 TEST_F(PrefObserverStoreTest, InvalidInitialization) {
241 std::set<mojo::String> keys;
242 const std::string key("hey");
243 keys.insert(key);
244 store()->Init(keys);
245
246 const std::string kInvalidKey("look");
247 const int kValue = 42;
248 prefs::mojom::PreferencePtr pref = prefs::mojom::Preference::New();
249 pref->type = prefs::mojom::Preference::PreferenceType::INT;
250 pref->integer_value_ = kValue;
251 prefs::mojom::PreferenceMapPtr pref_map = prefs::mojom::PreferenceMap::New();
252 pref_map->preferences.insert(kInvalidKey, std::move(pref));
253
254 OnPreferencesChanged(std::move(pref_map));
255 EXPECT_TRUE(observer()->changed_keys.empty());
256 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698