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