blob: 4733ba1170e666b4c0aff08a66a79076c410d2e1 [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
Paul Stewart5dc40aa2011-10-28 19:43:43 -070067 EXPECT_FALSE(store_.IsNonEmpty());
Darin Petkov083047b2011-06-23 20:42:48 -070068 ASSERT_TRUE(store_.Open());
69 EXPECT_TRUE(store_.key_file_);
Darin Petkov86964e02011-06-29 13:49:28 -070070 EXPECT_EQ(1, store_.crypto_.cryptos_.size());
Darin Petkov083047b2011-06-23 20:42:48 -070071 ASSERT_TRUE(store_.Close());
72 EXPECT_FALSE(store_.key_file_);
73
74 ASSERT_TRUE(store_.Open());
75 EXPECT_TRUE(store_.key_file_);
76 ASSERT_TRUE(store_.Close());
77 EXPECT_FALSE(store_.key_file_);
78
79 ASSERT_TRUE(store_.Open());
80 store_.set_path(FilePath(""));
81 ASSERT_FALSE(store_.Close());
82 EXPECT_FALSE(store_.key_file_);
83}
84
85TEST_F(KeyFileStoreTest, OpenFail) {
86 WriteKeyFile("garbage\n");
87 EXPECT_FALSE(store_.Open());
88 EXPECT_FALSE(store_.key_file_);
89}
90
91TEST_F(KeyFileStoreTest, GetGroups) {
92 static const char kGroupA[] = "g-a";
93 static const char kGroupB[] = "g-b";
94 static const char kGroupC[] = "g-c";
95 WriteKeyFile(base::StringPrintf("[%s]\n"
96 "[%s]\n"
97 "[%s]\n",
98 kGroupA, kGroupB, kGroupC));
Paul Stewart5dc40aa2011-10-28 19:43:43 -070099 EXPECT_TRUE(store_.IsNonEmpty());
Darin Petkov083047b2011-06-23 20:42:48 -0700100 ASSERT_TRUE(store_.Open());
101 set<string> groups = store_.GetGroups();
102 EXPECT_EQ(3, groups.size());
103 EXPECT_TRUE(ContainsKey(groups, kGroupA));
104 EXPECT_TRUE(ContainsKey(groups, kGroupB));
105 EXPECT_TRUE(ContainsKey(groups, kGroupC));
106 EXPECT_FALSE(ContainsKey(groups, "g-x"));
107 ASSERT_TRUE(store_.Close());
108}
109
110TEST_F(KeyFileStoreTest, ContainsGroup) {
111 static const char kGroupA[] = "group-a";
112 static const char kGroupB[] = "group-b";
113 static const char kGroupC[] = "group-c";
114 WriteKeyFile(base::StringPrintf("[%s]\n"
115 "[%s]\n"
116 "[%s]\n",
117 kGroupA, kGroupB, kGroupC));
118 ASSERT_TRUE(store_.Open());
119 EXPECT_TRUE(store_.ContainsGroup(kGroupA));
120 EXPECT_TRUE(store_.ContainsGroup(kGroupB));
121 EXPECT_TRUE(store_.ContainsGroup(kGroupC));
122 EXPECT_FALSE(store_.ContainsGroup("group-d"));
123 ASSERT_TRUE(store_.Close());
124}
125
126TEST_F(KeyFileStoreTest, DeleteKey) {
127 static const char kGroup[] = "the-group";
128 static const char kKeyDead[] = "dead";
129 static const char kKeyAlive[] = "alive";
130 const int kValueAlive = 3;
131 WriteKeyFile(base::StringPrintf("[%s]\n"
132 "%s=5\n"
133 "%s=%d\n",
134 kGroup, kKeyDead, kKeyAlive, kValueAlive));
135 ASSERT_TRUE(store_.Open());
136 EXPECT_TRUE(store_.DeleteKey(kGroup, kKeyDead));
Chris Masone9d779932011-08-25 16:33:41 -0700137 EXPECT_TRUE(store_.DeleteKey(kGroup, "random-key"));
Darin Petkov083047b2011-06-23 20:42:48 -0700138 EXPECT_FALSE(store_.DeleteKey("random-group", kKeyAlive));
139 ASSERT_TRUE(store_.Close());
140 EXPECT_EQ(base::StringPrintf("\n"
141 "[%s]\n"
142 "%s=%d\n",
143 kGroup, kKeyAlive, kValueAlive),
144 ReadKeyFile());
145}
146
147TEST_F(KeyFileStoreTest, DeleteGroup) {
148 static const char kGroupA[] = "group-a";
149 static const char kGroupB[] = "group-b";
150 static const char kGroupC[] = "group-c";
151 WriteKeyFile(base::StringPrintf("[%s]\n"
152 "[%s]\n"
153 "key-to-be-deleted=true\n"
154 "[%s]\n",
155 kGroupA, kGroupB, kGroupC));
156 ASSERT_TRUE(store_.Open());
157 EXPECT_TRUE(store_.DeleteGroup(kGroupB));
Chris Masone9d779932011-08-25 16:33:41 -0700158 EXPECT_TRUE(store_.DeleteGroup("group-d"));
Darin Petkov083047b2011-06-23 20:42:48 -0700159 ASSERT_TRUE(store_.Close());
160 EXPECT_EQ(base::StringPrintf("\n"
161 "[%s]\n"
162 "\n"
163 "[%s]\n",
164 kGroupA, kGroupC),
165 ReadKeyFile());
166}
167
168TEST_F(KeyFileStoreTest, GetString) {
169 static const char kGroup[] = "something";
170 static const char kKey[] = "foo";
171 static const char kValue[] = "bar";
172 WriteKeyFile(base::StringPrintf("[%s]\n"
173 "%s=%s\n",
174 kGroup, kKey, kValue));
175 ASSERT_TRUE(store_.Open());
176 string value;
177 EXPECT_TRUE(store_.GetString(kGroup, kKey, &value));
178 EXPECT_EQ(kValue, value);
179 EXPECT_FALSE(store_.GetString("something-else", kKey, &value));
180 EXPECT_FALSE(store_.GetString(kGroup, "bar", &value));
181 EXPECT_TRUE(store_.GetString(kGroup, kKey, NULL));
182 ASSERT_TRUE(store_.Close());
183}
184
185TEST_F(KeyFileStoreTest, SetString) {
186 static const char kGroup[] = "string-group";
187 static const char kKey1[] = "test-string";
188 static const char kValue1[] = "foo";
189 static const char kKey2[] = "empty-string";
190 static const char kValue2[] = "";
191 ASSERT_TRUE(store_.Open());
192 ASSERT_TRUE(store_.SetString(kGroup, kKey1, kValue1));
193 ASSERT_TRUE(store_.SetString(kGroup, kKey2, kValue2));
194 ASSERT_TRUE(store_.Close());
195 EXPECT_EQ(base::StringPrintf("\n"
196 "[%s]\n"
197 "%s=%s\n"
198 "%s=%s\n",
199 kGroup, kKey1, kValue1, kKey2, kValue2),
200 ReadKeyFile());
201}
202
203TEST_F(KeyFileStoreTest, GetBool) {
204 static const char kGroup[] = "boo";
205 static const char kKeyTrue[] = "foo";
206 static const char kKeyFalse[] = "bar";
207 static const char kKeyBad[] = "zoo";
208 WriteKeyFile(base::StringPrintf("[%s]\n"
209 "%s=true\n"
210 "%s=false\n"
211 "%s=moo\n",
212 kGroup, kKeyTrue, kKeyFalse, kKeyBad));
213 ASSERT_TRUE(store_.Open());
214 {
215 bool value = true;
216 EXPECT_TRUE(store_.GetBool(kGroup, kKeyFalse, &value));
217 EXPECT_FALSE(value);
218 }
219 {
220 bool value = false;
221 EXPECT_TRUE(store_.GetBool(kGroup, kKeyTrue, &value));
222 EXPECT_TRUE(value);
223 }
224 {
225 bool value;
226 EXPECT_FALSE(store_.GetBool(kGroup, kKeyBad, &value));
227 EXPECT_FALSE(store_.GetBool(kGroup, "unknown", &value));
228 EXPECT_FALSE(store_.GetBool("unknown", kKeyTrue, &value));
229 }
230 EXPECT_TRUE(store_.GetBool(kGroup, kKeyFalse, NULL));
231 ASSERT_TRUE(store_.Close());
232}
233
234TEST_F(KeyFileStoreTest, SetBool) {
235 static const char kGroup[] = "bool-group";
236 static const char kKeyTrue[] = "test-true-bool";
237 static const char kKeyFalse[] = "test-false-bool";
238 ASSERT_TRUE(store_.Open());
239 ASSERT_TRUE(store_.SetBool(kGroup, kKeyTrue, true));
240 ASSERT_TRUE(store_.SetBool(kGroup, kKeyFalse, false));
241 ASSERT_TRUE(store_.Close());
242 EXPECT_EQ(base::StringPrintf("\n"
243 "[%s]\n"
244 "%s=true\n"
245 "%s=false\n",
246 kGroup, kKeyTrue, kKeyFalse),
247 ReadKeyFile());
248}
249
250TEST_F(KeyFileStoreTest, GetInt) {
251 static const char kGroup[] = "numbers";
252 static const char kKeyPos[] = "pos";
253 static const char kKeyNeg[] = "neg";
254 static const char kKeyBad[] = "bad";
255 const int kValuePos = 50;
256 const int kValueNeg = -20;
257 static const char kValueBad[] = "nan";
258 WriteKeyFile(base::StringPrintf("[%s]\n"
259 "%s=%d\n"
260 "%s=%d\n"
261 "%s=%s\n",
262 kGroup,
263 kKeyPos, kValuePos,
264 kKeyNeg, kValueNeg,
265 kKeyBad, kValueBad));
266 ASSERT_TRUE(store_.Open());
267 {
268 int value = 0;
269 EXPECT_TRUE(store_.GetInt(kGroup, kKeyNeg, &value));
270 EXPECT_EQ(kValueNeg, value);
271 }
272 {
273 int value = 0;
274 EXPECT_TRUE(store_.GetInt(kGroup, kKeyPos, &value));
275 EXPECT_EQ(kValuePos, value);
276 }
277 {
278 int value;
279 EXPECT_FALSE(store_.GetInt(kGroup, kKeyBad, &value));
280 EXPECT_FALSE(store_.GetInt(kGroup, "invalid", &value));
281 EXPECT_FALSE(store_.GetInt("invalid", kKeyPos, &value));
282 }
283 EXPECT_TRUE(store_.GetInt(kGroup, kKeyPos, NULL));
284 ASSERT_TRUE(store_.Close());
285}
286
287TEST_F(KeyFileStoreTest, SetInt) {
288 static const char kGroup[] = "int-group";
289 static const char kKey1[] = "test-int";
290 static const char kKey2[] = "test-negative";
291 const int kValue1 = 5;
292 const int kValue2 = -10;
293 ASSERT_TRUE(store_.Open());
294 ASSERT_TRUE(store_.SetInt(kGroup, kKey1, kValue1));
295 ASSERT_TRUE(store_.SetInt(kGroup, kKey2, kValue2));
296 ASSERT_TRUE(store_.Close());
297 EXPECT_EQ(base::StringPrintf("\n"
298 "[%s]\n"
299 "%s=%d\n"
300 "%s=%d\n",
301 kGroup, kKey1, kValue1, kKey2, kValue2),
302 ReadKeyFile());
303}
304
Darin Petkovb2841fd2011-06-30 12:54:12 -0700305TEST_F(KeyFileStoreTest, GetStringList) {
306 static const char kGroup[] = "string-lists";
307 static const char kKeyEmpty[] = "empty";
308 static const char kKeyEmptyValue[] = "empty-value";
309 static const char kKeyValueEmpty[] = "value-empty";
310 static const char kKeyValueEmptyValue[] = "value-empty-value";
311 static const char kKeyValues[] = "values";
312 static const char kValue[] = "value";
313 static const char kValue2[] = "value2";
314 static const char kValue3[] = "value3";
315 WriteKeyFile(base::StringPrintf("[%s]\n"
316 "%s=\n"
317 "%s=;%s\n"
318 "%s=%s;;\n"
319 "%s=%s;;%s\n"
320 "%s=%s;%s;%s\n",
321 kGroup,
322 kKeyEmpty,
323 kKeyEmptyValue, kValue,
324 kKeyValueEmpty, kValue,
325 kKeyValueEmptyValue, kValue, kValue2,
326 kKeyValues, kValue, kValue2, kValue3));
327 ASSERT_TRUE(store_.Open());
328
329 vector<string> value;
330
331 EXPECT_TRUE(store_.GetStringList(kGroup, kKeyValues, &value));
332 ASSERT_EQ(3, value.size());
333 EXPECT_EQ(kValue, value[0]);
334 EXPECT_EQ(kValue2, value[1]);
335 EXPECT_EQ(kValue3, value[2]);
336
337 EXPECT_TRUE(store_.GetStringList(kGroup, kKeyEmptyValue, &value));
338 ASSERT_EQ(2, value.size());
339 EXPECT_EQ("", value[0]);
340 EXPECT_EQ(kValue, value[1]);
341
342 EXPECT_TRUE(store_.GetStringList(kGroup, kKeyValueEmpty, &value));
343 ASSERT_EQ(2, value.size());
344 EXPECT_EQ(kValue, value[0]);
345 EXPECT_EQ("", value[1]);
346
347 EXPECT_TRUE(store_.GetStringList(kGroup, kKeyEmpty, &value));
348 ASSERT_EQ(0, value.size());
349
350 EXPECT_TRUE(store_.GetStringList(kGroup, kKeyValueEmptyValue, &value));
351 ASSERT_EQ(3, value.size());
352 EXPECT_EQ(kValue, value[0]);
353 EXPECT_EQ("", value[1]);
354 EXPECT_EQ(kValue2, value[2]);
355
356 EXPECT_FALSE(store_.GetStringList("unknown-string-lists", kKeyEmpty, &value));
357 EXPECT_FALSE(store_.GetStringList(kGroup, "some-key", &value));
358 EXPECT_TRUE(store_.GetStringList(kGroup, kKeyValues, NULL));
359 ASSERT_TRUE(store_.Close());
360}
361
362TEST_F(KeyFileStoreTest, SetStringList) {
363 static const char kGroup[] = "strings";
364 static const char kKeyEmpty[] = "e";
365 static const char kKeyEmptyValue[] = "ev";
366 static const char kKeyValueEmpty[] = "ve";
367 static const char kKeyValueEmptyValue[] = "vev";
368 static const char kKeyValues[] = "v";
369 static const char kValue[] = "abc";
370 static const char kValue2[] = "pqr";
371 static const char kValue3[] = "xyz";
372 ASSERT_TRUE(store_.Open());
373 {
374 vector<string> value;
375 ASSERT_TRUE(store_.SetStringList(kGroup, kKeyEmpty, value));
376 }
377 {
378 vector<string> value;
379 value.push_back("");
380 value.push_back(kValue);
381 ASSERT_TRUE(store_.SetStringList(kGroup, kKeyEmptyValue, value));
382 }
383 {
384 vector<string> value;
385 value.push_back(kValue);
386 value.push_back("");
387 ASSERT_TRUE(store_.SetStringList(kGroup, kKeyValueEmpty, value));
388 }
389 {
390 vector<string> value;
391 value.push_back(kValue);
392 value.push_back("");
393 value.push_back(kValue2);
394 ASSERT_TRUE(store_.SetStringList(kGroup, kKeyValueEmptyValue, value));
395 }
396 {
397 vector<string> value;
398 value.push_back(kValue);
399 value.push_back(kValue2);
400 value.push_back(kValue3);
401 ASSERT_TRUE(store_.SetStringList(kGroup, kKeyValues, value));
402 }
403 ASSERT_TRUE(store_.Close());
404 EXPECT_EQ(base::StringPrintf("\n"
405 "[%s]\n"
406 "%s=\n"
407 "%s=;%s;\n"
408 "%s=%s;;\n"
409 "%s=%s;;%s;\n"
410 "%s=%s;%s;%s;\n",
411 kGroup,
412 kKeyEmpty,
413 kKeyEmptyValue, kValue,
414 kKeyValueEmpty, kValue,
415 kKeyValueEmptyValue, kValue, kValue2,
416 kKeyValues, kValue, kValue2, kValue3),
417 ReadKeyFile());
418}
419
Darin Petkov86964e02011-06-29 13:49:28 -0700420TEST_F(KeyFileStoreTest, GetCryptedString) {
421 static const char kGroup[] = "crypto-group";
422 static const char kKey[] = "secret";
423 WriteKeyFile(base::StringPrintf("[%s]\n"
424 "%s=%s\n",
425 kGroup, kKey, kROT47Text));
426 ASSERT_TRUE(store_.Open());
427 string value;
428 EXPECT_TRUE(store_.GetCryptedString(kGroup, kKey, &value));
429 EXPECT_EQ(kPlainText, value);
430 EXPECT_FALSE(store_.GetCryptedString("something-else", kKey, &value));
431 EXPECT_FALSE(store_.GetCryptedString(kGroup, "non-secret", &value));
432 EXPECT_TRUE(store_.GetCryptedString(kGroup, kKey, NULL));
433 ASSERT_TRUE(store_.Close());
434}
435
436TEST_F(KeyFileStoreTest, SetCryptedString) {
437 static const char kGroup[] = "crypted-string-group";
438 static const char kKey[] = "test-string";
439 ASSERT_TRUE(store_.Open());
440 ASSERT_TRUE(store_.SetCryptedString(kGroup, kKey, kPlainText));
441 ASSERT_TRUE(store_.Close());
442 EXPECT_EQ(base::StringPrintf("\n"
443 "[%s]\n"
444 "%s=%s\n",
445 kGroup, kKey, kROT47Text),
446 ReadKeyFile());
447}
448
Chris Masoneb9c00592011-10-06 13:10:39 -0700449TEST_F(KeyFileStoreTest, PersistAcrossClose) {
450 static const char kGroup[] = "string-group";
451 static const char kKey1[] = "test-string";
452 static const char kValue1[] = "foo";
453 static const char kKey2[] = "empty-string";
454 static const char kValue2[] = "";
455 ASSERT_TRUE(store_.Open());
456 ASSERT_TRUE(store_.SetString(kGroup, kKey1, kValue1));
457 ASSERT_TRUE(store_.Close());
458 ASSERT_TRUE(store_.Open());
459 ASSERT_TRUE(store_.SetString(kGroup, kKey2, kValue2));
460 string value;
461 ASSERT_TRUE(store_.GetString(kGroup, kKey1, &value));
462 ASSERT_EQ(kValue1, value);
463 ASSERT_TRUE(store_.GetString(kGroup, kKey2, &value));
464 ASSERT_EQ(kValue2, value);
465 ASSERT_TRUE(store_.Close());
466}
467
468bool KeyFileStoreTest::OpenCheckClose(const string &group,
469 const string &key,
470 const string &expected_value) {
471 KeyFileStore store(&glib_);
472 store.set_path(test_file_);
473 EXPECT_TRUE(store.Open());
474 string value;
475 bool could_get = store.GetString(group, key, &value);
476 store.set_path(FilePath("")); // Don't persist to disk.
477 store.Close();
478 return could_get && expected_value == value;
479}
480
481TEST_F(KeyFileStoreTest, Flush) {
482 static const char kGroup[] = "string-group";
483 static const char kKey1[] = "test-string";
484 static const char kValue1[] = "foo";
485 static const char kKey2[] = "empty-string";
486 static const char kValue2[] = "";
487 ASSERT_TRUE(store_.Open());
488 ASSERT_TRUE(store_.SetString(kGroup, kKey1, kValue1));
489 ASSERT_TRUE(store_.Flush());
490 ASSERT_TRUE(OpenCheckClose(kGroup, kKey1, kValue1));
491
492 ASSERT_TRUE(store_.SetString(kGroup, kKey2, kValue2));
493 ASSERT_TRUE(store_.Flush());
494 ASSERT_TRUE(OpenCheckClose(kGroup, kKey2, kValue2));
495
496 EXPECT_TRUE(store_.DeleteKey(kGroup, kKey1));
497 ASSERT_TRUE(store_.Flush());
498 ASSERT_FALSE(OpenCheckClose(kGroup, kKey1, kValue1));
499}
500
Paul Stewart5dc40aa2011-10-28 19:43:43 -0700501TEST_F(KeyFileStoreTest, EmptyFile) {
502 ASSERT_TRUE(store_.Open());
503 ASSERT_TRUE(store_.Close());
504 EXPECT_FALSE(store_.IsNonEmpty());
505}
506
507TEST_F(KeyFileStoreTest, SetHeader) {
508 ASSERT_TRUE(store_.Open());
509 ASSERT_TRUE(store_.SetHeader("this is a test"));
510 ASSERT_TRUE(store_.Close());
511 EXPECT_TRUE(store_.IsNonEmpty());
512 ASSERT_TRUE(store_.Open());
513}
514
Darin Petkov083047b2011-06-23 20:42:48 -0700515TEST_F(KeyFileStoreTest, Combo) {
516 static const char kGroupA[] = "square";
517 static const char kGroupB[] = "circle";
518 static const char kGroupC[] = "triangle";
519 static const char kGroupX[] = "pentagon";
520 static const char kKeyString[] = "color";
Darin Petkovb2841fd2011-06-30 12:54:12 -0700521 static const char kKeyStringList[] = "alternative-colors";
Darin Petkov083047b2011-06-23 20:42:48 -0700522 static const char kKeyInt[] = "area";
523 static const char kKeyBool[] = "visible";
524 static const char kValueStringA[] = "blue";
525 static const char kValueStringB[] = "red";
526 static const char kValueStringC[] = "yellow";
527 static const char kValueStringCNew[] = "purple";
528 const int kValueIntA = 5;
529 const int kValueIntB = 10;
530 const int kValueIntBNew = 333;
531 WriteKeyFile(base::StringPrintf("[%s]\n"
532 "%s=%s\n"
Darin Petkovb2841fd2011-06-30 12:54:12 -0700533 "%s=%s;%s\n"
Darin Petkov083047b2011-06-23 20:42:48 -0700534 "%s=%d\n"
535 "[%s]\n"
536 "%s=%s\n"
Darin Petkovb2841fd2011-06-30 12:54:12 -0700537 "%s=%s;%s\n"
Darin Petkov083047b2011-06-23 20:42:48 -0700538 "%s=%d\n"
539 "%s=true\n"
540 "[%s]\n"
541 "%s=%s\n"
542 "%s=false\n",
543 kGroupA,
544 kKeyString, kValueStringA,
Darin Petkovb2841fd2011-06-30 12:54:12 -0700545 kKeyStringList, kValueStringB, kValueStringC,
Darin Petkov083047b2011-06-23 20:42:48 -0700546 kKeyInt, kValueIntA,
547 kGroupB,
548 kKeyString, kValueStringB,
Darin Petkovb2841fd2011-06-30 12:54:12 -0700549 kKeyStringList, kValueStringA, kValueStringC,
Darin Petkov083047b2011-06-23 20:42:48 -0700550 kKeyInt, kValueIntB,
551 kKeyBool,
552 kGroupC,
553 kKeyString, kValueStringC,
554 kKeyBool));
555 ASSERT_TRUE(store_.Open());
556
557 EXPECT_TRUE(store_.ContainsGroup(kGroupA));
558 EXPECT_TRUE(store_.ContainsGroup(kGroupB));
559 EXPECT_TRUE(store_.ContainsGroup(kGroupC));
560 EXPECT_FALSE(store_.ContainsGroup(kGroupX));
561
562 set<string> groups = store_.GetGroups();
563 EXPECT_EQ(3, groups.size());
564 EXPECT_TRUE(ContainsKey(groups, kGroupA));
565 EXPECT_TRUE(ContainsKey(groups, kGroupB));
566 EXPECT_TRUE(ContainsKey(groups, kGroupC));
567 EXPECT_FALSE(ContainsKey(groups, kGroupX));
568
569 {
570 string value;
571 EXPECT_TRUE(store_.GetString(kGroupB, kKeyString, &value));
572 EXPECT_EQ(kValueStringB, value);
573 EXPECT_TRUE(store_.GetString(kGroupA, kKeyString, &value));
574 EXPECT_EQ(kValueStringA, value);
575 EXPECT_TRUE(store_.GetString(kGroupC, kKeyString, &value));
576 EXPECT_EQ(kValueStringC, value);
577 }
578 {
Darin Petkovb2841fd2011-06-30 12:54:12 -0700579 vector<string> value;
580 EXPECT_TRUE(store_.GetStringList(kGroupB, kKeyStringList, &value));
581 ASSERT_EQ(2, value.size());
582 EXPECT_EQ(kValueStringA, value[0]);
583 EXPECT_EQ(kValueStringC, value[1]);
584 EXPECT_TRUE(store_.GetStringList(kGroupA, kKeyStringList, &value));
585 ASSERT_EQ(2, value.size());
586 EXPECT_EQ(kValueStringB, value[0]);
587 EXPECT_EQ(kValueStringC, value[1]);
588 EXPECT_FALSE(store_.GetStringList(kGroupC, kKeyStringList, &value));
589 }
590 {
Darin Petkov083047b2011-06-23 20:42:48 -0700591 int value = 0;
592 EXPECT_TRUE(store_.GetInt(kGroupB, kKeyInt, &value));
593 EXPECT_EQ(kValueIntB, value);
594 EXPECT_TRUE(store_.GetInt(kGroupA, kKeyInt, &value));
595 EXPECT_EQ(kValueIntA, value);
596 EXPECT_FALSE(store_.GetInt(kGroupC, kKeyInt, &value));
597 }
598 {
599 bool value = false;
600 EXPECT_TRUE(store_.GetBool(kGroupB, kKeyBool, &value));
601 EXPECT_TRUE(value);
602 EXPECT_TRUE(store_.GetBool(kGroupC, kKeyBool, &value));
603 EXPECT_FALSE(value);
604 EXPECT_FALSE(store_.GetBool(kGroupA, kKeyBool, &value));
605 }
606
607 EXPECT_TRUE(store_.DeleteGroup(kGroupA));
Chris Masone9d779932011-08-25 16:33:41 -0700608 EXPECT_TRUE(store_.DeleteGroup(kGroupA));
Darin Petkov083047b2011-06-23 20:42:48 -0700609
610 EXPECT_FALSE(store_.ContainsGroup(kGroupA));
611 EXPECT_TRUE(store_.ContainsGroup(kGroupB));
612 EXPECT_TRUE(store_.ContainsGroup(kGroupC));
613
614 groups = store_.GetGroups();
615 EXPECT_EQ(2, groups.size());
616 EXPECT_FALSE(ContainsKey(groups, kGroupA));
617 EXPECT_TRUE(ContainsKey(groups, kGroupB));
618 EXPECT_TRUE(ContainsKey(groups, kGroupC));
619
620 EXPECT_TRUE(store_.SetBool(kGroupB, kKeyBool, false));
621 EXPECT_TRUE(store_.SetInt(kGroupB, kKeyInt, kValueIntBNew));
622 EXPECT_TRUE(store_.SetString(kGroupC, kKeyString, kValueStringCNew));
Darin Petkovb2841fd2011-06-30 12:54:12 -0700623 store_.SetStringList(kGroupB,
624 kKeyStringList,
625 vector<string>(1, kValueStringB));
Darin Petkov083047b2011-06-23 20:42:48 -0700626
627 EXPECT_TRUE(store_.DeleteKey(kGroupB, kKeyString));
Chris Masone9d779932011-08-25 16:33:41 -0700628 EXPECT_TRUE(store_.DeleteKey(kGroupB, kKeyString));
Darin Petkov083047b2011-06-23 20:42:48 -0700629
630 {
631 string value;
632 EXPECT_FALSE(store_.GetString(kGroupB, kKeyString, &value));
633 EXPECT_FALSE(store_.GetString(kGroupA, kKeyString, &value));
634 EXPECT_TRUE(store_.GetString(kGroupC, kKeyString, &value));
635 EXPECT_EQ(kValueStringCNew, value);
636 }
Darin Petkovb2841fd2011-06-30 12:54:12 -0700637 {
638 vector<string> value;
639 EXPECT_TRUE(store_.GetStringList(kGroupB, kKeyStringList, &value));
640 ASSERT_EQ(1, value.size());
641 EXPECT_EQ(kValueStringB, value[0]);
642 EXPECT_FALSE(store_.GetStringList(kGroupA, kKeyStringList, &value));
643 EXPECT_FALSE(store_.GetStringList(kGroupC, kKeyStringList, &value));
644 }
Darin Petkov083047b2011-06-23 20:42:48 -0700645 {
646 int value = 0;
647 EXPECT_TRUE(store_.GetInt(kGroupB, kKeyInt, &value));
648 EXPECT_EQ(kValueIntBNew, value);
649 EXPECT_FALSE(store_.GetInt(kGroupA, kKeyInt, &value));
650 EXPECT_FALSE(store_.GetInt(kGroupC, kKeyInt, &value));
651 }
Darin Petkov083047b2011-06-23 20:42:48 -0700652 {
653 bool value = false;
654 EXPECT_TRUE(store_.GetBool(kGroupB, kKeyBool, &value));
655 EXPECT_FALSE(value);
656 EXPECT_TRUE(store_.GetBool(kGroupC, kKeyBool, &value));
657 EXPECT_FALSE(value);
658 EXPECT_FALSE(store_.GetBool(kGroupA, kKeyBool, &value));
659 }
660
661 ASSERT_TRUE(store_.Close());
662 EXPECT_EQ(base::StringPrintf("\n"
663 "[%s]\n"
Darin Petkovb2841fd2011-06-30 12:54:12 -0700664 "%s=%s;\n"
Darin Petkov083047b2011-06-23 20:42:48 -0700665 "%s=%d\n"
666 "%s=false\n"
667 "\n"
668 "[%s]\n"
669 "%s=%s\n"
670 "%s=false\n",
671 kGroupB,
Darin Petkovb2841fd2011-06-30 12:54:12 -0700672 kKeyStringList, kValueStringB,
Darin Petkov083047b2011-06-23 20:42:48 -0700673 kKeyInt, kValueIntBNew,
674 kKeyBool,
675 kGroupC,
676 kKeyString, kValueStringCNew,
677 kKeyBool),
678 ReadKeyFile());
679}
680
681} // namespace shill