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