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 "base/prefs/overlay_user_pref_store.h"
      6 
      7 #include "base/prefs/pref_store_observer_mock.h"
      8 #include "base/prefs/testing_pref_store.h"
      9 #include "base/values.h"
     10 #include "testing/gmock/include/gmock/gmock.h"
     11 #include "testing/gtest/include/gtest/gtest.h"
     12 
     13 using ::testing::Mock;
     14 using ::testing::StrEq;
     15 
     16 namespace base {
     17 namespace {
     18 
     19 const char kBrowserWindowPlacement[] = "browser.window_placement";
     20 const char kShowBookmarkBar[] = "bookmark_bar.show_on_all_tabs";
     21 
     22 const char* overlay_key = kBrowserWindowPlacement;
     23 const char* regular_key = kShowBookmarkBar;
     24 // With the removal of the kWebKitGlobalXXX prefs, we'll no longer have real
     25 // prefs using the overlay pref store, so make up keys here.
     26 const char* mapped_overlay_key = "test.per_tab.javascript_enabled";
     27 const char* mapped_underlay_key = "test.per_profile.javascript_enabled";
     28 
     29 }  // namespace
     30 
     31 class OverlayUserPrefStoreTest : public testing::Test {
     32  protected:
     33   OverlayUserPrefStoreTest()
     34       : underlay_(new TestingPrefStore()),
     35         overlay_(new OverlayUserPrefStore(underlay_.get())) {
     36     overlay_->RegisterOverlayPref(overlay_key);
     37     overlay_->RegisterOverlayPref(mapped_overlay_key, mapped_underlay_key);
     38   }
     39 
     40   virtual ~OverlayUserPrefStoreTest() {}
     41 
     42   scoped_refptr<TestingPrefStore> underlay_;
     43   scoped_refptr<OverlayUserPrefStore> overlay_;
     44 };
     45 
     46 TEST_F(OverlayUserPrefStoreTest, Observer) {
     47   PrefStoreObserverMock obs;
     48   overlay_->AddObserver(&obs);
     49 
     50   // Check that underlay first value is reported.
     51   EXPECT_CALL(obs, OnPrefValueChanged(StrEq(overlay_key))).Times(1);
     52   underlay_->SetValue(overlay_key, new FundamentalValue(42));
     53   Mock::VerifyAndClearExpectations(&obs);
     54 
     55   // Check that underlay overwriting is reported.
     56   EXPECT_CALL(obs, OnPrefValueChanged(StrEq(overlay_key))).Times(1);
     57   underlay_->SetValue(overlay_key, new FundamentalValue(43));
     58   Mock::VerifyAndClearExpectations(&obs);
     59 
     60   // Check that overwriting change in overlay is reported.
     61   EXPECT_CALL(obs, OnPrefValueChanged(StrEq(overlay_key))).Times(1);
     62   overlay_->SetValue(overlay_key, new FundamentalValue(44));
     63   Mock::VerifyAndClearExpectations(&obs);
     64 
     65   // Check that hidden underlay change is not reported.
     66   EXPECT_CALL(obs, OnPrefValueChanged(StrEq(overlay_key))).Times(0);
     67   underlay_->SetValue(overlay_key, new FundamentalValue(45));
     68   Mock::VerifyAndClearExpectations(&obs);
     69 
     70   // Check that overlay remove is reported.
     71   EXPECT_CALL(obs, OnPrefValueChanged(StrEq(overlay_key))).Times(1);
     72   overlay_->RemoveValue(overlay_key);
     73   Mock::VerifyAndClearExpectations(&obs);
     74 
     75   // Check that underlay remove is reported.
     76   EXPECT_CALL(obs, OnPrefValueChanged(StrEq(overlay_key))).Times(1);
     77   underlay_->RemoveValue(overlay_key);
     78   Mock::VerifyAndClearExpectations(&obs);
     79 
     80   // Check respecting of silence.
     81   EXPECT_CALL(obs, OnPrefValueChanged(StrEq(overlay_key))).Times(0);
     82   overlay_->SetValueSilently(overlay_key, new FundamentalValue(46));
     83   Mock::VerifyAndClearExpectations(&obs);
     84 
     85   overlay_->RemoveObserver(&obs);
     86 
     87   // Check successful unsubscription.
     88   EXPECT_CALL(obs, OnPrefValueChanged(StrEq(overlay_key))).Times(0);
     89   underlay_->SetValue(overlay_key, new FundamentalValue(47));
     90   overlay_->SetValue(overlay_key, new FundamentalValue(48));
     91   Mock::VerifyAndClearExpectations(&obs);
     92 }
     93 
     94 TEST_F(OverlayUserPrefStoreTest, GetAndSet) {
     95   const Value* value = NULL;
     96   EXPECT_FALSE(overlay_->GetValue(overlay_key, &value));
     97   EXPECT_FALSE(underlay_->GetValue(overlay_key, &value));
     98 
     99   underlay_->SetValue(overlay_key, new FundamentalValue(42));
    100 
    101   // Value shines through:
    102   EXPECT_TRUE(overlay_->GetValue(overlay_key, &value));
    103   EXPECT_TRUE(base::FundamentalValue(42).Equals(value));
    104 
    105   EXPECT_TRUE(underlay_->GetValue(overlay_key, &value));
    106   EXPECT_TRUE(base::FundamentalValue(42).Equals(value));
    107 
    108   overlay_->SetValue(overlay_key, new FundamentalValue(43));
    109 
    110   EXPECT_TRUE(overlay_->GetValue(overlay_key, &value));
    111   EXPECT_TRUE(base::FundamentalValue(43).Equals(value));
    112 
    113   EXPECT_TRUE(underlay_->GetValue(overlay_key, &value));
    114   EXPECT_TRUE(base::FundamentalValue(42).Equals(value));
    115 
    116   overlay_->RemoveValue(overlay_key);
    117 
    118   // Value shines through:
    119   EXPECT_TRUE(overlay_->GetValue(overlay_key, &value));
    120   EXPECT_TRUE(base::FundamentalValue(42).Equals(value));
    121 
    122   EXPECT_TRUE(underlay_->GetValue(overlay_key, &value));
    123   EXPECT_TRUE(base::FundamentalValue(42).Equals(value));
    124 }
    125 
    126 // Check that GetMutableValue does not return the dictionary of the underlay.
    127 TEST_F(OverlayUserPrefStoreTest, ModifyDictionaries) {
    128   underlay_->SetValue(overlay_key, new DictionaryValue);
    129 
    130   Value* modify = NULL;
    131   EXPECT_TRUE(overlay_->GetMutableValue(overlay_key, &modify));
    132   ASSERT_TRUE(modify);
    133   ASSERT_TRUE(modify->IsType(Value::TYPE_DICTIONARY));
    134   static_cast<DictionaryValue*>(modify)->SetInteger(overlay_key, 42);
    135 
    136   Value* original_in_underlay = NULL;
    137   EXPECT_TRUE(underlay_->GetMutableValue(overlay_key, &original_in_underlay));
    138   ASSERT_TRUE(original_in_underlay);
    139   ASSERT_TRUE(original_in_underlay->IsType(Value::TYPE_DICTIONARY));
    140   EXPECT_TRUE(static_cast<DictionaryValue*>(original_in_underlay)->empty());
    141 
    142   Value* modified = NULL;
    143   EXPECT_TRUE(overlay_->GetMutableValue(overlay_key, &modified));
    144   ASSERT_TRUE(modified);
    145   ASSERT_TRUE(modified->IsType(Value::TYPE_DICTIONARY));
    146   EXPECT_TRUE(Value::Equals(modify, static_cast<DictionaryValue*>(modified)));
    147 }
    148 
    149 // Here we consider a global preference that is not overlayed.
    150 TEST_F(OverlayUserPrefStoreTest, GlobalPref) {
    151   PrefStoreObserverMock obs;
    152   overlay_->AddObserver(&obs);
    153 
    154   const Value* value = NULL;
    155 
    156   // Check that underlay first value is reported.
    157   EXPECT_CALL(obs, OnPrefValueChanged(StrEq(regular_key))).Times(1);
    158   underlay_->SetValue(regular_key, new FundamentalValue(42));
    159   Mock::VerifyAndClearExpectations(&obs);
    160 
    161   // Check that underlay overwriting is reported.
    162   EXPECT_CALL(obs, OnPrefValueChanged(StrEq(regular_key))).Times(1);
    163   underlay_->SetValue(regular_key, new FundamentalValue(43));
    164   Mock::VerifyAndClearExpectations(&obs);
    165 
    166   // Check that we get this value from the overlay
    167   EXPECT_TRUE(overlay_->GetValue(regular_key, &value));
    168   EXPECT_TRUE(base::FundamentalValue(43).Equals(value));
    169 
    170   // Check that overwriting change in overlay is reported.
    171   EXPECT_CALL(obs, OnPrefValueChanged(StrEq(regular_key))).Times(1);
    172   overlay_->SetValue(regular_key, new FundamentalValue(44));
    173   Mock::VerifyAndClearExpectations(&obs);
    174 
    175   // Check that we get this value from the overlay and the underlay.
    176   EXPECT_TRUE(overlay_->GetValue(regular_key, &value));
    177   EXPECT_TRUE(base::FundamentalValue(44).Equals(value));
    178   EXPECT_TRUE(underlay_->GetValue(regular_key, &value));
    179   EXPECT_TRUE(base::FundamentalValue(44).Equals(value));
    180 
    181   // Check that overlay remove is reported.
    182   EXPECT_CALL(obs, OnPrefValueChanged(StrEq(regular_key))).Times(1);
    183   overlay_->RemoveValue(regular_key);
    184   Mock::VerifyAndClearExpectations(&obs);
    185 
    186   // Check that value was removed from overlay and underlay
    187   EXPECT_FALSE(overlay_->GetValue(regular_key, &value));
    188   EXPECT_FALSE(underlay_->GetValue(regular_key, &value));
    189 
    190   // Check respecting of silence.
    191   EXPECT_CALL(obs, OnPrefValueChanged(StrEq(regular_key))).Times(0);
    192   overlay_->SetValueSilently(regular_key, new FundamentalValue(46));
    193   Mock::VerifyAndClearExpectations(&obs);
    194 
    195   overlay_->RemoveObserver(&obs);
    196 
    197   // Check successful unsubscription.
    198   EXPECT_CALL(obs, OnPrefValueChanged(StrEq(regular_key))).Times(0);
    199   underlay_->SetValue(regular_key, new FundamentalValue(47));
    200   overlay_->SetValue(regular_key, new FundamentalValue(48));
    201   Mock::VerifyAndClearExpectations(&obs);
    202 }
    203 
    204 // Check that names mapping works correctly.
    205 TEST_F(OverlayUserPrefStoreTest, NamesMapping) {
    206   PrefStoreObserverMock obs;
    207   overlay_->AddObserver(&obs);
    208 
    209   const Value* value = NULL;
    210 
    211   // Check that if there is no override in the overlay, changing underlay value
    212   // is reported as changing an overlay value.
    213   EXPECT_CALL(obs, OnPrefValueChanged(StrEq(mapped_overlay_key))).Times(1);
    214   underlay_->SetValue(mapped_underlay_key, new FundamentalValue(42));
    215   Mock::VerifyAndClearExpectations(&obs);
    216 
    217   // Check that underlay overwriting is reported.
    218   EXPECT_CALL(obs, OnPrefValueChanged(StrEq(mapped_overlay_key))).Times(1);
    219   underlay_->SetValue(mapped_underlay_key, new FundamentalValue(43));
    220   Mock::VerifyAndClearExpectations(&obs);
    221 
    222   // Check that we get this value from the overlay with both keys
    223   EXPECT_TRUE(overlay_->GetValue(mapped_overlay_key, &value));
    224   EXPECT_TRUE(base::FundamentalValue(43).Equals(value));
    225   // In this case, overlay reads directly from the underlay.
    226   EXPECT_TRUE(overlay_->GetValue(mapped_underlay_key, &value));
    227   EXPECT_TRUE(base::FundamentalValue(43).Equals(value));
    228 
    229   // Check that overwriting change in overlay is reported.
    230   EXPECT_CALL(obs, OnPrefValueChanged(StrEq(mapped_overlay_key))).Times(1);
    231   overlay_->SetValue(mapped_overlay_key, new FundamentalValue(44));
    232   Mock::VerifyAndClearExpectations(&obs);
    233 
    234   // Check that we get an overriden value from overlay, while reading the
    235   // value from underlay still holds an old value.
    236   EXPECT_TRUE(overlay_->GetValue(mapped_overlay_key, &value));
    237   EXPECT_TRUE(base::FundamentalValue(44).Equals(value));
    238   EXPECT_TRUE(overlay_->GetValue(mapped_underlay_key, &value));
    239   EXPECT_TRUE(base::FundamentalValue(43).Equals(value));
    240   EXPECT_TRUE(underlay_->GetValue(mapped_underlay_key, &value));
    241   EXPECT_TRUE(base::FundamentalValue(43).Equals(value));
    242 
    243   // Check that hidden underlay change is not reported.
    244   EXPECT_CALL(obs, OnPrefValueChanged(StrEq(mapped_overlay_key))).Times(0);
    245   underlay_->SetValue(mapped_underlay_key, new FundamentalValue(45));
    246   Mock::VerifyAndClearExpectations(&obs);
    247 
    248   // Check that overlay remove is reported.
    249   EXPECT_CALL(obs, OnPrefValueChanged(StrEq(mapped_overlay_key))).Times(1);
    250   overlay_->RemoveValue(mapped_overlay_key);
    251   Mock::VerifyAndClearExpectations(&obs);
    252 
    253   // Check that underlay remove is reported.
    254   EXPECT_CALL(obs, OnPrefValueChanged(StrEq(mapped_overlay_key))).Times(1);
    255   underlay_->RemoveValue(mapped_underlay_key);
    256   Mock::VerifyAndClearExpectations(&obs);
    257 
    258   // Check that value was removed.
    259   EXPECT_FALSE(overlay_->GetValue(mapped_overlay_key, &value));
    260   EXPECT_FALSE(overlay_->GetValue(mapped_underlay_key, &value));
    261 
    262   // Check respecting of silence.
    263   EXPECT_CALL(obs, OnPrefValueChanged(StrEq(mapped_overlay_key))).Times(0);
    264   EXPECT_CALL(obs, OnPrefValueChanged(StrEq(mapped_underlay_key))).Times(0);
    265   overlay_->SetValueSilently(mapped_overlay_key, new FundamentalValue(46));
    266   Mock::VerifyAndClearExpectations(&obs);
    267 
    268   overlay_->RemoveObserver(&obs);
    269 
    270   // Check successful unsubscription.
    271   EXPECT_CALL(obs, OnPrefValueChanged(StrEq(mapped_overlay_key))).Times(0);
    272   EXPECT_CALL(obs, OnPrefValueChanged(StrEq(mapped_underlay_key))).Times(0);
    273   underlay_->SetValue(mapped_underlay_key, new FundamentalValue(47));
    274   overlay_->SetValue(mapped_overlay_key, new FundamentalValue(48));
    275   Mock::VerifyAndClearExpectations(&obs);
    276 }
    277 
    278 }  // namespace base
    279