blob: 12f6b6e57076d4935211c903a571a430774cc15b [file] [log] [blame]
Darin Petkov083047b2011-06-23 20:42:48 -07001// Copyright (c) 2011 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
Chris Masone8a7b8be2011-07-22 12:43:37 -07005#include "shill/key_file_store.h"
6
Darin Petkov083047b2011-06-23 20:42:48 -07007#include <base/file_util.h>
Eric Shienbrood3e20a232012-02-16 11:35:56 -05008#include <base/scoped_temp_dir.h>
9#include <base/stl_util.h>
Darin Petkov083047b2011-06-23 20:42:48 -070010#include <base/stringprintf.h>
Darin Petkov083047b2011-06-23 20:42:48 -070011#include <gtest/gtest.h>
12
Gary Morain96970242012-04-20 10:59:58 -070013using file_util::FileEnumerator;
Darin Petkov083047b2011-06-23 20:42:48 -070014using std::set;
15using std::string;
Darin Petkovb2841fd2011-06-30 12:54:12 -070016using std::vector;
Darin Petkov083047b2011-06-23 20:42:48 -070017using testing::Test;
18
19namespace shill {
20
Darin Petkov86964e02011-06-29 13:49:28 -070021namespace {
22const char kPlainText[] = "This is a test!";
23const char kROT47Text[] = "rot47:%9:D :D 2 E6DEP";
24} // namespace {}
25
Darin Petkov083047b2011-06-23 20:42:48 -070026class KeyFileStoreTest : public Test {
27 public:
28 KeyFileStoreTest() : store_(&glib_) {}
29
30 virtual void SetUp() {
31 ASSERT_TRUE(temp_dir_.CreateUniqueTempDir());
Chris Masoneb9c00592011-10-06 13:10:39 -070032 test_file_ = temp_dir_.path().Append("test-key-file-store");
33 store_.set_path(test_file_);
Darin Petkov083047b2011-06-23 20:42:48 -070034 }
35
36 virtual void TearDown() {
37 store_.set_path(FilePath("")); // Don't try to save the store.
38 ASSERT_TRUE(temp_dir_.Delete());
39 }
40
41 protected:
42 string ReadKeyFile();
43 void WriteKeyFile(string data);
Chris Masoneb9c00592011-10-06 13:10:39 -070044 bool OpenCheckClose(const string &group,
45 const string &key,
46 const string &expected_value);
Darin Petkov083047b2011-06-23 20:42:48 -070047
48 GLib glib_; // Use real GLib for testing KeyFileStore.
49 ScopedTempDir temp_dir_;
Chris Masoneb9c00592011-10-06 13:10:39 -070050 FilePath test_file_;
Darin Petkov083047b2011-06-23 20:42:48 -070051 KeyFileStore store_;
52};
53
54string KeyFileStoreTest::ReadKeyFile() {
55 string data;
56 EXPECT_TRUE(file_util::ReadFileToString(store_.path(), &data));
57 return data;
58}
59
60void KeyFileStoreTest::WriteKeyFile(string data) {
61 EXPECT_EQ(data.size(),
62 file_util::WriteFile(store_.path(), data.data(), data.size()));
63}
64
65TEST_F(KeyFileStoreTest, OpenClose) {
66 EXPECT_FALSE(store_.key_file_);
67
Paul Stewart5dc40aa2011-10-28 19:43:43 -070068 EXPECT_FALSE(store_.IsNonEmpty());
Darin Petkov083047b2011-06-23 20:42:48 -070069 ASSERT_TRUE(store_.Open());
70 EXPECT_TRUE(store_.key_file_);
Darin Petkov86964e02011-06-29 13:49:28 -070071 EXPECT_EQ(1, store_.crypto_.cryptos_.size());
Darin Petkov083047b2011-06-23 20:42:48 -070072 ASSERT_TRUE(store_.Close());
73 EXPECT_FALSE(store_.key_file_);
Gary Morain96970242012-04-20 10:59:58 -070074 FileEnumerator file_enumerator(temp_dir_.path(),
75 false /* not recursive */,
76 FileEnumerator::FILES);
77
78 // Verify that the file actually got written with the right name.
79 EXPECT_EQ(test_file_.value(), file_enumerator.Next().value());
80 FileEnumerator::FindInfo find_info;
81 file_enumerator.GetFindInfo(&find_info);
82
83 // Verify that the profile is a regular file, readable and writeable by the
84 // owner only.
85 EXPECT_EQ(S_IFREG | S_IRUSR | S_IWUSR, find_info.stat.st_mode);
Darin Petkov083047b2011-06-23 20:42:48 -070086
87 ASSERT_TRUE(store_.Open());
88 EXPECT_TRUE(store_.key_file_);
89 ASSERT_TRUE(store_.Close());
90 EXPECT_FALSE(store_.key_file_);
91
92 ASSERT_TRUE(store_.Open());
93 store_.set_path(FilePath(""));
94 ASSERT_FALSE(store_.Close());
95 EXPECT_FALSE(store_.key_file_);
96}
97
98TEST_F(KeyFileStoreTest, OpenFail) {
99 WriteKeyFile("garbage\n");
100 EXPECT_FALSE(store_.Open());
101 EXPECT_FALSE(store_.key_file_);
102}
103
104TEST_F(KeyFileStoreTest, GetGroups) {
105 static const char kGroupA[] = "g-a";
106 static const char kGroupB[] = "g-b";
107 static const char kGroupC[] = "g-c";
108 WriteKeyFile(base::StringPrintf("[%s]\n"
109 "[%s]\n"
110 "[%s]\n",
111 kGroupA, kGroupB, kGroupC));
Paul Stewart5dc40aa2011-10-28 19:43:43 -0700112 EXPECT_TRUE(store_.IsNonEmpty());
Darin Petkov083047b2011-06-23 20:42:48 -0700113 ASSERT_TRUE(store_.Open());
114 set<string> groups = store_.GetGroups();
115 EXPECT_EQ(3, groups.size());
116 EXPECT_TRUE(ContainsKey(groups, kGroupA));
117 EXPECT_TRUE(ContainsKey(groups, kGroupB));
118 EXPECT_TRUE(ContainsKey(groups, kGroupC));
119 EXPECT_FALSE(ContainsKey(groups, "g-x"));
120 ASSERT_TRUE(store_.Close());
121}
122
Paul Stewarta41e38d2011-11-11 07:47:29 -0800123TEST_F(KeyFileStoreTest, GetGroupsWithKey) {
124 static const char kGroupA[] = "g-a";
125 static const char kGroupB[] = "g-b";
126 static const char kGroupC[] = "g-c";
127 static const char kKeyA[] = "k-a";
128 static const char kKeyB[] = "k-b";
129 static const char kValue[] = "true";
130 WriteKeyFile(base::StringPrintf("[%s]\n"
131 "%s=%s\n"
132 "[%s]\n"
133 "%s=%s\n"
134 "%s=%s\n"
135 "[%s]\n"
136 "%s=%s\n",
137 kGroupA, kKeyA, kValue,
138 kGroupB, kKeyA, kValue, kKeyB, kValue,
139 kGroupC, kKeyB, kValue));
140 EXPECT_TRUE(store_.IsNonEmpty());
141 ASSERT_TRUE(store_.Open());
142 set<string> groups_a = store_.GetGroupsWithKey(kKeyA);
143 EXPECT_EQ(2, groups_a.size());
144 EXPECT_TRUE(ContainsKey(groups_a, kGroupA));
145 EXPECT_TRUE(ContainsKey(groups_a, kGroupB));
146 set<string> groups_b = store_.GetGroupsWithKey(kKeyB);
147 EXPECT_EQ(2, groups_b.size());
148 EXPECT_TRUE(ContainsKey(groups_b, kGroupB));
149 EXPECT_TRUE(ContainsKey(groups_b, kGroupC));
150 ASSERT_TRUE(store_.Close());
151}
152
Darin Petkov083047b2011-06-23 20:42:48 -0700153TEST_F(KeyFileStoreTest, ContainsGroup) {
154 static const char kGroupA[] = "group-a";
155 static const char kGroupB[] = "group-b";
156 static const char kGroupC[] = "group-c";
157 WriteKeyFile(base::StringPrintf("[%s]\n"
158 "[%s]\n"
159 "[%s]\n",
160 kGroupA, kGroupB, kGroupC));
161 ASSERT_TRUE(store_.Open());
162 EXPECT_TRUE(store_.ContainsGroup(kGroupA));
163 EXPECT_TRUE(store_.ContainsGroup(kGroupB));
164 EXPECT_TRUE(store_.ContainsGroup(kGroupC));
165 EXPECT_FALSE(store_.ContainsGroup("group-d"));
166 ASSERT_TRUE(store_.Close());
167}
168
169TEST_F(KeyFileStoreTest, DeleteKey) {
170 static const char kGroup[] = "the-group";
171 static const char kKeyDead[] = "dead";
172 static const char kKeyAlive[] = "alive";
173 const int kValueAlive = 3;
174 WriteKeyFile(base::StringPrintf("[%s]\n"
175 "%s=5\n"
176 "%s=%d\n",
177 kGroup, kKeyDead, kKeyAlive, kValueAlive));
178 ASSERT_TRUE(store_.Open());
179 EXPECT_TRUE(store_.DeleteKey(kGroup, kKeyDead));
Chris Masone9d779932011-08-25 16:33:41 -0700180 EXPECT_TRUE(store_.DeleteKey(kGroup, "random-key"));
Darin Petkov083047b2011-06-23 20:42:48 -0700181 EXPECT_FALSE(store_.DeleteKey("random-group", kKeyAlive));
182 ASSERT_TRUE(store_.Close());
183 EXPECT_EQ(base::StringPrintf("\n"
184 "[%s]\n"
185 "%s=%d\n",
186 kGroup, kKeyAlive, kValueAlive),
187 ReadKeyFile());
188}
189
190TEST_F(KeyFileStoreTest, DeleteGroup) {
191 static const char kGroupA[] = "group-a";
192 static const char kGroupB[] = "group-b";
193 static const char kGroupC[] = "group-c";
194 WriteKeyFile(base::StringPrintf("[%s]\n"
195 "[%s]\n"
196 "key-to-be-deleted=true\n"
197 "[%s]\n",
198 kGroupA, kGroupB, kGroupC));
199 ASSERT_TRUE(store_.Open());
200 EXPECT_TRUE(store_.DeleteGroup(kGroupB));
Chris Masone9d779932011-08-25 16:33:41 -0700201 EXPECT_TRUE(store_.DeleteGroup("group-d"));
Darin Petkov083047b2011-06-23 20:42:48 -0700202 ASSERT_TRUE(store_.Close());
203 EXPECT_EQ(base::StringPrintf("\n"
204 "[%s]\n"
205 "\n"
206 "[%s]\n",
207 kGroupA, kGroupC),
208 ReadKeyFile());
209}
210
211TEST_F(KeyFileStoreTest, GetString) {
212 static const char kGroup[] = "something";
213 static const char kKey[] = "foo";
214 static const char kValue[] = "bar";
215 WriteKeyFile(base::StringPrintf("[%s]\n"
216 "%s=%s\n",
217 kGroup, kKey, kValue));
218 ASSERT_TRUE(store_.Open());
219 string value;
220 EXPECT_TRUE(store_.GetString(kGroup, kKey, &value));
221 EXPECT_EQ(kValue, value);
222 EXPECT_FALSE(store_.GetString("something-else", kKey, &value));
223 EXPECT_FALSE(store_.GetString(kGroup, "bar", &value));
224 EXPECT_TRUE(store_.GetString(kGroup, kKey, NULL));
225 ASSERT_TRUE(store_.Close());
226}
227
228TEST_F(KeyFileStoreTest, SetString) {
229 static const char kGroup[] = "string-group";
230 static const char kKey1[] = "test-string";
231 static const char kValue1[] = "foo";
232 static const char kKey2[] = "empty-string";
233 static const char kValue2[] = "";
234 ASSERT_TRUE(store_.Open());
235 ASSERT_TRUE(store_.SetString(kGroup, kKey1, kValue1));
236 ASSERT_TRUE(store_.SetString(kGroup, kKey2, kValue2));
237 ASSERT_TRUE(store_.Close());
238 EXPECT_EQ(base::StringPrintf("\n"
239 "[%s]\n"
240 "%s=%s\n"
241 "%s=%s\n",
242 kGroup, kKey1, kValue1, kKey2, kValue2),
243 ReadKeyFile());
244}
245
246TEST_F(KeyFileStoreTest, GetBool) {
247 static const char kGroup[] = "boo";
248 static const char kKeyTrue[] = "foo";
249 static const char kKeyFalse[] = "bar";
250 static const char kKeyBad[] = "zoo";
251 WriteKeyFile(base::StringPrintf("[%s]\n"
252 "%s=true\n"
253 "%s=false\n"
254 "%s=moo\n",
255 kGroup, kKeyTrue, kKeyFalse, kKeyBad));
256 ASSERT_TRUE(store_.Open());
257 {
258 bool value = true;
259 EXPECT_TRUE(store_.GetBool(kGroup, kKeyFalse, &value));
260 EXPECT_FALSE(value);
261 }
262 {
263 bool value = false;
264 EXPECT_TRUE(store_.GetBool(kGroup, kKeyTrue, &value));
265 EXPECT_TRUE(value);
266 }
267 {
268 bool value;
269 EXPECT_FALSE(store_.GetBool(kGroup, kKeyBad, &value));
270 EXPECT_FALSE(store_.GetBool(kGroup, "unknown", &value));
271 EXPECT_FALSE(store_.GetBool("unknown", kKeyTrue, &value));
272 }
273 EXPECT_TRUE(store_.GetBool(kGroup, kKeyFalse, NULL));
274 ASSERT_TRUE(store_.Close());
275}
276
277TEST_F(KeyFileStoreTest, SetBool) {
278 static const char kGroup[] = "bool-group";
279 static const char kKeyTrue[] = "test-true-bool";
280 static const char kKeyFalse[] = "test-false-bool";
281 ASSERT_TRUE(store_.Open());
282 ASSERT_TRUE(store_.SetBool(kGroup, kKeyTrue, true));
283 ASSERT_TRUE(store_.SetBool(kGroup, kKeyFalse, false));
284 ASSERT_TRUE(store_.Close());
285 EXPECT_EQ(base::StringPrintf("\n"
286 "[%s]\n"
287 "%s=true\n"
288 "%s=false\n",
289 kGroup, kKeyTrue, kKeyFalse),
290 ReadKeyFile());
291}
292
293TEST_F(KeyFileStoreTest, GetInt) {
294 static const char kGroup[] = "numbers";
295 static const char kKeyPos[] = "pos";
296 static const char kKeyNeg[] = "neg";
297 static const char kKeyBad[] = "bad";
298 const int kValuePos = 50;
299 const int kValueNeg = -20;
300 static const char kValueBad[] = "nan";
301 WriteKeyFile(base::StringPrintf("[%s]\n"
302 "%s=%d\n"
303 "%s=%d\n"
304 "%s=%s\n",
305 kGroup,
306 kKeyPos, kValuePos,
307 kKeyNeg, kValueNeg,
308 kKeyBad, kValueBad));
309 ASSERT_TRUE(store_.Open());
310 {
311 int value = 0;
312 EXPECT_TRUE(store_.GetInt(kGroup, kKeyNeg, &value));
313 EXPECT_EQ(kValueNeg, value);
314 }
315 {
316 int value = 0;
317 EXPECT_TRUE(store_.GetInt(kGroup, kKeyPos, &value));
318 EXPECT_EQ(kValuePos, value);
319 }
320 {
321 int value;
322 EXPECT_FALSE(store_.GetInt(kGroup, kKeyBad, &value));
323 EXPECT_FALSE(store_.GetInt(kGroup, "invalid", &value));
324 EXPECT_FALSE(store_.GetInt("invalid", kKeyPos, &value));
325 }
326 EXPECT_TRUE(store_.GetInt(kGroup, kKeyPos, NULL));
327 ASSERT_TRUE(store_.Close());
328}
329
330TEST_F(KeyFileStoreTest, SetInt) {
331 static const char kGroup[] = "int-group";
332 static const char kKey1[] = "test-int";
333 static const char kKey2[] = "test-negative";
334 const int kValue1 = 5;
335 const int kValue2 = -10;
336 ASSERT_TRUE(store_.Open());
337 ASSERT_TRUE(store_.SetInt(kGroup, kKey1, kValue1));
338 ASSERT_TRUE(store_.SetInt(kGroup, kKey2, kValue2));
339 ASSERT_TRUE(store_.Close());
340 EXPECT_EQ(base::StringPrintf("\n"
341 "[%s]\n"
342 "%s=%d\n"
343 "%s=%d\n",
344 kGroup, kKey1, kValue1, kKey2, kValue2),
345 ReadKeyFile());
346}
347
Darin Petkovb2841fd2011-06-30 12:54:12 -0700348TEST_F(KeyFileStoreTest, GetStringList) {
349 static const char kGroup[] = "string-lists";
350 static const char kKeyEmpty[] = "empty";
351 static const char kKeyEmptyValue[] = "empty-value";
352 static const char kKeyValueEmpty[] = "value-empty";
353 static const char kKeyValueEmptyValue[] = "value-empty-value";
354 static const char kKeyValues[] = "values";
355 static const char kValue[] = "value";
356 static const char kValue2[] = "value2";
357 static const char kValue3[] = "value3";
358 WriteKeyFile(base::StringPrintf("[%s]\n"
359 "%s=\n"
360 "%s=;%s\n"
361 "%s=%s;;\n"
362 "%s=%s;;%s\n"
363 "%s=%s;%s;%s\n",
364 kGroup,
365 kKeyEmpty,
366 kKeyEmptyValue, kValue,
367 kKeyValueEmpty, kValue,
368 kKeyValueEmptyValue, kValue, kValue2,
369 kKeyValues, kValue, kValue2, kValue3));
370 ASSERT_TRUE(store_.Open());
371
372 vector<string> value;
373
374 EXPECT_TRUE(store_.GetStringList(kGroup, kKeyValues, &value));
375 ASSERT_EQ(3, value.size());
376 EXPECT_EQ(kValue, value[0]);
377 EXPECT_EQ(kValue2, value[1]);
378 EXPECT_EQ(kValue3, value[2]);
379
380 EXPECT_TRUE(store_.GetStringList(kGroup, kKeyEmptyValue, &value));
381 ASSERT_EQ(2, value.size());
382 EXPECT_EQ("", value[0]);
383 EXPECT_EQ(kValue, value[1]);
384
385 EXPECT_TRUE(store_.GetStringList(kGroup, kKeyValueEmpty, &value));
386 ASSERT_EQ(2, value.size());
387 EXPECT_EQ(kValue, value[0]);
388 EXPECT_EQ("", value[1]);
389
390 EXPECT_TRUE(store_.GetStringList(kGroup, kKeyEmpty, &value));
391 ASSERT_EQ(0, value.size());
392
393 EXPECT_TRUE(store_.GetStringList(kGroup, kKeyValueEmptyValue, &value));
394 ASSERT_EQ(3, value.size());
395 EXPECT_EQ(kValue, value[0]);
396 EXPECT_EQ("", value[1]);
397 EXPECT_EQ(kValue2, value[2]);
398
399 EXPECT_FALSE(store_.GetStringList("unknown-string-lists", kKeyEmpty, &value));
400 EXPECT_FALSE(store_.GetStringList(kGroup, "some-key", &value));
401 EXPECT_TRUE(store_.GetStringList(kGroup, kKeyValues, NULL));
402 ASSERT_TRUE(store_.Close());
403}
404
405TEST_F(KeyFileStoreTest, SetStringList) {
406 static const char kGroup[] = "strings";
407 static const char kKeyEmpty[] = "e";
408 static const char kKeyEmptyValue[] = "ev";
409 static const char kKeyValueEmpty[] = "ve";
410 static const char kKeyValueEmptyValue[] = "vev";
411 static const char kKeyValues[] = "v";
412 static const char kValue[] = "abc";
413 static const char kValue2[] = "pqr";
414 static const char kValue3[] = "xyz";
415 ASSERT_TRUE(store_.Open());
416 {
417 vector<string> value;
418 ASSERT_TRUE(store_.SetStringList(kGroup, kKeyEmpty, value));
419 }
420 {
421 vector<string> value;
422 value.push_back("");
423 value.push_back(kValue);
424 ASSERT_TRUE(store_.SetStringList(kGroup, kKeyEmptyValue, value));
425 }
426 {
427 vector<string> value;
428 value.push_back(kValue);
429 value.push_back("");
430 ASSERT_TRUE(store_.SetStringList(kGroup, kKeyValueEmpty, value));
431 }
432 {
433 vector<string> value;
434 value.push_back(kValue);
435 value.push_back("");
436 value.push_back(kValue2);
437 ASSERT_TRUE(store_.SetStringList(kGroup, kKeyValueEmptyValue, value));
438 }
439 {
440 vector<string> value;
441 value.push_back(kValue);
442 value.push_back(kValue2);
443 value.push_back(kValue3);
444 ASSERT_TRUE(store_.SetStringList(kGroup, kKeyValues, value));
445 }
446 ASSERT_TRUE(store_.Close());
447 EXPECT_EQ(base::StringPrintf("\n"
448 "[%s]\n"
449 "%s=\n"
450 "%s=;%s;\n"
451 "%s=%s;;\n"
452 "%s=%s;;%s;\n"
453 "%s=%s;%s;%s;\n",
454 kGroup,
455 kKeyEmpty,
456 kKeyEmptyValue, kValue,
457 kKeyValueEmpty, kValue,
458 kKeyValueEmptyValue, kValue, kValue2,
459 kKeyValues, kValue, kValue2, kValue3),
460 ReadKeyFile());
461}
462
Darin Petkov86964e02011-06-29 13:49:28 -0700463TEST_F(KeyFileStoreTest, GetCryptedString) {
464 static const char kGroup[] = "crypto-group";
465 static const char kKey[] = "secret";
466 WriteKeyFile(base::StringPrintf("[%s]\n"
467 "%s=%s\n",
468 kGroup, kKey, kROT47Text));
469 ASSERT_TRUE(store_.Open());
470 string value;
471 EXPECT_TRUE(store_.GetCryptedString(kGroup, kKey, &value));
472 EXPECT_EQ(kPlainText, value);
473 EXPECT_FALSE(store_.GetCryptedString("something-else", kKey, &value));
474 EXPECT_FALSE(store_.GetCryptedString(kGroup, "non-secret", &value));
475 EXPECT_TRUE(store_.GetCryptedString(kGroup, kKey, NULL));
476 ASSERT_TRUE(store_.Close());
477}
478
479TEST_F(KeyFileStoreTest, SetCryptedString) {
480 static const char kGroup[] = "crypted-string-group";
481 static const char kKey[] = "test-string";
482 ASSERT_TRUE(store_.Open());
483 ASSERT_TRUE(store_.SetCryptedString(kGroup, kKey, kPlainText));
484 ASSERT_TRUE(store_.Close());
485 EXPECT_EQ(base::StringPrintf("\n"
486 "[%s]\n"
487 "%s=%s\n",
488 kGroup, kKey, kROT47Text),
489 ReadKeyFile());
490}
491
Chris Masoneb9c00592011-10-06 13:10:39 -0700492TEST_F(KeyFileStoreTest, PersistAcrossClose) {
493 static const char kGroup[] = "string-group";
494 static const char kKey1[] = "test-string";
495 static const char kValue1[] = "foo";
496 static const char kKey2[] = "empty-string";
497 static const char kValue2[] = "";
498 ASSERT_TRUE(store_.Open());
499 ASSERT_TRUE(store_.SetString(kGroup, kKey1, kValue1));
500 ASSERT_TRUE(store_.Close());
501 ASSERT_TRUE(store_.Open());
502 ASSERT_TRUE(store_.SetString(kGroup, kKey2, kValue2));
503 string value;
504 ASSERT_TRUE(store_.GetString(kGroup, kKey1, &value));
505 ASSERT_EQ(kValue1, value);
506 ASSERT_TRUE(store_.GetString(kGroup, kKey2, &value));
507 ASSERT_EQ(kValue2, value);
508 ASSERT_TRUE(store_.Close());
509}
510
511bool KeyFileStoreTest::OpenCheckClose(const string &group,
512 const string &key,
513 const string &expected_value) {
514 KeyFileStore store(&glib_);
515 store.set_path(test_file_);
516 EXPECT_TRUE(store.Open());
517 string value;
518 bool could_get = store.GetString(group, key, &value);
519 store.set_path(FilePath("")); // Don't persist to disk.
520 store.Close();
521 return could_get && expected_value == value;
522}
523
524TEST_F(KeyFileStoreTest, Flush) {
525 static const char kGroup[] = "string-group";
526 static const char kKey1[] = "test-string";
527 static const char kValue1[] = "foo";
528 static const char kKey2[] = "empty-string";
529 static const char kValue2[] = "";
530 ASSERT_TRUE(store_.Open());
531 ASSERT_TRUE(store_.SetString(kGroup, kKey1, kValue1));
532 ASSERT_TRUE(store_.Flush());
533 ASSERT_TRUE(OpenCheckClose(kGroup, kKey1, kValue1));
534
535 ASSERT_TRUE(store_.SetString(kGroup, kKey2, kValue2));
536 ASSERT_TRUE(store_.Flush());
537 ASSERT_TRUE(OpenCheckClose(kGroup, kKey2, kValue2));
538
539 EXPECT_TRUE(store_.DeleteKey(kGroup, kKey1));
540 ASSERT_TRUE(store_.Flush());
541 ASSERT_FALSE(OpenCheckClose(kGroup, kKey1, kValue1));
542}
543
Paul Stewart5dc40aa2011-10-28 19:43:43 -0700544TEST_F(KeyFileStoreTest, EmptyFile) {
545 ASSERT_TRUE(store_.Open());
546 ASSERT_TRUE(store_.Close());
547 EXPECT_FALSE(store_.IsNonEmpty());
548}
549
550TEST_F(KeyFileStoreTest, SetHeader) {
551 ASSERT_TRUE(store_.Open());
552 ASSERT_TRUE(store_.SetHeader("this is a test"));
553 ASSERT_TRUE(store_.Close());
554 EXPECT_TRUE(store_.IsNonEmpty());
555 ASSERT_TRUE(store_.Open());
556}
557
Darin Petkov083047b2011-06-23 20:42:48 -0700558TEST_F(KeyFileStoreTest, Combo) {
559 static const char kGroupA[] = "square";
560 static const char kGroupB[] = "circle";
561 static const char kGroupC[] = "triangle";
562 static const char kGroupX[] = "pentagon";
563 static const char kKeyString[] = "color";
Darin Petkovb2841fd2011-06-30 12:54:12 -0700564 static const char kKeyStringList[] = "alternative-colors";
Darin Petkov083047b2011-06-23 20:42:48 -0700565 static const char kKeyInt[] = "area";
566 static const char kKeyBool[] = "visible";
567 static const char kValueStringA[] = "blue";
568 static const char kValueStringB[] = "red";
569 static const char kValueStringC[] = "yellow";
570 static const char kValueStringCNew[] = "purple";
571 const int kValueIntA = 5;
572 const int kValueIntB = 10;
573 const int kValueIntBNew = 333;
574 WriteKeyFile(base::StringPrintf("[%s]\n"
575 "%s=%s\n"
Darin Petkovb2841fd2011-06-30 12:54:12 -0700576 "%s=%s;%s\n"
Darin Petkov083047b2011-06-23 20:42:48 -0700577 "%s=%d\n"
578 "[%s]\n"
579 "%s=%s\n"
Darin Petkovb2841fd2011-06-30 12:54:12 -0700580 "%s=%s;%s\n"
Darin Petkov083047b2011-06-23 20:42:48 -0700581 "%s=%d\n"
582 "%s=true\n"
583 "[%s]\n"
584 "%s=%s\n"
585 "%s=false\n",
586 kGroupA,
587 kKeyString, kValueStringA,
Darin Petkovb2841fd2011-06-30 12:54:12 -0700588 kKeyStringList, kValueStringB, kValueStringC,
Darin Petkov083047b2011-06-23 20:42:48 -0700589 kKeyInt, kValueIntA,
590 kGroupB,
591 kKeyString, kValueStringB,
Darin Petkovb2841fd2011-06-30 12:54:12 -0700592 kKeyStringList, kValueStringA, kValueStringC,
Darin Petkov083047b2011-06-23 20:42:48 -0700593 kKeyInt, kValueIntB,
594 kKeyBool,
595 kGroupC,
596 kKeyString, kValueStringC,
597 kKeyBool));
598 ASSERT_TRUE(store_.Open());
599
600 EXPECT_TRUE(store_.ContainsGroup(kGroupA));
601 EXPECT_TRUE(store_.ContainsGroup(kGroupB));
602 EXPECT_TRUE(store_.ContainsGroup(kGroupC));
603 EXPECT_FALSE(store_.ContainsGroup(kGroupX));
604
605 set<string> groups = store_.GetGroups();
606 EXPECT_EQ(3, groups.size());
607 EXPECT_TRUE(ContainsKey(groups, kGroupA));
608 EXPECT_TRUE(ContainsKey(groups, kGroupB));
609 EXPECT_TRUE(ContainsKey(groups, kGroupC));
610 EXPECT_FALSE(ContainsKey(groups, kGroupX));
611
612 {
613 string value;
614 EXPECT_TRUE(store_.GetString(kGroupB, kKeyString, &value));
615 EXPECT_EQ(kValueStringB, value);
616 EXPECT_TRUE(store_.GetString(kGroupA, kKeyString, &value));
617 EXPECT_EQ(kValueStringA, value);
618 EXPECT_TRUE(store_.GetString(kGroupC, kKeyString, &value));
619 EXPECT_EQ(kValueStringC, value);
620 }
621 {
Darin Petkovb2841fd2011-06-30 12:54:12 -0700622 vector<string> value;
623 EXPECT_TRUE(store_.GetStringList(kGroupB, kKeyStringList, &value));
624 ASSERT_EQ(2, value.size());
625 EXPECT_EQ(kValueStringA, value[0]);
626 EXPECT_EQ(kValueStringC, value[1]);
627 EXPECT_TRUE(store_.GetStringList(kGroupA, kKeyStringList, &value));
628 ASSERT_EQ(2, value.size());
629 EXPECT_EQ(kValueStringB, value[0]);
630 EXPECT_EQ(kValueStringC, value[1]);
631 EXPECT_FALSE(store_.GetStringList(kGroupC, kKeyStringList, &value));
632 }
633 {
Darin Petkov083047b2011-06-23 20:42:48 -0700634 int value = 0;
635 EXPECT_TRUE(store_.GetInt(kGroupB, kKeyInt, &value));
636 EXPECT_EQ(kValueIntB, value);
637 EXPECT_TRUE(store_.GetInt(kGroupA, kKeyInt, &value));
638 EXPECT_EQ(kValueIntA, value);
639 EXPECT_FALSE(store_.GetInt(kGroupC, kKeyInt, &value));
640 }
641 {
642 bool value = false;
643 EXPECT_TRUE(store_.GetBool(kGroupB, kKeyBool, &value));
644 EXPECT_TRUE(value);
645 EXPECT_TRUE(store_.GetBool(kGroupC, kKeyBool, &value));
646 EXPECT_FALSE(value);
647 EXPECT_FALSE(store_.GetBool(kGroupA, kKeyBool, &value));
648 }
649
650 EXPECT_TRUE(store_.DeleteGroup(kGroupA));
Chris Masone9d779932011-08-25 16:33:41 -0700651 EXPECT_TRUE(store_.DeleteGroup(kGroupA));
Darin Petkov083047b2011-06-23 20:42:48 -0700652
653 EXPECT_FALSE(store_.ContainsGroup(kGroupA));
654 EXPECT_TRUE(store_.ContainsGroup(kGroupB));
655 EXPECT_TRUE(store_.ContainsGroup(kGroupC));
656
657 groups = store_.GetGroups();
658 EXPECT_EQ(2, groups.size());
659 EXPECT_FALSE(ContainsKey(groups, kGroupA));
660 EXPECT_TRUE(ContainsKey(groups, kGroupB));
661 EXPECT_TRUE(ContainsKey(groups, kGroupC));
662
663 EXPECT_TRUE(store_.SetBool(kGroupB, kKeyBool, false));
664 EXPECT_TRUE(store_.SetInt(kGroupB, kKeyInt, kValueIntBNew));
665 EXPECT_TRUE(store_.SetString(kGroupC, kKeyString, kValueStringCNew));
Darin Petkovb2841fd2011-06-30 12:54:12 -0700666 store_.SetStringList(kGroupB,
667 kKeyStringList,
668 vector<string>(1, kValueStringB));
Darin Petkov083047b2011-06-23 20:42:48 -0700669
670 EXPECT_TRUE(store_.DeleteKey(kGroupB, kKeyString));
Chris Masone9d779932011-08-25 16:33:41 -0700671 EXPECT_TRUE(store_.DeleteKey(kGroupB, kKeyString));
Darin Petkov083047b2011-06-23 20:42:48 -0700672
673 {
674 string value;
675 EXPECT_FALSE(store_.GetString(kGroupB, kKeyString, &value));
676 EXPECT_FALSE(store_.GetString(kGroupA, kKeyString, &value));
677 EXPECT_TRUE(store_.GetString(kGroupC, kKeyString, &value));
678 EXPECT_EQ(kValueStringCNew, value);
679 }
Darin Petkovb2841fd2011-06-30 12:54:12 -0700680 {
681 vector<string> value;
682 EXPECT_TRUE(store_.GetStringList(kGroupB, kKeyStringList, &value));
683 ASSERT_EQ(1, value.size());
684 EXPECT_EQ(kValueStringB, value[0]);
685 EXPECT_FALSE(store_.GetStringList(kGroupA, kKeyStringList, &value));
686 EXPECT_FALSE(store_.GetStringList(kGroupC, kKeyStringList, &value));
687 }
Darin Petkov083047b2011-06-23 20:42:48 -0700688 {
689 int value = 0;
690 EXPECT_TRUE(store_.GetInt(kGroupB, kKeyInt, &value));
691 EXPECT_EQ(kValueIntBNew, value);
692 EXPECT_FALSE(store_.GetInt(kGroupA, kKeyInt, &value));
693 EXPECT_FALSE(store_.GetInt(kGroupC, kKeyInt, &value));
694 }
Darin Petkov083047b2011-06-23 20:42:48 -0700695 {
696 bool value = false;
697 EXPECT_TRUE(store_.GetBool(kGroupB, kKeyBool, &value));
698 EXPECT_FALSE(value);
699 EXPECT_TRUE(store_.GetBool(kGroupC, kKeyBool, &value));
700 EXPECT_FALSE(value);
701 EXPECT_FALSE(store_.GetBool(kGroupA, kKeyBool, &value));
702 }
703
704 ASSERT_TRUE(store_.Close());
705 EXPECT_EQ(base::StringPrintf("\n"
706 "[%s]\n"
Darin Petkovb2841fd2011-06-30 12:54:12 -0700707 "%s=%s;\n"
Darin Petkov083047b2011-06-23 20:42:48 -0700708 "%s=%d\n"
709 "%s=false\n"
710 "\n"
711 "[%s]\n"
712 "%s=%s\n"
713 "%s=false\n",
714 kGroupB,
Darin Petkovb2841fd2011-06-30 12:54:12 -0700715 kKeyStringList, kValueStringB,
Darin Petkov083047b2011-06-23 20:42:48 -0700716 kKeyInt, kValueIntBNew,
717 kKeyBool,
718 kGroupC,
719 kKeyString, kValueStringCNew,
720 kKeyBool),
721 ReadKeyFile());
722}
723
724} // namespace shill