blob: c6e014bb4f2502a404ce70ff8827257de5280126 [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>
8#include <base/stl_util-inl.h>
9#include <base/stringprintf.h>
10#include <base/memory/scoped_temp_dir.h>
11#include <gtest/gtest.h>
12
Darin Petkov083047b2011-06-23 20:42:48 -070013using std::set;
14using std::string;
Darin Petkovb2841fd2011-06-30 12:54:12 -070015using std::vector;
Darin Petkov083047b2011-06-23 20:42:48 -070016using testing::Test;
17
18namespace shill {
19
Darin Petkov86964e02011-06-29 13:49:28 -070020namespace {
21const char kPlainText[] = "This is a test!";
22const char kROT47Text[] = "rot47:%9:D :D 2 E6DEP";
23} // namespace {}
24
Darin Petkov083047b2011-06-23 20:42:48 -070025class KeyFileStoreTest : public Test {
26 public:
27 KeyFileStoreTest() : store_(&glib_) {}
28
29 virtual void SetUp() {
30 ASSERT_TRUE(temp_dir_.CreateUniqueTempDir());
Chris Masoneb9c00592011-10-06 13:10:39 -070031 test_file_ = temp_dir_.path().Append("test-key-file-store");
32 store_.set_path(test_file_);
Darin Petkov083047b2011-06-23 20:42:48 -070033 }
34
35 virtual void TearDown() {
36 store_.set_path(FilePath("")); // Don't try to save the store.
37 ASSERT_TRUE(temp_dir_.Delete());
38 }
39
40 protected:
41 string ReadKeyFile();
42 void WriteKeyFile(string data);
Chris Masoneb9c00592011-10-06 13:10:39 -070043 bool OpenCheckClose(const string &group,
44 const string &key,
45 const string &expected_value);
Darin Petkov083047b2011-06-23 20:42:48 -070046
47 GLib glib_; // Use real GLib for testing KeyFileStore.
48 ScopedTempDir temp_dir_;
Chris Masoneb9c00592011-10-06 13:10:39 -070049 FilePath test_file_;
Darin Petkov083047b2011-06-23 20:42:48 -070050 KeyFileStore store_;
51};
52
53string KeyFileStoreTest::ReadKeyFile() {
54 string data;
55 EXPECT_TRUE(file_util::ReadFileToString(store_.path(), &data));
56 return data;
57}
58
59void KeyFileStoreTest::WriteKeyFile(string data) {
60 EXPECT_EQ(data.size(),
61 file_util::WriteFile(store_.path(), data.data(), data.size()));
62}
63
64TEST_F(KeyFileStoreTest, OpenClose) {
65 EXPECT_FALSE(store_.key_file_);
66
67 ASSERT_TRUE(store_.Open());
68 EXPECT_TRUE(store_.key_file_);
Darin Petkov86964e02011-06-29 13:49:28 -070069 EXPECT_EQ(1, store_.crypto_.cryptos_.size());
Darin Petkov083047b2011-06-23 20:42:48 -070070 ASSERT_TRUE(store_.Close());
71 EXPECT_FALSE(store_.key_file_);
72
73 ASSERT_TRUE(store_.Open());
74 EXPECT_TRUE(store_.key_file_);
75 ASSERT_TRUE(store_.Close());
76 EXPECT_FALSE(store_.key_file_);
77
78 ASSERT_TRUE(store_.Open());
79 store_.set_path(FilePath(""));
80 ASSERT_FALSE(store_.Close());
81 EXPECT_FALSE(store_.key_file_);
82}
83
84TEST_F(KeyFileStoreTest, OpenFail) {
85 WriteKeyFile("garbage\n");
86 EXPECT_FALSE(store_.Open());
87 EXPECT_FALSE(store_.key_file_);
88}
89
90TEST_F(KeyFileStoreTest, GetGroups) {
91 static const char kGroupA[] = "g-a";
92 static const char kGroupB[] = "g-b";
93 static const char kGroupC[] = "g-c";
94 WriteKeyFile(base::StringPrintf("[%s]\n"
95 "[%s]\n"
96 "[%s]\n",
97 kGroupA, kGroupB, kGroupC));
98 ASSERT_TRUE(store_.Open());
99 set<string> groups = store_.GetGroups();
100 EXPECT_EQ(3, groups.size());
101 EXPECT_TRUE(ContainsKey(groups, kGroupA));
102 EXPECT_TRUE(ContainsKey(groups, kGroupB));
103 EXPECT_TRUE(ContainsKey(groups, kGroupC));
104 EXPECT_FALSE(ContainsKey(groups, "g-x"));
105 ASSERT_TRUE(store_.Close());
106}
107
108TEST_F(KeyFileStoreTest, ContainsGroup) {
109 static const char kGroupA[] = "group-a";
110 static const char kGroupB[] = "group-b";
111 static const char kGroupC[] = "group-c";
112 WriteKeyFile(base::StringPrintf("[%s]\n"
113 "[%s]\n"
114 "[%s]\n",
115 kGroupA, kGroupB, kGroupC));
116 ASSERT_TRUE(store_.Open());
117 EXPECT_TRUE(store_.ContainsGroup(kGroupA));
118 EXPECT_TRUE(store_.ContainsGroup(kGroupB));
119 EXPECT_TRUE(store_.ContainsGroup(kGroupC));
120 EXPECT_FALSE(store_.ContainsGroup("group-d"));
121 ASSERT_TRUE(store_.Close());
122}
123
124TEST_F(KeyFileStoreTest, DeleteKey) {
125 static const char kGroup[] = "the-group";
126 static const char kKeyDead[] = "dead";
127 static const char kKeyAlive[] = "alive";
128 const int kValueAlive = 3;
129 WriteKeyFile(base::StringPrintf("[%s]\n"
130 "%s=5\n"
131 "%s=%d\n",
132 kGroup, kKeyDead, kKeyAlive, kValueAlive));
133 ASSERT_TRUE(store_.Open());
134 EXPECT_TRUE(store_.DeleteKey(kGroup, kKeyDead));
Chris Masone9d779932011-08-25 16:33:41 -0700135 EXPECT_TRUE(store_.DeleteKey(kGroup, "random-key"));
Darin Petkov083047b2011-06-23 20:42:48 -0700136 EXPECT_FALSE(store_.DeleteKey("random-group", kKeyAlive));
137 ASSERT_TRUE(store_.Close());
138 EXPECT_EQ(base::StringPrintf("\n"
139 "[%s]\n"
140 "%s=%d\n",
141 kGroup, kKeyAlive, kValueAlive),
142 ReadKeyFile());
143}
144
145TEST_F(KeyFileStoreTest, DeleteGroup) {
146 static const char kGroupA[] = "group-a";
147 static const char kGroupB[] = "group-b";
148 static const char kGroupC[] = "group-c";
149 WriteKeyFile(base::StringPrintf("[%s]\n"
150 "[%s]\n"
151 "key-to-be-deleted=true\n"
152 "[%s]\n",
153 kGroupA, kGroupB, kGroupC));
154 ASSERT_TRUE(store_.Open());
155 EXPECT_TRUE(store_.DeleteGroup(kGroupB));
Chris Masone9d779932011-08-25 16:33:41 -0700156 EXPECT_TRUE(store_.DeleteGroup("group-d"));
Darin Petkov083047b2011-06-23 20:42:48 -0700157 ASSERT_TRUE(store_.Close());
158 EXPECT_EQ(base::StringPrintf("\n"
159 "[%s]\n"
160 "\n"
161 "[%s]\n",
162 kGroupA, kGroupC),
163 ReadKeyFile());
164}
165
166TEST_F(KeyFileStoreTest, GetString) {
167 static const char kGroup[] = "something";
168 static const char kKey[] = "foo";
169 static const char kValue[] = "bar";
170 WriteKeyFile(base::StringPrintf("[%s]\n"
171 "%s=%s\n",
172 kGroup, kKey, kValue));
173 ASSERT_TRUE(store_.Open());
174 string value;
175 EXPECT_TRUE(store_.GetString(kGroup, kKey, &value));
176 EXPECT_EQ(kValue, value);
177 EXPECT_FALSE(store_.GetString("something-else", kKey, &value));
178 EXPECT_FALSE(store_.GetString(kGroup, "bar", &value));
179 EXPECT_TRUE(store_.GetString(kGroup, kKey, NULL));
180 ASSERT_TRUE(store_.Close());
181}
182
183TEST_F(KeyFileStoreTest, SetString) {
184 static const char kGroup[] = "string-group";
185 static const char kKey1[] = "test-string";
186 static const char kValue1[] = "foo";
187 static const char kKey2[] = "empty-string";
188 static const char kValue2[] = "";
189 ASSERT_TRUE(store_.Open());
190 ASSERT_TRUE(store_.SetString(kGroup, kKey1, kValue1));
191 ASSERT_TRUE(store_.SetString(kGroup, kKey2, kValue2));
192 ASSERT_TRUE(store_.Close());
193 EXPECT_EQ(base::StringPrintf("\n"
194 "[%s]\n"
195 "%s=%s\n"
196 "%s=%s\n",
197 kGroup, kKey1, kValue1, kKey2, kValue2),
198 ReadKeyFile());
199}
200
201TEST_F(KeyFileStoreTest, GetBool) {
202 static const char kGroup[] = "boo";
203 static const char kKeyTrue[] = "foo";
204 static const char kKeyFalse[] = "bar";
205 static const char kKeyBad[] = "zoo";
206 WriteKeyFile(base::StringPrintf("[%s]\n"
207 "%s=true\n"
208 "%s=false\n"
209 "%s=moo\n",
210 kGroup, kKeyTrue, kKeyFalse, kKeyBad));
211 ASSERT_TRUE(store_.Open());
212 {
213 bool value = true;
214 EXPECT_TRUE(store_.GetBool(kGroup, kKeyFalse, &value));
215 EXPECT_FALSE(value);
216 }
217 {
218 bool value = false;
219 EXPECT_TRUE(store_.GetBool(kGroup, kKeyTrue, &value));
220 EXPECT_TRUE(value);
221 }
222 {
223 bool value;
224 EXPECT_FALSE(store_.GetBool(kGroup, kKeyBad, &value));
225 EXPECT_FALSE(store_.GetBool(kGroup, "unknown", &value));
226 EXPECT_FALSE(store_.GetBool("unknown", kKeyTrue, &value));
227 }
228 EXPECT_TRUE(store_.GetBool(kGroup, kKeyFalse, NULL));
229 ASSERT_TRUE(store_.Close());
230}
231
232TEST_F(KeyFileStoreTest, SetBool) {
233 static const char kGroup[] = "bool-group";
234 static const char kKeyTrue[] = "test-true-bool";
235 static const char kKeyFalse[] = "test-false-bool";
236 ASSERT_TRUE(store_.Open());
237 ASSERT_TRUE(store_.SetBool(kGroup, kKeyTrue, true));
238 ASSERT_TRUE(store_.SetBool(kGroup, kKeyFalse, false));
239 ASSERT_TRUE(store_.Close());
240 EXPECT_EQ(base::StringPrintf("\n"
241 "[%s]\n"
242 "%s=true\n"
243 "%s=false\n",
244 kGroup, kKeyTrue, kKeyFalse),
245 ReadKeyFile());
246}
247
248TEST_F(KeyFileStoreTest, GetInt) {
249 static const char kGroup[] = "numbers";
250 static const char kKeyPos[] = "pos";
251 static const char kKeyNeg[] = "neg";
252 static const char kKeyBad[] = "bad";
253 const int kValuePos = 50;
254 const int kValueNeg = -20;
255 static const char kValueBad[] = "nan";
256 WriteKeyFile(base::StringPrintf("[%s]\n"
257 "%s=%d\n"
258 "%s=%d\n"
259 "%s=%s\n",
260 kGroup,
261 kKeyPos, kValuePos,
262 kKeyNeg, kValueNeg,
263 kKeyBad, kValueBad));
264 ASSERT_TRUE(store_.Open());
265 {
266 int value = 0;
267 EXPECT_TRUE(store_.GetInt(kGroup, kKeyNeg, &value));
268 EXPECT_EQ(kValueNeg, value);
269 }
270 {
271 int value = 0;
272 EXPECT_TRUE(store_.GetInt(kGroup, kKeyPos, &value));
273 EXPECT_EQ(kValuePos, value);
274 }
275 {
276 int value;
277 EXPECT_FALSE(store_.GetInt(kGroup, kKeyBad, &value));
278 EXPECT_FALSE(store_.GetInt(kGroup, "invalid", &value));
279 EXPECT_FALSE(store_.GetInt("invalid", kKeyPos, &value));
280 }
281 EXPECT_TRUE(store_.GetInt(kGroup, kKeyPos, NULL));
282 ASSERT_TRUE(store_.Close());
283}
284
285TEST_F(KeyFileStoreTest, SetInt) {
286 static const char kGroup[] = "int-group";
287 static const char kKey1[] = "test-int";
288 static const char kKey2[] = "test-negative";
289 const int kValue1 = 5;
290 const int kValue2 = -10;
291 ASSERT_TRUE(store_.Open());
292 ASSERT_TRUE(store_.SetInt(kGroup, kKey1, kValue1));
293 ASSERT_TRUE(store_.SetInt(kGroup, kKey2, kValue2));
294 ASSERT_TRUE(store_.Close());
295 EXPECT_EQ(base::StringPrintf("\n"
296 "[%s]\n"
297 "%s=%d\n"
298 "%s=%d\n",
299 kGroup, kKey1, kValue1, kKey2, kValue2),
300 ReadKeyFile());
301}
302
Darin Petkovb2841fd2011-06-30 12:54:12 -0700303TEST_F(KeyFileStoreTest, GetStringList) {
304 static const char kGroup[] = "string-lists";
305 static const char kKeyEmpty[] = "empty";
306 static const char kKeyEmptyValue[] = "empty-value";
307 static const char kKeyValueEmpty[] = "value-empty";
308 static const char kKeyValueEmptyValue[] = "value-empty-value";
309 static const char kKeyValues[] = "values";
310 static const char kValue[] = "value";
311 static const char kValue2[] = "value2";
312 static const char kValue3[] = "value3";
313 WriteKeyFile(base::StringPrintf("[%s]\n"
314 "%s=\n"
315 "%s=;%s\n"
316 "%s=%s;;\n"
317 "%s=%s;;%s\n"
318 "%s=%s;%s;%s\n",
319 kGroup,
320 kKeyEmpty,
321 kKeyEmptyValue, kValue,
322 kKeyValueEmpty, kValue,
323 kKeyValueEmptyValue, kValue, kValue2,
324 kKeyValues, kValue, kValue2, kValue3));
325 ASSERT_TRUE(store_.Open());
326
327 vector<string> value;
328
329 EXPECT_TRUE(store_.GetStringList(kGroup, kKeyValues, &value));
330 ASSERT_EQ(3, value.size());
331 EXPECT_EQ(kValue, value[0]);
332 EXPECT_EQ(kValue2, value[1]);
333 EXPECT_EQ(kValue3, value[2]);
334
335 EXPECT_TRUE(store_.GetStringList(kGroup, kKeyEmptyValue, &value));
336 ASSERT_EQ(2, value.size());
337 EXPECT_EQ("", value[0]);
338 EXPECT_EQ(kValue, value[1]);
339
340 EXPECT_TRUE(store_.GetStringList(kGroup, kKeyValueEmpty, &value));
341 ASSERT_EQ(2, value.size());
342 EXPECT_EQ(kValue, value[0]);
343 EXPECT_EQ("", value[1]);
344
345 EXPECT_TRUE(store_.GetStringList(kGroup, kKeyEmpty, &value));
346 ASSERT_EQ(0, value.size());
347
348 EXPECT_TRUE(store_.GetStringList(kGroup, kKeyValueEmptyValue, &value));
349 ASSERT_EQ(3, value.size());
350 EXPECT_EQ(kValue, value[0]);
351 EXPECT_EQ("", value[1]);
352 EXPECT_EQ(kValue2, value[2]);
353
354 EXPECT_FALSE(store_.GetStringList("unknown-string-lists", kKeyEmpty, &value));
355 EXPECT_FALSE(store_.GetStringList(kGroup, "some-key", &value));
356 EXPECT_TRUE(store_.GetStringList(kGroup, kKeyValues, NULL));
357 ASSERT_TRUE(store_.Close());
358}
359
360TEST_F(KeyFileStoreTest, SetStringList) {
361 static const char kGroup[] = "strings";
362 static const char kKeyEmpty[] = "e";
363 static const char kKeyEmptyValue[] = "ev";
364 static const char kKeyValueEmpty[] = "ve";
365 static const char kKeyValueEmptyValue[] = "vev";
366 static const char kKeyValues[] = "v";
367 static const char kValue[] = "abc";
368 static const char kValue2[] = "pqr";
369 static const char kValue3[] = "xyz";
370 ASSERT_TRUE(store_.Open());
371 {
372 vector<string> value;
373 ASSERT_TRUE(store_.SetStringList(kGroup, kKeyEmpty, value));
374 }
375 {
376 vector<string> value;
377 value.push_back("");
378 value.push_back(kValue);
379 ASSERT_TRUE(store_.SetStringList(kGroup, kKeyEmptyValue, value));
380 }
381 {
382 vector<string> value;
383 value.push_back(kValue);
384 value.push_back("");
385 ASSERT_TRUE(store_.SetStringList(kGroup, kKeyValueEmpty, value));
386 }
387 {
388 vector<string> value;
389 value.push_back(kValue);
390 value.push_back("");
391 value.push_back(kValue2);
392 ASSERT_TRUE(store_.SetStringList(kGroup, kKeyValueEmptyValue, value));
393 }
394 {
395 vector<string> value;
396 value.push_back(kValue);
397 value.push_back(kValue2);
398 value.push_back(kValue3);
399 ASSERT_TRUE(store_.SetStringList(kGroup, kKeyValues, value));
400 }
401 ASSERT_TRUE(store_.Close());
402 EXPECT_EQ(base::StringPrintf("\n"
403 "[%s]\n"
404 "%s=\n"
405 "%s=;%s;\n"
406 "%s=%s;;\n"
407 "%s=%s;;%s;\n"
408 "%s=%s;%s;%s;\n",
409 kGroup,
410 kKeyEmpty,
411 kKeyEmptyValue, kValue,
412 kKeyValueEmpty, kValue,
413 kKeyValueEmptyValue, kValue, kValue2,
414 kKeyValues, kValue, kValue2, kValue3),
415 ReadKeyFile());
416}
417
Darin Petkov86964e02011-06-29 13:49:28 -0700418TEST_F(KeyFileStoreTest, GetCryptedString) {
419 static const char kGroup[] = "crypto-group";
420 static const char kKey[] = "secret";
421 WriteKeyFile(base::StringPrintf("[%s]\n"
422 "%s=%s\n",
423 kGroup, kKey, kROT47Text));
424 ASSERT_TRUE(store_.Open());
425 string value;
426 EXPECT_TRUE(store_.GetCryptedString(kGroup, kKey, &value));
427 EXPECT_EQ(kPlainText, value);
428 EXPECT_FALSE(store_.GetCryptedString("something-else", kKey, &value));
429 EXPECT_FALSE(store_.GetCryptedString(kGroup, "non-secret", &value));
430 EXPECT_TRUE(store_.GetCryptedString(kGroup, kKey, NULL));
431 ASSERT_TRUE(store_.Close());
432}
433
434TEST_F(KeyFileStoreTest, SetCryptedString) {
435 static const char kGroup[] = "crypted-string-group";
436 static const char kKey[] = "test-string";
437 ASSERT_TRUE(store_.Open());
438 ASSERT_TRUE(store_.SetCryptedString(kGroup, kKey, kPlainText));
439 ASSERT_TRUE(store_.Close());
440 EXPECT_EQ(base::StringPrintf("\n"
441 "[%s]\n"
442 "%s=%s\n",
443 kGroup, kKey, kROT47Text),
444 ReadKeyFile());
445}
446
Chris Masoneb9c00592011-10-06 13:10:39 -0700447TEST_F(KeyFileStoreTest, PersistAcrossClose) {
448 static const char kGroup[] = "string-group";
449 static const char kKey1[] = "test-string";
450 static const char kValue1[] = "foo";
451 static const char kKey2[] = "empty-string";
452 static const char kValue2[] = "";
453 ASSERT_TRUE(store_.Open());
454 ASSERT_TRUE(store_.SetString(kGroup, kKey1, kValue1));
455 ASSERT_TRUE(store_.Close());
456 ASSERT_TRUE(store_.Open());
457 ASSERT_TRUE(store_.SetString(kGroup, kKey2, kValue2));
458 string value;
459 ASSERT_TRUE(store_.GetString(kGroup, kKey1, &value));
460 ASSERT_EQ(kValue1, value);
461 ASSERT_TRUE(store_.GetString(kGroup, kKey2, &value));
462 ASSERT_EQ(kValue2, value);
463 ASSERT_TRUE(store_.Close());
464}
465
466bool KeyFileStoreTest::OpenCheckClose(const string &group,
467 const string &key,
468 const string &expected_value) {
469 KeyFileStore store(&glib_);
470 store.set_path(test_file_);
471 EXPECT_TRUE(store.Open());
472 string value;
473 bool could_get = store.GetString(group, key, &value);
474 store.set_path(FilePath("")); // Don't persist to disk.
475 store.Close();
476 return could_get && expected_value == value;
477}
478
479TEST_F(KeyFileStoreTest, Flush) {
480 static const char kGroup[] = "string-group";
481 static const char kKey1[] = "test-string";
482 static const char kValue1[] = "foo";
483 static const char kKey2[] = "empty-string";
484 static const char kValue2[] = "";
485 ASSERT_TRUE(store_.Open());
486 ASSERT_TRUE(store_.SetString(kGroup, kKey1, kValue1));
487 ASSERT_TRUE(store_.Flush());
488 ASSERT_TRUE(OpenCheckClose(kGroup, kKey1, kValue1));
489
490 ASSERT_TRUE(store_.SetString(kGroup, kKey2, kValue2));
491 ASSERT_TRUE(store_.Flush());
492 ASSERT_TRUE(OpenCheckClose(kGroup, kKey2, kValue2));
493
494 EXPECT_TRUE(store_.DeleteKey(kGroup, kKey1));
495 ASSERT_TRUE(store_.Flush());
496 ASSERT_FALSE(OpenCheckClose(kGroup, kKey1, kValue1));
497}
498
Darin Petkov083047b2011-06-23 20:42:48 -0700499TEST_F(KeyFileStoreTest, Combo) {
500 static const char kGroupA[] = "square";
501 static const char kGroupB[] = "circle";
502 static const char kGroupC[] = "triangle";
503 static const char kGroupX[] = "pentagon";
504 static const char kKeyString[] = "color";
Darin Petkovb2841fd2011-06-30 12:54:12 -0700505 static const char kKeyStringList[] = "alternative-colors";
Darin Petkov083047b2011-06-23 20:42:48 -0700506 static const char kKeyInt[] = "area";
507 static const char kKeyBool[] = "visible";
508 static const char kValueStringA[] = "blue";
509 static const char kValueStringB[] = "red";
510 static const char kValueStringC[] = "yellow";
511 static const char kValueStringCNew[] = "purple";
512 const int kValueIntA = 5;
513 const int kValueIntB = 10;
514 const int kValueIntBNew = 333;
515 WriteKeyFile(base::StringPrintf("[%s]\n"
516 "%s=%s\n"
Darin Petkovb2841fd2011-06-30 12:54:12 -0700517 "%s=%s;%s\n"
Darin Petkov083047b2011-06-23 20:42:48 -0700518 "%s=%d\n"
519 "[%s]\n"
520 "%s=%s\n"
Darin Petkovb2841fd2011-06-30 12:54:12 -0700521 "%s=%s;%s\n"
Darin Petkov083047b2011-06-23 20:42:48 -0700522 "%s=%d\n"
523 "%s=true\n"
524 "[%s]\n"
525 "%s=%s\n"
526 "%s=false\n",
527 kGroupA,
528 kKeyString, kValueStringA,
Darin Petkovb2841fd2011-06-30 12:54:12 -0700529 kKeyStringList, kValueStringB, kValueStringC,
Darin Petkov083047b2011-06-23 20:42:48 -0700530 kKeyInt, kValueIntA,
531 kGroupB,
532 kKeyString, kValueStringB,
Darin Petkovb2841fd2011-06-30 12:54:12 -0700533 kKeyStringList, kValueStringA, kValueStringC,
Darin Petkov083047b2011-06-23 20:42:48 -0700534 kKeyInt, kValueIntB,
535 kKeyBool,
536 kGroupC,
537 kKeyString, kValueStringC,
538 kKeyBool));
539 ASSERT_TRUE(store_.Open());
540
541 EXPECT_TRUE(store_.ContainsGroup(kGroupA));
542 EXPECT_TRUE(store_.ContainsGroup(kGroupB));
543 EXPECT_TRUE(store_.ContainsGroup(kGroupC));
544 EXPECT_FALSE(store_.ContainsGroup(kGroupX));
545
546 set<string> groups = store_.GetGroups();
547 EXPECT_EQ(3, groups.size());
548 EXPECT_TRUE(ContainsKey(groups, kGroupA));
549 EXPECT_TRUE(ContainsKey(groups, kGroupB));
550 EXPECT_TRUE(ContainsKey(groups, kGroupC));
551 EXPECT_FALSE(ContainsKey(groups, kGroupX));
552
553 {
554 string value;
555 EXPECT_TRUE(store_.GetString(kGroupB, kKeyString, &value));
556 EXPECT_EQ(kValueStringB, value);
557 EXPECT_TRUE(store_.GetString(kGroupA, kKeyString, &value));
558 EXPECT_EQ(kValueStringA, value);
559 EXPECT_TRUE(store_.GetString(kGroupC, kKeyString, &value));
560 EXPECT_EQ(kValueStringC, value);
561 }
562 {
Darin Petkovb2841fd2011-06-30 12:54:12 -0700563 vector<string> value;
564 EXPECT_TRUE(store_.GetStringList(kGroupB, kKeyStringList, &value));
565 ASSERT_EQ(2, value.size());
566 EXPECT_EQ(kValueStringA, value[0]);
567 EXPECT_EQ(kValueStringC, value[1]);
568 EXPECT_TRUE(store_.GetStringList(kGroupA, kKeyStringList, &value));
569 ASSERT_EQ(2, value.size());
570 EXPECT_EQ(kValueStringB, value[0]);
571 EXPECT_EQ(kValueStringC, value[1]);
572 EXPECT_FALSE(store_.GetStringList(kGroupC, kKeyStringList, &value));
573 }
574 {
Darin Petkov083047b2011-06-23 20:42:48 -0700575 int value = 0;
576 EXPECT_TRUE(store_.GetInt(kGroupB, kKeyInt, &value));
577 EXPECT_EQ(kValueIntB, value);
578 EXPECT_TRUE(store_.GetInt(kGroupA, kKeyInt, &value));
579 EXPECT_EQ(kValueIntA, value);
580 EXPECT_FALSE(store_.GetInt(kGroupC, kKeyInt, &value));
581 }
582 {
583 bool value = false;
584 EXPECT_TRUE(store_.GetBool(kGroupB, kKeyBool, &value));
585 EXPECT_TRUE(value);
586 EXPECT_TRUE(store_.GetBool(kGroupC, kKeyBool, &value));
587 EXPECT_FALSE(value);
588 EXPECT_FALSE(store_.GetBool(kGroupA, kKeyBool, &value));
589 }
590
591 EXPECT_TRUE(store_.DeleteGroup(kGroupA));
Chris Masone9d779932011-08-25 16:33:41 -0700592 EXPECT_TRUE(store_.DeleteGroup(kGroupA));
Darin Petkov083047b2011-06-23 20:42:48 -0700593
594 EXPECT_FALSE(store_.ContainsGroup(kGroupA));
595 EXPECT_TRUE(store_.ContainsGroup(kGroupB));
596 EXPECT_TRUE(store_.ContainsGroup(kGroupC));
597
598 groups = store_.GetGroups();
599 EXPECT_EQ(2, groups.size());
600 EXPECT_FALSE(ContainsKey(groups, kGroupA));
601 EXPECT_TRUE(ContainsKey(groups, kGroupB));
602 EXPECT_TRUE(ContainsKey(groups, kGroupC));
603
604 EXPECT_TRUE(store_.SetBool(kGroupB, kKeyBool, false));
605 EXPECT_TRUE(store_.SetInt(kGroupB, kKeyInt, kValueIntBNew));
606 EXPECT_TRUE(store_.SetString(kGroupC, kKeyString, kValueStringCNew));
Darin Petkovb2841fd2011-06-30 12:54:12 -0700607 store_.SetStringList(kGroupB,
608 kKeyStringList,
609 vector<string>(1, kValueStringB));
Darin Petkov083047b2011-06-23 20:42:48 -0700610
611 EXPECT_TRUE(store_.DeleteKey(kGroupB, kKeyString));
Chris Masone9d779932011-08-25 16:33:41 -0700612 EXPECT_TRUE(store_.DeleteKey(kGroupB, kKeyString));
Darin Petkov083047b2011-06-23 20:42:48 -0700613
614 {
615 string value;
616 EXPECT_FALSE(store_.GetString(kGroupB, kKeyString, &value));
617 EXPECT_FALSE(store_.GetString(kGroupA, kKeyString, &value));
618 EXPECT_TRUE(store_.GetString(kGroupC, kKeyString, &value));
619 EXPECT_EQ(kValueStringCNew, value);
620 }
Darin Petkovb2841fd2011-06-30 12:54:12 -0700621 {
622 vector<string> value;
623 EXPECT_TRUE(store_.GetStringList(kGroupB, kKeyStringList, &value));
624 ASSERT_EQ(1, value.size());
625 EXPECT_EQ(kValueStringB, value[0]);
626 EXPECT_FALSE(store_.GetStringList(kGroupA, kKeyStringList, &value));
627 EXPECT_FALSE(store_.GetStringList(kGroupC, kKeyStringList, &value));
628 }
Darin Petkov083047b2011-06-23 20:42:48 -0700629 {
630 int value = 0;
631 EXPECT_TRUE(store_.GetInt(kGroupB, kKeyInt, &value));
632 EXPECT_EQ(kValueIntBNew, value);
633 EXPECT_FALSE(store_.GetInt(kGroupA, kKeyInt, &value));
634 EXPECT_FALSE(store_.GetInt(kGroupC, kKeyInt, &value));
635 }
Darin Petkov083047b2011-06-23 20:42:48 -0700636 {
637 bool value = false;
638 EXPECT_TRUE(store_.GetBool(kGroupB, kKeyBool, &value));
639 EXPECT_FALSE(value);
640 EXPECT_TRUE(store_.GetBool(kGroupC, kKeyBool, &value));
641 EXPECT_FALSE(value);
642 EXPECT_FALSE(store_.GetBool(kGroupA, kKeyBool, &value));
643 }
644
645 ASSERT_TRUE(store_.Close());
646 EXPECT_EQ(base::StringPrintf("\n"
647 "[%s]\n"
Darin Petkovb2841fd2011-06-30 12:54:12 -0700648 "%s=%s;\n"
Darin Petkov083047b2011-06-23 20:42:48 -0700649 "%s=%d\n"
650 "%s=false\n"
651 "\n"
652 "[%s]\n"
653 "%s=%s\n"
654 "%s=false\n",
655 kGroupB,
Darin Petkovb2841fd2011-06-30 12:54:12 -0700656 kKeyStringList, kValueStringB,
Darin Petkov083047b2011-06-23 20:42:48 -0700657 kKeyInt, kValueIntBNew,
658 kKeyBool,
659 kGroupC,
660 kKeyString, kValueStringCNew,
661 kKeyBool),
662 ReadKeyFile());
663}
664
665} // namespace shill