blob: cfa04ee6fd4aab6aead326a414e0a60f830bdb91 [file] [log] [blame]
Darin Petkov7f060332012-03-14 11:46:47 +01001// Copyright (c) 2012 The Chromium OS Authors. All rights reserved.
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 "shill/key_value_store.h"
6
7#include <gtest/gtest.h>
8
Arman Uguray631c7e42013-07-30 16:41:12 -07009using std::map;
Paul Stewart1062d9d2012-04-27 10:42:27 -070010using std::string;
Paul Stewart3c5e2b32013-06-13 07:49:49 -070011using std::vector;
Darin Petkov7f060332012-03-14 11:46:47 +010012using testing::Test;
13
14namespace shill {
15
16class KeyValueStoreTest : public Test {
17 public:
18 KeyValueStoreTest() {}
19
20 protected:
21 KeyValueStore store_;
22};
23
Paul Stewart1062d9d2012-04-27 10:42:27 -070024TEST_F(KeyValueStoreTest, Bool) {
25 const string kKey("foo");
26 const bool kDefaultValue = true;
27 const bool kValue = false;
28 EXPECT_FALSE(store_.ContainsBool(kKey));
29 EXPECT_EQ(kDefaultValue, store_.LookupBool(kKey, kDefaultValue));
30 store_.SetBool(kKey, kValue);
31 EXPECT_TRUE(store_.ContainsBool(kKey));
Alex Vakulenko8a532292014-06-16 17:18:44 -070032 // TODO(shenhan): investigate if a newer version of gtest handles EXPECT_EQ
33 // for bools in a manner that gcc 4.7 is happy with. (Improper conversion from
34 // "false" to "NULL").
Han Shenfc349252012-08-30 11:36:04 -070035 EXPECT_EQ(static_cast<int>(kValue),
36 static_cast<int>(store_.LookupBool(kKey, kDefaultValue)));
37 EXPECT_EQ(static_cast<int>(kValue),
38 static_cast<int>(store_.GetBool(kKey)));
Darin Petkovb536a742012-04-26 11:31:28 +020039}
40
Paul Stewart1062d9d2012-04-27 10:42:27 -070041TEST_F(KeyValueStoreTest, Int) {
42 const string kKey("foo");
43 const int kValue = 456;
44 EXPECT_FALSE(store_.ContainsInt(kKey));
Paul Stewart68e59562013-12-12 08:15:05 -080045 const int kDefaultValue = 789;
46 EXPECT_EQ(kDefaultValue, store_.LookupInt(kKey, kDefaultValue));
Paul Stewart1062d9d2012-04-27 10:42:27 -070047 store_.SetInt(kKey, kValue);
48 EXPECT_TRUE(store_.ContainsInt(kKey));
49 EXPECT_EQ(kValue, store_.GetInt(kKey));
Paul Stewart68e59562013-12-12 08:15:05 -080050 EXPECT_EQ(kValue, store_.LookupInt(kKey, kDefaultValue));
Paul Stewart1062d9d2012-04-27 10:42:27 -070051 store_.RemoveInt(kKey);
52 EXPECT_FALSE(store_.ContainsInt(kKey));
Darin Petkov7f060332012-03-14 11:46:47 +010053}
54
Paul Stewartbb833562015-01-21 23:30:46 -080055TEST_F(KeyValueStoreTest, KeyValueStore) {
56 const string kSubKey("foo");
57 const map<string, string> kSubValue{ { "bar0", "baz0" }, { "bar1", "baz1" } };
58 KeyValueStore value;
59 value.SetStringmap(kSubKey, kSubValue);
60 const string kKey("foo");
61 EXPECT_FALSE(store_.ContainsKeyValueStore(kKey));
62 store_.SetKeyValueStore(kKey, value);
63 EXPECT_TRUE(store_.ContainsKeyValueStore(kKey));
64 EXPECT_TRUE(value.Equals(store_.GetKeyValueStore(kKey)));
65 store_.RemoveKeyValueStore(kKey);
66 EXPECT_FALSE(store_.ContainsKeyValueStore(kKey));
67}
68
Paul Stewart1062d9d2012-04-27 10:42:27 -070069TEST_F(KeyValueStoreTest, String) {
70 const string kKey("foo");
71 const string kDefaultValue("bar");
72 const string kValue("baz");
73 EXPECT_FALSE(store_.ContainsString(kKey));
74 EXPECT_EQ(kDefaultValue, store_.LookupString(kKey, kDefaultValue));
75 store_.SetString(kKey, kValue);
76 EXPECT_TRUE(store_.ContainsString(kKey));
77 EXPECT_EQ(kValue, store_.LookupString(kKey, kDefaultValue));
78 EXPECT_EQ(kValue, store_.GetString(kKey));
Paul Stewart88125fb2012-03-26 07:13:51 -070079 store_.RemoveString(kKey);
Paul Stewart1062d9d2012-04-27 10:42:27 -070080 EXPECT_FALSE(store_.ContainsString(kKey));
81 EXPECT_EQ(kDefaultValue, store_.LookupString(kKey, kDefaultValue));
82}
83
Arman Uguray631c7e42013-07-30 16:41:12 -070084TEST_F(KeyValueStoreTest, Stringmap) {
85 const string kKey("foo");
86 const map<string, string> kValue{ { "bar0", "baz0" }, { "bar1", "baz1" } };
87 EXPECT_FALSE(store_.ContainsStringmap(kKey));
88 store_.SetStringmap(kKey, kValue);
89 EXPECT_TRUE(store_.ContainsStringmap(kKey));
90 EXPECT_EQ(kValue, store_.GetStringmap(kKey));
91 store_.RemoveStringmap(kKey);
92 EXPECT_FALSE(store_.ContainsStringmap(kKey));
93}
94
Paul Stewart3c5e2b32013-06-13 07:49:49 -070095TEST_F(KeyValueStoreTest, Strings) {
96 const string kKey("foo");
97 const vector<string> kValue{ "baz0", "baz1", "baz2" };
98 EXPECT_FALSE(store_.ContainsStrings(kKey));
99 store_.SetStrings(kKey, kValue);
100 EXPECT_TRUE(store_.ContainsStrings(kKey));
101 EXPECT_EQ(kValue, store_.GetStrings(kKey));
102 store_.RemoveStrings(kKey);
103 EXPECT_FALSE(store_.ContainsStrings(kKey));
104}
105
Paul Stewart1062d9d2012-04-27 10:42:27 -0700106TEST_F(KeyValueStoreTest, Uint) {
107 const string kKey("foo");
Ben Chan7fab8972014-08-10 17:14:46 -0700108 const uint32_t kValue = 456;
Paul Stewart1062d9d2012-04-27 10:42:27 -0700109 EXPECT_FALSE(store_.ContainsUint(kKey));
110 store_.SetUint(kKey, kValue);
111 EXPECT_TRUE(store_.ContainsUint(kKey));
112 EXPECT_EQ(kValue, store_.GetUint(kKey));
113}
114
115TEST_F(KeyValueStoreTest, DoubleRemove) {
116 const string kKey("foo");
Paul Stewart88125fb2012-03-26 07:13:51 -0700117 // Make sure we don't get an exception/infinite loop if we do a
Paul Stewart1062d9d2012-04-27 10:42:27 -0700118 // "Remove()" when the key does not exist.
119 store_.RemoveInt(kKey);
120 store_.RemoveInt(kKey);
121 store_.RemoveString(kKey);
Paul Stewart88125fb2012-03-26 07:13:51 -0700122 store_.RemoveString(kKey);
123}
124
Paul Stewartdef189e2012-08-02 20:12:09 -0700125TEST_F(KeyValueStoreTest, Clear) {
Paul Stewartbaf87072013-10-04 17:03:37 -0700126 EXPECT_TRUE(store_.IsEmpty());
Paul Stewartdef189e2012-08-02 20:12:09 -0700127 const string kBoolKey("foo");
128 const bool kBoolValue = true;
129 store_.SetBool(kBoolKey, kBoolValue);
130 const string kIntKey("bar");
131 const int kIntValue = 123;
132 store_.SetInt(kIntKey, kIntValue);
Paul Stewartbb833562015-01-21 23:30:46 -0800133 const string kKeyValueStoreKey("bear");
134 const KeyValueStore kKeyValueStoreValue;
135 store_.SetKeyValueStore(kKeyValueStoreKey, kKeyValueStoreValue);
Paul Stewartdef189e2012-08-02 20:12:09 -0700136 const string kStringKey("baz");
137 const string kStringValue("string");
138 store_.SetString(kStringKey, kStringValue);
Arman Uguray631c7e42013-07-30 16:41:12 -0700139 const string kStringmapKey("stringMapKey");
140 const map<string, string> kStringmapValue;
141 store_.SetStringmap(kStringmapKey, kStringmapValue);
142 const string kStringsKey("stringsKey");
143 const vector<string> kStringsValue;
144 store_.SetStrings(kStringsKey, kStringsValue);
Paul Stewartdef189e2012-08-02 20:12:09 -0700145 const string kUintKey("bun");
Ben Chan7fab8972014-08-10 17:14:46 -0700146 const uint32_t kUintValue = 456;
Paul Stewartdef189e2012-08-02 20:12:09 -0700147 store_.SetUint(kUintKey, kUintValue);
148
149 EXPECT_TRUE(store_.ContainsBool(kBoolKey));
150 EXPECT_TRUE(store_.ContainsInt(kIntKey));
Paul Stewartbb833562015-01-21 23:30:46 -0800151 EXPECT_TRUE(store_.ContainsKeyValueStore(kKeyValueStoreKey));
Paul Stewartdef189e2012-08-02 20:12:09 -0700152 EXPECT_TRUE(store_.ContainsString(kStringKey));
Arman Uguray631c7e42013-07-30 16:41:12 -0700153 EXPECT_TRUE(store_.ContainsStringmap(kStringmapKey));
154 EXPECT_TRUE(store_.ContainsStrings(kStringsKey));
Paul Stewartdef189e2012-08-02 20:12:09 -0700155 EXPECT_TRUE(store_.ContainsUint(kUintKey));
Paul Stewartbaf87072013-10-04 17:03:37 -0700156 EXPECT_FALSE(store_.IsEmpty());
Paul Stewartdef189e2012-08-02 20:12:09 -0700157 store_.Clear();
Paul Stewartbaf87072013-10-04 17:03:37 -0700158 EXPECT_TRUE(store_.IsEmpty());
Paul Stewartdef189e2012-08-02 20:12:09 -0700159 EXPECT_FALSE(store_.ContainsBool(kBoolKey));
160 EXPECT_FALSE(store_.ContainsInt(kIntKey));
Paul Stewartbb833562015-01-21 23:30:46 -0800161 EXPECT_FALSE(store_.ContainsInt(kKeyValueStoreKey));
Paul Stewartdef189e2012-08-02 20:12:09 -0700162 EXPECT_FALSE(store_.ContainsString(kStringKey));
Arman Uguray631c7e42013-07-30 16:41:12 -0700163 EXPECT_FALSE(store_.ContainsStringmap(kStringmapKey));
164 EXPECT_FALSE(store_.ContainsStrings(kStringsKey));
Paul Stewartdef189e2012-08-02 20:12:09 -0700165 EXPECT_FALSE(store_.ContainsUint(kUintKey));
166}
167
Prathmesh Prabhu3903c702013-11-22 17:31:17 -0800168TEST_F(KeyValueStoreTest, Equals) {
169 KeyValueStore first, second;
170
171 first.SetBool("boolKey", true);
172 EXPECT_FALSE(first.Equals(second));
173
174 first.Clear();
175 second.Clear();
176 second.SetBool("boolKey", true);
177 EXPECT_FALSE(first.Equals(second));
178
179 first.Clear();
180 second.Clear();
181 first.SetBool("boolKey", true);
182 second.SetBool("boolOtherKey", true);
183 EXPECT_FALSE(first.Equals(second));
184
185 first.Clear();
186 second.Clear();
187 first.SetBool("boolKey", true);
188 second.SetBool("boolKey", false);
189 EXPECT_FALSE(first.Equals(second));
190
191 first.Clear();
192 second.Clear();
193 first.SetInt("intKey", 123);
194 second.SetInt("intOtherKey", 123);
195 EXPECT_FALSE(first.Equals(second));
196
197 first.Clear();
198 second.Clear();
199 first.SetInt("intKey", 123);
200 second.SetInt("intKey", 456);
201 EXPECT_FALSE(first.Equals(second));
202
Paul Stewartbb833562015-01-21 23:30:46 -0800203 KeyValueStore key_value0;
204 key_value0.SetInt("intKey", 123);
205 KeyValueStore key_value1;
206 key_value1.SetInt("intOtherKey", 123);
207
208 first.Clear();
209 second.Clear();
210 first.SetKeyValueStore("keyValueKey", key_value0);
211 second.SetKeyValueStore("keyValueKey", key_value1);
212 EXPECT_FALSE(first.Equals(second));
213
214 first.Clear();
215 second.Clear();
216 first.SetKeyValueStore("keyValueKey", key_value0);
217 second.SetKeyValueStore("keyValueOtherKey", key_value0);
218 EXPECT_FALSE(first.Equals(second));
219
Prathmesh Prabhu3903c702013-11-22 17:31:17 -0800220 first.Clear();
221 second.Clear();
222 first.SetString("stringKey", "string");
223 second.SetString("stringOtherKey", "string");
224 EXPECT_FALSE(first.Equals(second));
225
226 first.Clear();
227 second.Clear();
228 first.SetString("stringKey", "string");
229 second.SetString("stringKey", "otherString");
230 EXPECT_FALSE(first.Equals(second));
231
232 const map<string, string> kStringmap1{ { "key", "value" } };
233 const map<string, string> kStringmap2{ { "otherKey", "value" } };
234 const map<string, string> kStringmap3{ { "key", "otherValue" } };
235
236 first.Clear();
237 second.Clear();
238 first.SetStringmap("stringmapKey", kStringmap1);
239 second.SetStringmap("stringmapOtherKey", kStringmap1);
240 EXPECT_FALSE(first.Equals(second));
241
242 first.Clear();
243 second.Clear();
244 first.SetStringmap("stringmapKey", kStringmap1);
245 second.SetStringmap("stringmapKey", kStringmap2);
246 EXPECT_FALSE(first.Equals(second));
247
248 first.Clear();
249 second.Clear();
250 first.SetStringmap("stringmapKey", kStringmap1);
251 second.SetStringmap("stringmapKey", kStringmap3);
252 EXPECT_FALSE(first.Equals(second));
253
254 const vector<string> kStrings1{ "value" };
255 const vector<string> kStrings2{ "otherValue" };
256
257 first.Clear();
258 second.Clear();
259 first.SetStrings("stringsKey", kStrings1);
260 second.SetStrings("stringsOtherKey", kStrings1);
261 EXPECT_FALSE(first.Equals(second));
262
263 first.Clear();
264 second.Clear();
265 first.SetStrings("stringsKey", kStrings1);
266 second.SetStrings("stringsKey", kStrings2);
267 EXPECT_FALSE(first.Equals(second));
268
269 first.Clear();
270 second.Clear();
271 first.SetUint("uintKey", 1);
272 second.SetUint("uintOtherKey", 1);
273 EXPECT_FALSE(first.Equals(second));
274
275 first.Clear();
276 second.Clear();
277 first.SetUint("uintKey", 1);
278 second.SetUint("uintKey", 2);
279 EXPECT_FALSE(first.Equals(second));
280
281 first.Clear();
282 second.Clear();
283 first.SetBool("boolKey", true);
284 first.SetInt("intKey", 123);
285 first.SetString("stringKey", "value");
286 first.SetStringmap("stringmapKey", kStringmap1);
287 first.SetStrings("stringsKey", kStrings1);
288 first.SetUint("uintKey", 1);
289 second.SetBool("boolKey", true);
290 second.SetInt("intKey", 123);
291 second.SetString("stringKey", "value");
292 second.SetStringmap("stringmapKey", kStringmap1);
293 second.SetStrings("stringsKey", kStrings1);
294 second.SetUint("uintKey", 1);
295 EXPECT_TRUE(first.Equals(second));
296}
297
Paul Stewartd2e1c362013-03-03 19:06:07 -0800298TEST_F(KeyValueStoreTest, CopyFrom) {
299 KeyValueStore donor;
300 const string kBoolKey("foo");
301 const bool kBoolValue = true;
302 donor.SetBool(kBoolKey, kBoolValue);
303 const string kIntKey("bar");
304 const int kIntValue = 123;
305 donor.SetInt(kIntKey, kIntValue);
Paul Stewartbb833562015-01-21 23:30:46 -0800306 const string kKeyValueStoreKey("bear");
307 KeyValueStore keyValueStoreValue;
308 keyValueStoreValue.SetInt(kIntKey, kIntValue);
309 donor.SetKeyValueStore(kKeyValueStoreKey, keyValueStoreValue);
Paul Stewartd2e1c362013-03-03 19:06:07 -0800310 const string kStringKey("baz");
311 const string kStringValue("string");
312 donor.SetString(kStringKey, kStringValue);
Arman Uguray631c7e42013-07-30 16:41:12 -0700313 const string kStringmapKey("stringMapKey");
314 const map<string, string> kStringmapValue{ { "key", "value" } };
315 donor.SetStringmap(kStringmapKey, kStringmapValue);
316 const string kStringsKey("stringsKey");
317 const vector<string> kStringsValue{ "string0", "string1" };
318 donor.SetStrings(kStringsKey, kStringsValue);
Paul Stewartd2e1c362013-03-03 19:06:07 -0800319 const string kUintKey("bun");
Ben Chan7fab8972014-08-10 17:14:46 -0700320 const uint32_t kUintValue = 456;
Paul Stewartd2e1c362013-03-03 19:06:07 -0800321 donor.SetUint(kUintKey, kUintValue);
322
Prathmesh Prabhu3903c702013-11-22 17:31:17 -0800323 EXPECT_TRUE(store_.IsEmpty());
Paul Stewartd2e1c362013-03-03 19:06:07 -0800324 store_.CopyFrom(donor);
Prathmesh Prabhu3903c702013-11-22 17:31:17 -0800325 EXPECT_FALSE(store_.IsEmpty());
326 EXPECT_TRUE(donor.Equals(store_));
Paul Stewartd2e1c362013-03-03 19:06:07 -0800327}
Prathmesh Prabhu3903c702013-11-22 17:31:17 -0800328
Darin Petkov7f060332012-03-14 11:46:47 +0100329} // namespace shill