blob: 77edb2608520c3bb10f15c95301d74cd84af9956 [file] [log] [blame]
Paul Stewart2ebc16d2012-08-23 10:38:39 -07001// Copyright (c) 2012 The Chromium OS Authors. All rights reserved.
Darin Petkov083047b2011-06-23 20:42:48 -07002// 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
Ben Chanc9638612012-09-13 16:20:46 -070020// TODO(benchan): Remove this workaround after finishing glib 2.32 migration.
21#ifdef GLIB_VERSION_2_32
22#define KEY_FILE_EXTRA_NEW_LINE
23#else
24#define KEY_FILE_EXTRA_NEW_LINE "\n"
25#endif
26
Darin Petkov083047b2011-06-23 20:42:48 -070027namespace shill {
28
Darin Petkov86964e02011-06-29 13:49:28 -070029namespace {
30const char kPlainText[] = "This is a test!";
31const char kROT47Text[] = "rot47:%9:D :D 2 E6DEP";
32} // namespace {}
33
Darin Petkov083047b2011-06-23 20:42:48 -070034class KeyFileStoreTest : public Test {
35 public:
36 KeyFileStoreTest() : store_(&glib_) {}
37
38 virtual void SetUp() {
39 ASSERT_TRUE(temp_dir_.CreateUniqueTempDir());
Chris Masoneb9c00592011-10-06 13:10:39 -070040 test_file_ = temp_dir_.path().Append("test-key-file-store");
41 store_.set_path(test_file_);
Darin Petkov083047b2011-06-23 20:42:48 -070042 }
43
44 virtual void TearDown() {
45 store_.set_path(FilePath("")); // Don't try to save the store.
46 ASSERT_TRUE(temp_dir_.Delete());
47 }
48
49 protected:
50 string ReadKeyFile();
51 void WriteKeyFile(string data);
Chris Masoneb9c00592011-10-06 13:10:39 -070052 bool OpenCheckClose(const string &group,
53 const string &key,
54 const string &expected_value);
Darin Petkov083047b2011-06-23 20:42:48 -070055
56 GLib glib_; // Use real GLib for testing KeyFileStore.
57 ScopedTempDir temp_dir_;
Chris Masoneb9c00592011-10-06 13:10:39 -070058 FilePath test_file_;
Darin Petkov083047b2011-06-23 20:42:48 -070059 KeyFileStore store_;
60};
61
62string KeyFileStoreTest::ReadKeyFile() {
63 string data;
64 EXPECT_TRUE(file_util::ReadFileToString(store_.path(), &data));
65 return data;
66}
67
68void KeyFileStoreTest::WriteKeyFile(string data) {
69 EXPECT_EQ(data.size(),
70 file_util::WriteFile(store_.path(), data.data(), data.size()));
71}
72
73TEST_F(KeyFileStoreTest, OpenClose) {
74 EXPECT_FALSE(store_.key_file_);
75
Paul Stewart5dc40aa2011-10-28 19:43:43 -070076 EXPECT_FALSE(store_.IsNonEmpty());
Darin Petkov083047b2011-06-23 20:42:48 -070077 ASSERT_TRUE(store_.Open());
78 EXPECT_TRUE(store_.key_file_);
Darin Petkov86964e02011-06-29 13:49:28 -070079 EXPECT_EQ(1, store_.crypto_.cryptos_.size());
Darin Petkov083047b2011-06-23 20:42:48 -070080 ASSERT_TRUE(store_.Close());
81 EXPECT_FALSE(store_.key_file_);
Gary Morain96970242012-04-20 10:59:58 -070082 FileEnumerator file_enumerator(temp_dir_.path(),
83 false /* not recursive */,
84 FileEnumerator::FILES);
85
86 // Verify that the file actually got written with the right name.
87 EXPECT_EQ(test_file_.value(), file_enumerator.Next().value());
88 FileEnumerator::FindInfo find_info;
89 file_enumerator.GetFindInfo(&find_info);
90
91 // Verify that the profile is a regular file, readable and writeable by the
92 // owner only.
93 EXPECT_EQ(S_IFREG | S_IRUSR | S_IWUSR, find_info.stat.st_mode);
Darin Petkov083047b2011-06-23 20:42:48 -070094
95 ASSERT_TRUE(store_.Open());
96 EXPECT_TRUE(store_.key_file_);
97 ASSERT_TRUE(store_.Close());
98 EXPECT_FALSE(store_.key_file_);
99
100 ASSERT_TRUE(store_.Open());
101 store_.set_path(FilePath(""));
102 ASSERT_FALSE(store_.Close());
103 EXPECT_FALSE(store_.key_file_);
104}
105
106TEST_F(KeyFileStoreTest, OpenFail) {
107 WriteKeyFile("garbage\n");
108 EXPECT_FALSE(store_.Open());
109 EXPECT_FALSE(store_.key_file_);
110}
111
Paul Stewart2ebc16d2012-08-23 10:38:39 -0700112TEST_F(KeyFileStoreTest, MarkAsCorrupted) {
113 EXPECT_FALSE(store_.MarkAsCorrupted());
114 EXPECT_FALSE(store_.IsNonEmpty());
115 WriteKeyFile("garbage\n");
116 EXPECT_TRUE(store_.IsNonEmpty());
117 EXPECT_TRUE(file_util::PathExists(store_.path()));
118 EXPECT_TRUE(store_.MarkAsCorrupted());
119 EXPECT_FALSE(store_.IsNonEmpty());
120 EXPECT_FALSE(file_util::PathExists(store_.path()));
121 EXPECT_TRUE(
122 file_util::PathExists(FilePath(store_.path().value() + ".corrupted")));
123}
124
Darin Petkov083047b2011-06-23 20:42:48 -0700125TEST_F(KeyFileStoreTest, GetGroups) {
126 static const char kGroupA[] = "g-a";
127 static const char kGroupB[] = "g-b";
128 static const char kGroupC[] = "g-c";
129 WriteKeyFile(base::StringPrintf("[%s]\n"
130 "[%s]\n"
131 "[%s]\n",
132 kGroupA, kGroupB, kGroupC));
Paul Stewart5dc40aa2011-10-28 19:43:43 -0700133 EXPECT_TRUE(store_.IsNonEmpty());
Darin Petkov083047b2011-06-23 20:42:48 -0700134 ASSERT_TRUE(store_.Open());
135 set<string> groups = store_.GetGroups();
136 EXPECT_EQ(3, groups.size());
137 EXPECT_TRUE(ContainsKey(groups, kGroupA));
138 EXPECT_TRUE(ContainsKey(groups, kGroupB));
139 EXPECT_TRUE(ContainsKey(groups, kGroupC));
140 EXPECT_FALSE(ContainsKey(groups, "g-x"));
141 ASSERT_TRUE(store_.Close());
142}
143
Paul Stewarta41e38d2011-11-11 07:47:29 -0800144TEST_F(KeyFileStoreTest, GetGroupsWithKey) {
145 static const char kGroupA[] = "g-a";
146 static const char kGroupB[] = "g-b";
147 static const char kGroupC[] = "g-c";
148 static const char kKeyA[] = "k-a";
149 static const char kKeyB[] = "k-b";
150 static const char kValue[] = "true";
151 WriteKeyFile(base::StringPrintf("[%s]\n"
152 "%s=%s\n"
153 "[%s]\n"
154 "%s=%s\n"
155 "%s=%s\n"
156 "[%s]\n"
157 "%s=%s\n",
158 kGroupA, kKeyA, kValue,
159 kGroupB, kKeyA, kValue, kKeyB, kValue,
160 kGroupC, kKeyB, kValue));
161 EXPECT_TRUE(store_.IsNonEmpty());
162 ASSERT_TRUE(store_.Open());
163 set<string> groups_a = store_.GetGroupsWithKey(kKeyA);
164 EXPECT_EQ(2, groups_a.size());
165 EXPECT_TRUE(ContainsKey(groups_a, kGroupA));
166 EXPECT_TRUE(ContainsKey(groups_a, kGroupB));
167 set<string> groups_b = store_.GetGroupsWithKey(kKeyB);
168 EXPECT_EQ(2, groups_b.size());
169 EXPECT_TRUE(ContainsKey(groups_b, kGroupB));
170 EXPECT_TRUE(ContainsKey(groups_b, kGroupC));
171 ASSERT_TRUE(store_.Close());
172}
173
Darin Petkov083047b2011-06-23 20:42:48 -0700174TEST_F(KeyFileStoreTest, ContainsGroup) {
175 static const char kGroupA[] = "group-a";
176 static const char kGroupB[] = "group-b";
177 static const char kGroupC[] = "group-c";
178 WriteKeyFile(base::StringPrintf("[%s]\n"
179 "[%s]\n"
180 "[%s]\n",
181 kGroupA, kGroupB, kGroupC));
182 ASSERT_TRUE(store_.Open());
183 EXPECT_TRUE(store_.ContainsGroup(kGroupA));
184 EXPECT_TRUE(store_.ContainsGroup(kGroupB));
185 EXPECT_TRUE(store_.ContainsGroup(kGroupC));
186 EXPECT_FALSE(store_.ContainsGroup("group-d"));
187 ASSERT_TRUE(store_.Close());
188}
189
190TEST_F(KeyFileStoreTest, DeleteKey) {
191 static const char kGroup[] = "the-group";
192 static const char kKeyDead[] = "dead";
193 static const char kKeyAlive[] = "alive";
194 const int kValueAlive = 3;
195 WriteKeyFile(base::StringPrintf("[%s]\n"
196 "%s=5\n"
197 "%s=%d\n",
198 kGroup, kKeyDead, kKeyAlive, kValueAlive));
199 ASSERT_TRUE(store_.Open());
200 EXPECT_TRUE(store_.DeleteKey(kGroup, kKeyDead));
Chris Masone9d779932011-08-25 16:33:41 -0700201 EXPECT_TRUE(store_.DeleteKey(kGroup, "random-key"));
Darin Petkov083047b2011-06-23 20:42:48 -0700202 EXPECT_FALSE(store_.DeleteKey("random-group", kKeyAlive));
203 ASSERT_TRUE(store_.Close());
Ben Chanc9638612012-09-13 16:20:46 -0700204 EXPECT_EQ(base::StringPrintf(KEY_FILE_EXTRA_NEW_LINE
Darin Petkov083047b2011-06-23 20:42:48 -0700205 "[%s]\n"
206 "%s=%d\n",
207 kGroup, kKeyAlive, kValueAlive),
208 ReadKeyFile());
209}
210
211TEST_F(KeyFileStoreTest, DeleteGroup) {
212 static const char kGroupA[] = "group-a";
213 static const char kGroupB[] = "group-b";
214 static const char kGroupC[] = "group-c";
215 WriteKeyFile(base::StringPrintf("[%s]\n"
216 "[%s]\n"
217 "key-to-be-deleted=true\n"
218 "[%s]\n",
219 kGroupA, kGroupB, kGroupC));
220 ASSERT_TRUE(store_.Open());
221 EXPECT_TRUE(store_.DeleteGroup(kGroupB));
Chris Masone9d779932011-08-25 16:33:41 -0700222 EXPECT_TRUE(store_.DeleteGroup("group-d"));
Darin Petkov083047b2011-06-23 20:42:48 -0700223 ASSERT_TRUE(store_.Close());
Ben Chanc9638612012-09-13 16:20:46 -0700224 EXPECT_EQ(base::StringPrintf(KEY_FILE_EXTRA_NEW_LINE
Darin Petkov083047b2011-06-23 20:42:48 -0700225 "[%s]\n"
226 "\n"
227 "[%s]\n",
228 kGroupA, kGroupC),
229 ReadKeyFile());
230}
231
232TEST_F(KeyFileStoreTest, GetString) {
233 static const char kGroup[] = "something";
234 static const char kKey[] = "foo";
235 static const char kValue[] = "bar";
236 WriteKeyFile(base::StringPrintf("[%s]\n"
237 "%s=%s\n",
238 kGroup, kKey, kValue));
239 ASSERT_TRUE(store_.Open());
240 string value;
241 EXPECT_TRUE(store_.GetString(kGroup, kKey, &value));
242 EXPECT_EQ(kValue, value);
243 EXPECT_FALSE(store_.GetString("something-else", kKey, &value));
244 EXPECT_FALSE(store_.GetString(kGroup, "bar", &value));
245 EXPECT_TRUE(store_.GetString(kGroup, kKey, NULL));
246 ASSERT_TRUE(store_.Close());
247}
248
249TEST_F(KeyFileStoreTest, SetString) {
250 static const char kGroup[] = "string-group";
251 static const char kKey1[] = "test-string";
252 static const char kValue1[] = "foo";
253 static const char kKey2[] = "empty-string";
254 static const char kValue2[] = "";
255 ASSERT_TRUE(store_.Open());
256 ASSERT_TRUE(store_.SetString(kGroup, kKey1, kValue1));
257 ASSERT_TRUE(store_.SetString(kGroup, kKey2, kValue2));
258 ASSERT_TRUE(store_.Close());
Ben Chanc9638612012-09-13 16:20:46 -0700259 EXPECT_EQ(base::StringPrintf(KEY_FILE_EXTRA_NEW_LINE
Darin Petkov083047b2011-06-23 20:42:48 -0700260 "[%s]\n"
261 "%s=%s\n"
262 "%s=%s\n",
263 kGroup, kKey1, kValue1, kKey2, kValue2),
264 ReadKeyFile());
265}
266
267TEST_F(KeyFileStoreTest, GetBool) {
268 static const char kGroup[] = "boo";
269 static const char kKeyTrue[] = "foo";
270 static const char kKeyFalse[] = "bar";
271 static const char kKeyBad[] = "zoo";
272 WriteKeyFile(base::StringPrintf("[%s]\n"
273 "%s=true\n"
274 "%s=false\n"
275 "%s=moo\n",
276 kGroup, kKeyTrue, kKeyFalse, kKeyBad));
277 ASSERT_TRUE(store_.Open());
278 {
279 bool value = true;
280 EXPECT_TRUE(store_.GetBool(kGroup, kKeyFalse, &value));
281 EXPECT_FALSE(value);
282 }
283 {
284 bool value = false;
285 EXPECT_TRUE(store_.GetBool(kGroup, kKeyTrue, &value));
286 EXPECT_TRUE(value);
287 }
288 {
289 bool value;
290 EXPECT_FALSE(store_.GetBool(kGroup, kKeyBad, &value));
291 EXPECT_FALSE(store_.GetBool(kGroup, "unknown", &value));
292 EXPECT_FALSE(store_.GetBool("unknown", kKeyTrue, &value));
293 }
294 EXPECT_TRUE(store_.GetBool(kGroup, kKeyFalse, NULL));
295 ASSERT_TRUE(store_.Close());
296}
297
298TEST_F(KeyFileStoreTest, SetBool) {
299 static const char kGroup[] = "bool-group";
300 static const char kKeyTrue[] = "test-true-bool";
301 static const char kKeyFalse[] = "test-false-bool";
302 ASSERT_TRUE(store_.Open());
303 ASSERT_TRUE(store_.SetBool(kGroup, kKeyTrue, true));
304 ASSERT_TRUE(store_.SetBool(kGroup, kKeyFalse, false));
305 ASSERT_TRUE(store_.Close());
Ben Chanc9638612012-09-13 16:20:46 -0700306 EXPECT_EQ(base::StringPrintf(KEY_FILE_EXTRA_NEW_LINE
Darin Petkov083047b2011-06-23 20:42:48 -0700307 "[%s]\n"
308 "%s=true\n"
309 "%s=false\n",
310 kGroup, kKeyTrue, kKeyFalse),
311 ReadKeyFile());
312}
313
314TEST_F(KeyFileStoreTest, GetInt) {
315 static const char kGroup[] = "numbers";
316 static const char kKeyPos[] = "pos";
317 static const char kKeyNeg[] = "neg";
318 static const char kKeyBad[] = "bad";
319 const int kValuePos = 50;
320 const int kValueNeg = -20;
321 static const char kValueBad[] = "nan";
322 WriteKeyFile(base::StringPrintf("[%s]\n"
323 "%s=%d\n"
324 "%s=%d\n"
325 "%s=%s\n",
326 kGroup,
327 kKeyPos, kValuePos,
328 kKeyNeg, kValueNeg,
329 kKeyBad, kValueBad));
330 ASSERT_TRUE(store_.Open());
331 {
332 int value = 0;
333 EXPECT_TRUE(store_.GetInt(kGroup, kKeyNeg, &value));
334 EXPECT_EQ(kValueNeg, value);
335 }
336 {
337 int value = 0;
338 EXPECT_TRUE(store_.GetInt(kGroup, kKeyPos, &value));
339 EXPECT_EQ(kValuePos, value);
340 }
341 {
342 int value;
343 EXPECT_FALSE(store_.GetInt(kGroup, kKeyBad, &value));
344 EXPECT_FALSE(store_.GetInt(kGroup, "invalid", &value));
345 EXPECT_FALSE(store_.GetInt("invalid", kKeyPos, &value));
346 }
347 EXPECT_TRUE(store_.GetInt(kGroup, kKeyPos, NULL));
348 ASSERT_TRUE(store_.Close());
349}
350
351TEST_F(KeyFileStoreTest, SetInt) {
352 static const char kGroup[] = "int-group";
353 static const char kKey1[] = "test-int";
354 static const char kKey2[] = "test-negative";
355 const int kValue1 = 5;
356 const int kValue2 = -10;
357 ASSERT_TRUE(store_.Open());
358 ASSERT_TRUE(store_.SetInt(kGroup, kKey1, kValue1));
359 ASSERT_TRUE(store_.SetInt(kGroup, kKey2, kValue2));
360 ASSERT_TRUE(store_.Close());
Ben Chanc9638612012-09-13 16:20:46 -0700361 EXPECT_EQ(base::StringPrintf(KEY_FILE_EXTRA_NEW_LINE
Darin Petkov083047b2011-06-23 20:42:48 -0700362 "[%s]\n"
363 "%s=%d\n"
364 "%s=%d\n",
365 kGroup, kKey1, kValue1, kKey2, kValue2),
366 ReadKeyFile());
367}
368
Paul Stewartdab3b5a2012-07-11 18:25:10 -0700369TEST_F(KeyFileStoreTest, GetUint64) {
370 static const char kGroup[] = "numbers";
371 static const char kKeyGood[] = "good";
372 static const char kKeyBad[] = "bad";
373 const uint64 kValueGood = 0xFEDCBA9876543210LL;
374 static const char kValueBad[] = "nan";
375 // Use base::Uint64ToString() instead of using something like "%llu"
376 // (not correct for native 64 bit architectures) or PRIu64 (does not
377 // work correctly using cros_workon_make due to include intricacies).
378 WriteKeyFile(base::StringPrintf("[%s]\n"
379 "%s=%s\n"
380 "%s=%s\n",
381 kGroup,
382 kKeyGood,
383 base::Uint64ToString(kValueGood).c_str(),
384 kKeyBad, kValueBad));
385 ASSERT_TRUE(store_.Open());
386 {
387 uint64 value = 0;
388 EXPECT_TRUE(store_.GetUint64(kGroup, kKeyGood, &value));
389 EXPECT_EQ(kValueGood, value);
390 }
391 {
392 uint64 value;
393 EXPECT_FALSE(store_.GetUint64(kGroup, kKeyBad, &value));
394 EXPECT_FALSE(store_.GetUint64(kGroup, "invalid", &value));
395 EXPECT_FALSE(store_.GetUint64("invalid", kKeyGood, &value));
396 }
397 EXPECT_TRUE(store_.GetUint64(kGroup, kKeyGood, NULL));
398 ASSERT_TRUE(store_.Close());
399}
400
401TEST_F(KeyFileStoreTest, SetUint64) {
402 static const char kGroup[] = "int-group";
403 static const char kKey[] = "test-int";
404 const uint64 kValue = 0xFEDCBA9876543210LL;
405 ASSERT_TRUE(store_.Open());
406 ASSERT_TRUE(store_.SetUint64(kGroup, kKey, kValue));
407 ASSERT_TRUE(store_.Close());
Ben Chanc9638612012-09-13 16:20:46 -0700408 EXPECT_EQ(base::StringPrintf(KEY_FILE_EXTRA_NEW_LINE
Paul Stewartdab3b5a2012-07-11 18:25:10 -0700409 "[%s]\n"
410 "%s=%s\n",
411 kGroup, kKey,
412 base::Uint64ToString(kValue).c_str()),
413 ReadKeyFile());
414}
415
Darin Petkovb2841fd2011-06-30 12:54:12 -0700416TEST_F(KeyFileStoreTest, GetStringList) {
417 static const char kGroup[] = "string-lists";
418 static const char kKeyEmpty[] = "empty";
419 static const char kKeyEmptyValue[] = "empty-value";
420 static const char kKeyValueEmpty[] = "value-empty";
421 static const char kKeyValueEmptyValue[] = "value-empty-value";
422 static const char kKeyValues[] = "values";
423 static const char kValue[] = "value";
424 static const char kValue2[] = "value2";
425 static const char kValue3[] = "value3";
426 WriteKeyFile(base::StringPrintf("[%s]\n"
427 "%s=\n"
428 "%s=;%s\n"
429 "%s=%s;;\n"
430 "%s=%s;;%s\n"
431 "%s=%s;%s;%s\n",
432 kGroup,
433 kKeyEmpty,
434 kKeyEmptyValue, kValue,
435 kKeyValueEmpty, kValue,
436 kKeyValueEmptyValue, kValue, kValue2,
437 kKeyValues, kValue, kValue2, kValue3));
438 ASSERT_TRUE(store_.Open());
439
440 vector<string> value;
441
442 EXPECT_TRUE(store_.GetStringList(kGroup, kKeyValues, &value));
443 ASSERT_EQ(3, value.size());
444 EXPECT_EQ(kValue, value[0]);
445 EXPECT_EQ(kValue2, value[1]);
446 EXPECT_EQ(kValue3, value[2]);
447
448 EXPECT_TRUE(store_.GetStringList(kGroup, kKeyEmptyValue, &value));
449 ASSERT_EQ(2, value.size());
450 EXPECT_EQ("", value[0]);
451 EXPECT_EQ(kValue, value[1]);
452
453 EXPECT_TRUE(store_.GetStringList(kGroup, kKeyValueEmpty, &value));
454 ASSERT_EQ(2, value.size());
455 EXPECT_EQ(kValue, value[0]);
456 EXPECT_EQ("", value[1]);
457
458 EXPECT_TRUE(store_.GetStringList(kGroup, kKeyEmpty, &value));
459 ASSERT_EQ(0, value.size());
460
461 EXPECT_TRUE(store_.GetStringList(kGroup, kKeyValueEmptyValue, &value));
462 ASSERT_EQ(3, value.size());
463 EXPECT_EQ(kValue, value[0]);
464 EXPECT_EQ("", value[1]);
465 EXPECT_EQ(kValue2, value[2]);
466
467 EXPECT_FALSE(store_.GetStringList("unknown-string-lists", kKeyEmpty, &value));
468 EXPECT_FALSE(store_.GetStringList(kGroup, "some-key", &value));
469 EXPECT_TRUE(store_.GetStringList(kGroup, kKeyValues, NULL));
470 ASSERT_TRUE(store_.Close());
471}
472
473TEST_F(KeyFileStoreTest, SetStringList) {
474 static const char kGroup[] = "strings";
475 static const char kKeyEmpty[] = "e";
476 static const char kKeyEmptyValue[] = "ev";
477 static const char kKeyValueEmpty[] = "ve";
478 static const char kKeyValueEmptyValue[] = "vev";
479 static const char kKeyValues[] = "v";
480 static const char kValue[] = "abc";
481 static const char kValue2[] = "pqr";
482 static const char kValue3[] = "xyz";
483 ASSERT_TRUE(store_.Open());
484 {
485 vector<string> value;
486 ASSERT_TRUE(store_.SetStringList(kGroup, kKeyEmpty, value));
487 }
488 {
489 vector<string> value;
490 value.push_back("");
491 value.push_back(kValue);
492 ASSERT_TRUE(store_.SetStringList(kGroup, kKeyEmptyValue, value));
493 }
494 {
495 vector<string> value;
496 value.push_back(kValue);
497 value.push_back("");
498 ASSERT_TRUE(store_.SetStringList(kGroup, kKeyValueEmpty, value));
499 }
500 {
501 vector<string> value;
502 value.push_back(kValue);
503 value.push_back("");
504 value.push_back(kValue2);
505 ASSERT_TRUE(store_.SetStringList(kGroup, kKeyValueEmptyValue, value));
506 }
507 {
508 vector<string> value;
509 value.push_back(kValue);
510 value.push_back(kValue2);
511 value.push_back(kValue3);
512 ASSERT_TRUE(store_.SetStringList(kGroup, kKeyValues, value));
513 }
514 ASSERT_TRUE(store_.Close());
Ben Chanc9638612012-09-13 16:20:46 -0700515 EXPECT_EQ(base::StringPrintf(KEY_FILE_EXTRA_NEW_LINE
Darin Petkovb2841fd2011-06-30 12:54:12 -0700516 "[%s]\n"
517 "%s=\n"
518 "%s=;%s;\n"
519 "%s=%s;;\n"
520 "%s=%s;;%s;\n"
521 "%s=%s;%s;%s;\n",
522 kGroup,
523 kKeyEmpty,
524 kKeyEmptyValue, kValue,
525 kKeyValueEmpty, kValue,
526 kKeyValueEmptyValue, kValue, kValue2,
527 kKeyValues, kValue, kValue2, kValue3),
528 ReadKeyFile());
529}
530
Darin Petkov86964e02011-06-29 13:49:28 -0700531TEST_F(KeyFileStoreTest, GetCryptedString) {
532 static const char kGroup[] = "crypto-group";
533 static const char kKey[] = "secret";
534 WriteKeyFile(base::StringPrintf("[%s]\n"
535 "%s=%s\n",
536 kGroup, kKey, kROT47Text));
537 ASSERT_TRUE(store_.Open());
538 string value;
539 EXPECT_TRUE(store_.GetCryptedString(kGroup, kKey, &value));
540 EXPECT_EQ(kPlainText, value);
541 EXPECT_FALSE(store_.GetCryptedString("something-else", kKey, &value));
542 EXPECT_FALSE(store_.GetCryptedString(kGroup, "non-secret", &value));
543 EXPECT_TRUE(store_.GetCryptedString(kGroup, kKey, NULL));
544 ASSERT_TRUE(store_.Close());
545}
546
547TEST_F(KeyFileStoreTest, SetCryptedString) {
548 static const char kGroup[] = "crypted-string-group";
549 static const char kKey[] = "test-string";
550 ASSERT_TRUE(store_.Open());
551 ASSERT_TRUE(store_.SetCryptedString(kGroup, kKey, kPlainText));
552 ASSERT_TRUE(store_.Close());
Ben Chanc9638612012-09-13 16:20:46 -0700553 EXPECT_EQ(base::StringPrintf(KEY_FILE_EXTRA_NEW_LINE
Darin Petkov86964e02011-06-29 13:49:28 -0700554 "[%s]\n"
555 "%s=%s\n",
556 kGroup, kKey, kROT47Text),
557 ReadKeyFile());
558}
559
Chris Masoneb9c00592011-10-06 13:10:39 -0700560TEST_F(KeyFileStoreTest, PersistAcrossClose) {
561 static const char kGroup[] = "string-group";
562 static const char kKey1[] = "test-string";
563 static const char kValue1[] = "foo";
564 static const char kKey2[] = "empty-string";
565 static const char kValue2[] = "";
566 ASSERT_TRUE(store_.Open());
567 ASSERT_TRUE(store_.SetString(kGroup, kKey1, kValue1));
568 ASSERT_TRUE(store_.Close());
569 ASSERT_TRUE(store_.Open());
570 ASSERT_TRUE(store_.SetString(kGroup, kKey2, kValue2));
571 string value;
572 ASSERT_TRUE(store_.GetString(kGroup, kKey1, &value));
573 ASSERT_EQ(kValue1, value);
574 ASSERT_TRUE(store_.GetString(kGroup, kKey2, &value));
575 ASSERT_EQ(kValue2, value);
576 ASSERT_TRUE(store_.Close());
577}
578
579bool KeyFileStoreTest::OpenCheckClose(const string &group,
580 const string &key,
581 const string &expected_value) {
582 KeyFileStore store(&glib_);
583 store.set_path(test_file_);
584 EXPECT_TRUE(store.Open());
585 string value;
586 bool could_get = store.GetString(group, key, &value);
587 store.set_path(FilePath("")); // Don't persist to disk.
588 store.Close();
589 return could_get && expected_value == value;
590}
591
592TEST_F(KeyFileStoreTest, Flush) {
593 static const char kGroup[] = "string-group";
594 static const char kKey1[] = "test-string";
595 static const char kValue1[] = "foo";
596 static const char kKey2[] = "empty-string";
597 static const char kValue2[] = "";
598 ASSERT_TRUE(store_.Open());
599 ASSERT_TRUE(store_.SetString(kGroup, kKey1, kValue1));
600 ASSERT_TRUE(store_.Flush());
601 ASSERT_TRUE(OpenCheckClose(kGroup, kKey1, kValue1));
602
603 ASSERT_TRUE(store_.SetString(kGroup, kKey2, kValue2));
604 ASSERT_TRUE(store_.Flush());
605 ASSERT_TRUE(OpenCheckClose(kGroup, kKey2, kValue2));
606
607 EXPECT_TRUE(store_.DeleteKey(kGroup, kKey1));
608 ASSERT_TRUE(store_.Flush());
609 ASSERT_FALSE(OpenCheckClose(kGroup, kKey1, kValue1));
610}
611
Paul Stewart5dc40aa2011-10-28 19:43:43 -0700612TEST_F(KeyFileStoreTest, EmptyFile) {
613 ASSERT_TRUE(store_.Open());
614 ASSERT_TRUE(store_.Close());
615 EXPECT_FALSE(store_.IsNonEmpty());
616}
617
618TEST_F(KeyFileStoreTest, SetHeader) {
619 ASSERT_TRUE(store_.Open());
620 ASSERT_TRUE(store_.SetHeader("this is a test"));
621 ASSERT_TRUE(store_.Close());
622 EXPECT_TRUE(store_.IsNonEmpty());
623 ASSERT_TRUE(store_.Open());
624}
625
Darin Petkov083047b2011-06-23 20:42:48 -0700626TEST_F(KeyFileStoreTest, Combo) {
627 static const char kGroupA[] = "square";
628 static const char kGroupB[] = "circle";
629 static const char kGroupC[] = "triangle";
630 static const char kGroupX[] = "pentagon";
631 static const char kKeyString[] = "color";
Darin Petkovb2841fd2011-06-30 12:54:12 -0700632 static const char kKeyStringList[] = "alternative-colors";
Darin Petkov083047b2011-06-23 20:42:48 -0700633 static const char kKeyInt[] = "area";
634 static const char kKeyBool[] = "visible";
635 static const char kValueStringA[] = "blue";
636 static const char kValueStringB[] = "red";
637 static const char kValueStringC[] = "yellow";
638 static const char kValueStringCNew[] = "purple";
639 const int kValueIntA = 5;
640 const int kValueIntB = 10;
641 const int kValueIntBNew = 333;
642 WriteKeyFile(base::StringPrintf("[%s]\n"
643 "%s=%s\n"
Darin Petkovb2841fd2011-06-30 12:54:12 -0700644 "%s=%s;%s\n"
Darin Petkov083047b2011-06-23 20:42:48 -0700645 "%s=%d\n"
646 "[%s]\n"
647 "%s=%s\n"
Darin Petkovb2841fd2011-06-30 12:54:12 -0700648 "%s=%s;%s\n"
Darin Petkov083047b2011-06-23 20:42:48 -0700649 "%s=%d\n"
650 "%s=true\n"
651 "[%s]\n"
652 "%s=%s\n"
653 "%s=false\n",
654 kGroupA,
655 kKeyString, kValueStringA,
Darin Petkovb2841fd2011-06-30 12:54:12 -0700656 kKeyStringList, kValueStringB, kValueStringC,
Darin Petkov083047b2011-06-23 20:42:48 -0700657 kKeyInt, kValueIntA,
658 kGroupB,
659 kKeyString, kValueStringB,
Darin Petkovb2841fd2011-06-30 12:54:12 -0700660 kKeyStringList, kValueStringA, kValueStringC,
Darin Petkov083047b2011-06-23 20:42:48 -0700661 kKeyInt, kValueIntB,
662 kKeyBool,
663 kGroupC,
664 kKeyString, kValueStringC,
665 kKeyBool));
666 ASSERT_TRUE(store_.Open());
667
668 EXPECT_TRUE(store_.ContainsGroup(kGroupA));
669 EXPECT_TRUE(store_.ContainsGroup(kGroupB));
670 EXPECT_TRUE(store_.ContainsGroup(kGroupC));
671 EXPECT_FALSE(store_.ContainsGroup(kGroupX));
672
673 set<string> groups = store_.GetGroups();
674 EXPECT_EQ(3, groups.size());
675 EXPECT_TRUE(ContainsKey(groups, kGroupA));
676 EXPECT_TRUE(ContainsKey(groups, kGroupB));
677 EXPECT_TRUE(ContainsKey(groups, kGroupC));
678 EXPECT_FALSE(ContainsKey(groups, kGroupX));
679
680 {
681 string value;
682 EXPECT_TRUE(store_.GetString(kGroupB, kKeyString, &value));
683 EXPECT_EQ(kValueStringB, value);
684 EXPECT_TRUE(store_.GetString(kGroupA, kKeyString, &value));
685 EXPECT_EQ(kValueStringA, value);
686 EXPECT_TRUE(store_.GetString(kGroupC, kKeyString, &value));
687 EXPECT_EQ(kValueStringC, value);
688 }
689 {
Darin Petkovb2841fd2011-06-30 12:54:12 -0700690 vector<string> value;
691 EXPECT_TRUE(store_.GetStringList(kGroupB, kKeyStringList, &value));
692 ASSERT_EQ(2, value.size());
693 EXPECT_EQ(kValueStringA, value[0]);
694 EXPECT_EQ(kValueStringC, value[1]);
695 EXPECT_TRUE(store_.GetStringList(kGroupA, kKeyStringList, &value));
696 ASSERT_EQ(2, value.size());
697 EXPECT_EQ(kValueStringB, value[0]);
698 EXPECT_EQ(kValueStringC, value[1]);
699 EXPECT_FALSE(store_.GetStringList(kGroupC, kKeyStringList, &value));
700 }
701 {
Darin Petkov083047b2011-06-23 20:42:48 -0700702 int value = 0;
703 EXPECT_TRUE(store_.GetInt(kGroupB, kKeyInt, &value));
704 EXPECT_EQ(kValueIntB, value);
705 EXPECT_TRUE(store_.GetInt(kGroupA, kKeyInt, &value));
706 EXPECT_EQ(kValueIntA, value);
707 EXPECT_FALSE(store_.GetInt(kGroupC, kKeyInt, &value));
708 }
709 {
710 bool value = false;
711 EXPECT_TRUE(store_.GetBool(kGroupB, kKeyBool, &value));
712 EXPECT_TRUE(value);
713 EXPECT_TRUE(store_.GetBool(kGroupC, kKeyBool, &value));
714 EXPECT_FALSE(value);
715 EXPECT_FALSE(store_.GetBool(kGroupA, kKeyBool, &value));
716 }
717
718 EXPECT_TRUE(store_.DeleteGroup(kGroupA));
Chris Masone9d779932011-08-25 16:33:41 -0700719 EXPECT_TRUE(store_.DeleteGroup(kGroupA));
Darin Petkov083047b2011-06-23 20:42:48 -0700720
721 EXPECT_FALSE(store_.ContainsGroup(kGroupA));
722 EXPECT_TRUE(store_.ContainsGroup(kGroupB));
723 EXPECT_TRUE(store_.ContainsGroup(kGroupC));
724
725 groups = store_.GetGroups();
726 EXPECT_EQ(2, groups.size());
727 EXPECT_FALSE(ContainsKey(groups, kGroupA));
728 EXPECT_TRUE(ContainsKey(groups, kGroupB));
729 EXPECT_TRUE(ContainsKey(groups, kGroupC));
730
731 EXPECT_TRUE(store_.SetBool(kGroupB, kKeyBool, false));
732 EXPECT_TRUE(store_.SetInt(kGroupB, kKeyInt, kValueIntBNew));
733 EXPECT_TRUE(store_.SetString(kGroupC, kKeyString, kValueStringCNew));
Darin Petkovb2841fd2011-06-30 12:54:12 -0700734 store_.SetStringList(kGroupB,
735 kKeyStringList,
736 vector<string>(1, kValueStringB));
Darin Petkov083047b2011-06-23 20:42:48 -0700737
738 EXPECT_TRUE(store_.DeleteKey(kGroupB, kKeyString));
Chris Masone9d779932011-08-25 16:33:41 -0700739 EXPECT_TRUE(store_.DeleteKey(kGroupB, kKeyString));
Darin Petkov083047b2011-06-23 20:42:48 -0700740
741 {
742 string value;
743 EXPECT_FALSE(store_.GetString(kGroupB, kKeyString, &value));
744 EXPECT_FALSE(store_.GetString(kGroupA, kKeyString, &value));
745 EXPECT_TRUE(store_.GetString(kGroupC, kKeyString, &value));
746 EXPECT_EQ(kValueStringCNew, value);
747 }
Darin Petkovb2841fd2011-06-30 12:54:12 -0700748 {
749 vector<string> value;
750 EXPECT_TRUE(store_.GetStringList(kGroupB, kKeyStringList, &value));
751 ASSERT_EQ(1, value.size());
752 EXPECT_EQ(kValueStringB, value[0]);
753 EXPECT_FALSE(store_.GetStringList(kGroupA, kKeyStringList, &value));
754 EXPECT_FALSE(store_.GetStringList(kGroupC, kKeyStringList, &value));
755 }
Darin Petkov083047b2011-06-23 20:42:48 -0700756 {
757 int value = 0;
758 EXPECT_TRUE(store_.GetInt(kGroupB, kKeyInt, &value));
759 EXPECT_EQ(kValueIntBNew, value);
760 EXPECT_FALSE(store_.GetInt(kGroupA, kKeyInt, &value));
761 EXPECT_FALSE(store_.GetInt(kGroupC, kKeyInt, &value));
762 }
Darin Petkov083047b2011-06-23 20:42:48 -0700763 {
764 bool value = false;
765 EXPECT_TRUE(store_.GetBool(kGroupB, kKeyBool, &value));
766 EXPECT_FALSE(value);
767 EXPECT_TRUE(store_.GetBool(kGroupC, kKeyBool, &value));
768 EXPECT_FALSE(value);
769 EXPECT_FALSE(store_.GetBool(kGroupA, kKeyBool, &value));
770 }
771
772 ASSERT_TRUE(store_.Close());
Ben Chanc9638612012-09-13 16:20:46 -0700773 EXPECT_EQ(base::StringPrintf(KEY_FILE_EXTRA_NEW_LINE
Darin Petkov083047b2011-06-23 20:42:48 -0700774 "[%s]\n"
Darin Petkovb2841fd2011-06-30 12:54:12 -0700775 "%s=%s;\n"
Darin Petkov083047b2011-06-23 20:42:48 -0700776 "%s=%d\n"
777 "%s=false\n"
778 "\n"
779 "[%s]\n"
780 "%s=%s\n"
781 "%s=false\n",
782 kGroupB,
Darin Petkovb2841fd2011-06-30 12:54:12 -0700783 kKeyStringList, kValueStringB,
Darin Petkov083047b2011-06-23 20:42:48 -0700784 kKeyInt, kValueIntBNew,
785 kKeyBool,
786 kGroupC,
787 kKeyString, kValueStringCNew,
788 kKeyBool),
789 ReadKeyFile());
790}
791
792} // namespace shill