|  | // Copyright 2016 The Chromium Authors. All rights reserved. | 
|  | // Use of this source code is governed by a BSD-style license that can be | 
|  | // found in the LICENSE file. | 
|  |  | 
|  | #include "components/prefs/in_memory_pref_store.h" | 
|  |  | 
|  | #include <memory> | 
|  |  | 
|  | #include "base/test/scoped_task_environment.h" | 
|  | #include "base/values.h" | 
|  | #include "components/prefs/persistent_pref_store_unittest.h" | 
|  | #include "components/prefs/pref_store_observer_mock.h" | 
|  | #include "testing/gmock/include/gmock/gmock.h" | 
|  | #include "testing/gtest/include/gtest/gtest.h" | 
|  |  | 
|  | namespace { | 
|  | const char kTestPref[] = "test.pref"; | 
|  |  | 
|  | class InMemoryPrefStoreTest : public testing::Test { | 
|  | public: | 
|  | InMemoryPrefStoreTest() {} | 
|  |  | 
|  | void SetUp() override { store_ = new InMemoryPrefStore(); } | 
|  |  | 
|  | protected: | 
|  | base::test::ScopedTaskEnvironment scoped_task_environment_; | 
|  | scoped_refptr<InMemoryPrefStore> store_; | 
|  | PrefStoreObserverMock observer_; | 
|  | }; | 
|  |  | 
|  | TEST_F(InMemoryPrefStoreTest, SetGetValue) { | 
|  | const base::Value* value = nullptr; | 
|  | base::Value* mutable_value = nullptr; | 
|  | EXPECT_FALSE(store_->GetValue(kTestPref, &value)); | 
|  | EXPECT_FALSE(store_->GetMutableValue(kTestPref, &mutable_value)); | 
|  |  | 
|  | store_->SetValue(kTestPref, std::make_unique<base::Value>(42), | 
|  | WriteablePrefStore::DEFAULT_PREF_WRITE_FLAGS); | 
|  | EXPECT_TRUE(store_->GetValue(kTestPref, &value)); | 
|  | EXPECT_TRUE(base::Value(42).Equals(value)); | 
|  | EXPECT_TRUE(store_->GetMutableValue(kTestPref, &mutable_value)); | 
|  | EXPECT_TRUE(base::Value(42).Equals(mutable_value)); | 
|  |  | 
|  | store_->RemoveValue(kTestPref, WriteablePrefStore::DEFAULT_PREF_WRITE_FLAGS); | 
|  | EXPECT_FALSE(store_->GetValue(kTestPref, &value)); | 
|  | EXPECT_FALSE(store_->GetMutableValue(kTestPref, &mutable_value)); | 
|  | } | 
|  |  | 
|  | TEST_F(InMemoryPrefStoreTest, GetSetObserver) { | 
|  | // Starts with no observers. | 
|  | EXPECT_FALSE(store_->HasObservers()); | 
|  |  | 
|  | // Add one. | 
|  | store_->AddObserver(&observer_); | 
|  | EXPECT_TRUE(store_->HasObservers()); | 
|  |  | 
|  | // Remove only observer. | 
|  | store_->RemoveObserver(&observer_); | 
|  | EXPECT_FALSE(store_->HasObservers()); | 
|  | } | 
|  |  | 
|  | TEST_F(InMemoryPrefStoreTest, CallObserver) { | 
|  | // With observer included. | 
|  | store_->AddObserver(&observer_); | 
|  |  | 
|  | // Triggers on SetValue. | 
|  | store_->SetValue(kTestPref, std::make_unique<base::Value>(42), | 
|  | WriteablePrefStore::DEFAULT_PREF_WRITE_FLAGS); | 
|  | observer_.VerifyAndResetChangedKey(kTestPref); | 
|  |  | 
|  | // And RemoveValue. | 
|  | store_->RemoveValue(kTestPref, WriteablePrefStore::DEFAULT_PREF_WRITE_FLAGS); | 
|  | observer_.VerifyAndResetChangedKey(kTestPref); | 
|  |  | 
|  | // But not SetValueSilently. | 
|  | store_->SetValueSilently(kTestPref, std::make_unique<base::Value>(42), | 
|  | WriteablePrefStore::DEFAULT_PREF_WRITE_FLAGS); | 
|  | EXPECT_EQ(0u, observer_.changed_keys.size()); | 
|  |  | 
|  | // On multiple RemoveValues only the first one triggers observer. | 
|  | store_->RemoveValue(kTestPref, WriteablePrefStore::DEFAULT_PREF_WRITE_FLAGS); | 
|  | observer_.VerifyAndResetChangedKey(kTestPref); | 
|  | store_->RemoveValue(kTestPref, WriteablePrefStore::DEFAULT_PREF_WRITE_FLAGS); | 
|  | EXPECT_EQ(0u, observer_.changed_keys.size()); | 
|  |  | 
|  | // Doesn't make call on removed observers. | 
|  | store_->RemoveObserver(&observer_); | 
|  | store_->SetValue(kTestPref, std::make_unique<base::Value>(42), | 
|  | WriteablePrefStore::DEFAULT_PREF_WRITE_FLAGS); | 
|  | store_->RemoveValue(kTestPref, WriteablePrefStore::DEFAULT_PREF_WRITE_FLAGS); | 
|  | EXPECT_EQ(0u, observer_.changed_keys.size()); | 
|  | } | 
|  |  | 
|  | TEST_F(InMemoryPrefStoreTest, Initialization) { | 
|  | EXPECT_TRUE(store_->IsInitializationComplete()); | 
|  | } | 
|  |  | 
|  | TEST_F(InMemoryPrefStoreTest, ReadOnly) { | 
|  | EXPECT_FALSE(store_->ReadOnly()); | 
|  | } | 
|  |  | 
|  | TEST_F(InMemoryPrefStoreTest, GetReadError) { | 
|  | EXPECT_EQ(PersistentPrefStore::PREF_READ_ERROR_NONE, store_->GetReadError()); | 
|  | } | 
|  |  | 
|  | TEST_F(InMemoryPrefStoreTest, ReadPrefs) { | 
|  | EXPECT_EQ(PersistentPrefStore::PREF_READ_ERROR_NONE, store_->ReadPrefs()); | 
|  | } | 
|  |  | 
|  | TEST_F(InMemoryPrefStoreTest, CommitPendingWriteWithCallback) { | 
|  | TestCommitPendingWriteWithCallback(store_.get(), &scoped_task_environment_); | 
|  | } | 
|  |  | 
|  | }  // namespace |