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

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: Use new wrapper types Created 4 years, 4 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 "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::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<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::PreferenceObserverPtr client) override;
34 void SetPreferences(
35 std::unordered_map<std::string, prefs::mojom::PreferencePtr> preferences)
36 override;
37
38 private:
39 bool add_observer_called_;
40 std::set<std::string> last_preference_set_;
41 bool set_preferences_called_;
42
43 DISALLOW_COPY_AND_ASSIGN(TestPreferenceManager);
44 };
45
46 void TestPreferenceManager::AddObserver(
47 const std::vector<std::string>& preferences,
48 prefs::mojom::PreferenceObserverPtr client) {
49 add_observer_called_ = true;
50 last_preference_set_.clear();
51 last_preference_set_.insert(preferences.begin(), preferences.end());
52 }
53
54 void TestPreferenceManager::SetPreferences(
55 std::unordered_map<std::string, prefs::mojom::PreferencePtr> preferences) {
56 set_preferences_called_ = true;
57 }
58
59 } // namespace
60
61 class PrefObserverStoreTest : public testing::Test {
62 public:
63 PrefObserverStoreTest() {}
64 ~PrefObserverStoreTest() override {}
65
66 TestPreferenceManager* manager() { return &manager_; }
67 PrefStoreObserverMock* observer() { return &observer_; }
68 PrefObserverStore* store() { return store_.get(); }
69
70 bool Initialized() { return store_->initialized_; }
71 void OnPreferencesChanged(
72 std::unordered_map<std::string, prefs::mojom::PreferencePtr>
73 preferences) {
74 store_->OnPreferencesChanged(std::move(preferences));
75 }
76
77 // testing::Test:
78 void SetUp() override;
79 void TearDown() override;
80
81 private:
82 scoped_refptr<PrefObserverStore> store_;
83 TestPreferenceManager manager_;
84 PrefStoreObserverMock observer_;
85 // Required by mojo binding code within PrefObserverStore.
86 base::MessageLoop message_loop_;
87
88 DISALLOW_COPY_AND_ASSIGN(PrefObserverStoreTest);
89 };
90
91 void PrefObserverStoreTest::SetUp() {
92 store_ = new PrefObserverStore(nullptr);
93 store_->AddObserver(&observer_);
94 store_->prefs_manager_ = &manager_;
95 }
96
97 void PrefObserverStoreTest::TearDown() {
98 store_->RemoveObserver(&observer_);
99 }
100
101 // Tests that observers are notified upon the completion of initialization, and
102 // that values become available.
103 TEST_F(PrefObserverStoreTest, Initialization) {
104 std::set<std::string> keys;
105 const std::string key("hey");
106 keys.insert(key);
107 store()->Init(keys);
108
109 EXPECT_FALSE(Initialized());
110 EXPECT_FALSE(observer()->initialized);
111
112 const int kValue = 42;
113 prefs::mojom::PreferencePtr pref = prefs::mojom::Preference::New();
114 pref->type = prefs::mojom::Preference::PreferenceType::INT;
115 pref->integer_value_ = kValue;
116 std::unordered_map<std::string, prefs::mojom::PreferencePtr> pref_map;
117 pref_map.emplace(std::make_pair(key, std::move(pref)));
118
119 // PreferenceManager notifies of PreferencesChanged, completing
120 // initialization.
121 OnPreferencesChanged(std::move(pref_map));
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 store()->SetValueSilently(
146 key, base::WrapUnique(new base::FundamentalValue(kValue)), 0);
147 EXPECT_TRUE(manager()->set_preferences_called());
148 EXPECT_TRUE(observer()->changed_keys.empty());
149 }
150
151 // Test that reporting values changed notifies observers, but not the preference
152 // manager.
153 TEST_F(PrefObserverStoreTest, ReportValueChanged) {
154 std::set<std::string> keys;
155 const std::string key("hey");
156 keys.insert(key);
157 store()->Init(keys);
158
159 store()->ReportValueChanged(key, 0);
160 EXPECT_FALSE(manager()->set_preferences_called());
161 observer()->VerifyAndResetChangedKey(key);
162 }
163
164 // Test that when initialized with multiple keys, that observers receive a
165 // notification for each key.
166 TEST_F(PrefObserverStoreTest, MultipleKeyInitialization) {
167 std::set<std::string> keys;
168 const std::string key1("hey");
169 const std::string key2("listen");
170 keys.insert(key1);
171 keys.insert(key2);
172 store()->Init(keys);
173
174 EXPECT_FALSE(Initialized());
175 EXPECT_FALSE(observer()->initialized);
176
177 const int kValue = 42;
178 prefs::mojom::PreferencePtr pref1 = prefs::mojom::Preference::New();
179 pref1->type = prefs::mojom::Preference::PreferenceType::INT;
180 pref1->integer_value_ = kValue;
181
182 const std::string kStringValue("look");
183 prefs::mojom::PreferencePtr pref2 = prefs::mojom::Preference::New();
184 pref2->type = prefs::mojom::Preference::PreferenceType::STRING;
185 pref2->string_value_ = kStringValue;
186
187 std::unordered_map<std::string, prefs::mojom::PreferencePtr> pref_map;
188 pref_map.emplace(std::make_pair(key1, std::move(pref1)));
189 pref_map.emplace(std::make_pair(key2, std::move(pref2)));
190
191 // The observer should be notified of all keys set.
192 OnPreferencesChanged(std::move(pref_map));
193 EXPECT_TRUE(Initialized());
194 EXPECT_TRUE(observer()->initialized);
195 EXPECT_EQ(2u, observer()->changed_keys.size());
196 EXPECT_NE(observer()->changed_keys.end(),
197 std::find(observer()->changed_keys.begin(),
198 observer()->changed_keys.end(), key1));
199 EXPECT_NE(observer()->changed_keys.end(),
200 std::find(observer()->changed_keys.begin(),
201 observer()->changed_keys.end(), key2));
202 }
203
204 // Tests that if OnPreferencesChanged is received with invalid keys, that they
205 // are ignored.
206 TEST_F(PrefObserverStoreTest, InvalidInitialization) {
207 std::set<std::string> keys;
208 const std::string key("hey");
209 keys.insert(key);
210 store()->Init(keys);
211
212 const std::string kInvalidKey("look");
213 const int kValue = 42;
214 prefs::mojom::PreferencePtr pref = prefs::mojom::Preference::New();
215 pref->type = prefs::mojom::Preference::PreferenceType::INT;
216 pref->integer_value_ = kValue;
217 std::unordered_map<std::string, prefs::mojom::PreferencePtr> pref_map;
218 pref_map.emplace(std::make_pair(kInvalidKey, std::move(pref)));
219
220 OnPreferencesChanged(std::move(pref_map));
221 EXPECT_TRUE(observer()->changed_keys.empty());
222 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698