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

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, 2 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(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::PreferenceObserverPtr 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 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698