blob: 65fa89e855d4e94ca15d9e03b5bfe6acc0fd8fb8 [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());
31 store_.set_path(temp_dir_.path().Append("test-key-file-store"));
32 }
33
34 virtual void TearDown() {
35 store_.set_path(FilePath("")); // Don't try to save the store.
36 ASSERT_TRUE(temp_dir_.Delete());
37 }
38
39 protected:
40 string ReadKeyFile();
41 void WriteKeyFile(string data);
42
43 GLib glib_; // Use real GLib for testing KeyFileStore.
44 ScopedTempDir temp_dir_;
45 KeyFileStore store_;
46};
47
48string KeyFileStoreTest::ReadKeyFile() {
49 string data;
50 EXPECT_TRUE(file_util::ReadFileToString(store_.path(), &data));
51 return data;
52}
53
54void KeyFileStoreTest::WriteKeyFile(string data) {
55 EXPECT_EQ(data.size(),
56 file_util::WriteFile(store_.path(), data.data(), data.size()));
57}
58
59TEST_F(KeyFileStoreTest, OpenClose) {
60 EXPECT_FALSE(store_.key_file_);
61
62 ASSERT_TRUE(store_.Open());
63 EXPECT_TRUE(store_.key_file_);
Darin Petkov86964e02011-06-29 13:49:28 -070064 EXPECT_EQ(1, store_.crypto_.cryptos_.size());
Darin Petkov083047b2011-06-23 20:42:48 -070065 ASSERT_TRUE(store_.Close());
66 EXPECT_FALSE(store_.key_file_);
67
68 ASSERT_TRUE(store_.Open());
69 EXPECT_TRUE(store_.key_file_);
70 ASSERT_TRUE(store_.Close());
71 EXPECT_FALSE(store_.key_file_);
72
73 ASSERT_TRUE(store_.Open());
74 store_.set_path(FilePath(""));
75 ASSERT_FALSE(store_.Close());
76 EXPECT_FALSE(store_.key_file_);
77}
78
79TEST_F(KeyFileStoreTest, OpenFail) {
80 WriteKeyFile("garbage\n");
81 EXPECT_FALSE(store_.Open());
82 EXPECT_FALSE(store_.key_file_);
83}
84
85TEST_F(KeyFileStoreTest, GetGroups) {
86 static const char kGroupA[] = "g-a";
87 static const char kGroupB[] = "g-b";
88 static const char kGroupC[] = "g-c";
89 WriteKeyFile(base::StringPrintf("[%s]\n"
90 "[%s]\n"
91 "[%s]\n",
92 kGroupA, kGroupB, kGroupC));
93 ASSERT_TRUE(store_.Open());
94 set<string> groups = store_.GetGroups();
95 EXPECT_EQ(3, groups.size());
96 EXPECT_TRUE(ContainsKey(groups, kGroupA));
97 EXPECT_TRUE(ContainsKey(groups, kGroupB));
98 EXPECT_TRUE(ContainsKey(groups, kGroupC));
99 EXPECT_FALSE(ContainsKey(groups, "g-x"));
100 ASSERT_TRUE(store_.Close());
101}
102
103TEST_F(KeyFileStoreTest, ContainsGroup) {
104 static const char kGroupA[] = "group-a";
105 static const char kGroupB[] = "group-b";
106 static const char kGroupC[] = "group-c";
107 WriteKeyFile(base::StringPrintf("[%s]\n"
108 "[%s]\n"
109 "[%s]\n",
110 kGroupA, kGroupB, kGroupC));
111 ASSERT_TRUE(store_.Open());
112 EXPECT_TRUE(store_.ContainsGroup(kGroupA));
113 EXPECT_TRUE(store_.ContainsGroup(kGroupB));
114 EXPECT_TRUE(store_.ContainsGroup(kGroupC));
115 EXPECT_FALSE(store_.ContainsGroup("group-d"));
116 ASSERT_TRUE(store_.Close());
117}
118
119TEST_F(KeyFileStoreTest, DeleteKey) {
120 static const char kGroup[] = "the-group";
121 static const char kKeyDead[] = "dead";
122 static const char kKeyAlive[] = "alive";
123 const int kValueAlive = 3;
124 WriteKeyFile(base::StringPrintf("[%s]\n"
125 "%s=5\n"
126 "%s=%d\n",
127 kGroup, kKeyDead, kKeyAlive, kValueAlive));
128 ASSERT_TRUE(store_.Open());
129 EXPECT_TRUE(store_.DeleteKey(kGroup, kKeyDead));
130 EXPECT_FALSE(store_.DeleteKey(kGroup, "random-key"));
131 EXPECT_FALSE(store_.DeleteKey("random-group", kKeyAlive));
132 ASSERT_TRUE(store_.Close());
133 EXPECT_EQ(base::StringPrintf("\n"
134 "[%s]\n"
135 "%s=%d\n",
136 kGroup, kKeyAlive, kValueAlive),
137 ReadKeyFile());
138}
139
140TEST_F(KeyFileStoreTest, DeleteGroup) {
141 static const char kGroupA[] = "group-a";
142 static const char kGroupB[] = "group-b";
143 static const char kGroupC[] = "group-c";
144 WriteKeyFile(base::StringPrintf("[%s]\n"
145 "[%s]\n"
146 "key-to-be-deleted=true\n"
147 "[%s]\n",
148 kGroupA, kGroupB, kGroupC));
149 ASSERT_TRUE(store_.Open());
150 EXPECT_TRUE(store_.DeleteGroup(kGroupB));
151 EXPECT_FALSE(store_.DeleteGroup("group-d"));
152 ASSERT_TRUE(store_.Close());
153 EXPECT_EQ(base::StringPrintf("\n"
154 "[%s]\n"
155 "\n"
156 "[%s]\n",
157 kGroupA, kGroupC),
158 ReadKeyFile());
159}
160
161TEST_F(KeyFileStoreTest, GetString) {
162 static const char kGroup[] = "something";
163 static const char kKey[] = "foo";
164 static const char kValue[] = "bar";
165 WriteKeyFile(base::StringPrintf("[%s]\n"
166 "%s=%s\n",
167 kGroup, kKey, kValue));
168 ASSERT_TRUE(store_.Open());
169 string value;
170 EXPECT_TRUE(store_.GetString(kGroup, kKey, &value));
171 EXPECT_EQ(kValue, value);
172 EXPECT_FALSE(store_.GetString("something-else", kKey, &value));
173 EXPECT_FALSE(store_.GetString(kGroup, "bar", &value));
174 EXPECT_TRUE(store_.GetString(kGroup, kKey, NULL));
175 ASSERT_TRUE(store_.Close());
176}
177
178TEST_F(KeyFileStoreTest, SetString) {
179 static const char kGroup[] = "string-group";
180 static const char kKey1[] = "test-string";
181 static const char kValue1[] = "foo";
182 static const char kKey2[] = "empty-string";
183 static const char kValue2[] = "";
184 ASSERT_TRUE(store_.Open());
185 ASSERT_TRUE(store_.SetString(kGroup, kKey1, kValue1));
186 ASSERT_TRUE(store_.SetString(kGroup, kKey2, kValue2));
187 ASSERT_TRUE(store_.Close());
188 EXPECT_EQ(base::StringPrintf("\n"
189 "[%s]\n"
190 "%s=%s\n"
191 "%s=%s\n",
192 kGroup, kKey1, kValue1, kKey2, kValue2),
193 ReadKeyFile());
194}
195
196TEST_F(KeyFileStoreTest, GetBool) {
197 static const char kGroup[] = "boo";
198 static const char kKeyTrue[] = "foo";
199 static const char kKeyFalse[] = "bar";
200 static const char kKeyBad[] = "zoo";
201 WriteKeyFile(base::StringPrintf("[%s]\n"
202 "%s=true\n"
203 "%s=false\n"
204 "%s=moo\n",
205 kGroup, kKeyTrue, kKeyFalse, kKeyBad));
206 ASSERT_TRUE(store_.Open());
207 {
208 bool value = true;
209 EXPECT_TRUE(store_.GetBool(kGroup, kKeyFalse, &value));
210 EXPECT_FALSE(value);
211 }
212 {
213 bool value = false;
214 EXPECT_TRUE(store_.GetBool(kGroup, kKeyTrue, &value));
215 EXPECT_TRUE(value);
216 }
217 {
218 bool value;
219 EXPECT_FALSE(store_.GetBool(kGroup, kKeyBad, &value));
220 EXPECT_FALSE(store_.GetBool(kGroup, "unknown", &value));
221 EXPECT_FALSE(store_.GetBool("unknown", kKeyTrue, &value));
222 }
223 EXPECT_TRUE(store_.GetBool(kGroup, kKeyFalse, NULL));
224 ASSERT_TRUE(store_.Close());
225}
226
227TEST_F(KeyFileStoreTest, SetBool) {
228 static const char kGroup[] = "bool-group";
229 static const char kKeyTrue[] = "test-true-bool";
230 static const char kKeyFalse[] = "test-false-bool";
231 ASSERT_TRUE(store_.Open());
232 ASSERT_TRUE(store_.SetBool(kGroup, kKeyTrue, true));
233 ASSERT_TRUE(store_.SetBool(kGroup, kKeyFalse, false));
234 ASSERT_TRUE(store_.Close());
235 EXPECT_EQ(base::StringPrintf("\n"
236 "[%s]\n"
237 "%s=true\n"
238 "%s=false\n",
239 kGroup, kKeyTrue, kKeyFalse),
240 ReadKeyFile());
241}
242
243TEST_F(KeyFileStoreTest, GetInt) {
244 static const char kGroup[] = "numbers";
245 static const char kKeyPos[] = "pos";
246 static const char kKeyNeg[] = "neg";
247 static const char kKeyBad[] = "bad";
248 const int kValuePos = 50;
249 const int kValueNeg = -20;
250 static const char kValueBad[] = "nan";
251 WriteKeyFile(base::StringPrintf("[%s]\n"
252 "%s=%d\n"
253 "%s=%d\n"
254 "%s=%s\n",
255 kGroup,
256 kKeyPos, kValuePos,
257 kKeyNeg, kValueNeg,
258 kKeyBad, kValueBad));
259 ASSERT_TRUE(store_.Open());
260 {
261 int value = 0;
262 EXPECT_TRUE(store_.GetInt(kGroup, kKeyNeg, &value));
263 EXPECT_EQ(kValueNeg, value);
264 }
265 {
266 int value = 0;
267 EXPECT_TRUE(store_.GetInt(kGroup, kKeyPos, &value));
268 EXPECT_EQ(kValuePos, value);
269 }
270 {
271 int value;
272 EXPECT_FALSE(store_.GetInt(kGroup, kKeyBad, &value));
273 EXPECT_FALSE(store_.GetInt(kGroup, "invalid", &value));
274 EXPECT_FALSE(store_.GetInt("invalid", kKeyPos, &value));
275 }
276 EXPECT_TRUE(store_.GetInt(kGroup, kKeyPos, NULL));
277 ASSERT_TRUE(store_.Close());
278}
279
280TEST_F(KeyFileStoreTest, SetInt) {
281 static const char kGroup[] = "int-group";
282 static const char kKey1[] = "test-int";
283 static const char kKey2[] = "test-negative";
284 const int kValue1 = 5;
285 const int kValue2 = -10;
286 ASSERT_TRUE(store_.Open());
287 ASSERT_TRUE(store_.SetInt(kGroup, kKey1, kValue1));
288 ASSERT_TRUE(store_.SetInt(kGroup, kKey2, kValue2));
289 ASSERT_TRUE(store_.Close());
290 EXPECT_EQ(base::StringPrintf("\n"
291 "[%s]\n"
292 "%s=%d\n"
293 "%s=%d\n",
294 kGroup, kKey1, kValue1, kKey2, kValue2),
295 ReadKeyFile());
296}
297
Darin Petkovb2841fd2011-06-30 12:54:12 -0700298TEST_F(KeyFileStoreTest, GetStringList) {
299 static const char kGroup[] = "string-lists";
300 static const char kKeyEmpty[] = "empty";
301 static const char kKeyEmptyValue[] = "empty-value";
302 static const char kKeyValueEmpty[] = "value-empty";
303 static const char kKeyValueEmptyValue[] = "value-empty-value";
304 static const char kKeyValues[] = "values";
305 static const char kValue[] = "value";
306 static const char kValue2[] = "value2";
307 static const char kValue3[] = "value3";
308 WriteKeyFile(base::StringPrintf("[%s]\n"
309 "%s=\n"
310 "%s=;%s\n"
311 "%s=%s;;\n"
312 "%s=%s;;%s\n"
313 "%s=%s;%s;%s\n",
314 kGroup,
315 kKeyEmpty,
316 kKeyEmptyValue, kValue,
317 kKeyValueEmpty, kValue,
318 kKeyValueEmptyValue, kValue, kValue2,
319 kKeyValues, kValue, kValue2, kValue3));
320 ASSERT_TRUE(store_.Open());
321
322 vector<string> value;
323
324 EXPECT_TRUE(store_.GetStringList(kGroup, kKeyValues, &value));
325 ASSERT_EQ(3, value.size());
326 EXPECT_EQ(kValue, value[0]);
327 EXPECT_EQ(kValue2, value[1]);
328 EXPECT_EQ(kValue3, value[2]);
329
330 EXPECT_TRUE(store_.GetStringList(kGroup, kKeyEmptyValue, &value));
331 ASSERT_EQ(2, value.size());
332 EXPECT_EQ("", value[0]);
333 EXPECT_EQ(kValue, value[1]);
334
335 EXPECT_TRUE(store_.GetStringList(kGroup, kKeyValueEmpty, &value));
336 ASSERT_EQ(2, value.size());
337 EXPECT_EQ(kValue, value[0]);
338 EXPECT_EQ("", value[1]);
339
340 EXPECT_TRUE(store_.GetStringList(kGroup, kKeyEmpty, &value));
341 ASSERT_EQ(0, value.size());
342
343 EXPECT_TRUE(store_.GetStringList(kGroup, kKeyValueEmptyValue, &value));
344 ASSERT_EQ(3, value.size());
345 EXPECT_EQ(kValue, value[0]);
346 EXPECT_EQ("", value[1]);
347 EXPECT_EQ(kValue2, value[2]);
348
349 EXPECT_FALSE(store_.GetStringList("unknown-string-lists", kKeyEmpty, &value));
350 EXPECT_FALSE(store_.GetStringList(kGroup, "some-key", &value));
351 EXPECT_TRUE(store_.GetStringList(kGroup, kKeyValues, NULL));
352 ASSERT_TRUE(store_.Close());
353}
354
355TEST_F(KeyFileStoreTest, SetStringList) {
356 static const char kGroup[] = "strings";
357 static const char kKeyEmpty[] = "e";
358 static const char kKeyEmptyValue[] = "ev";
359 static const char kKeyValueEmpty[] = "ve";
360 static const char kKeyValueEmptyValue[] = "vev";
361 static const char kKeyValues[] = "v";
362 static const char kValue[] = "abc";
363 static const char kValue2[] = "pqr";
364 static const char kValue3[] = "xyz";
365 ASSERT_TRUE(store_.Open());
366 {
367 vector<string> value;
368 ASSERT_TRUE(store_.SetStringList(kGroup, kKeyEmpty, value));
369 }
370 {
371 vector<string> value;
372 value.push_back("");
373 value.push_back(kValue);
374 ASSERT_TRUE(store_.SetStringList(kGroup, kKeyEmptyValue, value));
375 }
376 {
377 vector<string> value;
378 value.push_back(kValue);
379 value.push_back("");
380 ASSERT_TRUE(store_.SetStringList(kGroup, kKeyValueEmpty, value));
381 }
382 {
383 vector<string> value;
384 value.push_back(kValue);
385 value.push_back("");
386 value.push_back(kValue2);
387 ASSERT_TRUE(store_.SetStringList(kGroup, kKeyValueEmptyValue, value));
388 }
389 {
390 vector<string> value;
391 value.push_back(kValue);
392 value.push_back(kValue2);
393 value.push_back(kValue3);
394 ASSERT_TRUE(store_.SetStringList(kGroup, kKeyValues, value));
395 }
396 ASSERT_TRUE(store_.Close());
397 EXPECT_EQ(base::StringPrintf("\n"
398 "[%s]\n"
399 "%s=\n"
400 "%s=;%s;\n"
401 "%s=%s;;\n"
402 "%s=%s;;%s;\n"
403 "%s=%s;%s;%s;\n",
404 kGroup,
405 kKeyEmpty,
406 kKeyEmptyValue, kValue,
407 kKeyValueEmpty, kValue,
408 kKeyValueEmptyValue, kValue, kValue2,
409 kKeyValues, kValue, kValue2, kValue3),
410 ReadKeyFile());
411}
412
Darin Petkov86964e02011-06-29 13:49:28 -0700413TEST_F(KeyFileStoreTest, GetCryptedString) {
414 static const char kGroup[] = "crypto-group";
415 static const char kKey[] = "secret";
416 WriteKeyFile(base::StringPrintf("[%s]\n"
417 "%s=%s\n",
418 kGroup, kKey, kROT47Text));
419 ASSERT_TRUE(store_.Open());
420 string value;
421 EXPECT_TRUE(store_.GetCryptedString(kGroup, kKey, &value));
422 EXPECT_EQ(kPlainText, value);
423 EXPECT_FALSE(store_.GetCryptedString("something-else", kKey, &value));
424 EXPECT_FALSE(store_.GetCryptedString(kGroup, "non-secret", &value));
425 EXPECT_TRUE(store_.GetCryptedString(kGroup, kKey, NULL));
426 ASSERT_TRUE(store_.Close());
427}
428
429TEST_F(KeyFileStoreTest, SetCryptedString) {
430 static const char kGroup[] = "crypted-string-group";
431 static const char kKey[] = "test-string";
432 ASSERT_TRUE(store_.Open());
433 ASSERT_TRUE(store_.SetCryptedString(kGroup, kKey, kPlainText));
434 ASSERT_TRUE(store_.Close());
435 EXPECT_EQ(base::StringPrintf("\n"
436 "[%s]\n"
437 "%s=%s\n",
438 kGroup, kKey, kROT47Text),
439 ReadKeyFile());
440}
441
Darin Petkov083047b2011-06-23 20:42:48 -0700442TEST_F(KeyFileStoreTest, Combo) {
443 static const char kGroupA[] = "square";
444 static const char kGroupB[] = "circle";
445 static const char kGroupC[] = "triangle";
446 static const char kGroupX[] = "pentagon";
447 static const char kKeyString[] = "color";
Darin Petkovb2841fd2011-06-30 12:54:12 -0700448 static const char kKeyStringList[] = "alternative-colors";
Darin Petkov083047b2011-06-23 20:42:48 -0700449 static const char kKeyInt[] = "area";
450 static const char kKeyBool[] = "visible";
451 static const char kValueStringA[] = "blue";
452 static const char kValueStringB[] = "red";
453 static const char kValueStringC[] = "yellow";
454 static const char kValueStringCNew[] = "purple";
455 const int kValueIntA = 5;
456 const int kValueIntB = 10;
457 const int kValueIntBNew = 333;
458 WriteKeyFile(base::StringPrintf("[%s]\n"
459 "%s=%s\n"
Darin Petkovb2841fd2011-06-30 12:54:12 -0700460 "%s=%s;%s\n"
Darin Petkov083047b2011-06-23 20:42:48 -0700461 "%s=%d\n"
462 "[%s]\n"
463 "%s=%s\n"
Darin Petkovb2841fd2011-06-30 12:54:12 -0700464 "%s=%s;%s\n"
Darin Petkov083047b2011-06-23 20:42:48 -0700465 "%s=%d\n"
466 "%s=true\n"
467 "[%s]\n"
468 "%s=%s\n"
469 "%s=false\n",
470 kGroupA,
471 kKeyString, kValueStringA,
Darin Petkovb2841fd2011-06-30 12:54:12 -0700472 kKeyStringList, kValueStringB, kValueStringC,
Darin Petkov083047b2011-06-23 20:42:48 -0700473 kKeyInt, kValueIntA,
474 kGroupB,
475 kKeyString, kValueStringB,
Darin Petkovb2841fd2011-06-30 12:54:12 -0700476 kKeyStringList, kValueStringA, kValueStringC,
Darin Petkov083047b2011-06-23 20:42:48 -0700477 kKeyInt, kValueIntB,
478 kKeyBool,
479 kGroupC,
480 kKeyString, kValueStringC,
481 kKeyBool));
482 ASSERT_TRUE(store_.Open());
483
484 EXPECT_TRUE(store_.ContainsGroup(kGroupA));
485 EXPECT_TRUE(store_.ContainsGroup(kGroupB));
486 EXPECT_TRUE(store_.ContainsGroup(kGroupC));
487 EXPECT_FALSE(store_.ContainsGroup(kGroupX));
488
489 set<string> groups = store_.GetGroups();
490 EXPECT_EQ(3, groups.size());
491 EXPECT_TRUE(ContainsKey(groups, kGroupA));
492 EXPECT_TRUE(ContainsKey(groups, kGroupB));
493 EXPECT_TRUE(ContainsKey(groups, kGroupC));
494 EXPECT_FALSE(ContainsKey(groups, kGroupX));
495
496 {
497 string value;
498 EXPECT_TRUE(store_.GetString(kGroupB, kKeyString, &value));
499 EXPECT_EQ(kValueStringB, value);
500 EXPECT_TRUE(store_.GetString(kGroupA, kKeyString, &value));
501 EXPECT_EQ(kValueStringA, value);
502 EXPECT_TRUE(store_.GetString(kGroupC, kKeyString, &value));
503 EXPECT_EQ(kValueStringC, value);
504 }
505 {
Darin Petkovb2841fd2011-06-30 12:54:12 -0700506 vector<string> value;
507 EXPECT_TRUE(store_.GetStringList(kGroupB, kKeyStringList, &value));
508 ASSERT_EQ(2, value.size());
509 EXPECT_EQ(kValueStringA, value[0]);
510 EXPECT_EQ(kValueStringC, value[1]);
511 EXPECT_TRUE(store_.GetStringList(kGroupA, kKeyStringList, &value));
512 ASSERT_EQ(2, value.size());
513 EXPECT_EQ(kValueStringB, value[0]);
514 EXPECT_EQ(kValueStringC, value[1]);
515 EXPECT_FALSE(store_.GetStringList(kGroupC, kKeyStringList, &value));
516 }
517 {
Darin Petkov083047b2011-06-23 20:42:48 -0700518 int value = 0;
519 EXPECT_TRUE(store_.GetInt(kGroupB, kKeyInt, &value));
520 EXPECT_EQ(kValueIntB, value);
521 EXPECT_TRUE(store_.GetInt(kGroupA, kKeyInt, &value));
522 EXPECT_EQ(kValueIntA, value);
523 EXPECT_FALSE(store_.GetInt(kGroupC, kKeyInt, &value));
524 }
525 {
526 bool value = false;
527 EXPECT_TRUE(store_.GetBool(kGroupB, kKeyBool, &value));
528 EXPECT_TRUE(value);
529 EXPECT_TRUE(store_.GetBool(kGroupC, kKeyBool, &value));
530 EXPECT_FALSE(value);
531 EXPECT_FALSE(store_.GetBool(kGroupA, kKeyBool, &value));
532 }
533
534 EXPECT_TRUE(store_.DeleteGroup(kGroupA));
535 EXPECT_FALSE(store_.DeleteGroup(kGroupA));
536
537 EXPECT_FALSE(store_.ContainsGroup(kGroupA));
538 EXPECT_TRUE(store_.ContainsGroup(kGroupB));
539 EXPECT_TRUE(store_.ContainsGroup(kGroupC));
540
541 groups = store_.GetGroups();
542 EXPECT_EQ(2, groups.size());
543 EXPECT_FALSE(ContainsKey(groups, kGroupA));
544 EXPECT_TRUE(ContainsKey(groups, kGroupB));
545 EXPECT_TRUE(ContainsKey(groups, kGroupC));
546
547 EXPECT_TRUE(store_.SetBool(kGroupB, kKeyBool, false));
548 EXPECT_TRUE(store_.SetInt(kGroupB, kKeyInt, kValueIntBNew));
549 EXPECT_TRUE(store_.SetString(kGroupC, kKeyString, kValueStringCNew));
Darin Petkovb2841fd2011-06-30 12:54:12 -0700550 store_.SetStringList(kGroupB,
551 kKeyStringList,
552 vector<string>(1, kValueStringB));
Darin Petkov083047b2011-06-23 20:42:48 -0700553
554 EXPECT_TRUE(store_.DeleteKey(kGroupB, kKeyString));
555 EXPECT_FALSE(store_.DeleteKey(kGroupB, kKeyString));
556
557 {
558 string value;
559 EXPECT_FALSE(store_.GetString(kGroupB, kKeyString, &value));
560 EXPECT_FALSE(store_.GetString(kGroupA, kKeyString, &value));
561 EXPECT_TRUE(store_.GetString(kGroupC, kKeyString, &value));
562 EXPECT_EQ(kValueStringCNew, value);
563 }
Darin Petkovb2841fd2011-06-30 12:54:12 -0700564 {
565 vector<string> value;
566 EXPECT_TRUE(store_.GetStringList(kGroupB, kKeyStringList, &value));
567 ASSERT_EQ(1, value.size());
568 EXPECT_EQ(kValueStringB, value[0]);
569 EXPECT_FALSE(store_.GetStringList(kGroupA, kKeyStringList, &value));
570 EXPECT_FALSE(store_.GetStringList(kGroupC, kKeyStringList, &value));
571 }
Darin Petkov083047b2011-06-23 20:42:48 -0700572 {
573 int value = 0;
574 EXPECT_TRUE(store_.GetInt(kGroupB, kKeyInt, &value));
575 EXPECT_EQ(kValueIntBNew, value);
576 EXPECT_FALSE(store_.GetInt(kGroupA, kKeyInt, &value));
577 EXPECT_FALSE(store_.GetInt(kGroupC, kKeyInt, &value));
578 }
Darin Petkov083047b2011-06-23 20:42:48 -0700579 {
580 bool value = false;
581 EXPECT_TRUE(store_.GetBool(kGroupB, kKeyBool, &value));
582 EXPECT_FALSE(value);
583 EXPECT_TRUE(store_.GetBool(kGroupC, kKeyBool, &value));
584 EXPECT_FALSE(value);
585 EXPECT_FALSE(store_.GetBool(kGroupA, kKeyBool, &value));
586 }
587
588 ASSERT_TRUE(store_.Close());
589 EXPECT_EQ(base::StringPrintf("\n"
590 "[%s]\n"
Darin Petkovb2841fd2011-06-30 12:54:12 -0700591 "%s=%s;\n"
Darin Petkov083047b2011-06-23 20:42:48 -0700592 "%s=%d\n"
593 "%s=false\n"
594 "\n"
595 "[%s]\n"
596 "%s=%s\n"
597 "%s=false\n",
598 kGroupB,
Darin Petkovb2841fd2011-06-30 12:54:12 -0700599 kKeyStringList, kValueStringB,
Darin Petkov083047b2011-06-23 20:42:48 -0700600 kKeyInt, kValueIntBNew,
601 kKeyBool,
602 kGroupC,
603 kKeyString, kValueStringCNew,
604 kKeyBool),
605 ReadKeyFile());
606}
607
608} // namespace shill