1 // Copyright 2016 The Chromium Authors
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 "components/prefs/in_memory_pref_store.h"
6
7 #include <memory>
8
9 #include "base/test/task_environment.h"
10 #include "base/values.h"
11 #include "components/prefs/persistent_pref_store_unittest.h"
12 #include "components/prefs/pref_store_observer_mock.h"
13 #include "testing/gmock/include/gmock/gmock.h"
14 #include "testing/gtest/include/gtest/gtest.h"
15
16 namespace {
17 const char kTestPref[] = "test.pref";
18
19 class InMemoryPrefStoreTest : public testing::Test {
20 public:
InMemoryPrefStoreTest()21 InMemoryPrefStoreTest() { }
22
SetUp()23 void SetUp() override { store_ = new InMemoryPrefStore(); }
24 protected:
25 base::test::TaskEnvironment task_environment_;
26 scoped_refptr<InMemoryPrefStore> store_;
27 PrefStoreObserverMock observer_;
28 };
29
TEST_F(InMemoryPrefStoreTest,SetGetValue)30 TEST_F(InMemoryPrefStoreTest, SetGetValue) {
31 const base::Value* value = nullptr;
32 base::Value* mutable_value = nullptr;
33 EXPECT_FALSE(store_->GetValue(kTestPref, &value));
34 EXPECT_FALSE(store_->GetMutableValue(kTestPref, &mutable_value));
35
36 store_->SetValue(kTestPref, base::Value(42),
37 WriteablePrefStore::DEFAULT_PREF_WRITE_FLAGS);
38 EXPECT_TRUE(store_->GetValue(kTestPref, &value));
39 EXPECT_EQ(base::Value(42), *value);
40 EXPECT_TRUE(store_->GetMutableValue(kTestPref, &mutable_value));
41 EXPECT_EQ(base::Value(42), *mutable_value);
42
43 store_->RemoveValue(kTestPref, WriteablePrefStore::DEFAULT_PREF_WRITE_FLAGS);
44 EXPECT_FALSE(store_->GetValue(kTestPref, &value));
45 EXPECT_FALSE(store_->GetMutableValue(kTestPref, &mutable_value));
46 }
47
TEST_F(InMemoryPrefStoreTest,GetSetObserver)48 TEST_F(InMemoryPrefStoreTest, GetSetObserver) {
49 // Starts with no observers.
50 EXPECT_FALSE(store_->HasObservers());
51
52 // Add one.
53 store_->AddObserver(&observer_);
54 EXPECT_TRUE(store_->HasObservers());
55
56 // Remove only observer.
57 store_->RemoveObserver(&observer_);
58 EXPECT_FALSE(store_->HasObservers());
59 }
60
TEST_F(InMemoryPrefStoreTest,CallObserver)61 TEST_F(InMemoryPrefStoreTest, CallObserver) {
62 // With observer included.
63 store_->AddObserver(&observer_);
64
65 // Triggers on SetValue.
66 store_->SetValue(kTestPref, base::Value(42),
67 WriteablePrefStore::DEFAULT_PREF_WRITE_FLAGS);
68 observer_.VerifyAndResetChangedKey(kTestPref);
69
70 // And RemoveValue.
71 store_->RemoveValue(kTestPref, WriteablePrefStore::DEFAULT_PREF_WRITE_FLAGS);
72 observer_.VerifyAndResetChangedKey(kTestPref);
73
74 // But not SetValueSilently.
75 store_->SetValueSilently(kTestPref, base::Value(42),
76 WriteablePrefStore::DEFAULT_PREF_WRITE_FLAGS);
77 EXPECT_EQ(0u, observer_.changed_keys.size());
78
79 // On multiple RemoveValues only the first one triggers observer.
80 store_->RemoveValue(kTestPref, WriteablePrefStore::DEFAULT_PREF_WRITE_FLAGS);
81 observer_.VerifyAndResetChangedKey(kTestPref);
82 store_->RemoveValue(kTestPref, WriteablePrefStore::DEFAULT_PREF_WRITE_FLAGS);
83 EXPECT_EQ(0u, observer_.changed_keys.size());
84
85 // Doesn't make call on removed observers.
86 store_->RemoveObserver(&observer_);
87 store_->SetValue(kTestPref, base::Value(42),
88 WriteablePrefStore::DEFAULT_PREF_WRITE_FLAGS);
89 store_->RemoveValue(kTestPref, WriteablePrefStore::DEFAULT_PREF_WRITE_FLAGS);
90 EXPECT_EQ(0u, observer_.changed_keys.size());
91 }
92
TEST_F(InMemoryPrefStoreTest,Initialization)93 TEST_F(InMemoryPrefStoreTest, Initialization) {
94 EXPECT_TRUE(store_->IsInitializationComplete());
95 }
96
TEST_F(InMemoryPrefStoreTest,ReadOnly)97 TEST_F(InMemoryPrefStoreTest, ReadOnly) {
98 EXPECT_FALSE(store_->ReadOnly());
99 }
100
TEST_F(InMemoryPrefStoreTest,GetReadError)101 TEST_F(InMemoryPrefStoreTest, GetReadError) {
102 EXPECT_EQ(PersistentPrefStore::PREF_READ_ERROR_NONE, store_->GetReadError());
103 }
104
TEST_F(InMemoryPrefStoreTest,ReadPrefs)105 TEST_F(InMemoryPrefStoreTest, ReadPrefs) {
106 EXPECT_EQ(PersistentPrefStore::PREF_READ_ERROR_NONE, store_->ReadPrefs());
107 }
108
TEST_F(InMemoryPrefStoreTest,CommitPendingWriteWithCallback)109 TEST_F(InMemoryPrefStoreTest, CommitPendingWriteWithCallback) {
110 TestCommitPendingWriteWithCallback(store_.get(), &task_environment_);
111 }
112
TEST_F(InMemoryPrefStoreTest,RemoveValuesByPrefix)113 TEST_F(InMemoryPrefStoreTest, RemoveValuesByPrefix) {
114 const base::Value* value;
115 const std::string prefix = "pref";
116 const std::string subpref_name1 = "pref.a";
117 const std::string subpref_name2 = "pref.b";
118 const std::string other_name = "other";
119
120 store_->SetValue(subpref_name1, base::Value(42),
121 WriteablePrefStore::DEFAULT_PREF_WRITE_FLAGS);
122 store_->SetValue(subpref_name2, base::Value(42),
123 WriteablePrefStore::DEFAULT_PREF_WRITE_FLAGS);
124 store_->SetValue(other_name, base::Value(42),
125 WriteablePrefStore::DEFAULT_PREF_WRITE_FLAGS);
126
127 store_->RemoveValuesByPrefixSilently(prefix);
128 EXPECT_FALSE(store_->GetValue(subpref_name1, &value));
129 EXPECT_FALSE(store_->GetValue(subpref_name2, &value));
130 EXPECT_TRUE(store_->GetValue(other_name, &value));
131 }
132
133 } // namespace
134