blob: a8bb05f9d6ad1505c1bfdcec1c814dedbdf8921b [file] [log] [blame]
[email protected]d3b05ea2012-01-24 22:57:051// Copyright (c) 2012 The Chromium Authors. All rights reserved.
license.botbf09a502008-08-24 00:55:552// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
initial.commit09911bf2008-07-26 23:55:294
[email protected]ecde2742010-04-02 17:36:185#include <string>
6
[email protected]03b9b4e2012-10-22 20:01:527#include "base/prefs/json_pref_store.h"
[email protected]3853a4c2013-02-11 17:15:578#include "base/prefs/mock_pref_change_callback.h"
9#include "base/prefs/pref_registry_simple.h"
10#include "base/prefs/pref_value_store.h"
[email protected]03b9b4e2012-10-22 20:01:5211#include "base/prefs/public/pref_change_registrar.h"
12#include "base/prefs/testing_pref_store.h"
[email protected]ecde2742010-04-02 17:36:1813#include "base/values.h"
[email protected]aaa552312013-02-13 16:25:4014#include "chrome/test/base/testing_pref_service.h"
[email protected]ecde2742010-04-02 17:36:1815#include "testing/gmock/include/gmock/gmock.h"
initial.commit09911bf2008-07-26 23:55:2916#include "testing/gtest/include/gtest/gtest.h"
17
[email protected]ecde2742010-04-02 17:36:1818using testing::_;
19using testing::Mock;
[email protected]12a3c022010-11-03 10:24:1120
[email protected]aaa552312013-02-13 16:25:4021const char kPrefName[] = "pref.name";
22
[email protected]277404c22010-04-22 13:09:4523TEST(PrefServiceTest, NoObserverFire) {
[email protected]5b199522012-12-22 17:24:4424 TestingPrefServiceSimple prefs;
[email protected]7aa0a962010-04-21 17:24:4225
[email protected]57ecc4b2010-08-11 03:02:5126 const char pref_name[] = "homepage";
[email protected]b1de2c72013-02-06 02:45:4727 prefs.registry()->RegisterStringPref(pref_name, std::string());
[email protected]7aa0a962010-04-21 17:24:4228
[email protected]acd78969c2010-12-08 09:49:1129 const char new_pref_value[] = "http://www.google.com/";
[email protected]96a5c342012-12-04 18:14:0230 MockPrefChangeCallback obs(&prefs);
[email protected]2fb7dc982010-09-29 12:24:2831 PrefChangeRegistrar registrar;
32 registrar.Init(&prefs);
[email protected]96a5c342012-12-04 18:14:0233 registrar.Add(pref_name, obs.GetCallback());
[email protected]7aa0a962010-04-21 17:24:4234
[email protected]96a5c342012-12-04 18:14:0235 // This should fire the checks in MockPrefChangeCallback::OnPreferenceChanged.
[email protected]acd78969c2010-12-08 09:49:1136 const StringValue expected_value(new_pref_value);
[email protected]96a5c342012-12-04 18:14:0237 obs.Expect(pref_name, &expected_value);
[email protected]acd78969c2010-12-08 09:49:1138 prefs.SetString(pref_name, new_pref_value);
39 Mock::VerifyAndClearExpectations(&obs);
[email protected]7aa0a962010-04-21 17:24:4240
41 // Setting the pref to the same value should not set the pref value a second
42 // time.
[email protected]96a5c342012-12-04 18:14:0243 EXPECT_CALL(obs, OnPreferenceChanged(_)).Times(0);
[email protected]7aa0a962010-04-21 17:24:4244 prefs.SetString(pref_name, new_pref_value);
[email protected]acd78969c2010-12-08 09:49:1145 Mock::VerifyAndClearExpectations(&obs);
[email protected]7aa0a962010-04-21 17:24:4246
47 // Clearing the pref should cause the pref to fire.
[email protected]acd78969c2010-12-08 09:49:1148 const StringValue expected_default_value("");
[email protected]96a5c342012-12-04 18:14:0249 obs.Expect(pref_name, &expected_default_value);
[email protected]7aa0a962010-04-21 17:24:4250 prefs.ClearPref(pref_name);
[email protected]acd78969c2010-12-08 09:49:1151 Mock::VerifyAndClearExpectations(&obs);
[email protected]7aa0a962010-04-21 17:24:4252
53 // Clearing the pref again should not cause the pref to fire.
[email protected]96a5c342012-12-04 18:14:0254 EXPECT_CALL(obs, OnPreferenceChanged(_)).Times(0);
[email protected]7aa0a962010-04-21 17:24:4255 prefs.ClearPref(pref_name);
[email protected]acd78969c2010-12-08 09:49:1156 Mock::VerifyAndClearExpectations(&obs);
[email protected]7aa0a962010-04-21 17:24:4257}
58
[email protected]277404c22010-04-22 13:09:4559TEST(PrefServiceTest, HasPrefPath) {
[email protected]5b199522012-12-22 17:24:4460 TestingPrefServiceSimple prefs;
[email protected]7aa0a962010-04-21 17:24:4261
[email protected]57ecc4b2010-08-11 03:02:5162 const char path[] = "fake.path";
[email protected]7aa0a962010-04-21 17:24:4263
64 // Shouldn't initially have a path.
65 EXPECT_FALSE(prefs.HasPrefPath(path));
66
67 // Register the path. This doesn't set a value, so the path still shouldn't
68 // exist.
[email protected]b1de2c72013-02-06 02:45:4769 prefs.registry()->RegisterStringPref(path, std::string());
[email protected]7aa0a962010-04-21 17:24:4270 EXPECT_FALSE(prefs.HasPrefPath(path));
71
72 // Set a value and make sure we have a path.
[email protected]ddd231e2010-06-29 20:35:1973 prefs.SetString(path, "blah");
[email protected]7aa0a962010-04-21 17:24:4274 EXPECT_TRUE(prefs.HasPrefPath(path));
75}
76
[email protected]277404c22010-04-22 13:09:4577TEST(PrefServiceTest, Observers) {
[email protected]57ecc4b2010-08-11 03:02:5178 const char pref_name[] = "homepage";
[email protected]277404c22010-04-22 13:09:4579
[email protected]5b199522012-12-22 17:24:4480 TestingPrefServiceSimple prefs;
[email protected]57ecc4b2010-08-11 03:02:5181 prefs.SetUserPref(pref_name, Value::CreateStringValue("http://www.cnn.com"));
[email protected]b1de2c72013-02-06 02:45:4782 prefs.registry()->RegisterStringPref(pref_name, std::string());
[email protected]277404c22010-04-22 13:09:4583
[email protected]acd78969c2010-12-08 09:49:1184 const char new_pref_value[] = "http://www.google.com/";
85 const StringValue expected_new_pref_value(new_pref_value);
[email protected]96a5c342012-12-04 18:14:0286 MockPrefChangeCallback obs(&prefs);
[email protected]2fb7dc982010-09-29 12:24:2887 PrefChangeRegistrar registrar;
88 registrar.Init(&prefs);
[email protected]96a5c342012-12-04 18:14:0289 registrar.Add(pref_name, obs.GetCallback());
[email protected]277404c22010-04-22 13:09:4590
[email protected]54ffd94a2012-11-12 15:29:2091 PrefChangeRegistrar registrar_two;
92 registrar_two.Init(&prefs);
93
[email protected]96a5c342012-12-04 18:14:0294 // This should fire the checks in MockPrefChangeCallback::OnPreferenceChanged.
95 obs.Expect(pref_name, &expected_new_pref_value);
[email protected]acd78969c2010-12-08 09:49:1196 prefs.SetString(pref_name, new_pref_value);
97 Mock::VerifyAndClearExpectations(&obs);
[email protected]277404c22010-04-22 13:09:4598
99 // Now try adding a second pref observer.
[email protected]acd78969c2010-12-08 09:49:11100 const char new_pref_value2[] = "http://www.youtube.com/";
101 const StringValue expected_new_pref_value2(new_pref_value2);
[email protected]96a5c342012-12-04 18:14:02102 MockPrefChangeCallback obs2(&prefs);
103 obs.Expect(pref_name, &expected_new_pref_value2);
104 obs2.Expect(pref_name, &expected_new_pref_value2);
105 registrar_two.Add(pref_name, obs2.GetCallback());
[email protected]277404c22010-04-22 13:09:45106 // This should fire the checks in obs and obs2.
107 prefs.SetString(pref_name, new_pref_value2);
[email protected]acd78969c2010-12-08 09:49:11108 Mock::VerifyAndClearExpectations(&obs);
109 Mock::VerifyAndClearExpectations(&obs2);
[email protected]277404c22010-04-22 13:09:45110
[email protected]7ca0f362012-07-30 10:14:03111 // Set a recommended value.
112 const StringValue recommended_pref_value("http://www.gmail.com/");
[email protected]96a5c342012-12-04 18:14:02113 obs.Expect(pref_name, &expected_new_pref_value2);
114 obs2.Expect(pref_name, &expected_new_pref_value2);
[email protected]7ca0f362012-07-30 10:14:03115 // This should fire the checks in obs and obs2 but with an unchanged value
116 // as the recommended value is being overridden by the user-set value.
117 prefs.SetRecommendedPref(pref_name, recommended_pref_value.DeepCopy());
118 Mock::VerifyAndClearExpectations(&obs);
119 Mock::VerifyAndClearExpectations(&obs2);
120
[email protected]277404c22010-04-22 13:09:45121 // Make sure obs2 still works after removing obs.
[email protected]54ffd94a2012-11-12 15:29:20122 registrar.Remove(pref_name);
[email protected]96a5c342012-12-04 18:14:02123 EXPECT_CALL(obs, OnPreferenceChanged(_)).Times(0);
124 obs2.Expect(pref_name, &expected_new_pref_value);
[email protected]277404c22010-04-22 13:09:45125 // This should only fire the observer in obs2.
126 prefs.SetString(pref_name, new_pref_value);
[email protected]acd78969c2010-12-08 09:49:11127 Mock::VerifyAndClearExpectations(&obs);
128 Mock::VerifyAndClearExpectations(&obs2);
[email protected]277404c22010-04-22 13:09:45129}
130
[email protected]9a8c4022011-01-25 14:25:33131// Make sure that if a preference changes type, so the wrong type is stored in
132// the user pref file, it uses the correct fallback value instead.
133TEST(PrefServiceTest, GetValueChangedType) {
134 const int kTestValue = 10;
[email protected]5b199522012-12-22 17:24:44135 TestingPrefServiceSimple prefs;
[email protected]aaa552312013-02-13 16:25:40136 prefs.registry()->RegisterIntegerPref(kPrefName, kTestValue);
[email protected]9a8c4022011-01-25 14:25:33137
138 // Check falling back to a recommended value.
[email protected]aaa552312013-02-13 16:25:40139 prefs.SetUserPref(kPrefName, Value::CreateStringValue("not an integer"));
140 const PrefService::Preference* pref = prefs.FindPreference(kPrefName);
[email protected]9a8c4022011-01-25 14:25:33141 ASSERT_TRUE(pref);
142 const Value* value = pref->GetValue();
143 ASSERT_TRUE(value);
144 EXPECT_EQ(Value::TYPE_INTEGER, value->GetType());
145 int actual_int_value = -1;
146 EXPECT_TRUE(value->GetAsInteger(&actual_int_value));
147 EXPECT_EQ(kTestValue, actual_int_value);
148}
149
[email protected]7ca0f362012-07-30 10:14:03150TEST(PrefServiceTest, GetValueAndGetRecommendedValue) {
151 const int kDefaultValue = 5;
152 const int kUserValue = 10;
153 const int kRecommendedValue = 15;
[email protected]5b199522012-12-22 17:24:44154 TestingPrefServiceSimple prefs;
[email protected]aaa552312013-02-13 16:25:40155 prefs.registry()->RegisterIntegerPref(kPrefName, kDefaultValue);
[email protected]7ca0f362012-07-30 10:14:03156
157 // Create pref with a default value only.
[email protected]aaa552312013-02-13 16:25:40158 const PrefService::Preference* pref = prefs.FindPreference(kPrefName);
[email protected]7ca0f362012-07-30 10:14:03159 ASSERT_TRUE(pref);
160
161 // Check that GetValue() returns the default value.
162 const Value* value = pref->GetValue();
163 ASSERT_TRUE(value);
164 EXPECT_EQ(Value::TYPE_INTEGER, value->GetType());
165 int actual_int_value = -1;
166 EXPECT_TRUE(value->GetAsInteger(&actual_int_value));
167 EXPECT_EQ(kDefaultValue, actual_int_value);
168
169 // Check that GetRecommendedValue() returns no value.
170 value = pref->GetRecommendedValue();
171 ASSERT_FALSE(value);
172
173 // Set a user-set value.
[email protected]aaa552312013-02-13 16:25:40174 prefs.SetUserPref(kPrefName, Value::CreateIntegerValue(kUserValue));
[email protected]7ca0f362012-07-30 10:14:03175
176 // Check that GetValue() returns the user-set value.
177 value = pref->GetValue();
178 ASSERT_TRUE(value);
179 EXPECT_EQ(Value::TYPE_INTEGER, value->GetType());
180 actual_int_value = -1;
181 EXPECT_TRUE(value->GetAsInteger(&actual_int_value));
182 EXPECT_EQ(kUserValue, actual_int_value);
183
184 // Check that GetRecommendedValue() returns no value.
185 value = pref->GetRecommendedValue();
186 ASSERT_FALSE(value);
187
188 // Set a recommended value.
[email protected]aaa552312013-02-13 16:25:40189 prefs.SetRecommendedPref(kPrefName,
[email protected]7ca0f362012-07-30 10:14:03190 Value::CreateIntegerValue(kRecommendedValue));
191
192 // Check that GetValue() returns the user-set value.
193 value = pref->GetValue();
194 ASSERT_TRUE(value);
195 EXPECT_EQ(Value::TYPE_INTEGER, value->GetType());
196 actual_int_value = -1;
197 EXPECT_TRUE(value->GetAsInteger(&actual_int_value));
198 EXPECT_EQ(kUserValue, actual_int_value);
199
200 // Check that GetRecommendedValue() returns the recommended value.
201 value = pref->GetRecommendedValue();
202 ASSERT_TRUE(value);
203 EXPECT_EQ(Value::TYPE_INTEGER, value->GetType());
204 actual_int_value = -1;
205 EXPECT_TRUE(value->GetAsInteger(&actual_int_value));
206 EXPECT_EQ(kRecommendedValue, actual_int_value);
207
208 // Remove the user-set value.
[email protected]aaa552312013-02-13 16:25:40209 prefs.RemoveUserPref(kPrefName);
[email protected]7ca0f362012-07-30 10:14:03210
211 // Check that GetValue() returns the recommended value.
212 value = pref->GetValue();
213 ASSERT_TRUE(value);
214 EXPECT_EQ(Value::TYPE_INTEGER, value->GetType());
215 actual_int_value = -1;
216 EXPECT_TRUE(value->GetAsInteger(&actual_int_value));
217 EXPECT_EQ(kRecommendedValue, actual_int_value);
218
219 // Check that GetRecommendedValue() returns the recommended value.
220 value = pref->GetRecommendedValue();
221 ASSERT_TRUE(value);
222 EXPECT_EQ(Value::TYPE_INTEGER, value->GetType());
223 actual_int_value = -1;
224 EXPECT_TRUE(value->GetAsInteger(&actual_int_value));
225 EXPECT_EQ(kRecommendedValue, actual_int_value);
226}
227
[email protected]ecde2742010-04-02 17:36:18228class PrefServiceSetValueTest : public testing::Test {
229 protected:
[email protected]12a3c022010-11-03 10:24:11230 static const char kName[];
231 static const char kValue[];
[email protected]ecde2742010-04-02 17:36:18232
[email protected]96a5c342012-12-04 18:14:02233 PrefServiceSetValueTest() : observer_(&prefs_) {}
234
[email protected]5b199522012-12-22 17:24:44235 TestingPrefServiceSimple prefs_;
[email protected]96a5c342012-12-04 18:14:02236 MockPrefChangeCallback observer_;
[email protected]ecde2742010-04-02 17:36:18237};
[email protected]ddd231e2010-06-29 20:35:19238
[email protected]12a3c022010-11-03 10:24:11239const char PrefServiceSetValueTest::kName[] = "name";
240const char PrefServiceSetValueTest::kValue[] = "value";
[email protected]ecde2742010-04-02 17:36:18241
242TEST_F(PrefServiceSetValueTest, SetStringValue) {
[email protected]20ce516d2010-06-18 02:20:04243 const char default_string[] = "default";
[email protected]acd78969c2010-12-08 09:49:11244 const StringValue default_value(default_string);
[email protected]b1de2c72013-02-06 02:45:47245 prefs_.registry()->RegisterStringPref(kName, default_string);
[email protected]2fb7dc982010-09-29 12:24:28246
247 PrefChangeRegistrar registrar;
248 registrar.Init(&prefs_);
[email protected]96a5c342012-12-04 18:14:02249 registrar.Add(kName, observer_.GetCallback());
[email protected]2fb7dc982010-09-29 12:24:28250
[email protected]c3b54f372010-09-14 08:25:07251 // Changing the controlling store from default to user triggers notification.
[email protected]96a5c342012-12-04 18:14:02252 observer_.Expect(kName, &default_value);
[email protected]acd78969c2010-12-08 09:49:11253 prefs_.Set(kName, default_value);
[email protected]c3b54f372010-09-14 08:25:07254 Mock::VerifyAndClearExpectations(&observer_);
255
[email protected]96a5c342012-12-04 18:14:02256 EXPECT_CALL(observer_, OnPreferenceChanged(_)).Times(0);
[email protected]acd78969c2010-12-08 09:49:11257 prefs_.Set(kName, default_value);
[email protected]ecde2742010-04-02 17:36:18258 Mock::VerifyAndClearExpectations(&observer_);
259
[email protected]acd78969c2010-12-08 09:49:11260 StringValue new_value(kValue);
[email protected]96a5c342012-12-04 18:14:02261 observer_.Expect(kName, &new_value);
[email protected]acd78969c2010-12-08 09:49:11262 prefs_.Set(kName, new_value);
263 Mock::VerifyAndClearExpectations(&observer_);
[email protected]ecde2742010-04-02 17:36:18264}
265
266TEST_F(PrefServiceSetValueTest, SetDictionaryValue) {
[email protected]b1de2c72013-02-06 02:45:47267 prefs_.registry()->RegisterDictionaryPref(kName);
[email protected]2fb7dc982010-09-29 12:24:28268 PrefChangeRegistrar registrar;
269 registrar.Init(&prefs_);
[email protected]96a5c342012-12-04 18:14:02270 registrar.Add(kName, observer_.GetCallback());
[email protected]ecde2742010-04-02 17:36:18271
[email protected]96a5c342012-12-04 18:14:02272 EXPECT_CALL(observer_, OnPreferenceChanged(_)).Times(0);
[email protected]9a8c4022011-01-25 14:25:33273 prefs_.RemoveUserPref(kName);
[email protected]ecde2742010-04-02 17:36:18274 Mock::VerifyAndClearExpectations(&observer_);
275
276 DictionaryValue new_value;
[email protected]12a3c022010-11-03 10:24:11277 new_value.SetString(kName, kValue);
[email protected]96a5c342012-12-04 18:14:02278 observer_.Expect(kName, &new_value);
[email protected]12a3c022010-11-03 10:24:11279 prefs_.Set(kName, new_value);
[email protected]ecde2742010-04-02 17:36:18280 Mock::VerifyAndClearExpectations(&observer_);
281
[email protected]96a5c342012-12-04 18:14:02282 EXPECT_CALL(observer_, OnPreferenceChanged(_)).Times(0);
[email protected]acd78969c2010-12-08 09:49:11283 prefs_.Set(kName, new_value);
284 Mock::VerifyAndClearExpectations(&observer_);
285
[email protected]9a8c4022011-01-25 14:25:33286 DictionaryValue empty;
[email protected]96a5c342012-12-04 18:14:02287 observer_.Expect(kName, &empty);
[email protected]9a8c4022011-01-25 14:25:33288 prefs_.Set(kName, empty);
[email protected]ecde2742010-04-02 17:36:18289 Mock::VerifyAndClearExpectations(&observer_);
[email protected]ecde2742010-04-02 17:36:18290}
291
292TEST_F(PrefServiceSetValueTest, SetListValue) {
[email protected]b1de2c72013-02-06 02:45:47293 prefs_.registry()->RegisterListPref(kName);
[email protected]2fb7dc982010-09-29 12:24:28294 PrefChangeRegistrar registrar;
295 registrar.Init(&prefs_);
[email protected]96a5c342012-12-04 18:14:02296 registrar.Add(kName, observer_.GetCallback());
[email protected]ecde2742010-04-02 17:36:18297
[email protected]96a5c342012-12-04 18:14:02298 EXPECT_CALL(observer_, OnPreferenceChanged(_)).Times(0);
[email protected]9a8c4022011-01-25 14:25:33299 prefs_.RemoveUserPref(kName);
[email protected]ecde2742010-04-02 17:36:18300 Mock::VerifyAndClearExpectations(&observer_);
301
302 ListValue new_value;
[email protected]12a3c022010-11-03 10:24:11303 new_value.Append(Value::CreateStringValue(kValue));
[email protected]96a5c342012-12-04 18:14:02304 observer_.Expect(kName, &new_value);
[email protected]12a3c022010-11-03 10:24:11305 prefs_.Set(kName, new_value);
[email protected]ecde2742010-04-02 17:36:18306 Mock::VerifyAndClearExpectations(&observer_);
307
[email protected]96a5c342012-12-04 18:14:02308 EXPECT_CALL(observer_, OnPreferenceChanged(_)).Times(0);
[email protected]acd78969c2010-12-08 09:49:11309 prefs_.Set(kName, new_value);
310 Mock::VerifyAndClearExpectations(&observer_);
311
[email protected]9a8c4022011-01-25 14:25:33312 ListValue empty;
[email protected]96a5c342012-12-04 18:14:02313 observer_.Expect(kName, &empty);
[email protected]9a8c4022011-01-25 14:25:33314 prefs_.Set(kName, empty);
[email protected]ecde2742010-04-02 17:36:18315 Mock::VerifyAndClearExpectations(&observer_);
[email protected]ecde2742010-04-02 17:36:18316}