Home | History | Annotate | Download | only in prefs
      1 // Copyright (c) 2012 The Chromium Authors. All rights reserved.
      2 // Use of this source code is governed by a BSD-style license that can be
      3 // found in the LICENSE file.
      4 
      5 #include <string>
      6 
      7 #include "base/prefs/json_pref_store.h"
      8 #include "base/prefs/mock_pref_change_callback.h"
      9 #include "base/prefs/pref_change_registrar.h"
     10 #include "base/prefs/pref_registry_simple.h"
     11 #include "base/prefs/pref_value_store.h"
     12 #include "base/prefs/testing_pref_service.h"
     13 #include "base/prefs/testing_pref_store.h"
     14 #include "base/values.h"
     15 #include "testing/gmock/include/gmock/gmock.h"
     16 #include "testing/gtest/include/gtest/gtest.h"
     17 
     18 using testing::_;
     19 using testing::Mock;
     20 
     21 const char kPrefName[] = "pref.name";
     22 
     23 TEST(PrefServiceTest, NoObserverFire) {
     24   TestingPrefServiceSimple prefs;
     25 
     26   const char pref_name[] = "homepage";
     27   prefs.registry()->RegisterStringPref(pref_name, std::string());
     28 
     29   const char new_pref_value[] = "http://www.google.com/";
     30   MockPrefChangeCallback obs(&prefs);
     31   PrefChangeRegistrar registrar;
     32   registrar.Init(&prefs);
     33   registrar.Add(pref_name, obs.GetCallback());
     34 
     35   // This should fire the checks in MockPrefChangeCallback::OnPreferenceChanged.
     36   const base::StringValue expected_value(new_pref_value);
     37   obs.Expect(pref_name, &expected_value);
     38   prefs.SetString(pref_name, new_pref_value);
     39   Mock::VerifyAndClearExpectations(&obs);
     40 
     41   // Setting the pref to the same value should not set the pref value a second
     42   // time.
     43   EXPECT_CALL(obs, OnPreferenceChanged(_)).Times(0);
     44   prefs.SetString(pref_name, new_pref_value);
     45   Mock::VerifyAndClearExpectations(&obs);
     46 
     47   // Clearing the pref should cause the pref to fire.
     48   const base::StringValue expected_default_value((std::string()));
     49   obs.Expect(pref_name, &expected_default_value);
     50   prefs.ClearPref(pref_name);
     51   Mock::VerifyAndClearExpectations(&obs);
     52 
     53   // Clearing the pref again should not cause the pref to fire.
     54   EXPECT_CALL(obs, OnPreferenceChanged(_)).Times(0);
     55   prefs.ClearPref(pref_name);
     56   Mock::VerifyAndClearExpectations(&obs);
     57 }
     58 
     59 TEST(PrefServiceTest, HasPrefPath) {
     60   TestingPrefServiceSimple prefs;
     61 
     62   const char path[] = "fake.path";
     63 
     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.
     69   prefs.registry()->RegisterStringPref(path, std::string());
     70   EXPECT_FALSE(prefs.HasPrefPath(path));
     71 
     72   // Set a value and make sure we have a path.
     73   prefs.SetString(path, "blah");
     74   EXPECT_TRUE(prefs.HasPrefPath(path));
     75 }
     76 
     77 TEST(PrefServiceTest, Observers) {
     78   const char pref_name[] = "homepage";
     79 
     80   TestingPrefServiceSimple prefs;
     81   prefs.SetUserPref(pref_name,
     82                     base::Value::CreateStringValue("http://www.cnn.com"));
     83   prefs.registry()->RegisterStringPref(pref_name, std::string());
     84 
     85   const char new_pref_value[] = "http://www.google.com/";
     86   const base::StringValue expected_new_pref_value(new_pref_value);
     87   MockPrefChangeCallback obs(&prefs);
     88   PrefChangeRegistrar registrar;
     89   registrar.Init(&prefs);
     90   registrar.Add(pref_name, obs.GetCallback());
     91 
     92   PrefChangeRegistrar registrar_two;
     93   registrar_two.Init(&prefs);
     94 
     95   // This should fire the checks in MockPrefChangeCallback::OnPreferenceChanged.
     96   obs.Expect(pref_name, &expected_new_pref_value);
     97   prefs.SetString(pref_name, new_pref_value);
     98   Mock::VerifyAndClearExpectations(&obs);
     99 
    100   // Now try adding a second pref observer.
    101   const char new_pref_value2[] = "http://www.youtube.com/";
    102   const base::StringValue expected_new_pref_value2(new_pref_value2);
    103   MockPrefChangeCallback obs2(&prefs);
    104   obs.Expect(pref_name, &expected_new_pref_value2);
    105   obs2.Expect(pref_name, &expected_new_pref_value2);
    106   registrar_two.Add(pref_name, obs2.GetCallback());
    107   // This should fire the checks in obs and obs2.
    108   prefs.SetString(pref_name, new_pref_value2);
    109   Mock::VerifyAndClearExpectations(&obs);
    110   Mock::VerifyAndClearExpectations(&obs2);
    111 
    112   // Set a recommended value.
    113   const base::StringValue recommended_pref_value("http://www.gmail.com/");
    114   obs.Expect(pref_name, &expected_new_pref_value2);
    115   obs2.Expect(pref_name, &expected_new_pref_value2);
    116   // This should fire the checks in obs and obs2 but with an unchanged value
    117   // as the recommended value is being overridden by the user-set value.
    118   prefs.SetRecommendedPref(pref_name, recommended_pref_value.DeepCopy());
    119   Mock::VerifyAndClearExpectations(&obs);
    120   Mock::VerifyAndClearExpectations(&obs2);
    121 
    122   // Make sure obs2 still works after removing obs.
    123   registrar.Remove(pref_name);
    124   EXPECT_CALL(obs, OnPreferenceChanged(_)).Times(0);
    125   obs2.Expect(pref_name, &expected_new_pref_value);
    126   // This should only fire the observer in obs2.
    127   prefs.SetString(pref_name, new_pref_value);
    128   Mock::VerifyAndClearExpectations(&obs);
    129   Mock::VerifyAndClearExpectations(&obs2);
    130 }
    131 
    132 // Make sure that if a preference changes type, so the wrong type is stored in
    133 // the user pref file, it uses the correct fallback value instead.
    134 TEST(PrefServiceTest, GetValueChangedType) {
    135   const int kTestValue = 10;
    136   TestingPrefServiceSimple prefs;
    137   prefs.registry()->RegisterIntegerPref(kPrefName, kTestValue);
    138 
    139   // Check falling back to a recommended value.
    140   prefs.SetUserPref(kPrefName,
    141                     base::Value::CreateStringValue("not an integer"));
    142   const PrefService::Preference* pref = prefs.FindPreference(kPrefName);
    143   ASSERT_TRUE(pref);
    144   const base::Value* value = pref->GetValue();
    145   ASSERT_TRUE(value);
    146   EXPECT_EQ(base::Value::TYPE_INTEGER, value->GetType());
    147   int actual_int_value = -1;
    148   EXPECT_TRUE(value->GetAsInteger(&actual_int_value));
    149   EXPECT_EQ(kTestValue, actual_int_value);
    150 }
    151 
    152 TEST(PrefServiceTest, GetValueAndGetRecommendedValue) {
    153   const int kDefaultValue = 5;
    154   const int kUserValue = 10;
    155   const int kRecommendedValue = 15;
    156   TestingPrefServiceSimple prefs;
    157   prefs.registry()->RegisterIntegerPref(kPrefName, kDefaultValue);
    158 
    159   // Create pref with a default value only.
    160   const PrefService::Preference* pref = prefs.FindPreference(kPrefName);
    161   ASSERT_TRUE(pref);
    162 
    163   // Check that GetValue() returns the default value.
    164   const base::Value* value = pref->GetValue();
    165   ASSERT_TRUE(value);
    166   EXPECT_EQ(base::Value::TYPE_INTEGER, value->GetType());
    167   int actual_int_value = -1;
    168   EXPECT_TRUE(value->GetAsInteger(&actual_int_value));
    169   EXPECT_EQ(kDefaultValue, actual_int_value);
    170 
    171   // Check that GetRecommendedValue() returns no value.
    172   value = pref->GetRecommendedValue();
    173   ASSERT_FALSE(value);
    174 
    175   // Set a user-set value.
    176   prefs.SetUserPref(kPrefName, base::Value::CreateIntegerValue(kUserValue));
    177 
    178   // Check that GetValue() returns the user-set value.
    179   value = pref->GetValue();
    180   ASSERT_TRUE(value);
    181   EXPECT_EQ(base::Value::TYPE_INTEGER, value->GetType());
    182   actual_int_value = -1;
    183   EXPECT_TRUE(value->GetAsInteger(&actual_int_value));
    184   EXPECT_EQ(kUserValue, actual_int_value);
    185 
    186   // Check that GetRecommendedValue() returns no value.
    187   value = pref->GetRecommendedValue();
    188   ASSERT_FALSE(value);
    189 
    190   // Set a recommended value.
    191   prefs.SetRecommendedPref(kPrefName,
    192                            base::Value::CreateIntegerValue(kRecommendedValue));
    193 
    194   // Check that GetValue() returns the user-set value.
    195   value = pref->GetValue();
    196   ASSERT_TRUE(value);
    197   EXPECT_EQ(base::Value::TYPE_INTEGER, value->GetType());
    198   actual_int_value = -1;
    199   EXPECT_TRUE(value->GetAsInteger(&actual_int_value));
    200   EXPECT_EQ(kUserValue, actual_int_value);
    201 
    202   // Check that GetRecommendedValue() returns the recommended value.
    203   value = pref->GetRecommendedValue();
    204   ASSERT_TRUE(value);
    205   EXPECT_EQ(base::Value::TYPE_INTEGER, value->GetType());
    206   actual_int_value = -1;
    207   EXPECT_TRUE(value->GetAsInteger(&actual_int_value));
    208   EXPECT_EQ(kRecommendedValue, actual_int_value);
    209 
    210   // Remove the user-set value.
    211   prefs.RemoveUserPref(kPrefName);
    212 
    213   // Check that GetValue() returns the recommended value.
    214   value = pref->GetValue();
    215   ASSERT_TRUE(value);
    216   EXPECT_EQ(base::Value::TYPE_INTEGER, value->GetType());
    217   actual_int_value = -1;
    218   EXPECT_TRUE(value->GetAsInteger(&actual_int_value));
    219   EXPECT_EQ(kRecommendedValue, actual_int_value);
    220 
    221   // Check that GetRecommendedValue() returns the recommended value.
    222   value = pref->GetRecommendedValue();
    223   ASSERT_TRUE(value);
    224   EXPECT_EQ(base::Value::TYPE_INTEGER, value->GetType());
    225   actual_int_value = -1;
    226   EXPECT_TRUE(value->GetAsInteger(&actual_int_value));
    227   EXPECT_EQ(kRecommendedValue, actual_int_value);
    228 }
    229 
    230 class PrefServiceSetValueTest : public testing::Test {
    231  protected:
    232   static const char kName[];
    233   static const char kValue[];
    234 
    235   PrefServiceSetValueTest() : observer_(&prefs_) {}
    236 
    237   TestingPrefServiceSimple prefs_;
    238   MockPrefChangeCallback observer_;
    239 };
    240 
    241 const char PrefServiceSetValueTest::kName[] = "name";
    242 const char PrefServiceSetValueTest::kValue[] = "value";
    243 
    244 TEST_F(PrefServiceSetValueTest, SetStringValue) {
    245   const char default_string[] = "default";
    246   const base::StringValue default_value(default_string);
    247   prefs_.registry()->RegisterStringPref(kName, default_string);
    248 
    249   PrefChangeRegistrar registrar;
    250   registrar.Init(&prefs_);
    251   registrar.Add(kName, observer_.GetCallback());
    252 
    253   // Changing the controlling store from default to user triggers notification.
    254   observer_.Expect(kName, &default_value);
    255   prefs_.Set(kName, default_value);
    256   Mock::VerifyAndClearExpectations(&observer_);
    257 
    258   EXPECT_CALL(observer_, OnPreferenceChanged(_)).Times(0);
    259   prefs_.Set(kName, default_value);
    260   Mock::VerifyAndClearExpectations(&observer_);
    261 
    262   base::StringValue new_value(kValue);
    263   observer_.Expect(kName, &new_value);
    264   prefs_.Set(kName, new_value);
    265   Mock::VerifyAndClearExpectations(&observer_);
    266 }
    267 
    268 TEST_F(PrefServiceSetValueTest, SetDictionaryValue) {
    269   prefs_.registry()->RegisterDictionaryPref(kName);
    270   PrefChangeRegistrar registrar;
    271   registrar.Init(&prefs_);
    272   registrar.Add(kName, observer_.GetCallback());
    273 
    274   EXPECT_CALL(observer_, OnPreferenceChanged(_)).Times(0);
    275   prefs_.RemoveUserPref(kName);
    276   Mock::VerifyAndClearExpectations(&observer_);
    277 
    278   base::DictionaryValue new_value;
    279   new_value.SetString(kName, kValue);
    280   observer_.Expect(kName, &new_value);
    281   prefs_.Set(kName, new_value);
    282   Mock::VerifyAndClearExpectations(&observer_);
    283 
    284   EXPECT_CALL(observer_, OnPreferenceChanged(_)).Times(0);
    285   prefs_.Set(kName, new_value);
    286   Mock::VerifyAndClearExpectations(&observer_);
    287 
    288   base::DictionaryValue empty;
    289   observer_.Expect(kName, &empty);
    290   prefs_.Set(kName, empty);
    291   Mock::VerifyAndClearExpectations(&observer_);
    292 }
    293 
    294 TEST_F(PrefServiceSetValueTest, SetListValue) {
    295   prefs_.registry()->RegisterListPref(kName);
    296   PrefChangeRegistrar registrar;
    297   registrar.Init(&prefs_);
    298   registrar.Add(kName, observer_.GetCallback());
    299 
    300   EXPECT_CALL(observer_, OnPreferenceChanged(_)).Times(0);
    301   prefs_.RemoveUserPref(kName);
    302   Mock::VerifyAndClearExpectations(&observer_);
    303 
    304   base::ListValue new_value;
    305   new_value.Append(base::Value::CreateStringValue(kValue));
    306   observer_.Expect(kName, &new_value);
    307   prefs_.Set(kName, new_value);
    308   Mock::VerifyAndClearExpectations(&observer_);
    309 
    310   EXPECT_CALL(observer_, OnPreferenceChanged(_)).Times(0);
    311   prefs_.Set(kName, new_value);
    312   Mock::VerifyAndClearExpectations(&observer_);
    313 
    314   base::ListValue empty;
    315   observer_.Expect(kName, &empty);
    316   prefs_.Set(kName, empty);
    317   Mock::VerifyAndClearExpectations(&observer_);
    318 }
    319