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

Side by Side Diff: components/user_prefs/tracked/segregated_pref_store_unittest.cc

Issue 2782803002: Move tracked prefs into services/preferences/tracked. (Closed)
Patch Set: rebase Created 3 years, 8 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 2014 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/user_prefs/tracked/segregated_pref_store.h"
6
7 #include <memory>
8 #include <set>
9 #include <string>
10 #include <utility>
11
12 #include "base/bind.h"
13 #include "base/callback.h"
14 #include "base/memory/ptr_util.h"
15 #include "base/memory/ref_counted.h"
16 #include "base/values.h"
17 #include "components/prefs/persistent_pref_store.h"
18 #include "components/prefs/pref_store_observer_mock.h"
19 #include "components/prefs/testing_pref_store.h"
20 #include "components/user_prefs/tracked/segregated_pref_store.h"
21 #include "testing/gtest/include/gtest/gtest.h"
22
23 namespace {
24
25 const char kSelectedPref[] = "selected_pref";
26 const char kUnselectedPref[] = "unselected_pref";
27 const char kSharedPref[] = "shared_pref";
28
29 const char kValue1[] = "value1";
30 const char kValue2[] = "value2";
31
32 class MockReadErrorDelegate : public PersistentPrefStore::ReadErrorDelegate {
33 public:
34 struct Data {
35 Data(bool invoked_in, PersistentPrefStore::PrefReadError read_error_in)
36 : invoked(invoked_in), read_error(read_error_in) {}
37
38 bool invoked;
39 PersistentPrefStore::PrefReadError read_error;
40 };
41
42 explicit MockReadErrorDelegate(Data* data) : data_(data) {
43 DCHECK(data_);
44 EXPECT_FALSE(data_->invoked);
45 }
46
47 // PersistentPrefStore::ReadErrorDelegate implementation
48 void OnError(PersistentPrefStore::PrefReadError read_error) override {
49 EXPECT_FALSE(data_->invoked);
50 data_->invoked = true;
51 data_->read_error = read_error;
52 }
53
54 private:
55 Data* data_;
56 };
57
58 } // namespace
59
60 class SegregatedPrefStoreTest : public testing::Test {
61 public:
62 SegregatedPrefStoreTest()
63 : read_error_delegate_data_(false,
64 PersistentPrefStore::PREF_READ_ERROR_NONE),
65 read_error_delegate_(
66 new MockReadErrorDelegate(&read_error_delegate_data_)) {}
67
68 void SetUp() override {
69 selected_store_ = new TestingPrefStore;
70 default_store_ = new TestingPrefStore;
71
72 std::set<std::string> selected_pref_names;
73 selected_pref_names.insert(kSelectedPref);
74 selected_pref_names.insert(kSharedPref);
75
76 segregated_store_ = new SegregatedPrefStore(default_store_, selected_store_,
77 selected_pref_names);
78
79 segregated_store_->AddObserver(&observer_);
80 }
81
82 void TearDown() override { segregated_store_->RemoveObserver(&observer_); }
83
84 protected:
85 std::unique_ptr<PersistentPrefStore::ReadErrorDelegate>
86 GetReadErrorDelegate() {
87 EXPECT_TRUE(read_error_delegate_);
88 return std::move(read_error_delegate_);
89 }
90
91 PrefStoreObserverMock observer_;
92
93 scoped_refptr<TestingPrefStore> default_store_;
94 scoped_refptr<TestingPrefStore> selected_store_;
95 scoped_refptr<SegregatedPrefStore> segregated_store_;
96
97 MockReadErrorDelegate::Data read_error_delegate_data_;
98
99 private:
100 std::unique_ptr<MockReadErrorDelegate> read_error_delegate_;
101 };
102
103 TEST_F(SegregatedPrefStoreTest, StoreValues) {
104 ASSERT_EQ(PersistentPrefStore::PREF_READ_ERROR_NONE,
105 segregated_store_->ReadPrefs());
106
107 // Properly stores new values.
108 segregated_store_->SetValue(kSelectedPref,
109 base::MakeUnique<base::Value>(kValue1),
110 WriteablePrefStore::DEFAULT_PREF_WRITE_FLAGS);
111 segregated_store_->SetValue(kUnselectedPref,
112 base::MakeUnique<base::Value>(kValue2),
113 WriteablePrefStore::DEFAULT_PREF_WRITE_FLAGS);
114
115 ASSERT_TRUE(selected_store_->GetValue(kSelectedPref, NULL));
116 ASSERT_FALSE(selected_store_->GetValue(kUnselectedPref, NULL));
117 ASSERT_FALSE(default_store_->GetValue(kSelectedPref, NULL));
118 ASSERT_TRUE(default_store_->GetValue(kUnselectedPref, NULL));
119
120 ASSERT_TRUE(segregated_store_->GetValue(kSelectedPref, NULL));
121 ASSERT_TRUE(segregated_store_->GetValue(kUnselectedPref, NULL));
122
123 ASSERT_FALSE(selected_store_->committed());
124 ASSERT_FALSE(default_store_->committed());
125
126 segregated_store_->CommitPendingWrite();
127
128 ASSERT_TRUE(selected_store_->committed());
129 ASSERT_TRUE(default_store_->committed());
130 }
131
132 TEST_F(SegregatedPrefStoreTest, ReadValues) {
133 selected_store_->SetValue(kSelectedPref,
134 base::MakeUnique<base::Value>(kValue1),
135 WriteablePrefStore::DEFAULT_PREF_WRITE_FLAGS);
136 default_store_->SetValue(kUnselectedPref,
137 base::MakeUnique<base::Value>(kValue2),
138 WriteablePrefStore::DEFAULT_PREF_WRITE_FLAGS);
139
140 // Works properly with values that are already there.
141 ASSERT_EQ(PersistentPrefStore::PREF_READ_ERROR_NONE,
142 segregated_store_->ReadPrefs());
143 ASSERT_EQ(PersistentPrefStore::PREF_READ_ERROR_NONE,
144 segregated_store_->GetReadError());
145
146 ASSERT_TRUE(selected_store_->GetValue(kSelectedPref, NULL));
147 ASSERT_FALSE(selected_store_->GetValue(kUnselectedPref, NULL));
148 ASSERT_FALSE(default_store_->GetValue(kSelectedPref, NULL));
149 ASSERT_TRUE(default_store_->GetValue(kUnselectedPref, NULL));
150
151 ASSERT_TRUE(segregated_store_->GetValue(kSelectedPref, NULL));
152 ASSERT_TRUE(segregated_store_->GetValue(kUnselectedPref, NULL));
153 }
154
155 TEST_F(SegregatedPrefStoreTest, Observer) {
156 EXPECT_EQ(PersistentPrefStore::PREF_READ_ERROR_NONE,
157 segregated_store_->ReadPrefs());
158 EXPECT_TRUE(observer_.initialized);
159 EXPECT_TRUE(observer_.initialization_success);
160 EXPECT_TRUE(observer_.changed_keys.empty());
161 segregated_store_->SetValue(kSelectedPref,
162 base::MakeUnique<base::Value>(kValue1),
163 WriteablePrefStore::DEFAULT_PREF_WRITE_FLAGS);
164 observer_.VerifyAndResetChangedKey(kSelectedPref);
165 segregated_store_->SetValue(kUnselectedPref,
166 base::MakeUnique<base::Value>(kValue2),
167 WriteablePrefStore::DEFAULT_PREF_WRITE_FLAGS);
168 observer_.VerifyAndResetChangedKey(kUnselectedPref);
169 }
170
171 TEST_F(SegregatedPrefStoreTest, SelectedPrefReadNoFileError) {
172 // PREF_READ_ERROR_NO_FILE for the selected prefs file is silently converted
173 // to PREF_READ_ERROR_NONE.
174 selected_store_->set_read_error(PersistentPrefStore::PREF_READ_ERROR_NO_FILE);
175 EXPECT_EQ(PersistentPrefStore::PREF_READ_ERROR_NONE,
176 segregated_store_->ReadPrefs());
177 EXPECT_EQ(PersistentPrefStore::PREF_READ_ERROR_NONE,
178 segregated_store_->GetReadError());
179 }
180
181 TEST_F(SegregatedPrefStoreTest, SelectedPrefReadError) {
182 selected_store_->set_read_error(
183 PersistentPrefStore::PREF_READ_ERROR_ACCESS_DENIED);
184 EXPECT_EQ(PersistentPrefStore::PREF_READ_ERROR_ACCESS_DENIED,
185 segregated_store_->ReadPrefs());
186 EXPECT_EQ(PersistentPrefStore::PREF_READ_ERROR_ACCESS_DENIED,
187 segregated_store_->GetReadError());
188 }
189
190 TEST_F(SegregatedPrefStoreTest, SelectedPrefReadNoFileErrorAsync) {
191 // PREF_READ_ERROR_NO_FILE for the selected prefs file is silently converted
192 // to PREF_READ_ERROR_NONE.
193 selected_store_->set_read_error(PersistentPrefStore::PREF_READ_ERROR_NO_FILE);
194
195 default_store_->SetBlockAsyncRead(true);
196
197 EXPECT_FALSE(read_error_delegate_data_.invoked);
198
199 segregated_store_->ReadPrefsAsync(GetReadErrorDelegate().release());
200
201 EXPECT_FALSE(read_error_delegate_data_.invoked);
202
203 default_store_->SetBlockAsyncRead(false);
204
205 // ReadErrorDelegate is not invoked for ERROR_NONE.
206 EXPECT_FALSE(read_error_delegate_data_.invoked);
207 EXPECT_EQ(PersistentPrefStore::PREF_READ_ERROR_NONE,
208 segregated_store_->GetReadError());
209 EXPECT_EQ(PersistentPrefStore::PREF_READ_ERROR_NONE,
210 segregated_store_->GetReadError());
211 }
212
213 TEST_F(SegregatedPrefStoreTest, UnselectedPrefReadNoFileError) {
214 default_store_->set_read_error(PersistentPrefStore::PREF_READ_ERROR_NO_FILE);
215 EXPECT_EQ(PersistentPrefStore::PREF_READ_ERROR_NO_FILE,
216 segregated_store_->ReadPrefs());
217 EXPECT_EQ(PersistentPrefStore::PREF_READ_ERROR_NO_FILE,
218 segregated_store_->GetReadError());
219 }
220
221 TEST_F(SegregatedPrefStoreTest, UnselectedPrefReadError) {
222 default_store_->set_read_error(
223 PersistentPrefStore::PREF_READ_ERROR_ACCESS_DENIED);
224 EXPECT_EQ(PersistentPrefStore::PREF_READ_ERROR_ACCESS_DENIED,
225 segregated_store_->ReadPrefs());
226 EXPECT_EQ(PersistentPrefStore::PREF_READ_ERROR_ACCESS_DENIED,
227 segregated_store_->GetReadError());
228 }
229
230 TEST_F(SegregatedPrefStoreTest, BothPrefReadError) {
231 default_store_->set_read_error(PersistentPrefStore::PREF_READ_ERROR_NO_FILE);
232 selected_store_->set_read_error(
233 PersistentPrefStore::PREF_READ_ERROR_ACCESS_DENIED);
234 EXPECT_EQ(PersistentPrefStore::PREF_READ_ERROR_NO_FILE,
235 segregated_store_->ReadPrefs());
236 EXPECT_EQ(PersistentPrefStore::PREF_READ_ERROR_NO_FILE,
237 segregated_store_->GetReadError());
238 }
239
240 TEST_F(SegregatedPrefStoreTest, BothPrefReadErrorAsync) {
241 default_store_->set_read_error(PersistentPrefStore::PREF_READ_ERROR_NO_FILE);
242 selected_store_->set_read_error(
243 PersistentPrefStore::PREF_READ_ERROR_ACCESS_DENIED);
244
245 selected_store_->SetBlockAsyncRead(true);
246
247 EXPECT_FALSE(read_error_delegate_data_.invoked);
248
249 segregated_store_->ReadPrefsAsync(GetReadErrorDelegate().release());
250
251 EXPECT_FALSE(read_error_delegate_data_.invoked);
252
253 selected_store_->SetBlockAsyncRead(false);
254
255 EXPECT_TRUE(read_error_delegate_data_.invoked);
256 EXPECT_EQ(PersistentPrefStore::PREF_READ_ERROR_NO_FILE,
257 segregated_store_->GetReadError());
258 EXPECT_EQ(PersistentPrefStore::PREF_READ_ERROR_NO_FILE,
259 segregated_store_->GetReadError());
260 }
261
262 TEST_F(SegregatedPrefStoreTest, IsInitializationComplete) {
263 EXPECT_FALSE(segregated_store_->IsInitializationComplete());
264 segregated_store_->ReadPrefs();
265 EXPECT_TRUE(segregated_store_->IsInitializationComplete());
266 }
267
268 TEST_F(SegregatedPrefStoreTest, IsInitializationCompleteAsync) {
269 selected_store_->SetBlockAsyncRead(true);
270 default_store_->SetBlockAsyncRead(true);
271 EXPECT_FALSE(segregated_store_->IsInitializationComplete());
272 segregated_store_->ReadPrefsAsync(NULL);
273 EXPECT_FALSE(segregated_store_->IsInitializationComplete());
274 selected_store_->SetBlockAsyncRead(false);
275 EXPECT_FALSE(segregated_store_->IsInitializationComplete());
276 default_store_->SetBlockAsyncRead(false);
277 EXPECT_TRUE(segregated_store_->IsInitializationComplete());
278 }
279
280 TEST_F(SegregatedPrefStoreTest, GetValues) {
281 // To check merge behavior, create selected and default stores so each has a
282 // key the other doesn't have and they have one key in common.
283 selected_store_->SetValue(kSelectedPref,
284 base::MakeUnique<base::Value>(kValue1),
285 WriteablePrefStore::DEFAULT_PREF_WRITE_FLAGS);
286 default_store_->SetValue(kUnselectedPref,
287 base::MakeUnique<base::Value>(kValue2),
288 WriteablePrefStore::DEFAULT_PREF_WRITE_FLAGS);
289 selected_store_->SetValue(kSharedPref, base::MakeUnique<base::Value>(kValue1),
290 WriteablePrefStore::DEFAULT_PREF_WRITE_FLAGS);
291
292 auto values = segregated_store_->GetValues();
293 const base::Value* value = nullptr;
294 // Check that a selected preference is returned.
295 ASSERT_TRUE(values->Get(kSelectedPref, &value));
296 EXPECT_TRUE(base::Value(kValue1).Equals(value));
297
298 // Check that a a default preference is returned.
299 ASSERT_TRUE(values->Get(kUnselectedPref, &value));
300 EXPECT_TRUE(base::Value(kValue2).Equals(value));
301
302 // Check that the selected preference is preferred.
303 ASSERT_TRUE(values->Get(kSharedPref, &value));
304 EXPECT_TRUE(base::Value(kValue1).Equals(value));
305 }
OLDNEW
« no previous file with comments | « components/user_prefs/tracked/segregated_pref_store.cc ('k') | components/user_prefs/tracked/tracked_atomic_preference.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698