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

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: Address Review Comments Created 4 years, 5 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(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<std::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<std::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 observers are notified upon the completion of initialization, and
97 // that values become available.
98 TEST_F(PrefObserverStoreTest, Initialization) {
99 std::set<std::string> keys;
100 const std::string key("hey");
101 keys.insert(key);
102 store()->Init(keys);
103
104 EXPECT_FALSE(Initialized());
105 EXPECT_FALSE(observer()->initialized);
106
107 const int kValue = 42;
108 prefs::mojom::PreferencePtr pref = prefs::mojom::Preference::New();
109 pref->type = prefs::mojom::Preference::PreferenceType::INT;
110 pref->integer_value_ = kValue;
111 prefs::mojom::PreferenceMapPtr pref_map = prefs::mojom::PreferenceMap::New();
112 pref_map->preferences.insert(key, std::move(pref));
113
114 // PreferenceManager notifies of PreferencesChanged, completing
115 // initialization.
116 OnPreferencesChanged(std::move(pref_map));
117 EXPECT_TRUE(Initialized());
118 EXPECT_TRUE(observer()->initialized);
119 EXPECT_TRUE(observer()->initialization_success);
120 observer()->VerifyAndResetChangedKey(key);
121
122 const base::Value* value = nullptr;
123 int actual_value;
124 EXPECT_TRUE(store()->GetValue(key, &value));
125 EXPECT_NE(nullptr, value);
126 EXPECT_TRUE(value->GetAsInteger(&actual_value));
127 EXPECT_EQ(kValue, actual_value);
128 EXPECT_FALSE(manager()->set_preferences_called());
129 }
130
131 // Tests that values set silently are also set on the preference manager, but
132 // that no observers are notified.
133 TEST_F(PrefObserverStoreTest, SetValueSilently) {
134 std::set<std::string> keys;
135 const std::string key("hey");
136 keys.insert(key);
137 store()->Init(keys);
138
139 const int kValue = 42;
140 store()->SetValueSilently(
141 key, base::WrapUnique(new base::FundamentalValue(kValue)), 0);
142 EXPECT_TRUE(manager()->set_preferences_called());
143 EXPECT_TRUE(observer()->changed_keys.empty());
144 }
145
146 // Test that reporting values changed notifies observers, but not the preference
147 // manager.
148 TEST_F(PrefObserverStoreTest, ReportValueChanged) {
149 std::set<std::string> keys;
150 const std::string key("hey");
151 keys.insert(key);
152 store()->Init(keys);
153
154 store()->ReportValueChanged(key, 0);
155 EXPECT_FALSE(manager()->set_preferences_called());
156 observer()->VerifyAndResetChangedKey(key);
157 }
158
159 // Test that when initialized with multiple keys, that observers receive a
160 // notification for each key.
161 TEST_F(PrefObserverStoreTest, MultipleKeyInitialization) {
162 std::set<std::string> keys;
163 const std::string key1("hey");
164 const std::string key2("listen");
165 keys.insert(key1);
166 keys.insert(key2);
167 store()->Init(keys);
168
169 EXPECT_FALSE(Initialized());
170 EXPECT_FALSE(observer()->initialized);
171
172 const int kValue = 42;
173 prefs::mojom::PreferencePtr pref1 = prefs::mojom::Preference::New();
174 pref1->type = prefs::mojom::Preference::PreferenceType::INT;
175 pref1->integer_value_ = kValue;
176
177 const std::string kStringValue("look");
178 prefs::mojom::PreferencePtr pref2 = prefs::mojom::Preference::New();
179 pref2->type = prefs::mojom::Preference::PreferenceType::STRING;
180 pref2->string_value_ = kStringValue;
181
182 prefs::mojom::PreferenceMapPtr pref_map = prefs::mojom::PreferenceMap::New();
183 pref_map->preferences.insert(key1, std::move(pref1));
184 pref_map->preferences.insert(key2, std::move(pref2));
185
186 // The observer should be notified of all keys set.
187 OnPreferencesChanged(std::move(pref_map));
188 EXPECT_TRUE(Initialized());
189 EXPECT_TRUE(observer()->initialized);
190 EXPECT_EQ(2u, observer()->changed_keys.size());
191 EXPECT_EQ(key1, observer()->changed_keys.front());
192 EXPECT_EQ(key2, observer()->changed_keys.back());
193 }
194
195 // Tests that if OnPreferencesChanged is received with invalid keys, that they
196 // are ignored.
197 TEST_F(PrefObserverStoreTest, InvalidInitialization) {
198 std::set<std::string> keys;
199 const std::string key("hey");
200 keys.insert(key);
201 store()->Init(keys);
202
203 const std::string kInvalidKey("look");
204 const int kValue = 42;
205 prefs::mojom::PreferencePtr pref = prefs::mojom::Preference::New();
206 pref->type = prefs::mojom::Preference::PreferenceType::INT;
207 pref->integer_value_ = kValue;
208 prefs::mojom::PreferenceMapPtr pref_map = prefs::mojom::PreferenceMap::New();
209 pref_map->preferences.insert(kInvalidKey, std::move(pref));
210
211 OnPreferencesChanged(std::move(pref_map));
212 EXPECT_TRUE(observer()->changed_keys.empty());
213 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698