1*5a923131SAndroid Build Coastguard Worker //
2*5a923131SAndroid Build Coastguard Worker // Copyright (C) 2012 The Android Open Source Project
3*5a923131SAndroid Build Coastguard Worker //
4*5a923131SAndroid Build Coastguard Worker // Licensed under the Apache License, Version 2.0 (the "License");
5*5a923131SAndroid Build Coastguard Worker // you may not use this file except in compliance with the License.
6*5a923131SAndroid Build Coastguard Worker // You may obtain a copy of the License at
7*5a923131SAndroid Build Coastguard Worker //
8*5a923131SAndroid Build Coastguard Worker // http://www.apache.org/licenses/LICENSE-2.0
9*5a923131SAndroid Build Coastguard Worker //
10*5a923131SAndroid Build Coastguard Worker // Unless required by applicable law or agreed to in writing, software
11*5a923131SAndroid Build Coastguard Worker // distributed under the License is distributed on an "AS IS" BASIS,
12*5a923131SAndroid Build Coastguard Worker // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13*5a923131SAndroid Build Coastguard Worker // See the License for the specific language governing permissions and
14*5a923131SAndroid Build Coastguard Worker // limitations under the License.
15*5a923131SAndroid Build Coastguard Worker //
16*5a923131SAndroid Build Coastguard Worker
17*5a923131SAndroid Build Coastguard Worker #include "update_engine/common/prefs.h"
18*5a923131SAndroid Build Coastguard Worker
19*5a923131SAndroid Build Coastguard Worker #include <inttypes.h>
20*5a923131SAndroid Build Coastguard Worker
21*5a923131SAndroid Build Coastguard Worker #include <limits>
22*5a923131SAndroid Build Coastguard Worker #include <string>
23*5a923131SAndroid Build Coastguard Worker #include <vector>
24*5a923131SAndroid Build Coastguard Worker
25*5a923131SAndroid Build Coastguard Worker #include <base/files/file_util.h>
26*5a923131SAndroid Build Coastguard Worker #include <base/files/scoped_temp_dir.h>
27*5a923131SAndroid Build Coastguard Worker #include <android-base/macros.h>
28*5a923131SAndroid Build Coastguard Worker #include <android-base/stringprintf.h>
29*5a923131SAndroid Build Coastguard Worker #include <gmock/gmock.h>
30*5a923131SAndroid Build Coastguard Worker #include <gtest/gtest.h>
31*5a923131SAndroid Build Coastguard Worker
32*5a923131SAndroid Build Coastguard Worker using std::string;
33*5a923131SAndroid Build Coastguard Worker using std::vector;
34*5a923131SAndroid Build Coastguard Worker using testing::_;
35*5a923131SAndroid Build Coastguard Worker using testing::ElementsAre;
36*5a923131SAndroid Build Coastguard Worker using testing::Eq;
37*5a923131SAndroid Build Coastguard Worker using testing::UnorderedElementsAre;
38*5a923131SAndroid Build Coastguard Worker
39*5a923131SAndroid Build Coastguard Worker namespace {
40*5a923131SAndroid Build Coastguard Worker // Test key used along the tests.
41*5a923131SAndroid Build Coastguard Worker const char kKey[] = "test-key";
42*5a923131SAndroid Build Coastguard Worker } // namespace
43*5a923131SAndroid Build Coastguard Worker
44*5a923131SAndroid Build Coastguard Worker namespace chromeos_update_engine {
45*5a923131SAndroid Build Coastguard Worker
46*5a923131SAndroid Build Coastguard Worker class BasePrefsTest : public ::testing::Test {
47*5a923131SAndroid Build Coastguard Worker protected:
MultiNamespaceKeyTest()48*5a923131SAndroid Build Coastguard Worker void MultiNamespaceKeyTest() {
49*5a923131SAndroid Build Coastguard Worker ASSERT_TRUE(common_prefs_);
50*5a923131SAndroid Build Coastguard Worker auto key0 = common_prefs_->CreateSubKey({"ns1", "key"});
51*5a923131SAndroid Build Coastguard Worker // Corner case for "ns1".
52*5a923131SAndroid Build Coastguard Worker auto key0corner = common_prefs_->CreateSubKey({"ns11", "key"});
53*5a923131SAndroid Build Coastguard Worker auto key1A = common_prefs_->CreateSubKey({"ns1", "nsA", "keyA"});
54*5a923131SAndroid Build Coastguard Worker auto key1B = common_prefs_->CreateSubKey({"ns1", "nsA", "keyB"});
55*5a923131SAndroid Build Coastguard Worker auto key2 = common_prefs_->CreateSubKey({"ns1", "nsB", "key"});
56*5a923131SAndroid Build Coastguard Worker // Corner case for "ns1/nsB".
57*5a923131SAndroid Build Coastguard Worker auto key2corner = common_prefs_->CreateSubKey({"ns1", "nsB1", "key"});
58*5a923131SAndroid Build Coastguard Worker EXPECT_FALSE(common_prefs_->Exists(key0));
59*5a923131SAndroid Build Coastguard Worker EXPECT_FALSE(common_prefs_->Exists(key1A));
60*5a923131SAndroid Build Coastguard Worker EXPECT_FALSE(common_prefs_->Exists(key1B));
61*5a923131SAndroid Build Coastguard Worker EXPECT_FALSE(common_prefs_->Exists(key2));
62*5a923131SAndroid Build Coastguard Worker
63*5a923131SAndroid Build Coastguard Worker EXPECT_TRUE(common_prefs_->SetString(key0, ""));
64*5a923131SAndroid Build Coastguard Worker EXPECT_TRUE(common_prefs_->SetString(key0corner, ""));
65*5a923131SAndroid Build Coastguard Worker EXPECT_TRUE(common_prefs_->SetString(key1A, ""));
66*5a923131SAndroid Build Coastguard Worker EXPECT_TRUE(common_prefs_->SetString(key1B, ""));
67*5a923131SAndroid Build Coastguard Worker EXPECT_TRUE(common_prefs_->SetString(key2, ""));
68*5a923131SAndroid Build Coastguard Worker EXPECT_TRUE(common_prefs_->SetString(key2corner, ""));
69*5a923131SAndroid Build Coastguard Worker
70*5a923131SAndroid Build Coastguard Worker EXPECT_TRUE(common_prefs_->Exists(key0));
71*5a923131SAndroid Build Coastguard Worker EXPECT_TRUE(common_prefs_->Exists(key0corner));
72*5a923131SAndroid Build Coastguard Worker EXPECT_TRUE(common_prefs_->Exists(key1A));
73*5a923131SAndroid Build Coastguard Worker EXPECT_TRUE(common_prefs_->Exists(key1B));
74*5a923131SAndroid Build Coastguard Worker EXPECT_TRUE(common_prefs_->Exists(key2));
75*5a923131SAndroid Build Coastguard Worker EXPECT_TRUE(common_prefs_->Exists(key2corner));
76*5a923131SAndroid Build Coastguard Worker
77*5a923131SAndroid Build Coastguard Worker vector<string> keys2;
78*5a923131SAndroid Build Coastguard Worker EXPECT_TRUE(common_prefs_->GetSubKeys("ns1/nsB/", &keys2));
79*5a923131SAndroid Build Coastguard Worker EXPECT_THAT(keys2, ElementsAre(key2));
80*5a923131SAndroid Build Coastguard Worker for (const auto& key : keys2)
81*5a923131SAndroid Build Coastguard Worker EXPECT_TRUE(common_prefs_->Delete(key));
82*5a923131SAndroid Build Coastguard Worker EXPECT_TRUE(common_prefs_->Exists(key0));
83*5a923131SAndroid Build Coastguard Worker EXPECT_TRUE(common_prefs_->Exists(key0corner));
84*5a923131SAndroid Build Coastguard Worker EXPECT_TRUE(common_prefs_->Exists(key1A));
85*5a923131SAndroid Build Coastguard Worker EXPECT_TRUE(common_prefs_->Exists(key1B));
86*5a923131SAndroid Build Coastguard Worker EXPECT_FALSE(common_prefs_->Exists(key2));
87*5a923131SAndroid Build Coastguard Worker EXPECT_TRUE(common_prefs_->Exists(key2corner));
88*5a923131SAndroid Build Coastguard Worker
89*5a923131SAndroid Build Coastguard Worker vector<string> keys2corner;
90*5a923131SAndroid Build Coastguard Worker EXPECT_TRUE(common_prefs_->GetSubKeys("ns1/nsB", &keys2corner));
91*5a923131SAndroid Build Coastguard Worker EXPECT_THAT(keys2corner, ElementsAre(key2corner));
92*5a923131SAndroid Build Coastguard Worker for (const auto& key : keys2corner)
93*5a923131SAndroid Build Coastguard Worker EXPECT_TRUE(common_prefs_->Delete(key));
94*5a923131SAndroid Build Coastguard Worker EXPECT_FALSE(common_prefs_->Exists(key2corner));
95*5a923131SAndroid Build Coastguard Worker
96*5a923131SAndroid Build Coastguard Worker vector<string> keys1;
97*5a923131SAndroid Build Coastguard Worker EXPECT_TRUE(common_prefs_->GetSubKeys("ns1/nsA/", &keys1));
98*5a923131SAndroid Build Coastguard Worker EXPECT_THAT(keys1, UnorderedElementsAre(key1A, key1B));
99*5a923131SAndroid Build Coastguard Worker for (const auto& key : keys1)
100*5a923131SAndroid Build Coastguard Worker EXPECT_TRUE(common_prefs_->Delete(key));
101*5a923131SAndroid Build Coastguard Worker EXPECT_TRUE(common_prefs_->Exists(key0));
102*5a923131SAndroid Build Coastguard Worker EXPECT_TRUE(common_prefs_->Exists(key0corner));
103*5a923131SAndroid Build Coastguard Worker EXPECT_FALSE(common_prefs_->Exists(key1A));
104*5a923131SAndroid Build Coastguard Worker EXPECT_FALSE(common_prefs_->Exists(key1B));
105*5a923131SAndroid Build Coastguard Worker
106*5a923131SAndroid Build Coastguard Worker vector<string> keys0;
107*5a923131SAndroid Build Coastguard Worker EXPECT_TRUE(common_prefs_->GetSubKeys("ns1/", &keys0));
108*5a923131SAndroid Build Coastguard Worker EXPECT_THAT(keys0, ElementsAre(key0));
109*5a923131SAndroid Build Coastguard Worker for (const auto& key : keys0)
110*5a923131SAndroid Build Coastguard Worker EXPECT_TRUE(common_prefs_->Delete(key));
111*5a923131SAndroid Build Coastguard Worker EXPECT_FALSE(common_prefs_->Exists(key0));
112*5a923131SAndroid Build Coastguard Worker EXPECT_TRUE(common_prefs_->Exists(key0corner));
113*5a923131SAndroid Build Coastguard Worker
114*5a923131SAndroid Build Coastguard Worker vector<string> keys0corner;
115*5a923131SAndroid Build Coastguard Worker EXPECT_TRUE(common_prefs_->GetSubKeys("ns1", &keys0corner));
116*5a923131SAndroid Build Coastguard Worker EXPECT_THAT(keys0corner, ElementsAre(key0corner));
117*5a923131SAndroid Build Coastguard Worker for (const auto& key : keys0corner)
118*5a923131SAndroid Build Coastguard Worker EXPECT_TRUE(common_prefs_->Delete(key));
119*5a923131SAndroid Build Coastguard Worker EXPECT_FALSE(common_prefs_->Exists(key0corner));
120*5a923131SAndroid Build Coastguard Worker
121*5a923131SAndroid Build Coastguard Worker // Test sub directory namespace.
122*5a923131SAndroid Build Coastguard Worker const string kDlcPrefsSubDir = "foo-dir";
123*5a923131SAndroid Build Coastguard Worker key1A = common_prefs_->CreateSubKey({kDlcPrefsSubDir, "dlc1", "keyA"});
124*5a923131SAndroid Build Coastguard Worker EXPECT_TRUE(common_prefs_->SetString(key1A, "fp_1A"));
125*5a923131SAndroid Build Coastguard Worker key1B = common_prefs_->CreateSubKey({kDlcPrefsSubDir, "dlc1", "keyB"});
126*5a923131SAndroid Build Coastguard Worker EXPECT_TRUE(common_prefs_->SetString(key1B, "fp_1B"));
127*5a923131SAndroid Build Coastguard Worker auto key2A = common_prefs_->CreateSubKey({kDlcPrefsSubDir, "dlc2", "keyA"});
128*5a923131SAndroid Build Coastguard Worker EXPECT_TRUE(common_prefs_->SetString(key2A, "fp_A2"));
129*5a923131SAndroid Build Coastguard Worker
130*5a923131SAndroid Build Coastguard Worker vector<string> fpKeys;
131*5a923131SAndroid Build Coastguard Worker EXPECT_TRUE(common_prefs_->GetSubKeys(kDlcPrefsSubDir, &fpKeys));
132*5a923131SAndroid Build Coastguard Worker EXPECT_EQ(fpKeys.size(), 3UL);
133*5a923131SAndroid Build Coastguard Worker EXPECT_TRUE(common_prefs_->Delete(fpKeys[0]));
134*5a923131SAndroid Build Coastguard Worker EXPECT_TRUE(common_prefs_->Delete(fpKeys[1]));
135*5a923131SAndroid Build Coastguard Worker EXPECT_TRUE(common_prefs_->Delete(fpKeys[2]));
136*5a923131SAndroid Build Coastguard Worker EXPECT_FALSE(common_prefs_->Exists(key1A));
137*5a923131SAndroid Build Coastguard Worker }
138*5a923131SAndroid Build Coastguard Worker
139*5a923131SAndroid Build Coastguard Worker PrefsInterface* common_prefs_;
140*5a923131SAndroid Build Coastguard Worker };
141*5a923131SAndroid Build Coastguard Worker
142*5a923131SAndroid Build Coastguard Worker class PrefsTest : public BasePrefsTest {
143*5a923131SAndroid Build Coastguard Worker protected:
SetUp()144*5a923131SAndroid Build Coastguard Worker void SetUp() override {
145*5a923131SAndroid Build Coastguard Worker ASSERT_TRUE(temp_dir_.CreateUniqueTempDir());
146*5a923131SAndroid Build Coastguard Worker prefs_dir_ = temp_dir_.GetPath();
147*5a923131SAndroid Build Coastguard Worker ASSERT_TRUE(prefs_.Init(prefs_dir_));
148*5a923131SAndroid Build Coastguard Worker common_prefs_ = &prefs_;
149*5a923131SAndroid Build Coastguard Worker }
150*5a923131SAndroid Build Coastguard Worker
SetValue(const string & key,const string & value)151*5a923131SAndroid Build Coastguard Worker bool SetValue(const string& key, const string& value) {
152*5a923131SAndroid Build Coastguard Worker return base::WriteFile(prefs_dir_.Append(key),
153*5a923131SAndroid Build Coastguard Worker value.data(),
154*5a923131SAndroid Build Coastguard Worker value.length()) == static_cast<int>(value.length());
155*5a923131SAndroid Build Coastguard Worker }
156*5a923131SAndroid Build Coastguard Worker
157*5a923131SAndroid Build Coastguard Worker base::ScopedTempDir temp_dir_;
158*5a923131SAndroid Build Coastguard Worker base::FilePath prefs_dir_;
159*5a923131SAndroid Build Coastguard Worker Prefs prefs_;
160*5a923131SAndroid Build Coastguard Worker };
161*5a923131SAndroid Build Coastguard Worker
TEST(Prefs,Init)162*5a923131SAndroid Build Coastguard Worker TEST(Prefs, Init) {
163*5a923131SAndroid Build Coastguard Worker Prefs prefs;
164*5a923131SAndroid Build Coastguard Worker const string ns1 = "ns1";
165*5a923131SAndroid Build Coastguard Worker const string ns2A = "ns2A";
166*5a923131SAndroid Build Coastguard Worker const string ns2B = "ns2B";
167*5a923131SAndroid Build Coastguard Worker const string sub_pref = "sp";
168*5a923131SAndroid Build Coastguard Worker
169*5a923131SAndroid Build Coastguard Worker base::ScopedTempDir temp_dir;
170*5a923131SAndroid Build Coastguard Worker ASSERT_TRUE(temp_dir.CreateUniqueTempDir());
171*5a923131SAndroid Build Coastguard Worker auto ns1_path = temp_dir.GetPath().Append(ns1);
172*5a923131SAndroid Build Coastguard Worker auto ns2A_path = ns1_path.Append(ns2A);
173*5a923131SAndroid Build Coastguard Worker auto ns2B_path = ns1_path.Append(ns2B);
174*5a923131SAndroid Build Coastguard Worker auto sub_pref_path = ns2A_path.Append(sub_pref);
175*5a923131SAndroid Build Coastguard Worker
176*5a923131SAndroid Build Coastguard Worker EXPECT_TRUE(base::CreateDirectory(ns2B_path));
177*5a923131SAndroid Build Coastguard Worker EXPECT_TRUE(base::PathExists(ns2B_path));
178*5a923131SAndroid Build Coastguard Worker
179*5a923131SAndroid Build Coastguard Worker EXPECT_TRUE(base::CreateDirectory(sub_pref_path));
180*5a923131SAndroid Build Coastguard Worker EXPECT_TRUE(base::PathExists(sub_pref_path));
181*5a923131SAndroid Build Coastguard Worker
182*5a923131SAndroid Build Coastguard Worker EXPECT_TRUE(base::PathExists(ns1_path));
183*5a923131SAndroid Build Coastguard Worker ASSERT_TRUE(prefs.Init(temp_dir.GetPath()));
184*5a923131SAndroid Build Coastguard Worker EXPECT_FALSE(base::PathExists(ns1_path));
185*5a923131SAndroid Build Coastguard Worker }
186*5a923131SAndroid Build Coastguard Worker
TEST_F(PrefsTest,GetFileNameForKey)187*5a923131SAndroid Build Coastguard Worker TEST_F(PrefsTest, GetFileNameForKey) {
188*5a923131SAndroid Build Coastguard Worker const char kAllvalidCharsKey[] =
189*5a923131SAndroid Build Coastguard Worker "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz_-";
190*5a923131SAndroid Build Coastguard Worker base::FilePath path;
191*5a923131SAndroid Build Coastguard Worker EXPECT_TRUE(prefs_.file_storage_.GetFileNameForKey(kAllvalidCharsKey, &path));
192*5a923131SAndroid Build Coastguard Worker EXPECT_EQ(prefs_dir_.Append(kAllvalidCharsKey).value(), path.value());
193*5a923131SAndroid Build Coastguard Worker }
194*5a923131SAndroid Build Coastguard Worker
TEST_F(PrefsTest,GetFileNameForKeyBadCharacter)195*5a923131SAndroid Build Coastguard Worker TEST_F(PrefsTest, GetFileNameForKeyBadCharacter) {
196*5a923131SAndroid Build Coastguard Worker base::FilePath path;
197*5a923131SAndroid Build Coastguard Worker EXPECT_FALSE(prefs_.file_storage_.GetFileNameForKey("ABC abc", &path));
198*5a923131SAndroid Build Coastguard Worker }
199*5a923131SAndroid Build Coastguard Worker
TEST_F(PrefsTest,GetFileNameForKeyEmpty)200*5a923131SAndroid Build Coastguard Worker TEST_F(PrefsTest, GetFileNameForKeyEmpty) {
201*5a923131SAndroid Build Coastguard Worker base::FilePath path;
202*5a923131SAndroid Build Coastguard Worker EXPECT_FALSE(prefs_.file_storage_.GetFileNameForKey("", &path));
203*5a923131SAndroid Build Coastguard Worker }
204*5a923131SAndroid Build Coastguard Worker
TEST_F(PrefsTest,CreateSubKey)205*5a923131SAndroid Build Coastguard Worker TEST_F(PrefsTest, CreateSubKey) {
206*5a923131SAndroid Build Coastguard Worker const string name_space = "ns";
207*5a923131SAndroid Build Coastguard Worker const string sub_pref1 = "sp1";
208*5a923131SAndroid Build Coastguard Worker const string sub_pref2 = "sp2";
209*5a923131SAndroid Build Coastguard Worker const string sub_key = "sk";
210*5a923131SAndroid Build Coastguard Worker
211*5a923131SAndroid Build Coastguard Worker EXPECT_EQ(PrefsInterface::CreateSubKey({name_space, sub_pref1, sub_key}),
212*5a923131SAndroid Build Coastguard Worker "ns/sp1/sk");
213*5a923131SAndroid Build Coastguard Worker EXPECT_EQ(PrefsInterface::CreateSubKey({name_space, sub_pref2, sub_key}),
214*5a923131SAndroid Build Coastguard Worker "ns/sp2/sk");
215*5a923131SAndroid Build Coastguard Worker }
216*5a923131SAndroid Build Coastguard Worker
TEST_F(PrefsTest,GetString)217*5a923131SAndroid Build Coastguard Worker TEST_F(PrefsTest, GetString) {
218*5a923131SAndroid Build Coastguard Worker const string test_data = "test data";
219*5a923131SAndroid Build Coastguard Worker ASSERT_TRUE(SetValue(kKey, test_data));
220*5a923131SAndroid Build Coastguard Worker string value;
221*5a923131SAndroid Build Coastguard Worker EXPECT_TRUE(prefs_.GetString(kKey, &value));
222*5a923131SAndroid Build Coastguard Worker EXPECT_EQ(test_data, value);
223*5a923131SAndroid Build Coastguard Worker }
224*5a923131SAndroid Build Coastguard Worker
TEST_F(PrefsTest,GetStringBadKey)225*5a923131SAndroid Build Coastguard Worker TEST_F(PrefsTest, GetStringBadKey) {
226*5a923131SAndroid Build Coastguard Worker string value;
227*5a923131SAndroid Build Coastguard Worker EXPECT_FALSE(prefs_.GetString(",bad", &value));
228*5a923131SAndroid Build Coastguard Worker }
229*5a923131SAndroid Build Coastguard Worker
TEST_F(PrefsTest,GetStringNonExistentKey)230*5a923131SAndroid Build Coastguard Worker TEST_F(PrefsTest, GetStringNonExistentKey) {
231*5a923131SAndroid Build Coastguard Worker string value;
232*5a923131SAndroid Build Coastguard Worker EXPECT_FALSE(prefs_.GetString("non-existent-key", &value));
233*5a923131SAndroid Build Coastguard Worker }
234*5a923131SAndroid Build Coastguard Worker
TEST_F(PrefsTest,SetString)235*5a923131SAndroid Build Coastguard Worker TEST_F(PrefsTest, SetString) {
236*5a923131SAndroid Build Coastguard Worker const char kValue[] = "some test value\non 2 lines";
237*5a923131SAndroid Build Coastguard Worker EXPECT_TRUE(prefs_.SetString(kKey, kValue));
238*5a923131SAndroid Build Coastguard Worker string value;
239*5a923131SAndroid Build Coastguard Worker EXPECT_TRUE(base::ReadFileToString(prefs_dir_.Append(kKey), &value));
240*5a923131SAndroid Build Coastguard Worker EXPECT_EQ(kValue, value);
241*5a923131SAndroid Build Coastguard Worker }
242*5a923131SAndroid Build Coastguard Worker
TEST_F(PrefsTest,SetStringBadKey)243*5a923131SAndroid Build Coastguard Worker TEST_F(PrefsTest, SetStringBadKey) {
244*5a923131SAndroid Build Coastguard Worker const char kKeyWithDots[] = ".no-dots";
245*5a923131SAndroid Build Coastguard Worker EXPECT_FALSE(prefs_.SetString(kKeyWithDots, "some value"));
246*5a923131SAndroid Build Coastguard Worker EXPECT_FALSE(base::PathExists(prefs_dir_.Append(kKeyWithDots)));
247*5a923131SAndroid Build Coastguard Worker }
248*5a923131SAndroid Build Coastguard Worker
TEST_F(PrefsTest,SetStringCreateDir)249*5a923131SAndroid Build Coastguard Worker TEST_F(PrefsTest, SetStringCreateDir) {
250*5a923131SAndroid Build Coastguard Worker const char kValue[] = "test value";
251*5a923131SAndroid Build Coastguard Worker base::FilePath subdir = prefs_dir_.Append("subdir1").Append("subdir2");
252*5a923131SAndroid Build Coastguard Worker EXPECT_TRUE(prefs_.Init(subdir));
253*5a923131SAndroid Build Coastguard Worker EXPECT_TRUE(prefs_.SetString(kKey, kValue));
254*5a923131SAndroid Build Coastguard Worker string value;
255*5a923131SAndroid Build Coastguard Worker EXPECT_TRUE(base::ReadFileToString(subdir.Append(kKey), &value));
256*5a923131SAndroid Build Coastguard Worker EXPECT_EQ(kValue, value);
257*5a923131SAndroid Build Coastguard Worker }
258*5a923131SAndroid Build Coastguard Worker
TEST_F(PrefsTest,SetStringDirCreationFailure)259*5a923131SAndroid Build Coastguard Worker TEST_F(PrefsTest, SetStringDirCreationFailure) {
260*5a923131SAndroid Build Coastguard Worker EXPECT_TRUE(prefs_.Init(base::FilePath("/dev/null")));
261*5a923131SAndroid Build Coastguard Worker EXPECT_FALSE(prefs_.SetString(kKey, "test value"));
262*5a923131SAndroid Build Coastguard Worker }
263*5a923131SAndroid Build Coastguard Worker
TEST_F(PrefsTest,SetStringFileCreationFailure)264*5a923131SAndroid Build Coastguard Worker TEST_F(PrefsTest, SetStringFileCreationFailure) {
265*5a923131SAndroid Build Coastguard Worker base::CreateDirectory(prefs_dir_.Append(kKey));
266*5a923131SAndroid Build Coastguard Worker EXPECT_FALSE(prefs_.SetString(kKey, "test value"));
267*5a923131SAndroid Build Coastguard Worker EXPECT_TRUE(base::DirectoryExists(prefs_dir_.Append(kKey)));
268*5a923131SAndroid Build Coastguard Worker }
269*5a923131SAndroid Build Coastguard Worker
TEST_F(PrefsTest,GetInt64)270*5a923131SAndroid Build Coastguard Worker TEST_F(PrefsTest, GetInt64) {
271*5a923131SAndroid Build Coastguard Worker ASSERT_TRUE(SetValue(kKey, " \n 25 \t "));
272*5a923131SAndroid Build Coastguard Worker int64_t value;
273*5a923131SAndroid Build Coastguard Worker EXPECT_TRUE(prefs_.GetInt64(kKey, &value));
274*5a923131SAndroid Build Coastguard Worker EXPECT_EQ(25, value);
275*5a923131SAndroid Build Coastguard Worker }
276*5a923131SAndroid Build Coastguard Worker
TEST_F(PrefsTest,GetInt64BadValue)277*5a923131SAndroid Build Coastguard Worker TEST_F(PrefsTest, GetInt64BadValue) {
278*5a923131SAndroid Build Coastguard Worker ASSERT_TRUE(SetValue(kKey, "30a"));
279*5a923131SAndroid Build Coastguard Worker int64_t value;
280*5a923131SAndroid Build Coastguard Worker EXPECT_FALSE(prefs_.GetInt64(kKey, &value));
281*5a923131SAndroid Build Coastguard Worker }
282*5a923131SAndroid Build Coastguard Worker
TEST_F(PrefsTest,GetInt64Max)283*5a923131SAndroid Build Coastguard Worker TEST_F(PrefsTest, GetInt64Max) {
284*5a923131SAndroid Build Coastguard Worker ASSERT_TRUE(SetValue(kKey,
285*5a923131SAndroid Build Coastguard Worker android::base::StringPrintf(
286*5a923131SAndroid Build Coastguard Worker "%" PRIi64, std::numeric_limits<int64_t>::max())));
287*5a923131SAndroid Build Coastguard Worker int64_t value;
288*5a923131SAndroid Build Coastguard Worker EXPECT_TRUE(prefs_.GetInt64(kKey, &value));
289*5a923131SAndroid Build Coastguard Worker EXPECT_EQ(std::numeric_limits<int64_t>::max(), value);
290*5a923131SAndroid Build Coastguard Worker }
291*5a923131SAndroid Build Coastguard Worker
TEST_F(PrefsTest,GetInt64Min)292*5a923131SAndroid Build Coastguard Worker TEST_F(PrefsTest, GetInt64Min) {
293*5a923131SAndroid Build Coastguard Worker ASSERT_TRUE(SetValue(kKey,
294*5a923131SAndroid Build Coastguard Worker android::base::StringPrintf(
295*5a923131SAndroid Build Coastguard Worker "%" PRIi64, std::numeric_limits<int64_t>::min())));
296*5a923131SAndroid Build Coastguard Worker int64_t value;
297*5a923131SAndroid Build Coastguard Worker EXPECT_TRUE(prefs_.GetInt64(kKey, &value));
298*5a923131SAndroid Build Coastguard Worker EXPECT_EQ(std::numeric_limits<int64_t>::min(), value);
299*5a923131SAndroid Build Coastguard Worker }
300*5a923131SAndroid Build Coastguard Worker
TEST_F(PrefsTest,GetInt64Negative)301*5a923131SAndroid Build Coastguard Worker TEST_F(PrefsTest, GetInt64Negative) {
302*5a923131SAndroid Build Coastguard Worker ASSERT_TRUE(SetValue(kKey, " \t -100 \n "));
303*5a923131SAndroid Build Coastguard Worker int64_t value;
304*5a923131SAndroid Build Coastguard Worker EXPECT_TRUE(prefs_.GetInt64(kKey, &value));
305*5a923131SAndroid Build Coastguard Worker EXPECT_EQ(-100, value);
306*5a923131SAndroid Build Coastguard Worker }
307*5a923131SAndroid Build Coastguard Worker
TEST_F(PrefsTest,GetInt64NonExistentKey)308*5a923131SAndroid Build Coastguard Worker TEST_F(PrefsTest, GetInt64NonExistentKey) {
309*5a923131SAndroid Build Coastguard Worker int64_t value;
310*5a923131SAndroid Build Coastguard Worker EXPECT_FALSE(prefs_.GetInt64("random-key", &value));
311*5a923131SAndroid Build Coastguard Worker }
312*5a923131SAndroid Build Coastguard Worker
TEST_F(PrefsTest,SetInt64)313*5a923131SAndroid Build Coastguard Worker TEST_F(PrefsTest, SetInt64) {
314*5a923131SAndroid Build Coastguard Worker EXPECT_TRUE(prefs_.SetInt64(kKey, -123));
315*5a923131SAndroid Build Coastguard Worker string value;
316*5a923131SAndroid Build Coastguard Worker EXPECT_TRUE(base::ReadFileToString(prefs_dir_.Append(kKey), &value));
317*5a923131SAndroid Build Coastguard Worker EXPECT_EQ("-123", value);
318*5a923131SAndroid Build Coastguard Worker }
319*5a923131SAndroid Build Coastguard Worker
TEST_F(PrefsTest,SetInt64BadKey)320*5a923131SAndroid Build Coastguard Worker TEST_F(PrefsTest, SetInt64BadKey) {
321*5a923131SAndroid Build Coastguard Worker const char kKeyWithSpaces[] = "s p a c e s";
322*5a923131SAndroid Build Coastguard Worker EXPECT_FALSE(prefs_.SetInt64(kKeyWithSpaces, 20));
323*5a923131SAndroid Build Coastguard Worker EXPECT_FALSE(base::PathExists(prefs_dir_.Append(kKeyWithSpaces)));
324*5a923131SAndroid Build Coastguard Worker }
325*5a923131SAndroid Build Coastguard Worker
TEST_F(PrefsTest,SetInt64Max)326*5a923131SAndroid Build Coastguard Worker TEST_F(PrefsTest, SetInt64Max) {
327*5a923131SAndroid Build Coastguard Worker EXPECT_TRUE(prefs_.SetInt64(kKey, std::numeric_limits<int64_t>::max()));
328*5a923131SAndroid Build Coastguard Worker string value;
329*5a923131SAndroid Build Coastguard Worker EXPECT_TRUE(base::ReadFileToString(prefs_dir_.Append(kKey), &value));
330*5a923131SAndroid Build Coastguard Worker EXPECT_EQ(android::base::StringPrintf("%" PRIi64,
331*5a923131SAndroid Build Coastguard Worker std::numeric_limits<int64_t>::max()),
332*5a923131SAndroid Build Coastguard Worker value);
333*5a923131SAndroid Build Coastguard Worker }
334*5a923131SAndroid Build Coastguard Worker
TEST_F(PrefsTest,SetInt64Min)335*5a923131SAndroid Build Coastguard Worker TEST_F(PrefsTest, SetInt64Min) {
336*5a923131SAndroid Build Coastguard Worker EXPECT_TRUE(prefs_.SetInt64(kKey, std::numeric_limits<int64_t>::min()));
337*5a923131SAndroid Build Coastguard Worker string value;
338*5a923131SAndroid Build Coastguard Worker EXPECT_TRUE(base::ReadFileToString(prefs_dir_.Append(kKey), &value));
339*5a923131SAndroid Build Coastguard Worker EXPECT_EQ(android::base::StringPrintf("%" PRIi64,
340*5a923131SAndroid Build Coastguard Worker std::numeric_limits<int64_t>::min()),
341*5a923131SAndroid Build Coastguard Worker value);
342*5a923131SAndroid Build Coastguard Worker }
343*5a923131SAndroid Build Coastguard Worker
TEST_F(PrefsTest,GetBooleanFalse)344*5a923131SAndroid Build Coastguard Worker TEST_F(PrefsTest, GetBooleanFalse) {
345*5a923131SAndroid Build Coastguard Worker ASSERT_TRUE(SetValue(kKey, " \n false \t "));
346*5a923131SAndroid Build Coastguard Worker bool value;
347*5a923131SAndroid Build Coastguard Worker EXPECT_TRUE(prefs_.GetBoolean(kKey, &value));
348*5a923131SAndroid Build Coastguard Worker EXPECT_FALSE(value);
349*5a923131SAndroid Build Coastguard Worker }
350*5a923131SAndroid Build Coastguard Worker
TEST_F(PrefsTest,GetBooleanTrue)351*5a923131SAndroid Build Coastguard Worker TEST_F(PrefsTest, GetBooleanTrue) {
352*5a923131SAndroid Build Coastguard Worker const char kKey[] = "test-key";
353*5a923131SAndroid Build Coastguard Worker ASSERT_TRUE(SetValue(kKey, " \t true \n "));
354*5a923131SAndroid Build Coastguard Worker bool value;
355*5a923131SAndroid Build Coastguard Worker EXPECT_TRUE(prefs_.GetBoolean(kKey, &value));
356*5a923131SAndroid Build Coastguard Worker EXPECT_TRUE(value);
357*5a923131SAndroid Build Coastguard Worker }
358*5a923131SAndroid Build Coastguard Worker
TEST_F(PrefsTest,GetBooleanBadValue)359*5a923131SAndroid Build Coastguard Worker TEST_F(PrefsTest, GetBooleanBadValue) {
360*5a923131SAndroid Build Coastguard Worker const char kKey[] = "test-key";
361*5a923131SAndroid Build Coastguard Worker ASSERT_TRUE(SetValue(kKey, "1"));
362*5a923131SAndroid Build Coastguard Worker bool value;
363*5a923131SAndroid Build Coastguard Worker EXPECT_FALSE(prefs_.GetBoolean(kKey, &value));
364*5a923131SAndroid Build Coastguard Worker }
365*5a923131SAndroid Build Coastguard Worker
TEST_F(PrefsTest,GetBooleanBadEmptyValue)366*5a923131SAndroid Build Coastguard Worker TEST_F(PrefsTest, GetBooleanBadEmptyValue) {
367*5a923131SAndroid Build Coastguard Worker const char kKey[] = "test-key";
368*5a923131SAndroid Build Coastguard Worker ASSERT_TRUE(SetValue(kKey, ""));
369*5a923131SAndroid Build Coastguard Worker bool value;
370*5a923131SAndroid Build Coastguard Worker EXPECT_FALSE(prefs_.GetBoolean(kKey, &value));
371*5a923131SAndroid Build Coastguard Worker }
372*5a923131SAndroid Build Coastguard Worker
TEST_F(PrefsTest,GetBooleanNonExistentKey)373*5a923131SAndroid Build Coastguard Worker TEST_F(PrefsTest, GetBooleanNonExistentKey) {
374*5a923131SAndroid Build Coastguard Worker bool value;
375*5a923131SAndroid Build Coastguard Worker EXPECT_FALSE(prefs_.GetBoolean("random-key", &value));
376*5a923131SAndroid Build Coastguard Worker }
377*5a923131SAndroid Build Coastguard Worker
TEST_F(PrefsTest,SetBooleanTrue)378*5a923131SAndroid Build Coastguard Worker TEST_F(PrefsTest, SetBooleanTrue) {
379*5a923131SAndroid Build Coastguard Worker const char kKey[] = "test-bool";
380*5a923131SAndroid Build Coastguard Worker EXPECT_TRUE(prefs_.SetBoolean(kKey, true));
381*5a923131SAndroid Build Coastguard Worker string value;
382*5a923131SAndroid Build Coastguard Worker EXPECT_TRUE(base::ReadFileToString(prefs_dir_.Append(kKey), &value));
383*5a923131SAndroid Build Coastguard Worker EXPECT_EQ("true", value);
384*5a923131SAndroid Build Coastguard Worker }
385*5a923131SAndroid Build Coastguard Worker
TEST_F(PrefsTest,SetBooleanFalse)386*5a923131SAndroid Build Coastguard Worker TEST_F(PrefsTest, SetBooleanFalse) {
387*5a923131SAndroid Build Coastguard Worker const char kKey[] = "test-bool";
388*5a923131SAndroid Build Coastguard Worker EXPECT_TRUE(prefs_.SetBoolean(kKey, false));
389*5a923131SAndroid Build Coastguard Worker string value;
390*5a923131SAndroid Build Coastguard Worker EXPECT_TRUE(base::ReadFileToString(prefs_dir_.Append(kKey), &value));
391*5a923131SAndroid Build Coastguard Worker EXPECT_EQ("false", value);
392*5a923131SAndroid Build Coastguard Worker }
393*5a923131SAndroid Build Coastguard Worker
TEST_F(PrefsTest,SetBooleanBadKey)394*5a923131SAndroid Build Coastguard Worker TEST_F(PrefsTest, SetBooleanBadKey) {
395*5a923131SAndroid Build Coastguard Worker const char kKey[] = "s p a c e s";
396*5a923131SAndroid Build Coastguard Worker EXPECT_FALSE(prefs_.SetBoolean(kKey, true));
397*5a923131SAndroid Build Coastguard Worker EXPECT_FALSE(base::PathExists(prefs_dir_.Append(kKey)));
398*5a923131SAndroid Build Coastguard Worker }
399*5a923131SAndroid Build Coastguard Worker
TEST_F(PrefsTest,ExistsWorks)400*5a923131SAndroid Build Coastguard Worker TEST_F(PrefsTest, ExistsWorks) {
401*5a923131SAndroid Build Coastguard Worker // test that the key doesn't exist before we set it.
402*5a923131SAndroid Build Coastguard Worker EXPECT_FALSE(prefs_.Exists(kKey));
403*5a923131SAndroid Build Coastguard Worker
404*5a923131SAndroid Build Coastguard Worker // test that the key exists after we set it.
405*5a923131SAndroid Build Coastguard Worker ASSERT_TRUE(prefs_.SetInt64(kKey, 8));
406*5a923131SAndroid Build Coastguard Worker EXPECT_TRUE(prefs_.Exists(kKey));
407*5a923131SAndroid Build Coastguard Worker }
408*5a923131SAndroid Build Coastguard Worker
TEST_F(PrefsTest,DeleteWorks)409*5a923131SAndroid Build Coastguard Worker TEST_F(PrefsTest, DeleteWorks) {
410*5a923131SAndroid Build Coastguard Worker // test that it's alright to delete a non-existent key.
411*5a923131SAndroid Build Coastguard Worker EXPECT_TRUE(prefs_.Delete(kKey));
412*5a923131SAndroid Build Coastguard Worker
413*5a923131SAndroid Build Coastguard Worker // delete the key after we set it.
414*5a923131SAndroid Build Coastguard Worker ASSERT_TRUE(prefs_.SetInt64(kKey, 0));
415*5a923131SAndroid Build Coastguard Worker EXPECT_TRUE(prefs_.Delete(kKey));
416*5a923131SAndroid Build Coastguard Worker
417*5a923131SAndroid Build Coastguard Worker // make sure it doesn't exist anymore.
418*5a923131SAndroid Build Coastguard Worker EXPECT_FALSE(prefs_.Exists(kKey));
419*5a923131SAndroid Build Coastguard Worker }
420*5a923131SAndroid Build Coastguard Worker
TEST_F(PrefsTest,SetDeleteSubKey)421*5a923131SAndroid Build Coastguard Worker TEST_F(PrefsTest, SetDeleteSubKey) {
422*5a923131SAndroid Build Coastguard Worker const string name_space = "ns";
423*5a923131SAndroid Build Coastguard Worker const string sub_pref = "sp";
424*5a923131SAndroid Build Coastguard Worker const string sub_key1 = "sk1";
425*5a923131SAndroid Build Coastguard Worker const string sub_key2 = "sk2";
426*5a923131SAndroid Build Coastguard Worker auto key1 = prefs_.CreateSubKey({name_space, sub_pref, sub_key1});
427*5a923131SAndroid Build Coastguard Worker auto key2 = prefs_.CreateSubKey({name_space, sub_pref, sub_key2});
428*5a923131SAndroid Build Coastguard Worker base::FilePath sub_pref_path = prefs_dir_.Append(name_space).Append(sub_pref);
429*5a923131SAndroid Build Coastguard Worker
430*5a923131SAndroid Build Coastguard Worker ASSERT_TRUE(prefs_.SetInt64(key1, 0));
431*5a923131SAndroid Build Coastguard Worker ASSERT_TRUE(prefs_.SetInt64(key2, 0));
432*5a923131SAndroid Build Coastguard Worker EXPECT_TRUE(base::PathExists(sub_pref_path.Append(sub_key1)));
433*5a923131SAndroid Build Coastguard Worker EXPECT_TRUE(base::PathExists(sub_pref_path.Append(sub_key2)));
434*5a923131SAndroid Build Coastguard Worker
435*5a923131SAndroid Build Coastguard Worker ASSERT_TRUE(prefs_.Delete(key1));
436*5a923131SAndroid Build Coastguard Worker EXPECT_FALSE(base::PathExists(sub_pref_path.Append(sub_key1)));
437*5a923131SAndroid Build Coastguard Worker EXPECT_TRUE(base::PathExists(sub_pref_path.Append(sub_key2)));
438*5a923131SAndroid Build Coastguard Worker ASSERT_TRUE(prefs_.Delete(key2));
439*5a923131SAndroid Build Coastguard Worker EXPECT_FALSE(base::PathExists(sub_pref_path.Append(sub_key2)));
440*5a923131SAndroid Build Coastguard Worker prefs_.Init(prefs_dir_);
441*5a923131SAndroid Build Coastguard Worker EXPECT_FALSE(base::PathExists(prefs_dir_.Append(name_space)));
442*5a923131SAndroid Build Coastguard Worker }
443*5a923131SAndroid Build Coastguard Worker
TEST_F(PrefsTest,DeletePrefs)444*5a923131SAndroid Build Coastguard Worker TEST_F(PrefsTest, DeletePrefs) {
445*5a923131SAndroid Build Coastguard Worker const string kPrefsSubDir = "foo-dir";
446*5a923131SAndroid Build Coastguard Worker const string kFpKey = "kPrefFp";
447*5a923131SAndroid Build Coastguard Worker const string kNotFpKey = "NotkPrefFp";
448*5a923131SAndroid Build Coastguard Worker const string kOtherKey = "kPrefNotFp";
449*5a923131SAndroid Build Coastguard Worker
450*5a923131SAndroid Build Coastguard Worker EXPECT_TRUE(prefs_.SetString(kFpKey, "3.000"));
451*5a923131SAndroid Build Coastguard Worker EXPECT_TRUE(prefs_.SetString(kOtherKey, "not_fp_val"));
452*5a923131SAndroid Build Coastguard Worker
453*5a923131SAndroid Build Coastguard Worker auto key1_fp = prefs_.CreateSubKey({kPrefsSubDir, "id-1", kFpKey});
454*5a923131SAndroid Build Coastguard Worker EXPECT_TRUE(prefs_.SetString(key1_fp, "3.7"));
455*5a923131SAndroid Build Coastguard Worker auto key_not_fp = prefs_.CreateSubKey({kPrefsSubDir, "id-1", kOtherKey});
456*5a923131SAndroid Build Coastguard Worker EXPECT_TRUE(prefs_.SetString(key_not_fp, "not_fp_val"));
457*5a923131SAndroid Build Coastguard Worker auto key2_fp = prefs_.CreateSubKey({kPrefsSubDir, "id-2", kFpKey});
458*5a923131SAndroid Build Coastguard Worker EXPECT_TRUE(prefs_.SetString(key2_fp, "3.9"));
459*5a923131SAndroid Build Coastguard Worker auto key3_fp = prefs_.CreateSubKey({kPrefsSubDir, "id-3", kFpKey});
460*5a923131SAndroid Build Coastguard Worker EXPECT_TRUE(prefs_.SetString(key3_fp, "3.45"));
461*5a923131SAndroid Build Coastguard Worker
462*5a923131SAndroid Build Coastguard Worker // Pref key does not match full subkey at end, should not delete.
463*5a923131SAndroid Build Coastguard Worker auto key_middle_fp = prefs_.CreateSubKey({kPrefsSubDir, kFpKey, kOtherKey});
464*5a923131SAndroid Build Coastguard Worker EXPECT_TRUE(prefs_.SetString(key_middle_fp, "not_fp_val"));
465*5a923131SAndroid Build Coastguard Worker auto key_end_not_fp = prefs_.CreateSubKey({kPrefsSubDir, "id-1", kNotFpKey});
466*5a923131SAndroid Build Coastguard Worker EXPECT_TRUE(prefs_.SetString(key_end_not_fp, "not_fp_val"));
467*5a923131SAndroid Build Coastguard Worker
468*5a923131SAndroid Build Coastguard Worker // Delete key in platform and one namespace.
469*5a923131SAndroid Build Coastguard Worker prefs_.Delete(kFpKey, {kPrefsSubDir});
470*5a923131SAndroid Build Coastguard Worker
471*5a923131SAndroid Build Coastguard Worker EXPECT_FALSE(prefs_.Exists(kFpKey));
472*5a923131SAndroid Build Coastguard Worker EXPECT_FALSE(prefs_.Exists(key1_fp));
473*5a923131SAndroid Build Coastguard Worker EXPECT_FALSE(prefs_.Exists(key2_fp));
474*5a923131SAndroid Build Coastguard Worker EXPECT_FALSE(prefs_.Exists(key3_fp));
475*5a923131SAndroid Build Coastguard Worker
476*5a923131SAndroid Build Coastguard Worker // Check other keys are not deleted.
477*5a923131SAndroid Build Coastguard Worker EXPECT_TRUE(prefs_.Exists(kOtherKey));
478*5a923131SAndroid Build Coastguard Worker EXPECT_TRUE(prefs_.Exists(key_not_fp));
479*5a923131SAndroid Build Coastguard Worker EXPECT_TRUE(prefs_.Exists(key_middle_fp));
480*5a923131SAndroid Build Coastguard Worker EXPECT_TRUE(prefs_.Exists(key_end_not_fp));
481*5a923131SAndroid Build Coastguard Worker }
482*5a923131SAndroid Build Coastguard Worker
TEST_F(PrefsTest,DeleteMultipleNamespaces)483*5a923131SAndroid Build Coastguard Worker TEST_F(PrefsTest, DeleteMultipleNamespaces) {
484*5a923131SAndroid Build Coastguard Worker const string kFirstSubDir = "foo-dir";
485*5a923131SAndroid Build Coastguard Worker const string kSecondarySubDir = "bar-dir";
486*5a923131SAndroid Build Coastguard Worker const string kTertiarySubDir = "ter-dir";
487*5a923131SAndroid Build Coastguard Worker const string kFpKey = "kPrefFp";
488*5a923131SAndroid Build Coastguard Worker
489*5a923131SAndroid Build Coastguard Worker EXPECT_TRUE(prefs_.SetString(kFpKey, "3.000"));
490*5a923131SAndroid Build Coastguard Worker // Set pref key in different namespaces.
491*5a923131SAndroid Build Coastguard Worker auto key1_fp = prefs_.CreateSubKey({kFirstSubDir, "id-1", kFpKey});
492*5a923131SAndroid Build Coastguard Worker EXPECT_TRUE(prefs_.SetString(key1_fp, "3.7"));
493*5a923131SAndroid Build Coastguard Worker auto key2_fp = prefs_.CreateSubKey({kSecondarySubDir, "id-3", kFpKey});
494*5a923131SAndroid Build Coastguard Worker EXPECT_TRUE(prefs_.SetString(key2_fp, "7.45"));
495*5a923131SAndroid Build Coastguard Worker auto key3_fp = prefs_.CreateSubKey({kTertiarySubDir, "id-3", kFpKey});
496*5a923131SAndroid Build Coastguard Worker EXPECT_TRUE(prefs_.SetString(key3_fp, "7.45"));
497*5a923131SAndroid Build Coastguard Worker
498*5a923131SAndroid Build Coastguard Worker // Delete key in platform and given namespaces.
499*5a923131SAndroid Build Coastguard Worker prefs_.Delete(kFpKey, {kFirstSubDir, kSecondarySubDir});
500*5a923131SAndroid Build Coastguard Worker
501*5a923131SAndroid Build Coastguard Worker EXPECT_FALSE(prefs_.Exists(kFpKey));
502*5a923131SAndroid Build Coastguard Worker EXPECT_FALSE(prefs_.Exists(key1_fp));
503*5a923131SAndroid Build Coastguard Worker EXPECT_FALSE(prefs_.Exists(key2_fp));
504*5a923131SAndroid Build Coastguard Worker
505*5a923131SAndroid Build Coastguard Worker // Tertiary namespace not given to delete. Key should still exist.
506*5a923131SAndroid Build Coastguard Worker EXPECT_TRUE(prefs_.Exists(key3_fp));
507*5a923131SAndroid Build Coastguard Worker }
508*5a923131SAndroid Build Coastguard Worker
509*5a923131SAndroid Build Coastguard Worker class MockPrefsObserver : public PrefsInterface::ObserverInterface {
510*5a923131SAndroid Build Coastguard Worker public:
511*5a923131SAndroid Build Coastguard Worker MOCK_METHOD1(OnPrefSet, void(std::string_view));
512*5a923131SAndroid Build Coastguard Worker MOCK_METHOD1(OnPrefDeleted, void(std::string_view));
513*5a923131SAndroid Build Coastguard Worker };
514*5a923131SAndroid Build Coastguard Worker
TEST_F(PrefsTest,ObserversCalled)515*5a923131SAndroid Build Coastguard Worker TEST_F(PrefsTest, ObserversCalled) {
516*5a923131SAndroid Build Coastguard Worker MockPrefsObserver mock_obserser;
517*5a923131SAndroid Build Coastguard Worker prefs_.AddObserver(kKey, &mock_obserser);
518*5a923131SAndroid Build Coastguard Worker
519*5a923131SAndroid Build Coastguard Worker EXPECT_CALL(mock_obserser, OnPrefSet(Eq(kKey)));
520*5a923131SAndroid Build Coastguard Worker EXPECT_CALL(mock_obserser, OnPrefDeleted(_)).Times(0);
521*5a923131SAndroid Build Coastguard Worker prefs_.SetString(kKey, "value");
522*5a923131SAndroid Build Coastguard Worker testing::Mock::VerifyAndClearExpectations(&mock_obserser);
523*5a923131SAndroid Build Coastguard Worker
524*5a923131SAndroid Build Coastguard Worker EXPECT_CALL(mock_obserser, OnPrefSet(_)).Times(0);
525*5a923131SAndroid Build Coastguard Worker EXPECT_CALL(mock_obserser, OnPrefDeleted(Eq(kKey)));
526*5a923131SAndroid Build Coastguard Worker prefs_.Delete(kKey);
527*5a923131SAndroid Build Coastguard Worker testing::Mock::VerifyAndClearExpectations(&mock_obserser);
528*5a923131SAndroid Build Coastguard Worker
529*5a923131SAndroid Build Coastguard Worker auto key1 = prefs_.CreateSubKey({"ns", "sp1", "key1"});
530*5a923131SAndroid Build Coastguard Worker prefs_.AddObserver(key1, &mock_obserser);
531*5a923131SAndroid Build Coastguard Worker
532*5a923131SAndroid Build Coastguard Worker EXPECT_CALL(mock_obserser, OnPrefSet(key1));
533*5a923131SAndroid Build Coastguard Worker EXPECT_CALL(mock_obserser, OnPrefDeleted(_)).Times(0);
534*5a923131SAndroid Build Coastguard Worker prefs_.SetString(key1, "value");
535*5a923131SAndroid Build Coastguard Worker testing::Mock::VerifyAndClearExpectations(&mock_obserser);
536*5a923131SAndroid Build Coastguard Worker
537*5a923131SAndroid Build Coastguard Worker EXPECT_CALL(mock_obserser, OnPrefSet(_)).Times(0);
538*5a923131SAndroid Build Coastguard Worker EXPECT_CALL(mock_obserser, OnPrefDeleted(Eq(key1)));
539*5a923131SAndroid Build Coastguard Worker prefs_.Delete(key1);
540*5a923131SAndroid Build Coastguard Worker testing::Mock::VerifyAndClearExpectations(&mock_obserser);
541*5a923131SAndroid Build Coastguard Worker
542*5a923131SAndroid Build Coastguard Worker prefs_.RemoveObserver(kKey, &mock_obserser);
543*5a923131SAndroid Build Coastguard Worker }
544*5a923131SAndroid Build Coastguard Worker
TEST_F(PrefsTest,OnlyCalledOnObservedKeys)545*5a923131SAndroid Build Coastguard Worker TEST_F(PrefsTest, OnlyCalledOnObservedKeys) {
546*5a923131SAndroid Build Coastguard Worker MockPrefsObserver mock_obserser;
547*5a923131SAndroid Build Coastguard Worker const char kUnusedKey[] = "unused-key";
548*5a923131SAndroid Build Coastguard Worker prefs_.AddObserver(kUnusedKey, &mock_obserser);
549*5a923131SAndroid Build Coastguard Worker
550*5a923131SAndroid Build Coastguard Worker EXPECT_CALL(mock_obserser, OnPrefSet(_)).Times(0);
551*5a923131SAndroid Build Coastguard Worker EXPECT_CALL(mock_obserser, OnPrefDeleted(_)).Times(0);
552*5a923131SAndroid Build Coastguard Worker prefs_.SetString(kKey, "value");
553*5a923131SAndroid Build Coastguard Worker prefs_.Delete(kKey);
554*5a923131SAndroid Build Coastguard Worker
555*5a923131SAndroid Build Coastguard Worker prefs_.RemoveObserver(kUnusedKey, &mock_obserser);
556*5a923131SAndroid Build Coastguard Worker }
557*5a923131SAndroid Build Coastguard Worker
TEST_F(PrefsTest,RemovedObserversNotCalled)558*5a923131SAndroid Build Coastguard Worker TEST_F(PrefsTest, RemovedObserversNotCalled) {
559*5a923131SAndroid Build Coastguard Worker MockPrefsObserver mock_obserser_a, mock_obserser_b;
560*5a923131SAndroid Build Coastguard Worker prefs_.AddObserver(kKey, &mock_obserser_a);
561*5a923131SAndroid Build Coastguard Worker prefs_.AddObserver(kKey, &mock_obserser_b);
562*5a923131SAndroid Build Coastguard Worker EXPECT_CALL(mock_obserser_a, OnPrefSet(_)).Times(2);
563*5a923131SAndroid Build Coastguard Worker EXPECT_CALL(mock_obserser_b, OnPrefSet(_)).Times(1);
564*5a923131SAndroid Build Coastguard Worker EXPECT_TRUE(prefs_.SetString(kKey, "value"));
565*5a923131SAndroid Build Coastguard Worker prefs_.RemoveObserver(kKey, &mock_obserser_b);
566*5a923131SAndroid Build Coastguard Worker EXPECT_TRUE(prefs_.SetString(kKey, "other value"));
567*5a923131SAndroid Build Coastguard Worker prefs_.RemoveObserver(kKey, &mock_obserser_a);
568*5a923131SAndroid Build Coastguard Worker EXPECT_TRUE(prefs_.SetString(kKey, "yet another value"));
569*5a923131SAndroid Build Coastguard Worker }
570*5a923131SAndroid Build Coastguard Worker
TEST_F(PrefsTest,UnsuccessfulCallsNotObserved)571*5a923131SAndroid Build Coastguard Worker TEST_F(PrefsTest, UnsuccessfulCallsNotObserved) {
572*5a923131SAndroid Build Coastguard Worker MockPrefsObserver mock_obserser;
573*5a923131SAndroid Build Coastguard Worker const char kInvalidKey[] = "no spaces or .";
574*5a923131SAndroid Build Coastguard Worker prefs_.AddObserver(kInvalidKey, &mock_obserser);
575*5a923131SAndroid Build Coastguard Worker
576*5a923131SAndroid Build Coastguard Worker EXPECT_CALL(mock_obserser, OnPrefSet(_)).Times(0);
577*5a923131SAndroid Build Coastguard Worker EXPECT_CALL(mock_obserser, OnPrefDeleted(_)).Times(0);
578*5a923131SAndroid Build Coastguard Worker EXPECT_FALSE(prefs_.SetString(kInvalidKey, "value"));
579*5a923131SAndroid Build Coastguard Worker EXPECT_FALSE(prefs_.Delete(kInvalidKey));
580*5a923131SAndroid Build Coastguard Worker
581*5a923131SAndroid Build Coastguard Worker prefs_.RemoveObserver(kInvalidKey, &mock_obserser);
582*5a923131SAndroid Build Coastguard Worker }
583*5a923131SAndroid Build Coastguard Worker
TEST_F(PrefsTest,MultiNamespaceKeyTest)584*5a923131SAndroid Build Coastguard Worker TEST_F(PrefsTest, MultiNamespaceKeyTest) {
585*5a923131SAndroid Build Coastguard Worker MultiNamespaceKeyTest();
586*5a923131SAndroid Build Coastguard Worker }
587*5a923131SAndroid Build Coastguard Worker
588*5a923131SAndroid Build Coastguard Worker class MemoryPrefsTest : public BasePrefsTest {
589*5a923131SAndroid Build Coastguard Worker protected:
SetUp()590*5a923131SAndroid Build Coastguard Worker void SetUp() override { common_prefs_ = &prefs_; }
591*5a923131SAndroid Build Coastguard Worker
592*5a923131SAndroid Build Coastguard Worker MemoryPrefs prefs_;
593*5a923131SAndroid Build Coastguard Worker };
594*5a923131SAndroid Build Coastguard Worker
TEST_F(MemoryPrefsTest,BasicTest)595*5a923131SAndroid Build Coastguard Worker TEST_F(MemoryPrefsTest, BasicTest) {
596*5a923131SAndroid Build Coastguard Worker EXPECT_FALSE(prefs_.Exists(kKey));
597*5a923131SAndroid Build Coastguard Worker int64_t value = 0;
598*5a923131SAndroid Build Coastguard Worker EXPECT_FALSE(prefs_.GetInt64(kKey, &value));
599*5a923131SAndroid Build Coastguard Worker
600*5a923131SAndroid Build Coastguard Worker EXPECT_TRUE(prefs_.SetInt64(kKey, 1234));
601*5a923131SAndroid Build Coastguard Worker EXPECT_TRUE(prefs_.Exists(kKey));
602*5a923131SAndroid Build Coastguard Worker EXPECT_TRUE(prefs_.GetInt64(kKey, &value));
603*5a923131SAndroid Build Coastguard Worker EXPECT_EQ(1234, value);
604*5a923131SAndroid Build Coastguard Worker
605*5a923131SAndroid Build Coastguard Worker EXPECT_TRUE(prefs_.Delete(kKey));
606*5a923131SAndroid Build Coastguard Worker EXPECT_FALSE(prefs_.Exists(kKey));
607*5a923131SAndroid Build Coastguard Worker EXPECT_TRUE(prefs_.Delete(kKey));
608*5a923131SAndroid Build Coastguard Worker
609*5a923131SAndroid Build Coastguard Worker auto key = prefs_.CreateSubKey({"ns", "sp", "sk"});
610*5a923131SAndroid Build Coastguard Worker ASSERT_TRUE(prefs_.SetInt64(key, 0));
611*5a923131SAndroid Build Coastguard Worker EXPECT_TRUE(prefs_.Exists(key));
612*5a923131SAndroid Build Coastguard Worker EXPECT_TRUE(prefs_.Delete(kKey));
613*5a923131SAndroid Build Coastguard Worker }
614*5a923131SAndroid Build Coastguard Worker
TEST_F(MemoryPrefsTest,MultiNamespaceKeyTest)615*5a923131SAndroid Build Coastguard Worker TEST_F(MemoryPrefsTest, MultiNamespaceKeyTest) {
616*5a923131SAndroid Build Coastguard Worker MultiNamespaceKeyTest();
617*5a923131SAndroid Build Coastguard Worker }
618*5a923131SAndroid Build Coastguard Worker
619*5a923131SAndroid Build Coastguard Worker } // namespace chromeos_update_engine
620