12a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved.
22a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
32a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// found in the LICENSE file.
42a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
52a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include <string>
62a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
72a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/prefs/json_pref_store.h"
82a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/prefs/mock_pref_change_callback.h"
92a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/prefs/pref_change_registrar.h"
102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/prefs/pref_registry_simple.h"
112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/prefs/pref_value_store.h"
122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/prefs/testing_pref_service.h"
132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/prefs/testing_pref_store.h"
142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/values.h"
152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "testing/gmock/include/gmock/gmock.h"
162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "testing/gtest/include/gtest/gtest.h"
172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)using testing::_;
192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)using testing::Mock;
202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)const char kPrefName[] = "pref.name";
222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST(PrefServiceTest, NoObserverFire) {
242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  TestingPrefServiceSimple prefs;
252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  const char pref_name[] = "homepage";
272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  prefs.registry()->RegisterStringPref(pref_name, std::string());
282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  const char new_pref_value[] = "http://www.google.com/";
302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  MockPrefChangeCallback obs(&prefs);
312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  PrefChangeRegistrar registrar;
322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  registrar.Init(&prefs);
332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  registrar.Add(pref_name, obs.GetCallback());
342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // This should fire the checks in MockPrefChangeCallback::OnPreferenceChanged.
367d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  const base::StringValue expected_value(new_pref_value);
372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  obs.Expect(pref_name, &expected_value);
382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  prefs.SetString(pref_name, new_pref_value);
392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  Mock::VerifyAndClearExpectations(&obs);
402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Setting the pref to the same value should not set the pref value a second
422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // time.
432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_CALL(obs, OnPreferenceChanged(_)).Times(0);
442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  prefs.SetString(pref_name, new_pref_value);
452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  Mock::VerifyAndClearExpectations(&obs);
462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Clearing the pref should cause the pref to fire.
487d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  const base::StringValue expected_default_value((std::string()));
492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  obs.Expect(pref_name, &expected_default_value);
502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  prefs.ClearPref(pref_name);
512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  Mock::VerifyAndClearExpectations(&obs);
522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Clearing the pref again should not cause the pref to fire.
542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_CALL(obs, OnPreferenceChanged(_)).Times(0);
552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  prefs.ClearPref(pref_name);
562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  Mock::VerifyAndClearExpectations(&obs);
572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST(PrefServiceTest, HasPrefPath) {
602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  TestingPrefServiceSimple prefs;
612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  const char path[] = "fake.path";
632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Shouldn't initially have a path.
652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_FALSE(prefs.HasPrefPath(path));
662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Register the path. This doesn't set a value, so the path still shouldn't
682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // exist.
692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  prefs.registry()->RegisterStringPref(path, std::string());
702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_FALSE(prefs.HasPrefPath(path));
712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Set a value and make sure we have a path.
732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  prefs.SetString(path, "blah");
742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_TRUE(prefs.HasPrefPath(path));
752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST(PrefServiceTest, Observers) {
782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  const char pref_name[] = "homepage";
792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  TestingPrefServiceSimple prefs;
817d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  prefs.SetUserPref(pref_name,
827d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)                    base::Value::CreateStringValue("http://www.cnn.com"));
832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  prefs.registry()->RegisterStringPref(pref_name, std::string());
842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  const char new_pref_value[] = "http://www.google.com/";
867d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  const base::StringValue expected_new_pref_value(new_pref_value);
872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  MockPrefChangeCallback obs(&prefs);
882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  PrefChangeRegistrar registrar;
892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  registrar.Init(&prefs);
902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  registrar.Add(pref_name, obs.GetCallback());
912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  PrefChangeRegistrar registrar_two;
932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  registrar_two.Init(&prefs);
942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // This should fire the checks in MockPrefChangeCallback::OnPreferenceChanged.
962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  obs.Expect(pref_name, &expected_new_pref_value);
972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  prefs.SetString(pref_name, new_pref_value);
982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  Mock::VerifyAndClearExpectations(&obs);
992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Now try adding a second pref observer.
1012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  const char new_pref_value2[] = "http://www.youtube.com/";
1027d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  const base::StringValue expected_new_pref_value2(new_pref_value2);
1032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  MockPrefChangeCallback obs2(&prefs);
1042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  obs.Expect(pref_name, &expected_new_pref_value2);
1052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  obs2.Expect(pref_name, &expected_new_pref_value2);
1062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  registrar_two.Add(pref_name, obs2.GetCallback());
1072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // This should fire the checks in obs and obs2.
1082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  prefs.SetString(pref_name, new_pref_value2);
1092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  Mock::VerifyAndClearExpectations(&obs);
1102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  Mock::VerifyAndClearExpectations(&obs2);
1112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Set a recommended value.
1137d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  const base::StringValue recommended_pref_value("http://www.gmail.com/");
1142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  obs.Expect(pref_name, &expected_new_pref_value2);
1152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  obs2.Expect(pref_name, &expected_new_pref_value2);
1162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // This should fire the checks in obs and obs2 but with an unchanged value
1172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // as the recommended value is being overridden by the user-set value.
1182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  prefs.SetRecommendedPref(pref_name, recommended_pref_value.DeepCopy());
1192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  Mock::VerifyAndClearExpectations(&obs);
1202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  Mock::VerifyAndClearExpectations(&obs2);
1212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Make sure obs2 still works after removing obs.
1232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  registrar.Remove(pref_name);
1242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_CALL(obs, OnPreferenceChanged(_)).Times(0);
1252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  obs2.Expect(pref_name, &expected_new_pref_value);
1262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // This should only fire the observer in obs2.
1272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  prefs.SetString(pref_name, new_pref_value);
1282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  Mock::VerifyAndClearExpectations(&obs);
1292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  Mock::VerifyAndClearExpectations(&obs2);
1302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
1312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Make sure that if a preference changes type, so the wrong type is stored in
1332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// the user pref file, it uses the correct fallback value instead.
1342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST(PrefServiceTest, GetValueChangedType) {
1352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  const int kTestValue = 10;
1362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  TestingPrefServiceSimple prefs;
1372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  prefs.registry()->RegisterIntegerPref(kPrefName, kTestValue);
1382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Check falling back to a recommended value.
1407d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  prefs.SetUserPref(kPrefName,
1417d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)                    base::Value::CreateStringValue("not an integer"));
1422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  const PrefService::Preference* pref = prefs.FindPreference(kPrefName);
1432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ASSERT_TRUE(pref);
1447d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  const base::Value* value = pref->GetValue();
1452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ASSERT_TRUE(value);
1467d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  EXPECT_EQ(base::Value::TYPE_INTEGER, value->GetType());
1472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  int actual_int_value = -1;
1482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_TRUE(value->GetAsInteger(&actual_int_value));
1492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(kTestValue, actual_int_value);
1502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
1512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST(PrefServiceTest, GetValueAndGetRecommendedValue) {
1532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  const int kDefaultValue = 5;
1542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  const int kUserValue = 10;
1552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  const int kRecommendedValue = 15;
1562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  TestingPrefServiceSimple prefs;
1572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  prefs.registry()->RegisterIntegerPref(kPrefName, kDefaultValue);
1582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Create pref with a default value only.
1602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  const PrefService::Preference* pref = prefs.FindPreference(kPrefName);
1612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ASSERT_TRUE(pref);
1622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Check that GetValue() returns the default value.
1647d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  const base::Value* value = pref->GetValue();
1652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ASSERT_TRUE(value);
1667d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  EXPECT_EQ(base::Value::TYPE_INTEGER, value->GetType());
1672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  int actual_int_value = -1;
1682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_TRUE(value->GetAsInteger(&actual_int_value));
1692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(kDefaultValue, actual_int_value);
1702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Check that GetRecommendedValue() returns no value.
1722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  value = pref->GetRecommendedValue();
1732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ASSERT_FALSE(value);
1742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Set a user-set value.
1767d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  prefs.SetUserPref(kPrefName, base::Value::CreateIntegerValue(kUserValue));
1772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Check that GetValue() returns the user-set value.
1792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  value = pref->GetValue();
1802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ASSERT_TRUE(value);
1817d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  EXPECT_EQ(base::Value::TYPE_INTEGER, value->GetType());
1822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  actual_int_value = -1;
1832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_TRUE(value->GetAsInteger(&actual_int_value));
1842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(kUserValue, actual_int_value);
1852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Check that GetRecommendedValue() returns no value.
1872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  value = pref->GetRecommendedValue();
1882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ASSERT_FALSE(value);
1892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Set a recommended value.
1912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  prefs.SetRecommendedPref(kPrefName,
1927d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)                           base::Value::CreateIntegerValue(kRecommendedValue));
1932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Check that GetValue() returns the user-set value.
1952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  value = pref->GetValue();
1962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ASSERT_TRUE(value);
1977d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  EXPECT_EQ(base::Value::TYPE_INTEGER, value->GetType());
1982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  actual_int_value = -1;
1992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_TRUE(value->GetAsInteger(&actual_int_value));
2002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(kUserValue, actual_int_value);
2012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Check that GetRecommendedValue() returns the recommended value.
2032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  value = pref->GetRecommendedValue();
2042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ASSERT_TRUE(value);
2057d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  EXPECT_EQ(base::Value::TYPE_INTEGER, value->GetType());
2062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  actual_int_value = -1;
2072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_TRUE(value->GetAsInteger(&actual_int_value));
2082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(kRecommendedValue, actual_int_value);
2092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Remove the user-set value.
2112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  prefs.RemoveUserPref(kPrefName);
2122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Check that GetValue() returns the recommended value.
2142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  value = pref->GetValue();
2152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ASSERT_TRUE(value);
2167d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  EXPECT_EQ(base::Value::TYPE_INTEGER, value->GetType());
2172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  actual_int_value = -1;
2182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_TRUE(value->GetAsInteger(&actual_int_value));
2192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(kRecommendedValue, actual_int_value);
2202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Check that GetRecommendedValue() returns the recommended value.
2222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  value = pref->GetRecommendedValue();
2232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ASSERT_TRUE(value);
2247d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  EXPECT_EQ(base::Value::TYPE_INTEGER, value->GetType());
2252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  actual_int_value = -1;
2262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_TRUE(value->GetAsInteger(&actual_int_value));
2272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(kRecommendedValue, actual_int_value);
2282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
2292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class PrefServiceSetValueTest : public testing::Test {
2312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) protected:
2322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  static const char kName[];
2332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  static const char kValue[];
2342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  PrefServiceSetValueTest() : observer_(&prefs_) {}
2362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  TestingPrefServiceSimple prefs_;
2382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  MockPrefChangeCallback observer_;
2392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)};
2402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)const char PrefServiceSetValueTest::kName[] = "name";
2422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)const char PrefServiceSetValueTest::kValue[] = "value";
2432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(PrefServiceSetValueTest, SetStringValue) {
2452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  const char default_string[] = "default";
2467d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  const base::StringValue default_value(default_string);
2472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  prefs_.registry()->RegisterStringPref(kName, default_string);
2482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  PrefChangeRegistrar registrar;
2502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  registrar.Init(&prefs_);
2512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  registrar.Add(kName, observer_.GetCallback());
2522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Changing the controlling store from default to user triggers notification.
2542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  observer_.Expect(kName, &default_value);
2552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  prefs_.Set(kName, default_value);
2562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  Mock::VerifyAndClearExpectations(&observer_);
2572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_CALL(observer_, OnPreferenceChanged(_)).Times(0);
2592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  prefs_.Set(kName, default_value);
2602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  Mock::VerifyAndClearExpectations(&observer_);
2612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2627d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  base::StringValue new_value(kValue);
2632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  observer_.Expect(kName, &new_value);
2642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  prefs_.Set(kName, new_value);
2652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  Mock::VerifyAndClearExpectations(&observer_);
2662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
2672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(PrefServiceSetValueTest, SetDictionaryValue) {
2692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  prefs_.registry()->RegisterDictionaryPref(kName);
2702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  PrefChangeRegistrar registrar;
2712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  registrar.Init(&prefs_);
2722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  registrar.Add(kName, observer_.GetCallback());
2732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_CALL(observer_, OnPreferenceChanged(_)).Times(0);
2752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  prefs_.RemoveUserPref(kName);
2762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  Mock::VerifyAndClearExpectations(&observer_);
2772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2787d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  base::DictionaryValue new_value;
2792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  new_value.SetString(kName, kValue);
2802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  observer_.Expect(kName, &new_value);
2812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  prefs_.Set(kName, new_value);
2822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  Mock::VerifyAndClearExpectations(&observer_);
2832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_CALL(observer_, OnPreferenceChanged(_)).Times(0);
2852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  prefs_.Set(kName, new_value);
2862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  Mock::VerifyAndClearExpectations(&observer_);
2872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2887d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  base::DictionaryValue empty;
2892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  observer_.Expect(kName, &empty);
2902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  prefs_.Set(kName, empty);
2912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  Mock::VerifyAndClearExpectations(&observer_);
2922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
2932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(PrefServiceSetValueTest, SetListValue) {
2952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  prefs_.registry()->RegisterListPref(kName);
2962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  PrefChangeRegistrar registrar;
2972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  registrar.Init(&prefs_);
2982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  registrar.Add(kName, observer_.GetCallback());
2992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_CALL(observer_, OnPreferenceChanged(_)).Times(0);
3012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  prefs_.RemoveUserPref(kName);
3022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  Mock::VerifyAndClearExpectations(&observer_);
3032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3047d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  base::ListValue new_value;
3057d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  new_value.Append(base::Value::CreateStringValue(kValue));
3062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  observer_.Expect(kName, &new_value);
3072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  prefs_.Set(kName, new_value);
3082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  Mock::VerifyAndClearExpectations(&observer_);
3092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_CALL(observer_, OnPreferenceChanged(_)).Times(0);
3112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  prefs_.Set(kName, new_value);
3122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  Mock::VerifyAndClearExpectations(&observer_);
3132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3147d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  base::ListValue empty;
3152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  observer_.Expect(kName, &empty);
3162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  prefs_.Set(kName, empty);
3172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  Mock::VerifyAndClearExpectations(&observer_);
3182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
319