blob: 2776fbf68e0fdc678ef187a56ce27cc46f6610d2 [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
avi9ef8bb02015-12-24 05:29:365#include <stddef.h>
6#include <stdint.h>
7
[email protected]ecde2742010-04-02 17:36:188#include <string>
9
avi9ef8bb02015-12-24 05:29:3610#include "base/macros.h"
vabr8684c9a2017-03-29 13:14:5711#include "base/memory/ptr_util.h"
[email protected]ecde2742010-04-02 17:36:1812#include "base/values.h"
brettwf00b9b42016-02-01 22:11:3813#include "components/prefs/json_pref_store.h"
14#include "components/prefs/mock_pref_change_callback.h"
15#include "components/prefs/pref_change_registrar.h"
16#include "components/prefs/pref_registry_simple.h"
17#include "components/prefs/pref_service_factory.h"
18#include "components/prefs/pref_value_store.h"
19#include "components/prefs/testing_pref_service.h"
20#include "components/prefs/testing_pref_store.h"
[email protected]ecde2742010-04-02 17:36:1821#include "testing/gmock/include/gmock/gmock.h"
initial.commit09911bf2008-07-26 23:55:2922#include "testing/gtest/include/gtest/gtest.h"
23
[email protected]ecde2742010-04-02 17:36:1824using testing::_;
25using testing::Mock;
[email protected]12a3c022010-11-03 10:24:1126
[email protected]aaa552312013-02-13 16:25:4027const char kPrefName[] = "pref.name";
28
[email protected]277404c22010-04-22 13:09:4529TEST(PrefServiceTest, NoObserverFire) {
[email protected]5b199522012-12-22 17:24:4430 TestingPrefServiceSimple prefs;
[email protected]7aa0a962010-04-21 17:24:4231
[email protected]57ecc4b2010-08-11 03:02:5132 const char pref_name[] = "homepage";
[email protected]b1de2c72013-02-06 02:45:4733 prefs.registry()->RegisterStringPref(pref_name, std::string());
[email protected]7aa0a962010-04-21 17:24:4234
[email protected]acd78969c2010-12-08 09:49:1135 const char new_pref_value[] = "http://www.google.com/";
[email protected]96a5c342012-12-04 18:14:0236 MockPrefChangeCallback obs(&prefs);
[email protected]2fb7dc982010-09-29 12:24:2837 PrefChangeRegistrar registrar;
38 registrar.Init(&prefs);
[email protected]96a5c342012-12-04 18:14:0239 registrar.Add(pref_name, obs.GetCallback());
[email protected]7aa0a962010-04-21 17:24:4240
[email protected]96a5c342012-12-04 18:14:0241 // This should fire the checks in MockPrefChangeCallback::OnPreferenceChanged.
jdoerrie122c4da2017-03-06 11:12:0442 const base::Value expected_value(new_pref_value);
[email protected]96a5c342012-12-04 18:14:0243 obs.Expect(pref_name, &expected_value);
[email protected]acd78969c2010-12-08 09:49:1144 prefs.SetString(pref_name, new_pref_value);
45 Mock::VerifyAndClearExpectations(&obs);
[email protected]7aa0a962010-04-21 17:24:4246
47 // Setting the pref to the same value should not set the pref value a second
48 // time.
[email protected]96a5c342012-12-04 18:14:0249 EXPECT_CALL(obs, OnPreferenceChanged(_)).Times(0);
[email protected]7aa0a962010-04-21 17:24:4250 prefs.SetString(pref_name, new_pref_value);
[email protected]acd78969c2010-12-08 09:49:1151 Mock::VerifyAndClearExpectations(&obs);
[email protected]7aa0a962010-04-21 17:24:4252
53 // Clearing the pref should cause the pref to fire.
jdoerrie122c4da2017-03-06 11:12:0454 const base::Value expected_default_value((std::string()));
[email protected]96a5c342012-12-04 18:14:0255 obs.Expect(pref_name, &expected_default_value);
[email protected]7aa0a962010-04-21 17:24:4256 prefs.ClearPref(pref_name);
[email protected]acd78969c2010-12-08 09:49:1157 Mock::VerifyAndClearExpectations(&obs);
[email protected]7aa0a962010-04-21 17:24:4258
59 // Clearing the pref again should not cause the pref to fire.
[email protected]96a5c342012-12-04 18:14:0260 EXPECT_CALL(obs, OnPreferenceChanged(_)).Times(0);
[email protected]7aa0a962010-04-21 17:24:4261 prefs.ClearPref(pref_name);
[email protected]acd78969c2010-12-08 09:49:1162 Mock::VerifyAndClearExpectations(&obs);
[email protected]7aa0a962010-04-21 17:24:4263}
64
[email protected]277404c22010-04-22 13:09:4565TEST(PrefServiceTest, HasPrefPath) {
[email protected]5b199522012-12-22 17:24:4466 TestingPrefServiceSimple prefs;
[email protected]7aa0a962010-04-21 17:24:4267
[email protected]57ecc4b2010-08-11 03:02:5168 const char path[] = "fake.path";
[email protected]7aa0a962010-04-21 17:24:4269
70 // Shouldn't initially have a path.
71 EXPECT_FALSE(prefs.HasPrefPath(path));
72
73 // Register the path. This doesn't set a value, so the path still shouldn't
74 // exist.
[email protected]b1de2c72013-02-06 02:45:4775 prefs.registry()->RegisterStringPref(path, std::string());
[email protected]7aa0a962010-04-21 17:24:4276 EXPECT_FALSE(prefs.HasPrefPath(path));
77
78 // Set a value and make sure we have a path.
[email protected]ddd231e2010-06-29 20:35:1979 prefs.SetString(path, "blah");
[email protected]7aa0a962010-04-21 17:24:4280 EXPECT_TRUE(prefs.HasPrefPath(path));
81}
82
[email protected]277404c22010-04-22 13:09:4583TEST(PrefServiceTest, Observers) {
[email protected]57ecc4b2010-08-11 03:02:5184 const char pref_name[] = "homepage";
[email protected]277404c22010-04-22 13:09:4585
[email protected]5b199522012-12-22 17:24:4486 TestingPrefServiceSimple prefs;
vabr8684c9a2017-03-29 13:14:5787 prefs.SetUserPref(pref_name,
88 base::MakeUnique<base::Value>("http://www.cnn.com"));
[email protected]b1de2c72013-02-06 02:45:4789 prefs.registry()->RegisterStringPref(pref_name, std::string());
[email protected]277404c22010-04-22 13:09:4590
[email protected]acd78969c2010-12-08 09:49:1191 const char new_pref_value[] = "http://www.google.com/";
jdoerrie122c4da2017-03-06 11:12:0492 const base::Value expected_new_pref_value(new_pref_value);
[email protected]96a5c342012-12-04 18:14:0293 MockPrefChangeCallback obs(&prefs);
[email protected]2fb7dc982010-09-29 12:24:2894 PrefChangeRegistrar registrar;
95 registrar.Init(&prefs);
[email protected]96a5c342012-12-04 18:14:0296 registrar.Add(pref_name, obs.GetCallback());
[email protected]277404c22010-04-22 13:09:4597
[email protected]54ffd94a2012-11-12 15:29:2098 PrefChangeRegistrar registrar_two;
99 registrar_two.Init(&prefs);
100
[email protected]96a5c342012-12-04 18:14:02101 // This should fire the checks in MockPrefChangeCallback::OnPreferenceChanged.
102 obs.Expect(pref_name, &expected_new_pref_value);
[email protected]acd78969c2010-12-08 09:49:11103 prefs.SetString(pref_name, new_pref_value);
104 Mock::VerifyAndClearExpectations(&obs);
[email protected]277404c22010-04-22 13:09:45105
106 // Now try adding a second pref observer.
[email protected]acd78969c2010-12-08 09:49:11107 const char new_pref_value2[] = "http://www.youtube.com/";
jdoerrie122c4da2017-03-06 11:12:04108 const base::Value expected_new_pref_value2(new_pref_value2);
[email protected]96a5c342012-12-04 18:14:02109 MockPrefChangeCallback obs2(&prefs);
110 obs.Expect(pref_name, &expected_new_pref_value2);
111 obs2.Expect(pref_name, &expected_new_pref_value2);
112 registrar_two.Add(pref_name, obs2.GetCallback());
[email protected]277404c22010-04-22 13:09:45113 // This should fire the checks in obs and obs2.
114 prefs.SetString(pref_name, new_pref_value2);
[email protected]acd78969c2010-12-08 09:49:11115 Mock::VerifyAndClearExpectations(&obs);
116 Mock::VerifyAndClearExpectations(&obs2);
[email protected]277404c22010-04-22 13:09:45117
[email protected]7ca0f362012-07-30 10:14:03118 // Set a recommended value.
jdoerrie122c4da2017-03-06 11:12:04119 const base::Value recommended_pref_value("http://www.gmail.com/");
[email protected]96a5c342012-12-04 18:14:02120 obs.Expect(pref_name, &expected_new_pref_value2);
121 obs2.Expect(pref_name, &expected_new_pref_value2);
[email protected]7ca0f362012-07-30 10:14:03122 // This should fire the checks in obs and obs2 but with an unchanged value
123 // as the recommended value is being overridden by the user-set value.
vabr8684c9a2017-03-29 13:14:57124 prefs.SetRecommendedPref(pref_name, recommended_pref_value.CreateDeepCopy());
[email protected]7ca0f362012-07-30 10:14:03125 Mock::VerifyAndClearExpectations(&obs);
126 Mock::VerifyAndClearExpectations(&obs2);
127
[email protected]277404c22010-04-22 13:09:45128 // Make sure obs2 still works after removing obs.
[email protected]54ffd94a2012-11-12 15:29:20129 registrar.Remove(pref_name);
[email protected]96a5c342012-12-04 18:14:02130 EXPECT_CALL(obs, OnPreferenceChanged(_)).Times(0);
131 obs2.Expect(pref_name, &expected_new_pref_value);
[email protected]277404c22010-04-22 13:09:45132 // This should only fire the observer in obs2.
133 prefs.SetString(pref_name, new_pref_value);
[email protected]acd78969c2010-12-08 09:49:11134 Mock::VerifyAndClearExpectations(&obs);
135 Mock::VerifyAndClearExpectations(&obs2);
[email protected]277404c22010-04-22 13:09:45136}
137
[email protected]9a8c4022011-01-25 14:25:33138// Make sure that if a preference changes type, so the wrong type is stored in
139// the user pref file, it uses the correct fallback value instead.
140TEST(PrefServiceTest, GetValueChangedType) {
141 const int kTestValue = 10;
[email protected]5b199522012-12-22 17:24:44142 TestingPrefServiceSimple prefs;
[email protected]aaa552312013-02-13 16:25:40143 prefs.registry()->RegisterIntegerPref(kPrefName, kTestValue);
[email protected]9a8c4022011-01-25 14:25:33144
145 // Check falling back to a recommended value.
vabr8684c9a2017-03-29 13:14:57146 prefs.SetUserPref(kPrefName, base::MakeUnique<base::Value>("not an integer"));
[email protected]aaa552312013-02-13 16:25:40147 const PrefService::Preference* pref = prefs.FindPreference(kPrefName);
[email protected]9a8c4022011-01-25 14:25:33148 ASSERT_TRUE(pref);
[email protected]a43a667b2013-06-14 17:56:08149 const base::Value* value = pref->GetValue();
[email protected]9a8c4022011-01-25 14:25:33150 ASSERT_TRUE(value);
jdoerrie76cee9c2017-10-06 22:42:42151 EXPECT_EQ(base::Value::Type::INTEGER, value->type());
[email protected]9a8c4022011-01-25 14:25:33152 int actual_int_value = -1;
153 EXPECT_TRUE(value->GetAsInteger(&actual_int_value));
154 EXPECT_EQ(kTestValue, actual_int_value);
155}
156
[email protected]7ca0f362012-07-30 10:14:03157TEST(PrefServiceTest, GetValueAndGetRecommendedValue) {
158 const int kDefaultValue = 5;
159 const int kUserValue = 10;
160 const int kRecommendedValue = 15;
[email protected]5b199522012-12-22 17:24:44161 TestingPrefServiceSimple prefs;
[email protected]aaa552312013-02-13 16:25:40162 prefs.registry()->RegisterIntegerPref(kPrefName, kDefaultValue);
[email protected]7ca0f362012-07-30 10:14:03163
164 // Create pref with a default value only.
[email protected]aaa552312013-02-13 16:25:40165 const PrefService::Preference* pref = prefs.FindPreference(kPrefName);
[email protected]7ca0f362012-07-30 10:14:03166 ASSERT_TRUE(pref);
167
168 // Check that GetValue() returns the default value.
[email protected]a43a667b2013-06-14 17:56:08169 const base::Value* value = pref->GetValue();
[email protected]7ca0f362012-07-30 10:14:03170 ASSERT_TRUE(value);
jdoerrie76cee9c2017-10-06 22:42:42171 EXPECT_EQ(base::Value::Type::INTEGER, value->type());
[email protected]7ca0f362012-07-30 10:14:03172 int actual_int_value = -1;
173 EXPECT_TRUE(value->GetAsInteger(&actual_int_value));
174 EXPECT_EQ(kDefaultValue, actual_int_value);
175
176 // Check that GetRecommendedValue() returns no value.
177 value = pref->GetRecommendedValue();
178 ASSERT_FALSE(value);
179
180 // Set a user-set value.
vabr8684c9a2017-03-29 13:14:57181 prefs.SetUserPref(kPrefName, base::MakeUnique<base::Value>(kUserValue));
[email protected]7ca0f362012-07-30 10:14:03182
183 // Check that GetValue() returns the user-set value.
184 value = pref->GetValue();
185 ASSERT_TRUE(value);
jdoerrie76cee9c2017-10-06 22:42:42186 EXPECT_EQ(base::Value::Type::INTEGER, value->type());
[email protected]7ca0f362012-07-30 10:14:03187 actual_int_value = -1;
188 EXPECT_TRUE(value->GetAsInteger(&actual_int_value));
189 EXPECT_EQ(kUserValue, actual_int_value);
190
191 // Check that GetRecommendedValue() returns no value.
192 value = pref->GetRecommendedValue();
193 ASSERT_FALSE(value);
194
195 // Set a recommended value.
vabr8684c9a2017-03-29 13:14:57196 prefs.SetRecommendedPref(kPrefName,
197 base::MakeUnique<base::Value>(kRecommendedValue));
[email protected]7ca0f362012-07-30 10:14:03198
199 // Check that GetValue() returns the user-set value.
200 value = pref->GetValue();
201 ASSERT_TRUE(value);
jdoerrie76cee9c2017-10-06 22:42:42202 EXPECT_EQ(base::Value::Type::INTEGER, value->type());
[email protected]7ca0f362012-07-30 10:14:03203 actual_int_value = -1;
204 EXPECT_TRUE(value->GetAsInteger(&actual_int_value));
205 EXPECT_EQ(kUserValue, actual_int_value);
206
207 // Check that GetRecommendedValue() returns the recommended value.
208 value = pref->GetRecommendedValue();
209 ASSERT_TRUE(value);
jdoerrie76cee9c2017-10-06 22:42:42210 EXPECT_EQ(base::Value::Type::INTEGER, value->type());
[email protected]7ca0f362012-07-30 10:14:03211 actual_int_value = -1;
212 EXPECT_TRUE(value->GetAsInteger(&actual_int_value));
213 EXPECT_EQ(kRecommendedValue, actual_int_value);
214
215 // Remove the user-set value.
[email protected]aaa552312013-02-13 16:25:40216 prefs.RemoveUserPref(kPrefName);
[email protected]7ca0f362012-07-30 10:14:03217
218 // Check that GetValue() returns the recommended value.
219 value = pref->GetValue();
220 ASSERT_TRUE(value);
jdoerrie76cee9c2017-10-06 22:42:42221 EXPECT_EQ(base::Value::Type::INTEGER, value->type());
[email protected]7ca0f362012-07-30 10:14:03222 actual_int_value = -1;
223 EXPECT_TRUE(value->GetAsInteger(&actual_int_value));
224 EXPECT_EQ(kRecommendedValue, actual_int_value);
225
226 // Check that GetRecommendedValue() returns the recommended value.
227 value = pref->GetRecommendedValue();
228 ASSERT_TRUE(value);
jdoerrie76cee9c2017-10-06 22:42:42229 EXPECT_EQ(base::Value::Type::INTEGER, value->type());
[email protected]7ca0f362012-07-30 10:14:03230 actual_int_value = -1;
231 EXPECT_TRUE(value->GetAsInteger(&actual_int_value));
232 EXPECT_EQ(kRecommendedValue, actual_int_value);
233}
234
raymesf3a929b02015-05-07 03:54:45235// A PrefStore which just stores the last write flags that were used to write
236// values to it.
237class WriteFlagChecker : public TestingPrefStore {
238 public:
239 WriteFlagChecker() {}
240
avi9ef8bb02015-12-24 05:29:36241 void ReportValueChanged(const std::string& key, uint32_t flags) override {
raymesf3a929b02015-05-07 03:54:45242 SetLastWriteFlags(flags);
243 }
244
245 void SetValue(const std::string& key,
dcheng5f043bc2016-04-22 19:09:06246 std::unique_ptr<base::Value> value,
avi9ef8bb02015-12-24 05:29:36247 uint32_t flags) override {
raymesf3a929b02015-05-07 03:54:45248 SetLastWriteFlags(flags);
raymesf3a929b02015-05-07 03:54:45249 }
250
251 void SetValueSilently(const std::string& key,
dcheng5f043bc2016-04-22 19:09:06252 std::unique_ptr<base::Value> value,
avi9ef8bb02015-12-24 05:29:36253 uint32_t flags) override {
raymesf3a929b02015-05-07 03:54:45254 SetLastWriteFlags(flags);
raymesf3a929b02015-05-07 03:54:45255 }
256
avi9ef8bb02015-12-24 05:29:36257 void RemoveValue(const std::string& key, uint32_t flags) override {
raymesf3a929b02015-05-07 03:54:45258 SetLastWriteFlags(flags);
259 }
260
avi9ef8bb02015-12-24 05:29:36261 uint32_t GetLastFlagsAndClear() {
raymesf3a929b02015-05-07 03:54:45262 CHECK(last_write_flags_set_);
avi9ef8bb02015-12-24 05:29:36263 uint32_t result = last_write_flags_;
raymesf3a929b02015-05-07 03:54:45264 last_write_flags_set_ = false;
265 last_write_flags_ = WriteablePrefStore::DEFAULT_PREF_WRITE_FLAGS;
266 return result;
267 }
268
269 bool last_write_flags_set() { return last_write_flags_set_; }
270
271 private:
272 ~WriteFlagChecker() override {}
273
avi9ef8bb02015-12-24 05:29:36274 void SetLastWriteFlags(uint32_t flags) {
raymesf3a929b02015-05-07 03:54:45275 CHECK(!last_write_flags_set_);
276 last_write_flags_set_ = true;
277 last_write_flags_ = flags;
278 }
279
280 bool last_write_flags_set_ = false;
avi9ef8bb02015-12-24 05:29:36281 uint32_t last_write_flags_ = WriteablePrefStore::DEFAULT_PREF_WRITE_FLAGS;
raymesf3a929b02015-05-07 03:54:45282};
283
284TEST(PrefServiceTest, WriteablePrefStoreFlags) {
285 scoped_refptr<WriteFlagChecker> flag_checker(new WriteFlagChecker);
286 scoped_refptr<PrefRegistrySimple> registry(new PrefRegistrySimple);
brettw066508682016-02-03 08:22:02287 PrefServiceFactory factory;
raymesf3a929b02015-05-07 03:54:45288 factory.set_user_prefs(flag_checker);
dcheng5f043bc2016-04-22 19:09:06289 std::unique_ptr<PrefService> prefs(factory.Create(registry.get()));
raymesf3a929b02015-05-07 03:54:45290
291 // The first 8 bits of write flags are reserved for subclasses. Create a
292 // custom flag in this range
avi9ef8bb02015-12-24 05:29:36293 uint32_t kCustomRegistrationFlag = 1 << 2;
raymesf3a929b02015-05-07 03:54:45294
295 // A map of the registration flags that will be tested and the write flags
296 // they are expected to convert to.
297 struct RegistrationToWriteFlags {
298 const char* pref_name;
avi9ef8bb02015-12-24 05:29:36299 uint32_t registration_flags;
300 uint32_t write_flags;
raymesf3a929b02015-05-07 03:54:45301 };
302 const RegistrationToWriteFlags kRegistrationToWriteFlags[] = {
303 {"none",
304 PrefRegistry::NO_REGISTRATION_FLAGS,
305 WriteablePrefStore::DEFAULT_PREF_WRITE_FLAGS},
306 {"lossy",
307 PrefRegistry::LOSSY_PREF,
308 WriteablePrefStore::LOSSY_PREF_WRITE_FLAG},
309 {"custom",
310 kCustomRegistrationFlag,
311 WriteablePrefStore::DEFAULT_PREF_WRITE_FLAGS},
312 {"lossyandcustom",
313 PrefRegistry::LOSSY_PREF | kCustomRegistrationFlag,
314 WriteablePrefStore::LOSSY_PREF_WRITE_FLAG}};
315
316 for (size_t i = 0; i < arraysize(kRegistrationToWriteFlags); ++i) {
317 RegistrationToWriteFlags entry = kRegistrationToWriteFlags[i];
vabr88e507212017-03-29 13:22:26318 registry->RegisterDictionaryPref(entry.pref_name,
319 base::MakeUnique<base::DictionaryValue>(),
320 entry.registration_flags);
raymesf3a929b02015-05-07 03:54:45321
322 SCOPED_TRACE("Currently testing pref with name: " +
323 std::string(entry.pref_name));
324
jdoerriedc72ee942016-12-07 15:43:28325 prefs->GetMutableUserPref(entry.pref_name, base::Value::Type::DICTIONARY);
raymesf3a929b02015-05-07 03:54:45326 EXPECT_TRUE(flag_checker->last_write_flags_set());
327 EXPECT_EQ(entry.write_flags, flag_checker->GetLastFlagsAndClear());
328
329 prefs->ReportUserPrefChanged(entry.pref_name);
330 EXPECT_TRUE(flag_checker->last_write_flags_set());
331 EXPECT_EQ(entry.write_flags, flag_checker->GetLastFlagsAndClear());
332
333 prefs->ClearPref(entry.pref_name);
334 EXPECT_TRUE(flag_checker->last_write_flags_set());
335 EXPECT_EQ(entry.write_flags, flag_checker->GetLastFlagsAndClear());
336
vabrbce355c2017-03-23 18:52:43337 prefs->SetUserPrefValue(entry.pref_name,
338 base::MakeUnique<base::DictionaryValue>());
raymesf3a929b02015-05-07 03:54:45339 EXPECT_TRUE(flag_checker->last_write_flags_set());
340 EXPECT_EQ(entry.write_flags, flag_checker->GetLastFlagsAndClear());
341 }
342}
343
[email protected]ecde2742010-04-02 17:36:18344class PrefServiceSetValueTest : public testing::Test {
345 protected:
[email protected]12a3c022010-11-03 10:24:11346 static const char kName[];
347 static const char kValue[];
[email protected]ecde2742010-04-02 17:36:18348
[email protected]96a5c342012-12-04 18:14:02349 PrefServiceSetValueTest() : observer_(&prefs_) {}
350
[email protected]5b199522012-12-22 17:24:44351 TestingPrefServiceSimple prefs_;
[email protected]96a5c342012-12-04 18:14:02352 MockPrefChangeCallback observer_;
[email protected]ecde2742010-04-02 17:36:18353};
[email protected]ddd231e2010-06-29 20:35:19354
[email protected]12a3c022010-11-03 10:24:11355const char PrefServiceSetValueTest::kName[] = "name";
356const char PrefServiceSetValueTest::kValue[] = "value";
[email protected]ecde2742010-04-02 17:36:18357
358TEST_F(PrefServiceSetValueTest, SetStringValue) {
[email protected]20ce516d2010-06-18 02:20:04359 const char default_string[] = "default";
jdoerrie122c4da2017-03-06 11:12:04360 const base::Value default_value(default_string);
[email protected]b1de2c72013-02-06 02:45:47361 prefs_.registry()->RegisterStringPref(kName, default_string);
[email protected]2fb7dc982010-09-29 12:24:28362
363 PrefChangeRegistrar registrar;
364 registrar.Init(&prefs_);
[email protected]96a5c342012-12-04 18:14:02365 registrar.Add(kName, observer_.GetCallback());
[email protected]2fb7dc982010-09-29 12:24:28366
[email protected]c3b54f372010-09-14 08:25:07367 // Changing the controlling store from default to user triggers notification.
[email protected]96a5c342012-12-04 18:14:02368 observer_.Expect(kName, &default_value);
[email protected]acd78969c2010-12-08 09:49:11369 prefs_.Set(kName, default_value);
[email protected]c3b54f372010-09-14 08:25:07370 Mock::VerifyAndClearExpectations(&observer_);
371
[email protected]96a5c342012-12-04 18:14:02372 EXPECT_CALL(observer_, OnPreferenceChanged(_)).Times(0);
[email protected]acd78969c2010-12-08 09:49:11373 prefs_.Set(kName, default_value);
[email protected]ecde2742010-04-02 17:36:18374 Mock::VerifyAndClearExpectations(&observer_);
375
jdoerrie122c4da2017-03-06 11:12:04376 base::Value new_value(kValue);
[email protected]96a5c342012-12-04 18:14:02377 observer_.Expect(kName, &new_value);
[email protected]acd78969c2010-12-08 09:49:11378 prefs_.Set(kName, new_value);
379 Mock::VerifyAndClearExpectations(&observer_);
[email protected]ecde2742010-04-02 17:36:18380}
381
382TEST_F(PrefServiceSetValueTest, SetDictionaryValue) {
[email protected]b1de2c72013-02-06 02:45:47383 prefs_.registry()->RegisterDictionaryPref(kName);
[email protected]2fb7dc982010-09-29 12:24:28384 PrefChangeRegistrar registrar;
385 registrar.Init(&prefs_);
[email protected]96a5c342012-12-04 18:14:02386 registrar.Add(kName, observer_.GetCallback());
[email protected]ecde2742010-04-02 17:36:18387
[email protected]96a5c342012-12-04 18:14:02388 EXPECT_CALL(observer_, OnPreferenceChanged(_)).Times(0);
[email protected]9a8c4022011-01-25 14:25:33389 prefs_.RemoveUserPref(kName);
[email protected]ecde2742010-04-02 17:36:18390 Mock::VerifyAndClearExpectations(&observer_);
391
[email protected]a43a667b2013-06-14 17:56:08392 base::DictionaryValue new_value;
[email protected]12a3c022010-11-03 10:24:11393 new_value.SetString(kName, kValue);
[email protected]96a5c342012-12-04 18:14:02394 observer_.Expect(kName, &new_value);
[email protected]12a3c022010-11-03 10:24:11395 prefs_.Set(kName, new_value);
[email protected]ecde2742010-04-02 17:36:18396 Mock::VerifyAndClearExpectations(&observer_);
397
[email protected]96a5c342012-12-04 18:14:02398 EXPECT_CALL(observer_, OnPreferenceChanged(_)).Times(0);
[email protected]acd78969c2010-12-08 09:49:11399 prefs_.Set(kName, new_value);
400 Mock::VerifyAndClearExpectations(&observer_);
401
[email protected]a43a667b2013-06-14 17:56:08402 base::DictionaryValue empty;
[email protected]96a5c342012-12-04 18:14:02403 observer_.Expect(kName, &empty);
[email protected]9a8c4022011-01-25 14:25:33404 prefs_.Set(kName, empty);
[email protected]ecde2742010-04-02 17:36:18405 Mock::VerifyAndClearExpectations(&observer_);
[email protected]ecde2742010-04-02 17:36:18406}
407
408TEST_F(PrefServiceSetValueTest, SetListValue) {
[email protected]b1de2c72013-02-06 02:45:47409 prefs_.registry()->RegisterListPref(kName);
[email protected]2fb7dc982010-09-29 12:24:28410 PrefChangeRegistrar registrar;
411 registrar.Init(&prefs_);
[email protected]96a5c342012-12-04 18:14:02412 registrar.Add(kName, observer_.GetCallback());
[email protected]ecde2742010-04-02 17:36:18413
[email protected]96a5c342012-12-04 18:14:02414 EXPECT_CALL(observer_, OnPreferenceChanged(_)).Times(0);
[email protected]9a8c4022011-01-25 14:25:33415 prefs_.RemoveUserPref(kName);
[email protected]ecde2742010-04-02 17:36:18416 Mock::VerifyAndClearExpectations(&observer_);
417
[email protected]a43a667b2013-06-14 17:56:08418 base::ListValue new_value;
dcheng58241a812016-06-03 18:18:42419 new_value.AppendString(kValue);
[email protected]96a5c342012-12-04 18:14:02420 observer_.Expect(kName, &new_value);
[email protected]12a3c022010-11-03 10:24:11421 prefs_.Set(kName, new_value);
[email protected]ecde2742010-04-02 17:36:18422 Mock::VerifyAndClearExpectations(&observer_);
423
[email protected]96a5c342012-12-04 18:14:02424 EXPECT_CALL(observer_, OnPreferenceChanged(_)).Times(0);
[email protected]acd78969c2010-12-08 09:49:11425 prefs_.Set(kName, new_value);
426 Mock::VerifyAndClearExpectations(&observer_);
427
[email protected]a43a667b2013-06-14 17:56:08428 base::ListValue empty;
[email protected]96a5c342012-12-04 18:14:02429 observer_.Expect(kName, &empty);
[email protected]9a8c4022011-01-25 14:25:33430 prefs_.Set(kName, empty);
[email protected]ecde2742010-04-02 17:36:18431 Mock::VerifyAndClearExpectations(&observer_);
[email protected]ecde2742010-04-02 17:36:18432}