1*6777b538SAndroid Build Coastguard Worker // Copyright 2011 The Chromium Authors
2*6777b538SAndroid Build Coastguard Worker // Use of this source code is governed by a BSD-style license that can be
3*6777b538SAndroid Build Coastguard Worker // found in the LICENSE file.
4*6777b538SAndroid Build Coastguard Worker
5*6777b538SAndroid Build Coastguard Worker #include "components/prefs/pref_member.h"
6*6777b538SAndroid Build Coastguard Worker
7*6777b538SAndroid Build Coastguard Worker #include <memory>
8*6777b538SAndroid Build Coastguard Worker
9*6777b538SAndroid Build Coastguard Worker #include "base/functional/bind.h"
10*6777b538SAndroid Build Coastguard Worker #include "base/location.h"
11*6777b538SAndroid Build Coastguard Worker #include "base/memory/raw_ptr.h"
12*6777b538SAndroid Build Coastguard Worker #include "base/synchronization/waitable_event.h"
13*6777b538SAndroid Build Coastguard Worker #include "base/task/sequenced_task_runner.h"
14*6777b538SAndroid Build Coastguard Worker #include "base/task/thread_pool.h"
15*6777b538SAndroid Build Coastguard Worker #include "base/test/task_environment.h"
16*6777b538SAndroid Build Coastguard Worker #include "components/prefs/pref_registry_simple.h"
17*6777b538SAndroid Build Coastguard Worker #include "components/prefs/testing_pref_service.h"
18*6777b538SAndroid Build Coastguard Worker #include "testing/gtest/include/gtest/gtest.h"
19*6777b538SAndroid Build Coastguard Worker
20*6777b538SAndroid Build Coastguard Worker namespace {
21*6777b538SAndroid Build Coastguard Worker
22*6777b538SAndroid Build Coastguard Worker const char kBoolPref[] = "bool";
23*6777b538SAndroid Build Coastguard Worker const char kIntPref[] = "int";
24*6777b538SAndroid Build Coastguard Worker const char kDoublePref[] = "double";
25*6777b538SAndroid Build Coastguard Worker const char kStringPref[] = "string";
26*6777b538SAndroid Build Coastguard Worker const char kStringListPref[] = "string_list";
27*6777b538SAndroid Build Coastguard Worker
RegisterTestPrefs(PrefRegistrySimple * registry)28*6777b538SAndroid Build Coastguard Worker void RegisterTestPrefs(PrefRegistrySimple* registry) {
29*6777b538SAndroid Build Coastguard Worker registry->RegisterBooleanPref(kBoolPref, false);
30*6777b538SAndroid Build Coastguard Worker registry->RegisterIntegerPref(kIntPref, 0);
31*6777b538SAndroid Build Coastguard Worker registry->RegisterDoublePref(kDoublePref, 0.0);
32*6777b538SAndroid Build Coastguard Worker registry->RegisterStringPref(kStringPref, "default");
33*6777b538SAndroid Build Coastguard Worker registry->RegisterListPref(kStringListPref);
34*6777b538SAndroid Build Coastguard Worker }
35*6777b538SAndroid Build Coastguard Worker
36*6777b538SAndroid Build Coastguard Worker class GetPrefValueHelper
37*6777b538SAndroid Build Coastguard Worker : public base::RefCountedThreadSafe<GetPrefValueHelper> {
38*6777b538SAndroid Build Coastguard Worker public:
GetPrefValueHelper()39*6777b538SAndroid Build Coastguard Worker GetPrefValueHelper()
40*6777b538SAndroid Build Coastguard Worker : value_(false),
41*6777b538SAndroid Build Coastguard Worker task_runner_(base::ThreadPool::CreateSequencedTaskRunner({})) {}
42*6777b538SAndroid Build Coastguard Worker
Init(const std::string & pref_name,PrefService * prefs)43*6777b538SAndroid Build Coastguard Worker void Init(const std::string& pref_name, PrefService* prefs) {
44*6777b538SAndroid Build Coastguard Worker pref_.Init(pref_name, prefs);
45*6777b538SAndroid Build Coastguard Worker pref_.MoveToSequence(task_runner_);
46*6777b538SAndroid Build Coastguard Worker }
47*6777b538SAndroid Build Coastguard Worker
Destroy()48*6777b538SAndroid Build Coastguard Worker void Destroy() {
49*6777b538SAndroid Build Coastguard Worker pref_.Destroy();
50*6777b538SAndroid Build Coastguard Worker }
51*6777b538SAndroid Build Coastguard Worker
FetchValue()52*6777b538SAndroid Build Coastguard Worker void FetchValue() {
53*6777b538SAndroid Build Coastguard Worker base::WaitableEvent event(base::WaitableEvent::ResetPolicy::MANUAL,
54*6777b538SAndroid Build Coastguard Worker base::WaitableEvent::InitialState::NOT_SIGNALED);
55*6777b538SAndroid Build Coastguard Worker ASSERT_TRUE(task_runner_->PostTask(
56*6777b538SAndroid Build Coastguard Worker FROM_HERE,
57*6777b538SAndroid Build Coastguard Worker base::BindOnce(&GetPrefValueHelper::GetPrefValue, this, &event)));
58*6777b538SAndroid Build Coastguard Worker event.Wait();
59*6777b538SAndroid Build Coastguard Worker }
60*6777b538SAndroid Build Coastguard Worker
value()61*6777b538SAndroid Build Coastguard Worker bool value() { return value_; }
62*6777b538SAndroid Build Coastguard Worker
63*6777b538SAndroid Build Coastguard Worker private:
64*6777b538SAndroid Build Coastguard Worker friend class base::RefCountedThreadSafe<GetPrefValueHelper>;
~GetPrefValueHelper()65*6777b538SAndroid Build Coastguard Worker ~GetPrefValueHelper() {}
66*6777b538SAndroid Build Coastguard Worker
GetPrefValue(base::WaitableEvent * event)67*6777b538SAndroid Build Coastguard Worker void GetPrefValue(base::WaitableEvent* event) {
68*6777b538SAndroid Build Coastguard Worker value_ = pref_.GetValue();
69*6777b538SAndroid Build Coastguard Worker event->Signal();
70*6777b538SAndroid Build Coastguard Worker }
71*6777b538SAndroid Build Coastguard Worker
72*6777b538SAndroid Build Coastguard Worker BooleanPrefMember pref_;
73*6777b538SAndroid Build Coastguard Worker bool value_;
74*6777b538SAndroid Build Coastguard Worker
75*6777b538SAndroid Build Coastguard Worker // The sequence |pref_| runs on.
76*6777b538SAndroid Build Coastguard Worker scoped_refptr<base::SequencedTaskRunner> task_runner_;
77*6777b538SAndroid Build Coastguard Worker };
78*6777b538SAndroid Build Coastguard Worker
79*6777b538SAndroid Build Coastguard Worker class PrefMemberTestClass {
80*6777b538SAndroid Build Coastguard Worker public:
PrefMemberTestClass(PrefService * prefs)81*6777b538SAndroid Build Coastguard Worker explicit PrefMemberTestClass(PrefService* prefs)
82*6777b538SAndroid Build Coastguard Worker : observe_cnt_(0), prefs_(prefs) {
83*6777b538SAndroid Build Coastguard Worker str_.Init(kStringPref, prefs,
84*6777b538SAndroid Build Coastguard Worker base::BindRepeating(&PrefMemberTestClass::OnPreferenceChanged,
85*6777b538SAndroid Build Coastguard Worker base::Unretained(this)));
86*6777b538SAndroid Build Coastguard Worker }
87*6777b538SAndroid Build Coastguard Worker
OnPreferenceChanged(const std::string & pref_name)88*6777b538SAndroid Build Coastguard Worker void OnPreferenceChanged(const std::string& pref_name) {
89*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(pref_name, kStringPref);
90*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(str_.GetValue(), prefs_->GetString(kStringPref));
91*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(str_.IsDefaultValue(),
92*6777b538SAndroid Build Coastguard Worker prefs_->FindPreference(kStringPref)->IsDefaultValue());
93*6777b538SAndroid Build Coastguard Worker ++observe_cnt_;
94*6777b538SAndroid Build Coastguard Worker }
95*6777b538SAndroid Build Coastguard Worker
96*6777b538SAndroid Build Coastguard Worker StringPrefMember str_;
97*6777b538SAndroid Build Coastguard Worker int observe_cnt_;
98*6777b538SAndroid Build Coastguard Worker
99*6777b538SAndroid Build Coastguard Worker private:
100*6777b538SAndroid Build Coastguard Worker raw_ptr<PrefService> prefs_;
101*6777b538SAndroid Build Coastguard Worker };
102*6777b538SAndroid Build Coastguard Worker
103*6777b538SAndroid Build Coastguard Worker } // anonymous namespace
104*6777b538SAndroid Build Coastguard Worker
105*6777b538SAndroid Build Coastguard Worker class PrefMemberTest : public testing::Test {
106*6777b538SAndroid Build Coastguard Worker base::test::TaskEnvironment task_environment_;
107*6777b538SAndroid Build Coastguard Worker };
108*6777b538SAndroid Build Coastguard Worker
TEST_F(PrefMemberTest,BasicGetAndSet)109*6777b538SAndroid Build Coastguard Worker TEST_F(PrefMemberTest, BasicGetAndSet) {
110*6777b538SAndroid Build Coastguard Worker TestingPrefServiceSimple prefs;
111*6777b538SAndroid Build Coastguard Worker RegisterTestPrefs(prefs.registry());
112*6777b538SAndroid Build Coastguard Worker
113*6777b538SAndroid Build Coastguard Worker // Test bool
114*6777b538SAndroid Build Coastguard Worker BooleanPrefMember boolean;
115*6777b538SAndroid Build Coastguard Worker boolean.Init(kBoolPref, &prefs);
116*6777b538SAndroid Build Coastguard Worker
117*6777b538SAndroid Build Coastguard Worker // Check the defaults
118*6777b538SAndroid Build Coastguard Worker EXPECT_FALSE(prefs.GetBoolean(kBoolPref));
119*6777b538SAndroid Build Coastguard Worker EXPECT_FALSE(boolean.GetValue());
120*6777b538SAndroid Build Coastguard Worker EXPECT_FALSE(*boolean);
121*6777b538SAndroid Build Coastguard Worker EXPECT_TRUE(boolean.IsDefaultValue());
122*6777b538SAndroid Build Coastguard Worker
123*6777b538SAndroid Build Coastguard Worker // Try changing through the member variable.
124*6777b538SAndroid Build Coastguard Worker boolean.SetValue(true);
125*6777b538SAndroid Build Coastguard Worker EXPECT_TRUE(boolean.GetValue());
126*6777b538SAndroid Build Coastguard Worker EXPECT_TRUE(prefs.GetBoolean(kBoolPref));
127*6777b538SAndroid Build Coastguard Worker EXPECT_TRUE(*boolean);
128*6777b538SAndroid Build Coastguard Worker EXPECT_FALSE(boolean.IsDefaultValue());
129*6777b538SAndroid Build Coastguard Worker
130*6777b538SAndroid Build Coastguard Worker // Try changing back through the pref.
131*6777b538SAndroid Build Coastguard Worker prefs.SetBoolean(kBoolPref, false);
132*6777b538SAndroid Build Coastguard Worker EXPECT_FALSE(prefs.GetBoolean(kBoolPref));
133*6777b538SAndroid Build Coastguard Worker EXPECT_FALSE(boolean.GetValue());
134*6777b538SAndroid Build Coastguard Worker EXPECT_FALSE(*boolean);
135*6777b538SAndroid Build Coastguard Worker EXPECT_FALSE(boolean.IsDefaultValue());
136*6777b538SAndroid Build Coastguard Worker
137*6777b538SAndroid Build Coastguard Worker // Test int
138*6777b538SAndroid Build Coastguard Worker IntegerPrefMember integer;
139*6777b538SAndroid Build Coastguard Worker integer.Init(kIntPref, &prefs);
140*6777b538SAndroid Build Coastguard Worker
141*6777b538SAndroid Build Coastguard Worker // Check the defaults
142*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(0, prefs.GetInteger(kIntPref));
143*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(0, integer.GetValue());
144*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(0, *integer);
145*6777b538SAndroid Build Coastguard Worker EXPECT_TRUE(integer.IsDefaultValue());
146*6777b538SAndroid Build Coastguard Worker
147*6777b538SAndroid Build Coastguard Worker // Try changing through the member variable.
148*6777b538SAndroid Build Coastguard Worker integer.SetValue(5);
149*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(5, integer.GetValue());
150*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(5, prefs.GetInteger(kIntPref));
151*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(5, *integer);
152*6777b538SAndroid Build Coastguard Worker EXPECT_FALSE(integer.IsDefaultValue());
153*6777b538SAndroid Build Coastguard Worker
154*6777b538SAndroid Build Coastguard Worker // Try changing back through the pref.
155*6777b538SAndroid Build Coastguard Worker prefs.SetInteger(kIntPref, 2);
156*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(2, prefs.GetInteger(kIntPref));
157*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(2, integer.GetValue());
158*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(2, *integer);
159*6777b538SAndroid Build Coastguard Worker EXPECT_FALSE(integer.IsDefaultValue());
160*6777b538SAndroid Build Coastguard Worker
161*6777b538SAndroid Build Coastguard Worker // Test double
162*6777b538SAndroid Build Coastguard Worker DoublePrefMember double_member;
163*6777b538SAndroid Build Coastguard Worker double_member.Init(kDoublePref, &prefs);
164*6777b538SAndroid Build Coastguard Worker
165*6777b538SAndroid Build Coastguard Worker // Check the defaults
166*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(0.0, prefs.GetDouble(kDoublePref));
167*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(0.0, double_member.GetValue());
168*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(0.0, *double_member);
169*6777b538SAndroid Build Coastguard Worker EXPECT_TRUE(double_member.IsDefaultValue());
170*6777b538SAndroid Build Coastguard Worker
171*6777b538SAndroid Build Coastguard Worker // Try changing through the member variable.
172*6777b538SAndroid Build Coastguard Worker double_member.SetValue(1.0);
173*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(1.0, double_member.GetValue());
174*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(1.0, prefs.GetDouble(kDoublePref));
175*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(1.0, *double_member);
176*6777b538SAndroid Build Coastguard Worker EXPECT_FALSE(double_member.IsDefaultValue());
177*6777b538SAndroid Build Coastguard Worker
178*6777b538SAndroid Build Coastguard Worker // Try changing back through the pref.
179*6777b538SAndroid Build Coastguard Worker prefs.SetDouble(kDoublePref, 3.0);
180*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(3.0, prefs.GetDouble(kDoublePref));
181*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(3.0, double_member.GetValue());
182*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(3.0, *double_member);
183*6777b538SAndroid Build Coastguard Worker EXPECT_FALSE(double_member.IsDefaultValue());
184*6777b538SAndroid Build Coastguard Worker
185*6777b538SAndroid Build Coastguard Worker // Test string
186*6777b538SAndroid Build Coastguard Worker StringPrefMember string;
187*6777b538SAndroid Build Coastguard Worker string.Init(kStringPref, &prefs);
188*6777b538SAndroid Build Coastguard Worker
189*6777b538SAndroid Build Coastguard Worker // Check the defaults
190*6777b538SAndroid Build Coastguard Worker EXPECT_EQ("default", prefs.GetString(kStringPref));
191*6777b538SAndroid Build Coastguard Worker EXPECT_EQ("default", string.GetValue());
192*6777b538SAndroid Build Coastguard Worker EXPECT_EQ("default", *string);
193*6777b538SAndroid Build Coastguard Worker EXPECT_TRUE(string.IsDefaultValue());
194*6777b538SAndroid Build Coastguard Worker
195*6777b538SAndroid Build Coastguard Worker // Try changing through the member variable.
196*6777b538SAndroid Build Coastguard Worker string.SetValue("foo");
197*6777b538SAndroid Build Coastguard Worker EXPECT_EQ("foo", string.GetValue());
198*6777b538SAndroid Build Coastguard Worker EXPECT_EQ("foo", prefs.GetString(kStringPref));
199*6777b538SAndroid Build Coastguard Worker EXPECT_EQ("foo", *string);
200*6777b538SAndroid Build Coastguard Worker EXPECT_FALSE(string.IsDefaultValue());
201*6777b538SAndroid Build Coastguard Worker
202*6777b538SAndroid Build Coastguard Worker // Try changing back through the pref.
203*6777b538SAndroid Build Coastguard Worker prefs.SetString(kStringPref, "bar");
204*6777b538SAndroid Build Coastguard Worker EXPECT_EQ("bar", prefs.GetString(kStringPref));
205*6777b538SAndroid Build Coastguard Worker EXPECT_EQ("bar", string.GetValue());
206*6777b538SAndroid Build Coastguard Worker EXPECT_EQ("bar", *string);
207*6777b538SAndroid Build Coastguard Worker EXPECT_FALSE(string.IsDefaultValue());
208*6777b538SAndroid Build Coastguard Worker
209*6777b538SAndroid Build Coastguard Worker // Test string list
210*6777b538SAndroid Build Coastguard Worker base::Value::List expected_list;
211*6777b538SAndroid Build Coastguard Worker std::vector<std::string> expected_vector;
212*6777b538SAndroid Build Coastguard Worker StringListPrefMember string_list;
213*6777b538SAndroid Build Coastguard Worker string_list.Init(kStringListPref, &prefs);
214*6777b538SAndroid Build Coastguard Worker
215*6777b538SAndroid Build Coastguard Worker // Check the defaults
216*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(expected_list, prefs.GetList(kStringListPref));
217*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(expected_vector, string_list.GetValue());
218*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(expected_vector, *string_list);
219*6777b538SAndroid Build Coastguard Worker EXPECT_TRUE(string_list.IsDefaultValue());
220*6777b538SAndroid Build Coastguard Worker
221*6777b538SAndroid Build Coastguard Worker // Try changing through the pref member.
222*6777b538SAndroid Build Coastguard Worker expected_list.Append("foo");
223*6777b538SAndroid Build Coastguard Worker expected_vector.push_back("foo");
224*6777b538SAndroid Build Coastguard Worker string_list.SetValue(expected_vector);
225*6777b538SAndroid Build Coastguard Worker
226*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(expected_list, prefs.GetList(kStringListPref));
227*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(expected_vector, string_list.GetValue());
228*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(expected_vector, *string_list);
229*6777b538SAndroid Build Coastguard Worker EXPECT_FALSE(string_list.IsDefaultValue());
230*6777b538SAndroid Build Coastguard Worker
231*6777b538SAndroid Build Coastguard Worker // Try adding through the pref.
232*6777b538SAndroid Build Coastguard Worker expected_list.Append("bar");
233*6777b538SAndroid Build Coastguard Worker expected_vector.push_back("bar");
234*6777b538SAndroid Build Coastguard Worker prefs.SetList(kStringListPref, expected_list.Clone());
235*6777b538SAndroid Build Coastguard Worker
236*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(expected_list, prefs.GetList(kStringListPref));
237*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(expected_vector, string_list.GetValue());
238*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(expected_vector, *string_list);
239*6777b538SAndroid Build Coastguard Worker EXPECT_FALSE(string_list.IsDefaultValue());
240*6777b538SAndroid Build Coastguard Worker
241*6777b538SAndroid Build Coastguard Worker // Try removing through the pref.
242*6777b538SAndroid Build Coastguard Worker expected_list.erase(expected_list.begin());
243*6777b538SAndroid Build Coastguard Worker expected_vector.erase(expected_vector.begin());
244*6777b538SAndroid Build Coastguard Worker prefs.SetList(kStringListPref, expected_list.Clone());
245*6777b538SAndroid Build Coastguard Worker
246*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(expected_list, prefs.GetList(kStringListPref));
247*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(expected_vector, string_list.GetValue());
248*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(expected_vector, *string_list);
249*6777b538SAndroid Build Coastguard Worker EXPECT_FALSE(string_list.IsDefaultValue());
250*6777b538SAndroid Build Coastguard Worker }
251*6777b538SAndroid Build Coastguard Worker
TEST_F(PrefMemberTest,InvalidList)252*6777b538SAndroid Build Coastguard Worker TEST_F(PrefMemberTest, InvalidList) {
253*6777b538SAndroid Build Coastguard Worker // Set the vector to an initial good value.
254*6777b538SAndroid Build Coastguard Worker std::vector<std::string> expected_vector;
255*6777b538SAndroid Build Coastguard Worker expected_vector.push_back("foo");
256*6777b538SAndroid Build Coastguard Worker
257*6777b538SAndroid Build Coastguard Worker // Try to add a valid list first.
258*6777b538SAndroid Build Coastguard Worker base::Value list(base::Value::Type::LIST);
259*6777b538SAndroid Build Coastguard Worker list.GetList().Append("foo");
260*6777b538SAndroid Build Coastguard Worker std::vector<std::string> vector;
261*6777b538SAndroid Build Coastguard Worker EXPECT_TRUE(subtle::PrefMemberVectorStringUpdate(list, &vector));
262*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(expected_vector, vector);
263*6777b538SAndroid Build Coastguard Worker
264*6777b538SAndroid Build Coastguard Worker // Now try to add an invalid list. |vector| should not be changed.
265*6777b538SAndroid Build Coastguard Worker list.GetList().Append(0);
266*6777b538SAndroid Build Coastguard Worker EXPECT_FALSE(subtle::PrefMemberVectorStringUpdate(list, &vector));
267*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(expected_vector, vector);
268*6777b538SAndroid Build Coastguard Worker }
269*6777b538SAndroid Build Coastguard Worker
TEST_F(PrefMemberTest,TwoPrefs)270*6777b538SAndroid Build Coastguard Worker TEST_F(PrefMemberTest, TwoPrefs) {
271*6777b538SAndroid Build Coastguard Worker // Make sure two DoublePrefMembers stay in sync.
272*6777b538SAndroid Build Coastguard Worker TestingPrefServiceSimple prefs;
273*6777b538SAndroid Build Coastguard Worker RegisterTestPrefs(prefs.registry());
274*6777b538SAndroid Build Coastguard Worker
275*6777b538SAndroid Build Coastguard Worker DoublePrefMember pref1;
276*6777b538SAndroid Build Coastguard Worker pref1.Init(kDoublePref, &prefs);
277*6777b538SAndroid Build Coastguard Worker DoublePrefMember pref2;
278*6777b538SAndroid Build Coastguard Worker pref2.Init(kDoublePref, &prefs);
279*6777b538SAndroid Build Coastguard Worker
280*6777b538SAndroid Build Coastguard Worker pref1.SetValue(2.3);
281*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(2.3, *pref2);
282*6777b538SAndroid Build Coastguard Worker
283*6777b538SAndroid Build Coastguard Worker pref2.SetValue(3.5);
284*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(3.5, *pref1);
285*6777b538SAndroid Build Coastguard Worker
286*6777b538SAndroid Build Coastguard Worker prefs.SetDouble(kDoublePref, 4.2);
287*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(4.2, *pref1);
288*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(4.2, *pref2);
289*6777b538SAndroid Build Coastguard Worker }
290*6777b538SAndroid Build Coastguard Worker
TEST_F(PrefMemberTest,Observer)291*6777b538SAndroid Build Coastguard Worker TEST_F(PrefMemberTest, Observer) {
292*6777b538SAndroid Build Coastguard Worker TestingPrefServiceSimple prefs;
293*6777b538SAndroid Build Coastguard Worker RegisterTestPrefs(prefs.registry());
294*6777b538SAndroid Build Coastguard Worker
295*6777b538SAndroid Build Coastguard Worker PrefMemberTestClass test_obj(&prefs);
296*6777b538SAndroid Build Coastguard Worker EXPECT_EQ("default", *test_obj.str_);
297*6777b538SAndroid Build Coastguard Worker EXPECT_TRUE(test_obj.str_.IsDefaultValue());
298*6777b538SAndroid Build Coastguard Worker
299*6777b538SAndroid Build Coastguard Worker // Changing the pref from the default value to an explicitly-set version of
300*6777b538SAndroid Build Coastguard Worker // the same value fires the observer. The caller may be sensitive to
301*6777b538SAndroid Build Coastguard Worker // IsDefaultValue().
302*6777b538SAndroid Build Coastguard Worker prefs.SetString(kStringPref, "default");
303*6777b538SAndroid Build Coastguard Worker EXPECT_EQ("default", *test_obj.str_);
304*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(1, test_obj.observe_cnt_);
305*6777b538SAndroid Build Coastguard Worker EXPECT_FALSE(test_obj.str_.IsDefaultValue());
306*6777b538SAndroid Build Coastguard Worker
307*6777b538SAndroid Build Coastguard Worker // Calling SetValue should not fire the observer.
308*6777b538SAndroid Build Coastguard Worker test_obj.str_.SetValue("hello");
309*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(1, test_obj.observe_cnt_);
310*6777b538SAndroid Build Coastguard Worker EXPECT_EQ("hello", prefs.GetString(kStringPref));
311*6777b538SAndroid Build Coastguard Worker
312*6777b538SAndroid Build Coastguard Worker // Changing the pref does fire the observer.
313*6777b538SAndroid Build Coastguard Worker prefs.SetString(kStringPref, "world");
314*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(2, test_obj.observe_cnt_);
315*6777b538SAndroid Build Coastguard Worker EXPECT_EQ("world", *(test_obj.str_));
316*6777b538SAndroid Build Coastguard Worker
317*6777b538SAndroid Build Coastguard Worker // Not changing the value should not fire the observer.
318*6777b538SAndroid Build Coastguard Worker prefs.SetString(kStringPref, "world");
319*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(2, test_obj.observe_cnt_);
320*6777b538SAndroid Build Coastguard Worker EXPECT_EQ("world", *(test_obj.str_));
321*6777b538SAndroid Build Coastguard Worker
322*6777b538SAndroid Build Coastguard Worker prefs.SetString(kStringPref, "hello");
323*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(3, test_obj.observe_cnt_);
324*6777b538SAndroid Build Coastguard Worker EXPECT_EQ("hello", prefs.GetString(kStringPref));
325*6777b538SAndroid Build Coastguard Worker }
326*6777b538SAndroid Build Coastguard Worker
TEST_F(PrefMemberTest,NoInit)327*6777b538SAndroid Build Coastguard Worker TEST_F(PrefMemberTest, NoInit) {
328*6777b538SAndroid Build Coastguard Worker // Make sure not calling Init on a PrefMember doesn't cause problems.
329*6777b538SAndroid Build Coastguard Worker IntegerPrefMember pref;
330*6777b538SAndroid Build Coastguard Worker }
331*6777b538SAndroid Build Coastguard Worker
TEST_F(PrefMemberTest,MoveToSequence)332*6777b538SAndroid Build Coastguard Worker TEST_F(PrefMemberTest, MoveToSequence) {
333*6777b538SAndroid Build Coastguard Worker TestingPrefServiceSimple prefs;
334*6777b538SAndroid Build Coastguard Worker scoped_refptr<GetPrefValueHelper> helper(new GetPrefValueHelper());
335*6777b538SAndroid Build Coastguard Worker RegisterTestPrefs(prefs.registry());
336*6777b538SAndroid Build Coastguard Worker helper->Init(kBoolPref, &prefs);
337*6777b538SAndroid Build Coastguard Worker
338*6777b538SAndroid Build Coastguard Worker helper->FetchValue();
339*6777b538SAndroid Build Coastguard Worker EXPECT_FALSE(helper->value());
340*6777b538SAndroid Build Coastguard Worker
341*6777b538SAndroid Build Coastguard Worker prefs.SetBoolean(kBoolPref, true);
342*6777b538SAndroid Build Coastguard Worker
343*6777b538SAndroid Build Coastguard Worker helper->FetchValue();
344*6777b538SAndroid Build Coastguard Worker EXPECT_TRUE(helper->value());
345*6777b538SAndroid Build Coastguard Worker
346*6777b538SAndroid Build Coastguard Worker helper->Destroy();
347*6777b538SAndroid Build Coastguard Worker
348*6777b538SAndroid Build Coastguard Worker helper->FetchValue();
349*6777b538SAndroid Build Coastguard Worker EXPECT_TRUE(helper->value());
350*6777b538SAndroid Build Coastguard Worker }
351