blob: d9806d94dc3192e61717bb4b36e2a5b53606f3c5 [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
Paul Stewarta41e38d2011-11-11 07:47:29 -0800110TEST_F(KeyFileStoreTest, GetGroupsWithKey) {
111 static const char kGroupA[] = "g-a";
112 static const char kGroupB[] = "g-b";
113 static const char kGroupC[] = "g-c";
114 static const char kKeyA[] = "k-a";
115 static const char kKeyB[] = "k-b";
116 static const char kValue[] = "true";
117 WriteKeyFile(base::StringPrintf("[%s]\n"
118 "%s=%s\n"
119 "[%s]\n"
120 "%s=%s\n"
121 "%s=%s\n"
122 "[%s]\n"
123 "%s=%s\n",
124 kGroupA, kKeyA, kValue,
125 kGroupB, kKeyA, kValue, kKeyB, kValue,
126 kGroupC, kKeyB, kValue));
127 EXPECT_TRUE(store_.IsNonEmpty());
128 ASSERT_TRUE(store_.Open());
129 set<string> groups_a = store_.GetGroupsWithKey(kKeyA);
130 EXPECT_EQ(2, groups_a.size());
131 EXPECT_TRUE(ContainsKey(groups_a, kGroupA));
132 EXPECT_TRUE(ContainsKey(groups_a, kGroupB));
133 set<string> groups_b = store_.GetGroupsWithKey(kKeyB);
134 EXPECT_EQ(2, groups_b.size());
135 EXPECT_TRUE(ContainsKey(groups_b, kGroupB));
136 EXPECT_TRUE(ContainsKey(groups_b, kGroupC));
137 ASSERT_TRUE(store_.Close());
138}
139
Darin Petkov083047b2011-06-23 20:42:48 -0700140TEST_F(KeyFileStoreTest, ContainsGroup) {
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 "[%s]\n",
147 kGroupA, kGroupB, kGroupC));
148 ASSERT_TRUE(store_.Open());
149 EXPECT_TRUE(store_.ContainsGroup(kGroupA));
150 EXPECT_TRUE(store_.ContainsGroup(kGroupB));
151 EXPECT_TRUE(store_.ContainsGroup(kGroupC));
152 EXPECT_FALSE(store_.ContainsGroup("group-d"));
153 ASSERT_TRUE(store_.Close());
154}
155
156TEST_F(KeyFileStoreTest, DeleteKey) {
157 static const char kGroup[] = "the-group";
158 static const char kKeyDead[] = "dead";
159 static const char kKeyAlive[] = "alive";
160 const int kValueAlive = 3;
161 WriteKeyFile(base::StringPrintf("[%s]\n"
162 "%s=5\n"
163 "%s=%d\n",
164 kGroup, kKeyDead, kKeyAlive, kValueAlive));
165 ASSERT_TRUE(store_.Open());
166 EXPECT_TRUE(store_.DeleteKey(kGroup, kKeyDead));
Chris Masone9d779932011-08-25 16:33:41 -0700167 EXPECT_TRUE(store_.DeleteKey(kGroup, "random-key"));
Darin Petkov083047b2011-06-23 20:42:48 -0700168 EXPECT_FALSE(store_.DeleteKey("random-group", kKeyAlive));
169 ASSERT_TRUE(store_.Close());
170 EXPECT_EQ(base::StringPrintf("\n"
171 "[%s]\n"
172 "%s=%d\n",
173 kGroup, kKeyAlive, kValueAlive),
174 ReadKeyFile());
175}
176
177TEST_F(KeyFileStoreTest, DeleteGroup) {
178 static const char kGroupA[] = "group-a";
179 static const char kGroupB[] = "group-b";
180 static const char kGroupC[] = "group-c";
181 WriteKeyFile(base::StringPrintf("[%s]\n"
182 "[%s]\n"
183 "key-to-be-deleted=true\n"
184 "[%s]\n",
185 kGroupA, kGroupB, kGroupC));
186 ASSERT_TRUE(store_.Open());
187 EXPECT_TRUE(store_.DeleteGroup(kGroupB));
Chris Masone9d779932011-08-25 16:33:41 -0700188 EXPECT_TRUE(store_.DeleteGroup("group-d"));
Darin Petkov083047b2011-06-23 20:42:48 -0700189 ASSERT_TRUE(store_.Close());
190 EXPECT_EQ(base::StringPrintf("\n"
191 "[%s]\n"
192 "\n"
193 "[%s]\n",
194 kGroupA, kGroupC),
195 ReadKeyFile());
196}
197
198TEST_F(KeyFileStoreTest, GetString) {
199 static const char kGroup[] = "something";
200 static const char kKey[] = "foo";
201 static const char kValue[] = "bar";
202 WriteKeyFile(base::StringPrintf("[%s]\n"
203 "%s=%s\n",
204 kGroup, kKey, kValue));
205 ASSERT_TRUE(store_.Open());
206 string value;
207 EXPECT_TRUE(store_.GetString(kGroup, kKey, &value));
208 EXPECT_EQ(kValue, value);
209 EXPECT_FALSE(store_.GetString("something-else", kKey, &value));
210 EXPECT_FALSE(store_.GetString(kGroup, "bar", &value));
211 EXPECT_TRUE(store_.GetString(kGroup, kKey, NULL));
212 ASSERT_TRUE(store_.Close());
213}
214
215TEST_F(KeyFileStoreTest, SetString) {
216 static const char kGroup[] = "string-group";
217 static const char kKey1[] = "test-string";
218 static const char kValue1[] = "foo";
219 static const char kKey2[] = "empty-string";
220 static const char kValue2[] = "";
221 ASSERT_TRUE(store_.Open());
222 ASSERT_TRUE(store_.SetString(kGroup, kKey1, kValue1));
223 ASSERT_TRUE(store_.SetString(kGroup, kKey2, kValue2));
224 ASSERT_TRUE(store_.Close());
225 EXPECT_EQ(base::StringPrintf("\n"
226 "[%s]\n"
227 "%s=%s\n"
228 "%s=%s\n",
229 kGroup, kKey1, kValue1, kKey2, kValue2),
230 ReadKeyFile());
231}
232
233TEST_F(KeyFileStoreTest, GetBool) {
234 static const char kGroup[] = "boo";
235 static const char kKeyTrue[] = "foo";
236 static const char kKeyFalse[] = "bar";
237 static const char kKeyBad[] = "zoo";
238 WriteKeyFile(base::StringPrintf("[%s]\n"
239 "%s=true\n"
240 "%s=false\n"
241 "%s=moo\n",
242 kGroup, kKeyTrue, kKeyFalse, kKeyBad));
243 ASSERT_TRUE(store_.Open());
244 {
245 bool value = true;
246 EXPECT_TRUE(store_.GetBool(kGroup, kKeyFalse, &value));
247 EXPECT_FALSE(value);
248 }
249 {
250 bool value = false;
251 EXPECT_TRUE(store_.GetBool(kGroup, kKeyTrue, &value));
252 EXPECT_TRUE(value);
253 }
254 {
255 bool value;
256 EXPECT_FALSE(store_.GetBool(kGroup, kKeyBad, &value));
257 EXPECT_FALSE(store_.GetBool(kGroup, "unknown", &value));
258 EXPECT_FALSE(store_.GetBool("unknown", kKeyTrue, &value));
259 }
260 EXPECT_TRUE(store_.GetBool(kGroup, kKeyFalse, NULL));
261 ASSERT_TRUE(store_.Close());
262}
263
264TEST_F(KeyFileStoreTest, SetBool) {
265 static const char kGroup[] = "bool-group";
266 static const char kKeyTrue[] = "test-true-bool";
267 static const char kKeyFalse[] = "test-false-bool";
268 ASSERT_TRUE(store_.Open());
269 ASSERT_TRUE(store_.SetBool(kGroup, kKeyTrue, true));
270 ASSERT_TRUE(store_.SetBool(kGroup, kKeyFalse, false));
271 ASSERT_TRUE(store_.Close());
272 EXPECT_EQ(base::StringPrintf("\n"
273 "[%s]\n"
274 "%s=true\n"
275 "%s=false\n",
276 kGroup, kKeyTrue, kKeyFalse),
277 ReadKeyFile());
278}
279
280TEST_F(KeyFileStoreTest, GetInt) {
281 static const char kGroup[] = "numbers";
282 static const char kKeyPos[] = "pos";
283 static const char kKeyNeg[] = "neg";
284 static const char kKeyBad[] = "bad";
285 const int kValuePos = 50;
286 const int kValueNeg = -20;
287 static const char kValueBad[] = "nan";
288 WriteKeyFile(base::StringPrintf("[%s]\n"
289 "%s=%d\n"
290 "%s=%d\n"
291 "%s=%s\n",
292 kGroup,
293 kKeyPos, kValuePos,
294 kKeyNeg, kValueNeg,
295 kKeyBad, kValueBad));
296 ASSERT_TRUE(store_.Open());
297 {
298 int value = 0;
299 EXPECT_TRUE(store_.GetInt(kGroup, kKeyNeg, &value));
300 EXPECT_EQ(kValueNeg, value);
301 }
302 {
303 int value = 0;
304 EXPECT_TRUE(store_.GetInt(kGroup, kKeyPos, &value));
305 EXPECT_EQ(kValuePos, value);
306 }
307 {
308 int value;
309 EXPECT_FALSE(store_.GetInt(kGroup, kKeyBad, &value));
310 EXPECT_FALSE(store_.GetInt(kGroup, "invalid", &value));
311 EXPECT_FALSE(store_.GetInt("invalid", kKeyPos, &value));
312 }
313 EXPECT_TRUE(store_.GetInt(kGroup, kKeyPos, NULL));
314 ASSERT_TRUE(store_.Close());
315}
316
317TEST_F(KeyFileStoreTest, SetInt) {
318 static const char kGroup[] = "int-group";
319 static const char kKey1[] = "test-int";
320 static const char kKey2[] = "test-negative";
321 const int kValue1 = 5;
322 const int kValue2 = -10;
323 ASSERT_TRUE(store_.Open());
324 ASSERT_TRUE(store_.SetInt(kGroup, kKey1, kValue1));
325 ASSERT_TRUE(store_.SetInt(kGroup, kKey2, kValue2));
326 ASSERT_TRUE(store_.Close());
327 EXPECT_EQ(base::StringPrintf("\n"
328 "[%s]\n"
329 "%s=%d\n"
330 "%s=%d\n",
331 kGroup, kKey1, kValue1, kKey2, kValue2),
332 ReadKeyFile());
333}
334
Darin Petkovb2841fd2011-06-30 12:54:12 -0700335TEST_F(KeyFileStoreTest, GetStringList) {
336 static const char kGroup[] = "string-lists";
337 static const char kKeyEmpty[] = "empty";
338 static const char kKeyEmptyValue[] = "empty-value";
339 static const char kKeyValueEmpty[] = "value-empty";
340 static const char kKeyValueEmptyValue[] = "value-empty-value";
341 static const char kKeyValues[] = "values";
342 static const char kValue[] = "value";
343 static const char kValue2[] = "value2";
344 static const char kValue3[] = "value3";
345 WriteKeyFile(base::StringPrintf("[%s]\n"
346 "%s=\n"
347 "%s=;%s\n"
348 "%s=%s;;\n"
349 "%s=%s;;%s\n"
350 "%s=%s;%s;%s\n",
351 kGroup,
352 kKeyEmpty,
353 kKeyEmptyValue, kValue,
354 kKeyValueEmpty, kValue,
355 kKeyValueEmptyValue, kValue, kValue2,
356 kKeyValues, kValue, kValue2, kValue3));
357 ASSERT_TRUE(store_.Open());
358
359 vector<string> value;
360
361 EXPECT_TRUE(store_.GetStringList(kGroup, kKeyValues, &value));
362 ASSERT_EQ(3, value.size());
363 EXPECT_EQ(kValue, value[0]);
364 EXPECT_EQ(kValue2, value[1]);
365 EXPECT_EQ(kValue3, value[2]);
366
367 EXPECT_TRUE(store_.GetStringList(kGroup, kKeyEmptyValue, &value));
368 ASSERT_EQ(2, value.size());
369 EXPECT_EQ("", value[0]);
370 EXPECT_EQ(kValue, value[1]);
371
372 EXPECT_TRUE(store_.GetStringList(kGroup, kKeyValueEmpty, &value));
373 ASSERT_EQ(2, value.size());
374 EXPECT_EQ(kValue, value[0]);
375 EXPECT_EQ("", value[1]);
376
377 EXPECT_TRUE(store_.GetStringList(kGroup, kKeyEmpty, &value));
378 ASSERT_EQ(0, value.size());
379
380 EXPECT_TRUE(store_.GetStringList(kGroup, kKeyValueEmptyValue, &value));
381 ASSERT_EQ(3, value.size());
382 EXPECT_EQ(kValue, value[0]);
383 EXPECT_EQ("", value[1]);
384 EXPECT_EQ(kValue2, value[2]);
385
386 EXPECT_FALSE(store_.GetStringList("unknown-string-lists", kKeyEmpty, &value));
387 EXPECT_FALSE(store_.GetStringList(kGroup, "some-key", &value));
388 EXPECT_TRUE(store_.GetStringList(kGroup, kKeyValues, NULL));
389 ASSERT_TRUE(store_.Close());
390}
391
392TEST_F(KeyFileStoreTest, SetStringList) {
393 static const char kGroup[] = "strings";
394 static const char kKeyEmpty[] = "e";
395 static const char kKeyEmptyValue[] = "ev";
396 static const char kKeyValueEmpty[] = "ve";
397 static const char kKeyValueEmptyValue[] = "vev";
398 static const char kKeyValues[] = "v";
399 static const char kValue[] = "abc";
400 static const char kValue2[] = "pqr";
401 static const char kValue3[] = "xyz";
402 ASSERT_TRUE(store_.Open());
403 {
404 vector<string> value;
405 ASSERT_TRUE(store_.SetStringList(kGroup, kKeyEmpty, value));
406 }
407 {
408 vector<string> value;
409 value.push_back("");
410 value.push_back(kValue);
411 ASSERT_TRUE(store_.SetStringList(kGroup, kKeyEmptyValue, value));
412 }
413 {
414 vector<string> value;
415 value.push_back(kValue);
416 value.push_back("");
417 ASSERT_TRUE(store_.SetStringList(kGroup, kKeyValueEmpty, value));
418 }
419 {
420 vector<string> value;
421 value.push_back(kValue);
422 value.push_back("");
423 value.push_back(kValue2);
424 ASSERT_TRUE(store_.SetStringList(kGroup, kKeyValueEmptyValue, value));
425 }
426 {
427 vector<string> value;
428 value.push_back(kValue);
429 value.push_back(kValue2);
430 value.push_back(kValue3);
431 ASSERT_TRUE(store_.SetStringList(kGroup, kKeyValues, value));
432 }
433 ASSERT_TRUE(store_.Close());
434 EXPECT_EQ(base::StringPrintf("\n"
435 "[%s]\n"
436 "%s=\n"
437 "%s=;%s;\n"
438 "%s=%s;;\n"
439 "%s=%s;;%s;\n"
440 "%s=%s;%s;%s;\n",
441 kGroup,
442 kKeyEmpty,
443 kKeyEmptyValue, kValue,
444 kKeyValueEmpty, kValue,
445 kKeyValueEmptyValue, kValue, kValue2,
446 kKeyValues, kValue, kValue2, kValue3),
447 ReadKeyFile());
448}
449
Darin Petkov86964e02011-06-29 13:49:28 -0700450TEST_F(KeyFileStoreTest, GetCryptedString) {
451 static const char kGroup[] = "crypto-group";
452 static const char kKey[] = "secret";
453 WriteKeyFile(base::StringPrintf("[%s]\n"
454 "%s=%s\n",
455 kGroup, kKey, kROT47Text));
456 ASSERT_TRUE(store_.Open());
457 string value;
458 EXPECT_TRUE(store_.GetCryptedString(kGroup, kKey, &value));
459 EXPECT_EQ(kPlainText, value);
460 EXPECT_FALSE(store_.GetCryptedString("something-else", kKey, &value));
461 EXPECT_FALSE(store_.GetCryptedString(kGroup, "non-secret", &value));
462 EXPECT_TRUE(store_.GetCryptedString(kGroup, kKey, NULL));
463 ASSERT_TRUE(store_.Close());
464}
465
466TEST_F(KeyFileStoreTest, SetCryptedString) {
467 static const char kGroup[] = "crypted-string-group";
468 static const char kKey[] = "test-string";
469 ASSERT_TRUE(store_.Open());
470 ASSERT_TRUE(store_.SetCryptedString(kGroup, kKey, kPlainText));
471 ASSERT_TRUE(store_.Close());
472 EXPECT_EQ(base::StringPrintf("\n"
473 "[%s]\n"
474 "%s=%s\n",
475 kGroup, kKey, kROT47Text),
476 ReadKeyFile());
477}
478
Chris Masoneb9c00592011-10-06 13:10:39 -0700479TEST_F(KeyFileStoreTest, PersistAcrossClose) {
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_.Close());
488 ASSERT_TRUE(store_.Open());
489 ASSERT_TRUE(store_.SetString(kGroup, kKey2, kValue2));
490 string value;
491 ASSERT_TRUE(store_.GetString(kGroup, kKey1, &value));
492 ASSERT_EQ(kValue1, value);
493 ASSERT_TRUE(store_.GetString(kGroup, kKey2, &value));
494 ASSERT_EQ(kValue2, value);
495 ASSERT_TRUE(store_.Close());
496}
497
498bool KeyFileStoreTest::OpenCheckClose(const string &group,
499 const string &key,
500 const string &expected_value) {
501 KeyFileStore store(&glib_);
502 store.set_path(test_file_);
503 EXPECT_TRUE(store.Open());
504 string value;
505 bool could_get = store.GetString(group, key, &value);
506 store.set_path(FilePath("")); // Don't persist to disk.
507 store.Close();
508 return could_get && expected_value == value;
509}
510
511TEST_F(KeyFileStoreTest, Flush) {
512 static const char kGroup[] = "string-group";
513 static const char kKey1[] = "test-string";
514 static const char kValue1[] = "foo";
515 static const char kKey2[] = "empty-string";
516 static const char kValue2[] = "";
517 ASSERT_TRUE(store_.Open());
518 ASSERT_TRUE(store_.SetString(kGroup, kKey1, kValue1));
519 ASSERT_TRUE(store_.Flush());
520 ASSERT_TRUE(OpenCheckClose(kGroup, kKey1, kValue1));
521
522 ASSERT_TRUE(store_.SetString(kGroup, kKey2, kValue2));
523 ASSERT_TRUE(store_.Flush());
524 ASSERT_TRUE(OpenCheckClose(kGroup, kKey2, kValue2));
525
526 EXPECT_TRUE(store_.DeleteKey(kGroup, kKey1));
527 ASSERT_TRUE(store_.Flush());
528 ASSERT_FALSE(OpenCheckClose(kGroup, kKey1, kValue1));
529}
530
Paul Stewart5dc40aa2011-10-28 19:43:43 -0700531TEST_F(KeyFileStoreTest, EmptyFile) {
532 ASSERT_TRUE(store_.Open());
533 ASSERT_TRUE(store_.Close());
534 EXPECT_FALSE(store_.IsNonEmpty());
535}
536
537TEST_F(KeyFileStoreTest, SetHeader) {
538 ASSERT_TRUE(store_.Open());
539 ASSERT_TRUE(store_.SetHeader("this is a test"));
540 ASSERT_TRUE(store_.Close());
541 EXPECT_TRUE(store_.IsNonEmpty());
542 ASSERT_TRUE(store_.Open());
543}
544
Darin Petkov083047b2011-06-23 20:42:48 -0700545TEST_F(KeyFileStoreTest, Combo) {
546 static const char kGroupA[] = "square";
547 static const char kGroupB[] = "circle";
548 static const char kGroupC[] = "triangle";
549 static const char kGroupX[] = "pentagon";
550 static const char kKeyString[] = "color";
Darin Petkovb2841fd2011-06-30 12:54:12 -0700551 static const char kKeyStringList[] = "alternative-colors";
Darin Petkov083047b2011-06-23 20:42:48 -0700552 static const char kKeyInt[] = "area";
553 static const char kKeyBool[] = "visible";
554 static const char kValueStringA[] = "blue";
555 static const char kValueStringB[] = "red";
556 static const char kValueStringC[] = "yellow";
557 static const char kValueStringCNew[] = "purple";
558 const int kValueIntA = 5;
559 const int kValueIntB = 10;
560 const int kValueIntBNew = 333;
561 WriteKeyFile(base::StringPrintf("[%s]\n"
562 "%s=%s\n"
Darin Petkovb2841fd2011-06-30 12:54:12 -0700563 "%s=%s;%s\n"
Darin Petkov083047b2011-06-23 20:42:48 -0700564 "%s=%d\n"
565 "[%s]\n"
566 "%s=%s\n"
Darin Petkovb2841fd2011-06-30 12:54:12 -0700567 "%s=%s;%s\n"
Darin Petkov083047b2011-06-23 20:42:48 -0700568 "%s=%d\n"
569 "%s=true\n"
570 "[%s]\n"
571 "%s=%s\n"
572 "%s=false\n",
573 kGroupA,
574 kKeyString, kValueStringA,
Darin Petkovb2841fd2011-06-30 12:54:12 -0700575 kKeyStringList, kValueStringB, kValueStringC,
Darin Petkov083047b2011-06-23 20:42:48 -0700576 kKeyInt, kValueIntA,
577 kGroupB,
578 kKeyString, kValueStringB,
Darin Petkovb2841fd2011-06-30 12:54:12 -0700579 kKeyStringList, kValueStringA, kValueStringC,
Darin Petkov083047b2011-06-23 20:42:48 -0700580 kKeyInt, kValueIntB,
581 kKeyBool,
582 kGroupC,
583 kKeyString, kValueStringC,
584 kKeyBool));
585 ASSERT_TRUE(store_.Open());
586
587 EXPECT_TRUE(store_.ContainsGroup(kGroupA));
588 EXPECT_TRUE(store_.ContainsGroup(kGroupB));
589 EXPECT_TRUE(store_.ContainsGroup(kGroupC));
590 EXPECT_FALSE(store_.ContainsGroup(kGroupX));
591
592 set<string> groups = store_.GetGroups();
593 EXPECT_EQ(3, groups.size());
594 EXPECT_TRUE(ContainsKey(groups, kGroupA));
595 EXPECT_TRUE(ContainsKey(groups, kGroupB));
596 EXPECT_TRUE(ContainsKey(groups, kGroupC));
597 EXPECT_FALSE(ContainsKey(groups, kGroupX));
598
599 {
600 string value;
601 EXPECT_TRUE(store_.GetString(kGroupB, kKeyString, &value));
602 EXPECT_EQ(kValueStringB, value);
603 EXPECT_TRUE(store_.GetString(kGroupA, kKeyString, &value));
604 EXPECT_EQ(kValueStringA, value);
605 EXPECT_TRUE(store_.GetString(kGroupC, kKeyString, &value));
606 EXPECT_EQ(kValueStringC, value);
607 }
608 {
Darin Petkovb2841fd2011-06-30 12:54:12 -0700609 vector<string> value;
610 EXPECT_TRUE(store_.GetStringList(kGroupB, kKeyStringList, &value));
611 ASSERT_EQ(2, value.size());
612 EXPECT_EQ(kValueStringA, value[0]);
613 EXPECT_EQ(kValueStringC, value[1]);
614 EXPECT_TRUE(store_.GetStringList(kGroupA, kKeyStringList, &value));
615 ASSERT_EQ(2, value.size());
616 EXPECT_EQ(kValueStringB, value[0]);
617 EXPECT_EQ(kValueStringC, value[1]);
618 EXPECT_FALSE(store_.GetStringList(kGroupC, kKeyStringList, &value));
619 }
620 {
Darin Petkov083047b2011-06-23 20:42:48 -0700621 int value = 0;
622 EXPECT_TRUE(store_.GetInt(kGroupB, kKeyInt, &value));
623 EXPECT_EQ(kValueIntB, value);
624 EXPECT_TRUE(store_.GetInt(kGroupA, kKeyInt, &value));
625 EXPECT_EQ(kValueIntA, value);
626 EXPECT_FALSE(store_.GetInt(kGroupC, kKeyInt, &value));
627 }
628 {
629 bool value = false;
630 EXPECT_TRUE(store_.GetBool(kGroupB, kKeyBool, &value));
631 EXPECT_TRUE(value);
632 EXPECT_TRUE(store_.GetBool(kGroupC, kKeyBool, &value));
633 EXPECT_FALSE(value);
634 EXPECT_FALSE(store_.GetBool(kGroupA, kKeyBool, &value));
635 }
636
637 EXPECT_TRUE(store_.DeleteGroup(kGroupA));
Chris Masone9d779932011-08-25 16:33:41 -0700638 EXPECT_TRUE(store_.DeleteGroup(kGroupA));
Darin Petkov083047b2011-06-23 20:42:48 -0700639
640 EXPECT_FALSE(store_.ContainsGroup(kGroupA));
641 EXPECT_TRUE(store_.ContainsGroup(kGroupB));
642 EXPECT_TRUE(store_.ContainsGroup(kGroupC));
643
644 groups = store_.GetGroups();
645 EXPECT_EQ(2, groups.size());
646 EXPECT_FALSE(ContainsKey(groups, kGroupA));
647 EXPECT_TRUE(ContainsKey(groups, kGroupB));
648 EXPECT_TRUE(ContainsKey(groups, kGroupC));
649
650 EXPECT_TRUE(store_.SetBool(kGroupB, kKeyBool, false));
651 EXPECT_TRUE(store_.SetInt(kGroupB, kKeyInt, kValueIntBNew));
652 EXPECT_TRUE(store_.SetString(kGroupC, kKeyString, kValueStringCNew));
Darin Petkovb2841fd2011-06-30 12:54:12 -0700653 store_.SetStringList(kGroupB,
654 kKeyStringList,
655 vector<string>(1, kValueStringB));
Darin Petkov083047b2011-06-23 20:42:48 -0700656
657 EXPECT_TRUE(store_.DeleteKey(kGroupB, kKeyString));
Chris Masone9d779932011-08-25 16:33:41 -0700658 EXPECT_TRUE(store_.DeleteKey(kGroupB, kKeyString));
Darin Petkov083047b2011-06-23 20:42:48 -0700659
660 {
661 string value;
662 EXPECT_FALSE(store_.GetString(kGroupB, kKeyString, &value));
663 EXPECT_FALSE(store_.GetString(kGroupA, kKeyString, &value));
664 EXPECT_TRUE(store_.GetString(kGroupC, kKeyString, &value));
665 EXPECT_EQ(kValueStringCNew, value);
666 }
Darin Petkovb2841fd2011-06-30 12:54:12 -0700667 {
668 vector<string> value;
669 EXPECT_TRUE(store_.GetStringList(kGroupB, kKeyStringList, &value));
670 ASSERT_EQ(1, value.size());
671 EXPECT_EQ(kValueStringB, value[0]);
672 EXPECT_FALSE(store_.GetStringList(kGroupA, kKeyStringList, &value));
673 EXPECT_FALSE(store_.GetStringList(kGroupC, kKeyStringList, &value));
674 }
Darin Petkov083047b2011-06-23 20:42:48 -0700675 {
676 int value = 0;
677 EXPECT_TRUE(store_.GetInt(kGroupB, kKeyInt, &value));
678 EXPECT_EQ(kValueIntBNew, value);
679 EXPECT_FALSE(store_.GetInt(kGroupA, kKeyInt, &value));
680 EXPECT_FALSE(store_.GetInt(kGroupC, kKeyInt, &value));
681 }
Darin Petkov083047b2011-06-23 20:42:48 -0700682 {
683 bool value = false;
684 EXPECT_TRUE(store_.GetBool(kGroupB, kKeyBool, &value));
685 EXPECT_FALSE(value);
686 EXPECT_TRUE(store_.GetBool(kGroupC, kKeyBool, &value));
687 EXPECT_FALSE(value);
688 EXPECT_FALSE(store_.GetBool(kGroupA, kKeyBool, &value));
689 }
690
691 ASSERT_TRUE(store_.Close());
692 EXPECT_EQ(base::StringPrintf("\n"
693 "[%s]\n"
Darin Petkovb2841fd2011-06-30 12:54:12 -0700694 "%s=%s;\n"
Darin Petkov083047b2011-06-23 20:42:48 -0700695 "%s=%d\n"
696 "%s=false\n"
697 "\n"
698 "[%s]\n"
699 "%s=%s\n"
700 "%s=false\n",
701 kGroupB,
Darin Petkovb2841fd2011-06-30 12:54:12 -0700702 kKeyStringList, kValueStringB,
Darin Petkov083047b2011-06-23 20:42:48 -0700703 kKeyInt, kValueIntBNew,
704 kKeyBool,
705 kGroupC,
706 kKeyString, kValueStringCNew,
707 kKeyBool),
708 ReadKeyFile());
709}
710
711} // namespace shill