172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen// Copyright (c) 2011 The Chromium Authors. All rights reserved. 272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen// Use of this source code is governed by a BSD-style license that can be 372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen// found in the LICENSE file. 472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen 572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen#include "base/values.h" 672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen#include "chrome/browser/prefs/overlay_persistent_pref_store.h" 772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen#include "chrome/browser/prefs/testing_pref_store.h" 872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen#include "chrome/common/pref_store_observer_mock.h" 972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen#include "testing/gmock/include/gmock/gmock.h" 1072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen#include "testing/gtest/include/gtest/gtest.h" 1172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen 1272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsenusing ::testing::Mock; 1372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsenusing ::testing::StrEq; 1472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen 1572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsenconst char key[] = "test.key"; 1672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen 1772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsenclass OverlayPersistentPrefStoreTest : public testing::Test { 1872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen public: 1972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen OverlayPersistentPrefStoreTest() 2072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen : underlay_(new TestingPrefStore()), 2172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen overlay_(new OverlayPersistentPrefStore(underlay_.get())) { 2272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen } 2372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen 2472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen scoped_refptr<TestingPrefStore> underlay_; 2572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen scoped_refptr<OverlayPersistentPrefStore> overlay_; 2672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen}; 2772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen 2872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian MonsenTEST_F(OverlayPersistentPrefStoreTest, Observer) { 2972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen PrefStoreObserverMock obs; 3072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen overlay_->AddObserver(&obs); 3172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen 3272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen // Check that underlay first value is reported. 3372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen EXPECT_CALL(obs, OnPrefValueChanged(StrEq(key))).Times(1); 3472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen underlay_->SetValue(key, Value::CreateIntegerValue(42)); 3572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen Mock::VerifyAndClearExpectations(&obs); 3672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen 3772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen // Check that underlay overwriting is reported. 3872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen EXPECT_CALL(obs, OnPrefValueChanged(StrEq(key))).Times(1); 3972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen underlay_->SetValue(key, Value::CreateIntegerValue(43)); 4072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen Mock::VerifyAndClearExpectations(&obs); 4172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen 4272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen // Check that overwriting change in overlay is reported. 4372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen EXPECT_CALL(obs, OnPrefValueChanged(StrEq(key))).Times(1); 4472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen overlay_->SetValue(key, Value::CreateIntegerValue(44)); 4572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen Mock::VerifyAndClearExpectations(&obs); 4672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen 4772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen // Check that hidden underlay change is not reported. 4872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen EXPECT_CALL(obs, OnPrefValueChanged(StrEq(key))).Times(0); 4972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen underlay_->SetValue(key, Value::CreateIntegerValue(45)); 5072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen Mock::VerifyAndClearExpectations(&obs); 5172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen 5272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen // Check that overlay remove is reported. 5372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen EXPECT_CALL(obs, OnPrefValueChanged(StrEq(key))).Times(1); 5472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen overlay_->RemoveValue(key); 5572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen Mock::VerifyAndClearExpectations(&obs); 5672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen 5772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen // Check that underlay remove is reported. 5872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen EXPECT_CALL(obs, OnPrefValueChanged(StrEq(key))).Times(1); 5972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen underlay_->RemoveValue(key); 6072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen Mock::VerifyAndClearExpectations(&obs); 6172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen 6272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen // Check respecting of silence. 6372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen EXPECT_CALL(obs, OnPrefValueChanged(StrEq(key))).Times(0); 6472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen overlay_->SetValueSilently(key, Value::CreateIntegerValue(46)); 6572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen Mock::VerifyAndClearExpectations(&obs); 6672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen 6772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen overlay_->RemoveObserver(&obs); 6872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen 6972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen // Check successful unsubscription. 7072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen EXPECT_CALL(obs, OnPrefValueChanged(StrEq(key))).Times(0); 7172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen underlay_->SetValue(key, Value::CreateIntegerValue(47)); 7272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen overlay_->SetValue(key, Value::CreateIntegerValue(48)); 7372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen Mock::VerifyAndClearExpectations(&obs); 7472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen} 7572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen 7672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian MonsenTEST_F(OverlayPersistentPrefStoreTest, GetAndSet) { 77ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen const Value* value = NULL; 7872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen int i = -1; 7972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen EXPECT_EQ(PrefStore::READ_NO_VALUE, overlay_->GetValue(key, &value)); 8072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen EXPECT_EQ(PrefStore::READ_NO_VALUE, underlay_->GetValue(key, &value)); 8172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen 8272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen underlay_->SetValue(key, Value::CreateIntegerValue(42)); 8372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen 8472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen // Value shines through: 8572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen EXPECT_EQ(PrefStore::READ_OK, overlay_->GetValue(key, &value)); 8672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen ASSERT_TRUE(value); 8772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen EXPECT_TRUE(value->GetAsInteger(&i)); 8872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen EXPECT_EQ(42, i); 8972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen 9072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen EXPECT_EQ(PrefStore::READ_OK, underlay_->GetValue(key, &value)); 9172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen ASSERT_TRUE(value); 9272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen EXPECT_TRUE(value->GetAsInteger(&i)); 9372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen EXPECT_EQ(42, i); 9472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen 9572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen overlay_->SetValue(key, Value::CreateIntegerValue(43)); 9672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen 9772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen EXPECT_EQ(PrefStore::READ_OK, overlay_->GetValue(key, &value)); 9872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen ASSERT_TRUE(value); 9972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen EXPECT_TRUE(value->GetAsInteger(&i)); 10072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen EXPECT_EQ(43, i); 10172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen 10272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen EXPECT_EQ(PrefStore::READ_OK, underlay_->GetValue(key, &value)); 10372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen ASSERT_TRUE(value); 10472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen EXPECT_TRUE(value->GetAsInteger(&i)); 10572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen EXPECT_EQ(42, i); 10672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen 10772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen overlay_->RemoveValue(key); 10872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen 10972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen // Value shines through: 11072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen EXPECT_EQ(PrefStore::READ_OK, overlay_->GetValue(key, &value)); 11172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen ASSERT_TRUE(value); 11272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen EXPECT_TRUE(value->GetAsInteger(&i)); 11372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen EXPECT_EQ(42, i); 11472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen 11572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen EXPECT_EQ(PrefStore::READ_OK, underlay_->GetValue(key, &value)); 11672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen ASSERT_TRUE(value); 11772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen EXPECT_TRUE(value->GetAsInteger(&i)); 11872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen EXPECT_EQ(42, i); 11972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen} 120ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 121ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen// Check that GetMutableValue does not return the dictionary of the underlay. 122ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian MonsenTEST_F(OverlayPersistentPrefStoreTest, ModifyDictionaries) { 123ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen underlay_->SetValue(key, new DictionaryValue); 124ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 125ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen Value* modify = NULL; 126ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen EXPECT_EQ(PrefStore::READ_OK, overlay_->GetMutableValue(key, &modify)); 127ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen ASSERT_TRUE(modify); 128ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen ASSERT_TRUE(modify->GetType() == Value::TYPE_DICTIONARY); 129ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen static_cast<DictionaryValue*>(modify)->SetInteger(key, 42); 130ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 131ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen Value* original_in_underlay = NULL; 132ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen EXPECT_EQ(PrefStore::READ_OK, 133ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen underlay_->GetMutableValue(key, &original_in_underlay)); 134ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen ASSERT_TRUE(original_in_underlay); 135ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen ASSERT_TRUE(original_in_underlay->GetType() == Value::TYPE_DICTIONARY); 136ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen EXPECT_TRUE(static_cast<DictionaryValue*>(original_in_underlay)->empty()); 137ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 138ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen Value* modified = NULL; 139ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen EXPECT_EQ(PrefStore::READ_OK, overlay_->GetMutableValue(key, &modified)); 140ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen ASSERT_TRUE(modified); 141ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen ASSERT_TRUE(modified->GetType() == Value::TYPE_DICTIONARY); 142ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen EXPECT_TRUE(Value::Equals(modify, static_cast<DictionaryValue*>(modified))); 143ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen} 144