blob: 1cc3edd6be6691eafc50c9975c3cb571337e2a75 [file] [log] [blame]
Darin Petkov083047b2011-06-23 20:42:48 -07001// Copyright (c) 2011 The Chromium OS Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
Chris Masone8a7b8be2011-07-22 12:43:37 -07005#include "shill/key_file_store.h"
6
Darin Petkov083047b2011-06-23 20:42:48 -07007#include <base/file_util.h>
Eric Shienbrood3e20a232012-02-16 11:35:56 -05008#include <base/scoped_temp_dir.h>
9#include <base/stl_util.h>
Paul Stewartdab3b5a2012-07-11 18:25:10 -070010#include <base/string_number_conversions.h>
Darin Petkov083047b2011-06-23 20:42:48 -070011#include <base/stringprintf.h>
Darin Petkov083047b2011-06-23 20:42:48 -070012#include <gtest/gtest.h>
13
Gary Morain96970242012-04-20 10:59:58 -070014using file_util::FileEnumerator;
Darin Petkov083047b2011-06-23 20:42:48 -070015using std::set;
16using std::string;
Darin Petkovb2841fd2011-06-30 12:54:12 -070017using std::vector;
Darin Petkov083047b2011-06-23 20:42:48 -070018using testing::Test;
19
20namespace shill {
21
Darin Petkov86964e02011-06-29 13:49:28 -070022namespace {
23const char kPlainText[] = "This is a test!";
24const char kROT47Text[] = "rot47:%9:D :D 2 E6DEP";
25} // namespace {}
26
Darin Petkov083047b2011-06-23 20:42:48 -070027class KeyFileStoreTest : public Test {
28 public:
29 KeyFileStoreTest() : store_(&glib_) {}
30
31 virtual void SetUp() {
32 ASSERT_TRUE(temp_dir_.CreateUniqueTempDir());
Chris Masoneb9c00592011-10-06 13:10:39 -070033 test_file_ = temp_dir_.path().Append("test-key-file-store");
34 store_.set_path(test_file_);
Darin Petkov083047b2011-06-23 20:42:48 -070035 }
36
37 virtual void TearDown() {
38 store_.set_path(FilePath("")); // Don't try to save the store.
39 ASSERT_TRUE(temp_dir_.Delete());
40 }
41
42 protected:
43 string ReadKeyFile();
44 void WriteKeyFile(string data);
Chris Masoneb9c00592011-10-06 13:10:39 -070045 bool OpenCheckClose(const string &group,
46 const string &key,
47 const string &expected_value);
Darin Petkov083047b2011-06-23 20:42:48 -070048
49 GLib glib_; // Use real GLib for testing KeyFileStore.
50 ScopedTempDir temp_dir_;
Chris Masoneb9c00592011-10-06 13:10:39 -070051 FilePath test_file_;
Darin Petkov083047b2011-06-23 20:42:48 -070052 KeyFileStore store_;
53};
54
55string KeyFileStoreTest::ReadKeyFile() {
56 string data;
57 EXPECT_TRUE(file_util::ReadFileToString(store_.path(), &data));
58 return data;
59}
60
61void KeyFileStoreTest::WriteKeyFile(string data) {
62 EXPECT_EQ(data.size(),
63 file_util::WriteFile(store_.path(), data.data(), data.size()));
64}
65
66TEST_F(KeyFileStoreTest, OpenClose) {
67 EXPECT_FALSE(store_.key_file_);
68
Paul Stewart5dc40aa2011-10-28 19:43:43 -070069 EXPECT_FALSE(store_.IsNonEmpty());
Darin Petkov083047b2011-06-23 20:42:48 -070070 ASSERT_TRUE(store_.Open());
71 EXPECT_TRUE(store_.key_file_);
Darin Petkov86964e02011-06-29 13:49:28 -070072 EXPECT_EQ(1, store_.crypto_.cryptos_.size());
Darin Petkov083047b2011-06-23 20:42:48 -070073 ASSERT_TRUE(store_.Close());
74 EXPECT_FALSE(store_.key_file_);
Gary Morain96970242012-04-20 10:59:58 -070075 FileEnumerator file_enumerator(temp_dir_.path(),
76 false /* not recursive */,
77 FileEnumerator::FILES);
78
79 // Verify that the file actually got written with the right name.
80 EXPECT_EQ(test_file_.value(), file_enumerator.Next().value());
81 FileEnumerator::FindInfo find_info;
82 file_enumerator.GetFindInfo(&find_info);
83
84 // Verify that the profile is a regular file, readable and writeable by the
85 // owner only.
86 EXPECT_EQ(S_IFREG | S_IRUSR | S_IWUSR, find_info.stat.st_mode);
Darin Petkov083047b2011-06-23 20:42:48 -070087
88 ASSERT_TRUE(store_.Open());
89 EXPECT_TRUE(store_.key_file_);
90 ASSERT_TRUE(store_.Close());
91 EXPECT_FALSE(store_.key_file_);
92
93 ASSERT_TRUE(store_.Open());
94 store_.set_path(FilePath(""));
95 ASSERT_FALSE(store_.Close());
96 EXPECT_FALSE(store_.key_file_);
97}
98
99TEST_F(KeyFileStoreTest, OpenFail) {
100 WriteKeyFile("garbage\n");
101 EXPECT_FALSE(store_.Open());
102 EXPECT_FALSE(store_.key_file_);
103}
104
105TEST_F(KeyFileStoreTest, GetGroups) {
106 static const char kGroupA[] = "g-a";
107 static const char kGroupB[] = "g-b";
108 static const char kGroupC[] = "g-c";
109 WriteKeyFile(base::StringPrintf("[%s]\n"
110 "[%s]\n"
111 "[%s]\n",
112 kGroupA, kGroupB, kGroupC));
Paul Stewart5dc40aa2011-10-28 19:43:43 -0700113 EXPECT_TRUE(store_.IsNonEmpty());
Darin Petkov083047b2011-06-23 20:42:48 -0700114 ASSERT_TRUE(store_.Open());
115 set<string> groups = store_.GetGroups();
116 EXPECT_EQ(3, groups.size());
117 EXPECT_TRUE(ContainsKey(groups, kGroupA));
118 EXPECT_TRUE(ContainsKey(groups, kGroupB));
119 EXPECT_TRUE(ContainsKey(groups, kGroupC));
120 EXPECT_FALSE(ContainsKey(groups, "g-x"));
121 ASSERT_TRUE(store_.Close());
122}
123
Paul Stewarta41e38d2011-11-11 07:47:29 -0800124TEST_F(KeyFileStoreTest, GetGroupsWithKey) {
125 static const char kGroupA[] = "g-a";
126 static const char kGroupB[] = "g-b";
127 static const char kGroupC[] = "g-c";
128 static const char kKeyA[] = "k-a";
129 static const char kKeyB[] = "k-b";
130 static const char kValue[] = "true";
131 WriteKeyFile(base::StringPrintf("[%s]\n"
132 "%s=%s\n"
133 "[%s]\n"
134 "%s=%s\n"
135 "%s=%s\n"
136 "[%s]\n"
137 "%s=%s\n",
138 kGroupA, kKeyA, kValue,
139 kGroupB, kKeyA, kValue, kKeyB, kValue,
140 kGroupC, kKeyB, kValue));
141 EXPECT_TRUE(store_.IsNonEmpty());
142 ASSERT_TRUE(store_.Open());
143 set<string> groups_a = store_.GetGroupsWithKey(kKeyA);
144 EXPECT_EQ(2, groups_a.size());
145 EXPECT_TRUE(ContainsKey(groups_a, kGroupA));
146 EXPECT_TRUE(ContainsKey(groups_a, kGroupB));
147 set<string> groups_b = store_.GetGroupsWithKey(kKeyB);
148 EXPECT_EQ(2, groups_b.size());
149 EXPECT_TRUE(ContainsKey(groups_b, kGroupB));
150 EXPECT_TRUE(ContainsKey(groups_b, kGroupC));
151 ASSERT_TRUE(store_.Close());
152}
153
Darin Petkov083047b2011-06-23 20:42:48 -0700154TEST_F(KeyFileStoreTest, ContainsGroup) {
155 static const char kGroupA[] = "group-a";
156 static const char kGroupB[] = "group-b";
157 static const char kGroupC[] = "group-c";
158 WriteKeyFile(base::StringPrintf("[%s]\n"
159 "[%s]\n"
160 "[%s]\n",
161 kGroupA, kGroupB, kGroupC));
162 ASSERT_TRUE(store_.Open());
163 EXPECT_TRUE(store_.ContainsGroup(kGroupA));
164 EXPECT_TRUE(store_.ContainsGroup(kGroupB));
165 EXPECT_TRUE(store_.ContainsGroup(kGroupC));
166 EXPECT_FALSE(store_.ContainsGroup("group-d"));
167 ASSERT_TRUE(store_.Close());
168}
169
170TEST_F(KeyFileStoreTest, DeleteKey) {
171 static const char kGroup[] = "the-group";
172 static const char kKeyDead[] = "dead";
173 static const char kKeyAlive[] = "alive";
174 const int kValueAlive = 3;
175 WriteKeyFile(base::StringPrintf("[%s]\n"
176 "%s=5\n"
177 "%s=%d\n",
178 kGroup, kKeyDead, kKeyAlive, kValueAlive));
179 ASSERT_TRUE(store_.Open());
180 EXPECT_TRUE(store_.DeleteKey(kGroup, kKeyDead));
Chris Masone9d779932011-08-25 16:33:41 -0700181 EXPECT_TRUE(store_.DeleteKey(kGroup, "random-key"));
Darin Petkov083047b2011-06-23 20:42:48 -0700182 EXPECT_FALSE(store_.DeleteKey("random-group", kKeyAlive));
183 ASSERT_TRUE(store_.Close());
184 EXPECT_EQ(base::StringPrintf("\n"
185 "[%s]\n"
186 "%s=%d\n",
187 kGroup, kKeyAlive, kValueAlive),
188 ReadKeyFile());
189}
190
191TEST_F(KeyFileStoreTest, DeleteGroup) {
192 static const char kGroupA[] = "group-a";
193 static const char kGroupB[] = "group-b";
194 static const char kGroupC[] = "group-c";
195 WriteKeyFile(base::StringPrintf("[%s]\n"
196 "[%s]\n"
197 "key-to-be-deleted=true\n"
198 "[%s]\n",
199 kGroupA, kGroupB, kGroupC));
200 ASSERT_TRUE(store_.Open());
201 EXPECT_TRUE(store_.DeleteGroup(kGroupB));
Chris Masone9d779932011-08-25 16:33:41 -0700202 EXPECT_TRUE(store_.DeleteGroup("group-d"));
Darin Petkov083047b2011-06-23 20:42:48 -0700203 ASSERT_TRUE(store_.Close());
204 EXPECT_EQ(base::StringPrintf("\n"
205 "[%s]\n"
206 "\n"
207 "[%s]\n",
208 kGroupA, kGroupC),
209 ReadKeyFile());
210}
211
212TEST_F(KeyFileStoreTest, GetString) {
213 static const char kGroup[] = "something";
214 static const char kKey[] = "foo";
215 static const char kValue[] = "bar";
216 WriteKeyFile(base::StringPrintf("[%s]\n"
217 "%s=%s\n",
218 kGroup, kKey, kValue));
219 ASSERT_TRUE(store_.Open());
220 string value;
221 EXPECT_TRUE(store_.GetString(kGroup, kKey, &value));
222 EXPECT_EQ(kValue, value);
223 EXPECT_FALSE(store_.GetString("something-else", kKey, &value));
224 EXPECT_FALSE(store_.GetString(kGroup, "bar", &value));
225 EXPECT_TRUE(store_.GetString(kGroup, kKey, NULL));
226 ASSERT_TRUE(store_.Close());
227}
228
229TEST_F(KeyFileStoreTest, SetString) {
230 static const char kGroup[] = "string-group";
231 static const char kKey1[] = "test-string";
232 static const char kValue1[] = "foo";
233 static const char kKey2[] = "empty-string";
234 static const char kValue2[] = "";
235 ASSERT_TRUE(store_.Open());
236 ASSERT_TRUE(store_.SetString(kGroup, kKey1, kValue1));
237 ASSERT_TRUE(store_.SetString(kGroup, kKey2, kValue2));
238 ASSERT_TRUE(store_.Close());
239 EXPECT_EQ(base::StringPrintf("\n"
240 "[%s]\n"
241 "%s=%s\n"
242 "%s=%s\n",
243 kGroup, kKey1, kValue1, kKey2, kValue2),
244 ReadKeyFile());
245}
246
247TEST_F(KeyFileStoreTest, GetBool) {
248 static const char kGroup[] = "boo";
249 static const char kKeyTrue[] = "foo";
250 static const char kKeyFalse[] = "bar";
251 static const char kKeyBad[] = "zoo";
252 WriteKeyFile(base::StringPrintf("[%s]\n"
253 "%s=true\n"
254 "%s=false\n"
255 "%s=moo\n",
256 kGroup, kKeyTrue, kKeyFalse, kKeyBad));
257 ASSERT_TRUE(store_.Open());
258 {
259 bool value = true;
260 EXPECT_TRUE(store_.GetBool(kGroup, kKeyFalse, &value));
261 EXPECT_FALSE(value);
262 }
263 {
264 bool value = false;
265 EXPECT_TRUE(store_.GetBool(kGroup, kKeyTrue, &value));
266 EXPECT_TRUE(value);
267 }
268 {
269 bool value;
270 EXPECT_FALSE(store_.GetBool(kGroup, kKeyBad, &value));
271 EXPECT_FALSE(store_.GetBool(kGroup, "unknown", &value));
272 EXPECT_FALSE(store_.GetBool("unknown", kKeyTrue, &value));
273 }
274 EXPECT_TRUE(store_.GetBool(kGroup, kKeyFalse, NULL));
275 ASSERT_TRUE(store_.Close());
276}
277
278TEST_F(KeyFileStoreTest, SetBool) {
279 static const char kGroup[] = "bool-group";
280 static const char kKeyTrue[] = "test-true-bool";
281 static const char kKeyFalse[] = "test-false-bool";
282 ASSERT_TRUE(store_.Open());
283 ASSERT_TRUE(store_.SetBool(kGroup, kKeyTrue, true));
284 ASSERT_TRUE(store_.SetBool(kGroup, kKeyFalse, false));
285 ASSERT_TRUE(store_.Close());
286 EXPECT_EQ(base::StringPrintf("\n"
287 "[%s]\n"
288 "%s=true\n"
289 "%s=false\n",
290 kGroup, kKeyTrue, kKeyFalse),
291 ReadKeyFile());
292}
293
294TEST_F(KeyFileStoreTest, GetInt) {
295 static const char kGroup[] = "numbers";
296 static const char kKeyPos[] = "pos";
297 static const char kKeyNeg[] = "neg";
298 static const char kKeyBad[] = "bad";
299 const int kValuePos = 50;
300 const int kValueNeg = -20;
301 static const char kValueBad[] = "nan";
302 WriteKeyFile(base::StringPrintf("[%s]\n"
303 "%s=%d\n"
304 "%s=%d\n"
305 "%s=%s\n",
306 kGroup,
307 kKeyPos, kValuePos,
308 kKeyNeg, kValueNeg,
309 kKeyBad, kValueBad));
310 ASSERT_TRUE(store_.Open());
311 {
312 int value = 0;
313 EXPECT_TRUE(store_.GetInt(kGroup, kKeyNeg, &value));
314 EXPECT_EQ(kValueNeg, value);
315 }
316 {
317 int value = 0;
318 EXPECT_TRUE(store_.GetInt(kGroup, kKeyPos, &value));
319 EXPECT_EQ(kValuePos, value);
320 }
321 {
322 int value;
323 EXPECT_FALSE(store_.GetInt(kGroup, kKeyBad, &value));
324 EXPECT_FALSE(store_.GetInt(kGroup, "invalid", &value));
325 EXPECT_FALSE(store_.GetInt("invalid", kKeyPos, &value));
326 }
327 EXPECT_TRUE(store_.GetInt(kGroup, kKeyPos, NULL));
328 ASSERT_TRUE(store_.Close());
329}
330
331TEST_F(KeyFileStoreTest, SetInt) {
332 static const char kGroup[] = "int-group";
333 static const char kKey1[] = "test-int";
334 static const char kKey2[] = "test-negative";
335 const int kValue1 = 5;
336 const int kValue2 = -10;
337 ASSERT_TRUE(store_.Open());
338 ASSERT_TRUE(store_.SetInt(kGroup, kKey1, kValue1));
339 ASSERT_TRUE(store_.SetInt(kGroup, kKey2, kValue2));
340 ASSERT_TRUE(store_.Close());
341 EXPECT_EQ(base::StringPrintf("\n"
342 "[%s]\n"
343 "%s=%d\n"
344 "%s=%d\n",
345 kGroup, kKey1, kValue1, kKey2, kValue2),
346 ReadKeyFile());
347}
348
Paul Stewartdab3b5a2012-07-11 18:25:10 -0700349TEST_F(KeyFileStoreTest, GetUint64) {
350 static const char kGroup[] = "numbers";
351 static const char kKeyGood[] = "good";
352 static const char kKeyBad[] = "bad";
353 const uint64 kValueGood = 0xFEDCBA9876543210LL;
354 static const char kValueBad[] = "nan";
355 // Use base::Uint64ToString() instead of using something like "%llu"
356 // (not correct for native 64 bit architectures) or PRIu64 (does not
357 // work correctly using cros_workon_make due to include intricacies).
358 WriteKeyFile(base::StringPrintf("[%s]\n"
359 "%s=%s\n"
360 "%s=%s\n",
361 kGroup,
362 kKeyGood,
363 base::Uint64ToString(kValueGood).c_str(),
364 kKeyBad, kValueBad));
365 ASSERT_TRUE(store_.Open());
366 {
367 uint64 value = 0;
368 EXPECT_TRUE(store_.GetUint64(kGroup, kKeyGood, &value));
369 EXPECT_EQ(kValueGood, value);
370 }
371 {
372 uint64 value;
373 EXPECT_FALSE(store_.GetUint64(kGroup, kKeyBad, &value));
374 EXPECT_FALSE(store_.GetUint64(kGroup, "invalid", &value));
375 EXPECT_FALSE(store_.GetUint64("invalid", kKeyGood, &value));
376 }
377 EXPECT_TRUE(store_.GetUint64(kGroup, kKeyGood, NULL));
378 ASSERT_TRUE(store_.Close());
379}
380
381TEST_F(KeyFileStoreTest, SetUint64) {
382 static const char kGroup[] = "int-group";
383 static const char kKey[] = "test-int";
384 const uint64 kValue = 0xFEDCBA9876543210LL;
385 ASSERT_TRUE(store_.Open());
386 ASSERT_TRUE(store_.SetUint64(kGroup, kKey, kValue));
387 ASSERT_TRUE(store_.Close());
388 EXPECT_EQ(base::StringPrintf("\n"
389 "[%s]\n"
390 "%s=%s\n",
391 kGroup, kKey,
392 base::Uint64ToString(kValue).c_str()),
393 ReadKeyFile());
394}
395
Darin Petkovb2841fd2011-06-30 12:54:12 -0700396TEST_F(KeyFileStoreTest, GetStringList) {
397 static const char kGroup[] = "string-lists";
398 static const char kKeyEmpty[] = "empty";
399 static const char kKeyEmptyValue[] = "empty-value";
400 static const char kKeyValueEmpty[] = "value-empty";
401 static const char kKeyValueEmptyValue[] = "value-empty-value";
402 static const char kKeyValues[] = "values";
403 static const char kValue[] = "value";
404 static const char kValue2[] = "value2";
405 static const char kValue3[] = "value3";
406 WriteKeyFile(base::StringPrintf("[%s]\n"
407 "%s=\n"
408 "%s=;%s\n"
409 "%s=%s;;\n"
410 "%s=%s;;%s\n"
411 "%s=%s;%s;%s\n",
412 kGroup,
413 kKeyEmpty,
414 kKeyEmptyValue, kValue,
415 kKeyValueEmpty, kValue,
416 kKeyValueEmptyValue, kValue, kValue2,
417 kKeyValues, kValue, kValue2, kValue3));
418 ASSERT_TRUE(store_.Open());
419
420 vector<string> value;
421
422 EXPECT_TRUE(store_.GetStringList(kGroup, kKeyValues, &value));
423 ASSERT_EQ(3, value.size());
424 EXPECT_EQ(kValue, value[0]);
425 EXPECT_EQ(kValue2, value[1]);
426 EXPECT_EQ(kValue3, value[2]);
427
428 EXPECT_TRUE(store_.GetStringList(kGroup, kKeyEmptyValue, &value));
429 ASSERT_EQ(2, value.size());
430 EXPECT_EQ("", value[0]);
431 EXPECT_EQ(kValue, value[1]);
432
433 EXPECT_TRUE(store_.GetStringList(kGroup, kKeyValueEmpty, &value));
434 ASSERT_EQ(2, value.size());
435 EXPECT_EQ(kValue, value[0]);
436 EXPECT_EQ("", value[1]);
437
438 EXPECT_TRUE(store_.GetStringList(kGroup, kKeyEmpty, &value));
439 ASSERT_EQ(0, value.size());
440
441 EXPECT_TRUE(store_.GetStringList(kGroup, kKeyValueEmptyValue, &value));
442 ASSERT_EQ(3, value.size());
443 EXPECT_EQ(kValue, value[0]);
444 EXPECT_EQ("", value[1]);
445 EXPECT_EQ(kValue2, value[2]);
446
447 EXPECT_FALSE(store_.GetStringList("unknown-string-lists", kKeyEmpty, &value));
448 EXPECT_FALSE(store_.GetStringList(kGroup, "some-key", &value));
449 EXPECT_TRUE(store_.GetStringList(kGroup, kKeyValues, NULL));
450 ASSERT_TRUE(store_.Close());
451}
452
453TEST_F(KeyFileStoreTest, SetStringList) {
454 static const char kGroup[] = "strings";
455 static const char kKeyEmpty[] = "e";
456 static const char kKeyEmptyValue[] = "ev";
457 static const char kKeyValueEmpty[] = "ve";
458 static const char kKeyValueEmptyValue[] = "vev";
459 static const char kKeyValues[] = "v";
460 static const char kValue[] = "abc";
461 static const char kValue2[] = "pqr";
462 static const char kValue3[] = "xyz";
463 ASSERT_TRUE(store_.Open());
464 {
465 vector<string> value;
466 ASSERT_TRUE(store_.SetStringList(kGroup, kKeyEmpty, value));
467 }
468 {
469 vector<string> value;
470 value.push_back("");
471 value.push_back(kValue);
472 ASSERT_TRUE(store_.SetStringList(kGroup, kKeyEmptyValue, value));
473 }
474 {
475 vector<string> value;
476 value.push_back(kValue);
477 value.push_back("");
478 ASSERT_TRUE(store_.SetStringList(kGroup, kKeyValueEmpty, value));
479 }
480 {
481 vector<string> value;
482 value.push_back(kValue);
483 value.push_back("");
484 value.push_back(kValue2);
485 ASSERT_TRUE(store_.SetStringList(kGroup, kKeyValueEmptyValue, value));
486 }
487 {
488 vector<string> value;
489 value.push_back(kValue);
490 value.push_back(kValue2);
491 value.push_back(kValue3);
492 ASSERT_TRUE(store_.SetStringList(kGroup, kKeyValues, value));
493 }
494 ASSERT_TRUE(store_.Close());
495 EXPECT_EQ(base::StringPrintf("\n"
496 "[%s]\n"
497 "%s=\n"
498 "%s=;%s;\n"
499 "%s=%s;;\n"
500 "%s=%s;;%s;\n"
501 "%s=%s;%s;%s;\n",
502 kGroup,
503 kKeyEmpty,
504 kKeyEmptyValue, kValue,
505 kKeyValueEmpty, kValue,
506 kKeyValueEmptyValue, kValue, kValue2,
507 kKeyValues, kValue, kValue2, kValue3),
508 ReadKeyFile());
509}
510
Darin Petkov86964e02011-06-29 13:49:28 -0700511TEST_F(KeyFileStoreTest, GetCryptedString) {
512 static const char kGroup[] = "crypto-group";
513 static const char kKey[] = "secret";
514 WriteKeyFile(base::StringPrintf("[%s]\n"
515 "%s=%s\n",
516 kGroup, kKey, kROT47Text));
517 ASSERT_TRUE(store_.Open());
518 string value;
519 EXPECT_TRUE(store_.GetCryptedString(kGroup, kKey, &value));
520 EXPECT_EQ(kPlainText, value);
521 EXPECT_FALSE(store_.GetCryptedString("something-else", kKey, &value));
522 EXPECT_FALSE(store_.GetCryptedString(kGroup, "non-secret", &value));
523 EXPECT_TRUE(store_.GetCryptedString(kGroup, kKey, NULL));
524 ASSERT_TRUE(store_.Close());
525}
526
527TEST_F(KeyFileStoreTest, SetCryptedString) {
528 static const char kGroup[] = "crypted-string-group";
529 static const char kKey[] = "test-string";
530 ASSERT_TRUE(store_.Open());
531 ASSERT_TRUE(store_.SetCryptedString(kGroup, kKey, kPlainText));
532 ASSERT_TRUE(store_.Close());
533 EXPECT_EQ(base::StringPrintf("\n"
534 "[%s]\n"
535 "%s=%s\n",
536 kGroup, kKey, kROT47Text),
537 ReadKeyFile());
538}
539
Chris Masoneb9c00592011-10-06 13:10:39 -0700540TEST_F(KeyFileStoreTest, PersistAcrossClose) {
541 static const char kGroup[] = "string-group";
542 static const char kKey1[] = "test-string";
543 static const char kValue1[] = "foo";
544 static const char kKey2[] = "empty-string";
545 static const char kValue2[] = "";
546 ASSERT_TRUE(store_.Open());
547 ASSERT_TRUE(store_.SetString(kGroup, kKey1, kValue1));
548 ASSERT_TRUE(store_.Close());
549 ASSERT_TRUE(store_.Open());
550 ASSERT_TRUE(store_.SetString(kGroup, kKey2, kValue2));
551 string value;
552 ASSERT_TRUE(store_.GetString(kGroup, kKey1, &value));
553 ASSERT_EQ(kValue1, value);
554 ASSERT_TRUE(store_.GetString(kGroup, kKey2, &value));
555 ASSERT_EQ(kValue2, value);
556 ASSERT_TRUE(store_.Close());
557}
558
559bool KeyFileStoreTest::OpenCheckClose(const string &group,
560 const string &key,
561 const string &expected_value) {
562 KeyFileStore store(&glib_);
563 store.set_path(test_file_);
564 EXPECT_TRUE(store.Open());
565 string value;
566 bool could_get = store.GetString(group, key, &value);
567 store.set_path(FilePath("")); // Don't persist to disk.
568 store.Close();
569 return could_get && expected_value == value;
570}
571
572TEST_F(KeyFileStoreTest, Flush) {
573 static const char kGroup[] = "string-group";
574 static const char kKey1[] = "test-string";
575 static const char kValue1[] = "foo";
576 static const char kKey2[] = "empty-string";
577 static const char kValue2[] = "";
578 ASSERT_TRUE(store_.Open());
579 ASSERT_TRUE(store_.SetString(kGroup, kKey1, kValue1));
580 ASSERT_TRUE(store_.Flush());
581 ASSERT_TRUE(OpenCheckClose(kGroup, kKey1, kValue1));
582
583 ASSERT_TRUE(store_.SetString(kGroup, kKey2, kValue2));
584 ASSERT_TRUE(store_.Flush());
585 ASSERT_TRUE(OpenCheckClose(kGroup, kKey2, kValue2));
586
587 EXPECT_TRUE(store_.DeleteKey(kGroup, kKey1));
588 ASSERT_TRUE(store_.Flush());
589 ASSERT_FALSE(OpenCheckClose(kGroup, kKey1, kValue1));
590}
591
Paul Stewart5dc40aa2011-10-28 19:43:43 -0700592TEST_F(KeyFileStoreTest, EmptyFile) {
593 ASSERT_TRUE(store_.Open());
594 ASSERT_TRUE(store_.Close());
595 EXPECT_FALSE(store_.IsNonEmpty());
596}
597
598TEST_F(KeyFileStoreTest, SetHeader) {
599 ASSERT_TRUE(store_.Open());
600 ASSERT_TRUE(store_.SetHeader("this is a test"));
601 ASSERT_TRUE(store_.Close());
602 EXPECT_TRUE(store_.IsNonEmpty());
603 ASSERT_TRUE(store_.Open());
604}
605
Darin Petkov083047b2011-06-23 20:42:48 -0700606TEST_F(KeyFileStoreTest, Combo) {
607 static const char kGroupA[] = "square";
608 static const char kGroupB[] = "circle";
609 static const char kGroupC[] = "triangle";
610 static const char kGroupX[] = "pentagon";
611 static const char kKeyString[] = "color";
Darin Petkovb2841fd2011-06-30 12:54:12 -0700612 static const char kKeyStringList[] = "alternative-colors";
Darin Petkov083047b2011-06-23 20:42:48 -0700613 static const char kKeyInt[] = "area";
614 static const char kKeyBool[] = "visible";
615 static const char kValueStringA[] = "blue";
616 static const char kValueStringB[] = "red";
617 static const char kValueStringC[] = "yellow";
618 static const char kValueStringCNew[] = "purple";
619 const int kValueIntA = 5;
620 const int kValueIntB = 10;
621 const int kValueIntBNew = 333;
622 WriteKeyFile(base::StringPrintf("[%s]\n"
623 "%s=%s\n"
Darin Petkovb2841fd2011-06-30 12:54:12 -0700624 "%s=%s;%s\n"
Darin Petkov083047b2011-06-23 20:42:48 -0700625 "%s=%d\n"
626 "[%s]\n"
627 "%s=%s\n"
Darin Petkovb2841fd2011-06-30 12:54:12 -0700628 "%s=%s;%s\n"
Darin Petkov083047b2011-06-23 20:42:48 -0700629 "%s=%d\n"
630 "%s=true\n"
631 "[%s]\n"
632 "%s=%s\n"
633 "%s=false\n",
634 kGroupA,
635 kKeyString, kValueStringA,
Darin Petkovb2841fd2011-06-30 12:54:12 -0700636 kKeyStringList, kValueStringB, kValueStringC,
Darin Petkov083047b2011-06-23 20:42:48 -0700637 kKeyInt, kValueIntA,
638 kGroupB,
639 kKeyString, kValueStringB,
Darin Petkovb2841fd2011-06-30 12:54:12 -0700640 kKeyStringList, kValueStringA, kValueStringC,
Darin Petkov083047b2011-06-23 20:42:48 -0700641 kKeyInt, kValueIntB,
642 kKeyBool,
643 kGroupC,
644 kKeyString, kValueStringC,
645 kKeyBool));
646 ASSERT_TRUE(store_.Open());
647
648 EXPECT_TRUE(store_.ContainsGroup(kGroupA));
649 EXPECT_TRUE(store_.ContainsGroup(kGroupB));
650 EXPECT_TRUE(store_.ContainsGroup(kGroupC));
651 EXPECT_FALSE(store_.ContainsGroup(kGroupX));
652
653 set<string> groups = store_.GetGroups();
654 EXPECT_EQ(3, groups.size());
655 EXPECT_TRUE(ContainsKey(groups, kGroupA));
656 EXPECT_TRUE(ContainsKey(groups, kGroupB));
657 EXPECT_TRUE(ContainsKey(groups, kGroupC));
658 EXPECT_FALSE(ContainsKey(groups, kGroupX));
659
660 {
661 string value;
662 EXPECT_TRUE(store_.GetString(kGroupB, kKeyString, &value));
663 EXPECT_EQ(kValueStringB, value);
664 EXPECT_TRUE(store_.GetString(kGroupA, kKeyString, &value));
665 EXPECT_EQ(kValueStringA, value);
666 EXPECT_TRUE(store_.GetString(kGroupC, kKeyString, &value));
667 EXPECT_EQ(kValueStringC, value);
668 }
669 {
Darin Petkovb2841fd2011-06-30 12:54:12 -0700670 vector<string> value;
671 EXPECT_TRUE(store_.GetStringList(kGroupB, kKeyStringList, &value));
672 ASSERT_EQ(2, value.size());
673 EXPECT_EQ(kValueStringA, value[0]);
674 EXPECT_EQ(kValueStringC, value[1]);
675 EXPECT_TRUE(store_.GetStringList(kGroupA, kKeyStringList, &value));
676 ASSERT_EQ(2, value.size());
677 EXPECT_EQ(kValueStringB, value[0]);
678 EXPECT_EQ(kValueStringC, value[1]);
679 EXPECT_FALSE(store_.GetStringList(kGroupC, kKeyStringList, &value));
680 }
681 {
Darin Petkov083047b2011-06-23 20:42:48 -0700682 int value = 0;
683 EXPECT_TRUE(store_.GetInt(kGroupB, kKeyInt, &value));
684 EXPECT_EQ(kValueIntB, value);
685 EXPECT_TRUE(store_.GetInt(kGroupA, kKeyInt, &value));
686 EXPECT_EQ(kValueIntA, value);
687 EXPECT_FALSE(store_.GetInt(kGroupC, kKeyInt, &value));
688 }
689 {
690 bool value = false;
691 EXPECT_TRUE(store_.GetBool(kGroupB, kKeyBool, &value));
692 EXPECT_TRUE(value);
693 EXPECT_TRUE(store_.GetBool(kGroupC, kKeyBool, &value));
694 EXPECT_FALSE(value);
695 EXPECT_FALSE(store_.GetBool(kGroupA, kKeyBool, &value));
696 }
697
698 EXPECT_TRUE(store_.DeleteGroup(kGroupA));
Chris Masone9d779932011-08-25 16:33:41 -0700699 EXPECT_TRUE(store_.DeleteGroup(kGroupA));
Darin Petkov083047b2011-06-23 20:42:48 -0700700
701 EXPECT_FALSE(store_.ContainsGroup(kGroupA));
702 EXPECT_TRUE(store_.ContainsGroup(kGroupB));
703 EXPECT_TRUE(store_.ContainsGroup(kGroupC));
704
705 groups = store_.GetGroups();
706 EXPECT_EQ(2, groups.size());
707 EXPECT_FALSE(ContainsKey(groups, kGroupA));
708 EXPECT_TRUE(ContainsKey(groups, kGroupB));
709 EXPECT_TRUE(ContainsKey(groups, kGroupC));
710
711 EXPECT_TRUE(store_.SetBool(kGroupB, kKeyBool, false));
712 EXPECT_TRUE(store_.SetInt(kGroupB, kKeyInt, kValueIntBNew));
713 EXPECT_TRUE(store_.SetString(kGroupC, kKeyString, kValueStringCNew));
Darin Petkovb2841fd2011-06-30 12:54:12 -0700714 store_.SetStringList(kGroupB,
715 kKeyStringList,
716 vector<string>(1, kValueStringB));
Darin Petkov083047b2011-06-23 20:42:48 -0700717
718 EXPECT_TRUE(store_.DeleteKey(kGroupB, kKeyString));
Chris Masone9d779932011-08-25 16:33:41 -0700719 EXPECT_TRUE(store_.DeleteKey(kGroupB, kKeyString));
Darin Petkov083047b2011-06-23 20:42:48 -0700720
721 {
722 string value;
723 EXPECT_FALSE(store_.GetString(kGroupB, kKeyString, &value));
724 EXPECT_FALSE(store_.GetString(kGroupA, kKeyString, &value));
725 EXPECT_TRUE(store_.GetString(kGroupC, kKeyString, &value));
726 EXPECT_EQ(kValueStringCNew, value);
727 }
Darin Petkovb2841fd2011-06-30 12:54:12 -0700728 {
729 vector<string> value;
730 EXPECT_TRUE(store_.GetStringList(kGroupB, kKeyStringList, &value));
731 ASSERT_EQ(1, value.size());
732 EXPECT_EQ(kValueStringB, value[0]);
733 EXPECT_FALSE(store_.GetStringList(kGroupA, kKeyStringList, &value));
734 EXPECT_FALSE(store_.GetStringList(kGroupC, kKeyStringList, &value));
735 }
Darin Petkov083047b2011-06-23 20:42:48 -0700736 {
737 int value = 0;
738 EXPECT_TRUE(store_.GetInt(kGroupB, kKeyInt, &value));
739 EXPECT_EQ(kValueIntBNew, value);
740 EXPECT_FALSE(store_.GetInt(kGroupA, kKeyInt, &value));
741 EXPECT_FALSE(store_.GetInt(kGroupC, kKeyInt, &value));
742 }
Darin Petkov083047b2011-06-23 20:42:48 -0700743 {
744 bool value = false;
745 EXPECT_TRUE(store_.GetBool(kGroupB, kKeyBool, &value));
746 EXPECT_FALSE(value);
747 EXPECT_TRUE(store_.GetBool(kGroupC, kKeyBool, &value));
748 EXPECT_FALSE(value);
749 EXPECT_FALSE(store_.GetBool(kGroupA, kKeyBool, &value));
750 }
751
752 ASSERT_TRUE(store_.Close());
753 EXPECT_EQ(base::StringPrintf("\n"
754 "[%s]\n"
Darin Petkovb2841fd2011-06-30 12:54:12 -0700755 "%s=%s;\n"
Darin Petkov083047b2011-06-23 20:42:48 -0700756 "%s=%d\n"
757 "%s=false\n"
758 "\n"
759 "[%s]\n"
760 "%s=%s\n"
761 "%s=false\n",
762 kGroupB,
Darin Petkovb2841fd2011-06-30 12:54:12 -0700763 kKeyStringList, kValueStringB,
Darin Petkov083047b2011-06-23 20:42:48 -0700764 kKeyInt, kValueIntBNew,
765 kKeyBool,
766 kGroupC,
767 kKeyString, kValueStringCNew,
768 kKeyBool),
769 ReadKeyFile());
770}
771
772} // namespace shill