blob: cab49c918b882128079eb81a6bfc84679c36ebec [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
Paul Stewart5b9ec982013-01-18 14:12:14 -080014#include "shill/key_value_store.h"
15
Gary Morain96970242012-04-20 10:59:58 -070016using file_util::FileEnumerator;
Darin Petkov083047b2011-06-23 20:42:48 -070017using std::set;
18using std::string;
Darin Petkovb2841fd2011-06-30 12:54:12 -070019using std::vector;
Darin Petkov083047b2011-06-23 20:42:48 -070020using testing::Test;
21
Ben Chanc9638612012-09-13 16:20:46 -070022// TODO(benchan): Remove this workaround after finishing glib 2.32 migration.
23#ifdef GLIB_VERSION_2_32
24#define KEY_FILE_EXTRA_NEW_LINE
25#else
26#define KEY_FILE_EXTRA_NEW_LINE "\n"
27#endif
28
Darin Petkov083047b2011-06-23 20:42:48 -070029namespace shill {
30
Darin Petkov86964e02011-06-29 13:49:28 -070031namespace {
32const char kPlainText[] = "This is a test!";
33const char kROT47Text[] = "rot47:%9:D :D 2 E6DEP";
34} // namespace {}
35
Darin Petkov083047b2011-06-23 20:42:48 -070036class KeyFileStoreTest : public Test {
37 public:
38 KeyFileStoreTest() : store_(&glib_) {}
39
40 virtual void SetUp() {
41 ASSERT_TRUE(temp_dir_.CreateUniqueTempDir());
Chris Masoneb9c00592011-10-06 13:10:39 -070042 test_file_ = temp_dir_.path().Append("test-key-file-store");
43 store_.set_path(test_file_);
Darin Petkov083047b2011-06-23 20:42:48 -070044 }
45
46 virtual void TearDown() {
47 store_.set_path(FilePath("")); // Don't try to save the store.
48 ASSERT_TRUE(temp_dir_.Delete());
49 }
50
51 protected:
52 string ReadKeyFile();
53 void WriteKeyFile(string data);
Chris Masoneb9c00592011-10-06 13:10:39 -070054 bool OpenCheckClose(const string &group,
55 const string &key,
56 const string &expected_value);
Darin Petkov083047b2011-06-23 20:42:48 -070057
58 GLib glib_; // Use real GLib for testing KeyFileStore.
59 ScopedTempDir temp_dir_;
Chris Masoneb9c00592011-10-06 13:10:39 -070060 FilePath test_file_;
Darin Petkov083047b2011-06-23 20:42:48 -070061 KeyFileStore store_;
62};
63
64string KeyFileStoreTest::ReadKeyFile() {
65 string data;
66 EXPECT_TRUE(file_util::ReadFileToString(store_.path(), &data));
67 return data;
68}
69
70void KeyFileStoreTest::WriteKeyFile(string data) {
71 EXPECT_EQ(data.size(),
72 file_util::WriteFile(store_.path(), data.data(), data.size()));
73}
74
75TEST_F(KeyFileStoreTest, OpenClose) {
76 EXPECT_FALSE(store_.key_file_);
77
Paul Stewart5dc40aa2011-10-28 19:43:43 -070078 EXPECT_FALSE(store_.IsNonEmpty());
Darin Petkov083047b2011-06-23 20:42:48 -070079 ASSERT_TRUE(store_.Open());
80 EXPECT_TRUE(store_.key_file_);
Darin Petkov86964e02011-06-29 13:49:28 -070081 EXPECT_EQ(1, store_.crypto_.cryptos_.size());
Darin Petkov083047b2011-06-23 20:42:48 -070082 ASSERT_TRUE(store_.Close());
83 EXPECT_FALSE(store_.key_file_);
Gary Morain96970242012-04-20 10:59:58 -070084 FileEnumerator file_enumerator(temp_dir_.path(),
85 false /* not recursive */,
86 FileEnumerator::FILES);
87
88 // Verify that the file actually got written with the right name.
89 EXPECT_EQ(test_file_.value(), file_enumerator.Next().value());
90 FileEnumerator::FindInfo find_info;
91 file_enumerator.GetFindInfo(&find_info);
92
93 // Verify that the profile is a regular file, readable and writeable by the
94 // owner only.
95 EXPECT_EQ(S_IFREG | S_IRUSR | S_IWUSR, find_info.stat.st_mode);
Darin Petkov083047b2011-06-23 20:42:48 -070096
97 ASSERT_TRUE(store_.Open());
98 EXPECT_TRUE(store_.key_file_);
99 ASSERT_TRUE(store_.Close());
100 EXPECT_FALSE(store_.key_file_);
101
102 ASSERT_TRUE(store_.Open());
103 store_.set_path(FilePath(""));
104 ASSERT_FALSE(store_.Close());
105 EXPECT_FALSE(store_.key_file_);
106}
107
108TEST_F(KeyFileStoreTest, OpenFail) {
109 WriteKeyFile("garbage\n");
110 EXPECT_FALSE(store_.Open());
111 EXPECT_FALSE(store_.key_file_);
112}
113
Paul Stewart2ebc16d2012-08-23 10:38:39 -0700114TEST_F(KeyFileStoreTest, MarkAsCorrupted) {
115 EXPECT_FALSE(store_.MarkAsCorrupted());
116 EXPECT_FALSE(store_.IsNonEmpty());
117 WriteKeyFile("garbage\n");
118 EXPECT_TRUE(store_.IsNonEmpty());
119 EXPECT_TRUE(file_util::PathExists(store_.path()));
120 EXPECT_TRUE(store_.MarkAsCorrupted());
121 EXPECT_FALSE(store_.IsNonEmpty());
122 EXPECT_FALSE(file_util::PathExists(store_.path()));
123 EXPECT_TRUE(
124 file_util::PathExists(FilePath(store_.path().value() + ".corrupted")));
125}
126
Darin Petkov083047b2011-06-23 20:42:48 -0700127TEST_F(KeyFileStoreTest, GetGroups) {
128 static const char kGroupA[] = "g-a";
129 static const char kGroupB[] = "g-b";
130 static const char kGroupC[] = "g-c";
131 WriteKeyFile(base::StringPrintf("[%s]\n"
132 "[%s]\n"
133 "[%s]\n",
134 kGroupA, kGroupB, kGroupC));
Paul Stewart5dc40aa2011-10-28 19:43:43 -0700135 EXPECT_TRUE(store_.IsNonEmpty());
Darin Petkov083047b2011-06-23 20:42:48 -0700136 ASSERT_TRUE(store_.Open());
137 set<string> groups = store_.GetGroups();
138 EXPECT_EQ(3, groups.size());
139 EXPECT_TRUE(ContainsKey(groups, kGroupA));
140 EXPECT_TRUE(ContainsKey(groups, kGroupB));
141 EXPECT_TRUE(ContainsKey(groups, kGroupC));
142 EXPECT_FALSE(ContainsKey(groups, "g-x"));
143 ASSERT_TRUE(store_.Close());
144}
145
Paul Stewarta41e38d2011-11-11 07:47:29 -0800146TEST_F(KeyFileStoreTest, GetGroupsWithKey) {
147 static const char kGroupA[] = "g-a";
148 static const char kGroupB[] = "g-b";
149 static const char kGroupC[] = "g-c";
150 static const char kKeyA[] = "k-a";
151 static const char kKeyB[] = "k-b";
152 static const char kValue[] = "true";
153 WriteKeyFile(base::StringPrintf("[%s]\n"
154 "%s=%s\n"
155 "[%s]\n"
156 "%s=%s\n"
157 "%s=%s\n"
158 "[%s]\n"
159 "%s=%s\n",
160 kGroupA, kKeyA, kValue,
161 kGroupB, kKeyA, kValue, kKeyB, kValue,
162 kGroupC, kKeyB, kValue));
163 EXPECT_TRUE(store_.IsNonEmpty());
164 ASSERT_TRUE(store_.Open());
165 set<string> groups_a = store_.GetGroupsWithKey(kKeyA);
166 EXPECT_EQ(2, groups_a.size());
167 EXPECT_TRUE(ContainsKey(groups_a, kGroupA));
168 EXPECT_TRUE(ContainsKey(groups_a, kGroupB));
169 set<string> groups_b = store_.GetGroupsWithKey(kKeyB);
170 EXPECT_EQ(2, groups_b.size());
171 EXPECT_TRUE(ContainsKey(groups_b, kGroupB));
172 EXPECT_TRUE(ContainsKey(groups_b, kGroupC));
173 ASSERT_TRUE(store_.Close());
174}
175
Darin Petkov083047b2011-06-23 20:42:48 -0700176TEST_F(KeyFileStoreTest, ContainsGroup) {
177 static const char kGroupA[] = "group-a";
178 static const char kGroupB[] = "group-b";
179 static const char kGroupC[] = "group-c";
180 WriteKeyFile(base::StringPrintf("[%s]\n"
181 "[%s]\n"
182 "[%s]\n",
183 kGroupA, kGroupB, kGroupC));
184 ASSERT_TRUE(store_.Open());
185 EXPECT_TRUE(store_.ContainsGroup(kGroupA));
186 EXPECT_TRUE(store_.ContainsGroup(kGroupB));
187 EXPECT_TRUE(store_.ContainsGroup(kGroupC));
188 EXPECT_FALSE(store_.ContainsGroup("group-d"));
189 ASSERT_TRUE(store_.Close());
190}
191
Paul Stewart5b9ec982013-01-18 14:12:14 -0800192TEST_F(KeyFileStoreTest, GetGroupsWithProperties) {
193 static const char kGroupA[] = "group-a";
194 static const char kGroupB[] = "group-b";
195 static const char kGroupC[] = "group-c";
196 static const char kAttributeA[] = "attr-a";
197 static const char kAttributeB[] = "attr-b";
198 static const char kAttributeC[] = "attr-c";
199 static const char kValueA_0[] = "val-a";
200 static const char kValueA_1[] = "val-b";
201 static const int kValueB_0 = 1;
202 static const int kValueB_1 = 2;
203 static const bool kValueC_0 = true;
204 static const char kValueC_0_string[] = "true";
205 static const bool kValueC_1 = false;
206 static const char kValueC_1_string[] = "false";
207 WriteKeyFile(base::StringPrintf("[%s]\n"
208 "%s=%s\n"
209 "%s=%d\n"
210 "%s=%s\n"
211 "[%s]\n"
212 "%s=%s\n"
213 "%s=%d\n"
214 "%s=%s\n"
215 "[%s]\n"
216 "%s=%s\n"
217 "%s=%d\n"
218 "%s=%s\n",
219 kGroupA,
220 kAttributeA, kValueA_0,
221 kAttributeB, kValueB_0,
222 kAttributeC, kValueC_0_string,
223 kGroupB,
224 kAttributeA, kValueA_0,
225 kAttributeB, kValueB_1,
226 kAttributeC, kValueC_0_string,
227 kGroupC,
228 kAttributeA, kValueA_0,
229 kAttributeB, kValueB_0,
230 kAttributeC, kValueC_1_string));
231 ASSERT_TRUE(store_.Open());
232 {
233 KeyValueStore args;
234 args.SetString(kAttributeA, kValueA_0);
235 args.SetInt(kAttributeB, kValueB_0);
236 set<string> results = store_.GetGroupsWithProperties(args);
237 EXPECT_EQ(2, results.size());
238 EXPECT_TRUE(results.find(kGroupA) != results.end());
239 EXPECT_TRUE(results.find(kGroupC) != results.end());
240 }
241 {
242 KeyValueStore args;
243 args.SetString(kAttributeA, kValueA_0);
244 args.SetBool(kAttributeC, kValueC_0);
245 set<string> results = store_.GetGroupsWithProperties(args);
246 EXPECT_EQ(2, results.size());
247 EXPECT_TRUE(results.find(kGroupA) != results.end());
248 EXPECT_TRUE(results.find(kGroupB) != results.end());
249 }
250 {
251 KeyValueStore args;
252 args.SetBool(kAttributeC, kValueC_1);
253 set<string> results = store_.GetGroupsWithProperties(args);
254 EXPECT_EQ(1, results.size());
255 EXPECT_TRUE(results.find(kGroupC) != results.end());
256 }
257 {
258 KeyValueStore args;
259 args.SetString(kAttributeA, kValueA_0);
260 set<string> results = store_.GetGroupsWithProperties(args);
261 EXPECT_EQ(3, results.size());
262 EXPECT_TRUE(results.find(kGroupA) != results.end());
263 EXPECT_TRUE(results.find(kGroupB) != results.end());
264 EXPECT_TRUE(results.find(kGroupC) != results.end());
265 }
266 {
267 KeyValueStore args;
268 args.SetString(kAttributeA, kValueA_1);
269 set<string> results = store_.GetGroupsWithProperties(args);
270 EXPECT_EQ(0, results.size());
271 }
272 ASSERT_TRUE(store_.Close());
273}
274
Darin Petkov083047b2011-06-23 20:42:48 -0700275TEST_F(KeyFileStoreTest, DeleteKey) {
276 static const char kGroup[] = "the-group";
277 static const char kKeyDead[] = "dead";
278 static const char kKeyAlive[] = "alive";
279 const int kValueAlive = 3;
280 WriteKeyFile(base::StringPrintf("[%s]\n"
281 "%s=5\n"
282 "%s=%d\n",
283 kGroup, kKeyDead, kKeyAlive, kValueAlive));
284 ASSERT_TRUE(store_.Open());
285 EXPECT_TRUE(store_.DeleteKey(kGroup, kKeyDead));
Chris Masone9d779932011-08-25 16:33:41 -0700286 EXPECT_TRUE(store_.DeleteKey(kGroup, "random-key"));
Darin Petkov083047b2011-06-23 20:42:48 -0700287 EXPECT_FALSE(store_.DeleteKey("random-group", kKeyAlive));
288 ASSERT_TRUE(store_.Close());
Ben Chanc9638612012-09-13 16:20:46 -0700289 EXPECT_EQ(base::StringPrintf(KEY_FILE_EXTRA_NEW_LINE
Darin Petkov083047b2011-06-23 20:42:48 -0700290 "[%s]\n"
291 "%s=%d\n",
292 kGroup, kKeyAlive, kValueAlive),
293 ReadKeyFile());
294}
295
296TEST_F(KeyFileStoreTest, DeleteGroup) {
297 static const char kGroupA[] = "group-a";
298 static const char kGroupB[] = "group-b";
299 static const char kGroupC[] = "group-c";
300 WriteKeyFile(base::StringPrintf("[%s]\n"
301 "[%s]\n"
302 "key-to-be-deleted=true\n"
303 "[%s]\n",
304 kGroupA, kGroupB, kGroupC));
305 ASSERT_TRUE(store_.Open());
306 EXPECT_TRUE(store_.DeleteGroup(kGroupB));
Chris Masone9d779932011-08-25 16:33:41 -0700307 EXPECT_TRUE(store_.DeleteGroup("group-d"));
Darin Petkov083047b2011-06-23 20:42:48 -0700308 ASSERT_TRUE(store_.Close());
Ben Chanc9638612012-09-13 16:20:46 -0700309 EXPECT_EQ(base::StringPrintf(KEY_FILE_EXTRA_NEW_LINE
Darin Petkov083047b2011-06-23 20:42:48 -0700310 "[%s]\n"
311 "\n"
312 "[%s]\n",
313 kGroupA, kGroupC),
314 ReadKeyFile());
315}
316
317TEST_F(KeyFileStoreTest, GetString) {
318 static const char kGroup[] = "something";
319 static const char kKey[] = "foo";
320 static const char kValue[] = "bar";
321 WriteKeyFile(base::StringPrintf("[%s]\n"
322 "%s=%s\n",
323 kGroup, kKey, kValue));
324 ASSERT_TRUE(store_.Open());
325 string value;
326 EXPECT_TRUE(store_.GetString(kGroup, kKey, &value));
327 EXPECT_EQ(kValue, value);
328 EXPECT_FALSE(store_.GetString("something-else", kKey, &value));
329 EXPECT_FALSE(store_.GetString(kGroup, "bar", &value));
330 EXPECT_TRUE(store_.GetString(kGroup, kKey, NULL));
331 ASSERT_TRUE(store_.Close());
332}
333
334TEST_F(KeyFileStoreTest, SetString) {
335 static const char kGroup[] = "string-group";
336 static const char kKey1[] = "test-string";
337 static const char kValue1[] = "foo";
338 static const char kKey2[] = "empty-string";
339 static const char kValue2[] = "";
340 ASSERT_TRUE(store_.Open());
341 ASSERT_TRUE(store_.SetString(kGroup, kKey1, kValue1));
342 ASSERT_TRUE(store_.SetString(kGroup, kKey2, kValue2));
343 ASSERT_TRUE(store_.Close());
Ben Chanc9638612012-09-13 16:20:46 -0700344 EXPECT_EQ(base::StringPrintf(KEY_FILE_EXTRA_NEW_LINE
Darin Petkov083047b2011-06-23 20:42:48 -0700345 "[%s]\n"
346 "%s=%s\n"
347 "%s=%s\n",
348 kGroup, kKey1, kValue1, kKey2, kValue2),
349 ReadKeyFile());
350}
351
352TEST_F(KeyFileStoreTest, GetBool) {
353 static const char kGroup[] = "boo";
354 static const char kKeyTrue[] = "foo";
355 static const char kKeyFalse[] = "bar";
356 static const char kKeyBad[] = "zoo";
357 WriteKeyFile(base::StringPrintf("[%s]\n"
358 "%s=true\n"
359 "%s=false\n"
360 "%s=moo\n",
361 kGroup, kKeyTrue, kKeyFalse, kKeyBad));
362 ASSERT_TRUE(store_.Open());
363 {
364 bool value = true;
365 EXPECT_TRUE(store_.GetBool(kGroup, kKeyFalse, &value));
366 EXPECT_FALSE(value);
367 }
368 {
369 bool value = false;
370 EXPECT_TRUE(store_.GetBool(kGroup, kKeyTrue, &value));
371 EXPECT_TRUE(value);
372 }
373 {
374 bool value;
375 EXPECT_FALSE(store_.GetBool(kGroup, kKeyBad, &value));
376 EXPECT_FALSE(store_.GetBool(kGroup, "unknown", &value));
377 EXPECT_FALSE(store_.GetBool("unknown", kKeyTrue, &value));
378 }
379 EXPECT_TRUE(store_.GetBool(kGroup, kKeyFalse, NULL));
380 ASSERT_TRUE(store_.Close());
381}
382
383TEST_F(KeyFileStoreTest, SetBool) {
384 static const char kGroup[] = "bool-group";
385 static const char kKeyTrue[] = "test-true-bool";
386 static const char kKeyFalse[] = "test-false-bool";
387 ASSERT_TRUE(store_.Open());
388 ASSERT_TRUE(store_.SetBool(kGroup, kKeyTrue, true));
389 ASSERT_TRUE(store_.SetBool(kGroup, kKeyFalse, false));
390 ASSERT_TRUE(store_.Close());
Ben Chanc9638612012-09-13 16:20:46 -0700391 EXPECT_EQ(base::StringPrintf(KEY_FILE_EXTRA_NEW_LINE
Darin Petkov083047b2011-06-23 20:42:48 -0700392 "[%s]\n"
393 "%s=true\n"
394 "%s=false\n",
395 kGroup, kKeyTrue, kKeyFalse),
396 ReadKeyFile());
397}
398
399TEST_F(KeyFileStoreTest, GetInt) {
400 static const char kGroup[] = "numbers";
401 static const char kKeyPos[] = "pos";
402 static const char kKeyNeg[] = "neg";
403 static const char kKeyBad[] = "bad";
404 const int kValuePos = 50;
405 const int kValueNeg = -20;
406 static const char kValueBad[] = "nan";
407 WriteKeyFile(base::StringPrintf("[%s]\n"
408 "%s=%d\n"
409 "%s=%d\n"
410 "%s=%s\n",
411 kGroup,
412 kKeyPos, kValuePos,
413 kKeyNeg, kValueNeg,
414 kKeyBad, kValueBad));
415 ASSERT_TRUE(store_.Open());
416 {
417 int value = 0;
418 EXPECT_TRUE(store_.GetInt(kGroup, kKeyNeg, &value));
419 EXPECT_EQ(kValueNeg, value);
420 }
421 {
422 int value = 0;
423 EXPECT_TRUE(store_.GetInt(kGroup, kKeyPos, &value));
424 EXPECT_EQ(kValuePos, value);
425 }
426 {
427 int value;
428 EXPECT_FALSE(store_.GetInt(kGroup, kKeyBad, &value));
429 EXPECT_FALSE(store_.GetInt(kGroup, "invalid", &value));
430 EXPECT_FALSE(store_.GetInt("invalid", kKeyPos, &value));
431 }
432 EXPECT_TRUE(store_.GetInt(kGroup, kKeyPos, NULL));
433 ASSERT_TRUE(store_.Close());
434}
435
436TEST_F(KeyFileStoreTest, SetInt) {
437 static const char kGroup[] = "int-group";
438 static const char kKey1[] = "test-int";
439 static const char kKey2[] = "test-negative";
440 const int kValue1 = 5;
441 const int kValue2 = -10;
442 ASSERT_TRUE(store_.Open());
443 ASSERT_TRUE(store_.SetInt(kGroup, kKey1, kValue1));
444 ASSERT_TRUE(store_.SetInt(kGroup, kKey2, kValue2));
445 ASSERT_TRUE(store_.Close());
Ben Chanc9638612012-09-13 16:20:46 -0700446 EXPECT_EQ(base::StringPrintf(KEY_FILE_EXTRA_NEW_LINE
Darin Petkov083047b2011-06-23 20:42:48 -0700447 "[%s]\n"
448 "%s=%d\n"
449 "%s=%d\n",
450 kGroup, kKey1, kValue1, kKey2, kValue2),
451 ReadKeyFile());
452}
453
Paul Stewartdab3b5a2012-07-11 18:25:10 -0700454TEST_F(KeyFileStoreTest, GetUint64) {
455 static const char kGroup[] = "numbers";
456 static const char kKeyGood[] = "good";
457 static const char kKeyBad[] = "bad";
458 const uint64 kValueGood = 0xFEDCBA9876543210LL;
459 static const char kValueBad[] = "nan";
460 // Use base::Uint64ToString() instead of using something like "%llu"
461 // (not correct for native 64 bit architectures) or PRIu64 (does not
462 // work correctly using cros_workon_make due to include intricacies).
463 WriteKeyFile(base::StringPrintf("[%s]\n"
464 "%s=%s\n"
465 "%s=%s\n",
466 kGroup,
467 kKeyGood,
468 base::Uint64ToString(kValueGood).c_str(),
469 kKeyBad, kValueBad));
470 ASSERT_TRUE(store_.Open());
471 {
472 uint64 value = 0;
473 EXPECT_TRUE(store_.GetUint64(kGroup, kKeyGood, &value));
474 EXPECT_EQ(kValueGood, value);
475 }
476 {
477 uint64 value;
478 EXPECT_FALSE(store_.GetUint64(kGroup, kKeyBad, &value));
479 EXPECT_FALSE(store_.GetUint64(kGroup, "invalid", &value));
480 EXPECT_FALSE(store_.GetUint64("invalid", kKeyGood, &value));
481 }
482 EXPECT_TRUE(store_.GetUint64(kGroup, kKeyGood, NULL));
483 ASSERT_TRUE(store_.Close());
484}
485
486TEST_F(KeyFileStoreTest, SetUint64) {
487 static const char kGroup[] = "int-group";
488 static const char kKey[] = "test-int";
489 const uint64 kValue = 0xFEDCBA9876543210LL;
490 ASSERT_TRUE(store_.Open());
491 ASSERT_TRUE(store_.SetUint64(kGroup, kKey, kValue));
492 ASSERT_TRUE(store_.Close());
Ben Chanc9638612012-09-13 16:20:46 -0700493 EXPECT_EQ(base::StringPrintf(KEY_FILE_EXTRA_NEW_LINE
Paul Stewartdab3b5a2012-07-11 18:25:10 -0700494 "[%s]\n"
495 "%s=%s\n",
496 kGroup, kKey,
497 base::Uint64ToString(kValue).c_str()),
498 ReadKeyFile());
499}
500
Darin Petkovb2841fd2011-06-30 12:54:12 -0700501TEST_F(KeyFileStoreTest, GetStringList) {
502 static const char kGroup[] = "string-lists";
503 static const char kKeyEmpty[] = "empty";
504 static const char kKeyEmptyValue[] = "empty-value";
505 static const char kKeyValueEmpty[] = "value-empty";
506 static const char kKeyValueEmptyValue[] = "value-empty-value";
507 static const char kKeyValues[] = "values";
508 static const char kValue[] = "value";
509 static const char kValue2[] = "value2";
510 static const char kValue3[] = "value3";
511 WriteKeyFile(base::StringPrintf("[%s]\n"
512 "%s=\n"
513 "%s=;%s\n"
514 "%s=%s;;\n"
515 "%s=%s;;%s\n"
516 "%s=%s;%s;%s\n",
517 kGroup,
518 kKeyEmpty,
519 kKeyEmptyValue, kValue,
520 kKeyValueEmpty, kValue,
521 kKeyValueEmptyValue, kValue, kValue2,
522 kKeyValues, kValue, kValue2, kValue3));
523 ASSERT_TRUE(store_.Open());
524
525 vector<string> value;
526
527 EXPECT_TRUE(store_.GetStringList(kGroup, kKeyValues, &value));
528 ASSERT_EQ(3, value.size());
529 EXPECT_EQ(kValue, value[0]);
530 EXPECT_EQ(kValue2, value[1]);
531 EXPECT_EQ(kValue3, value[2]);
532
533 EXPECT_TRUE(store_.GetStringList(kGroup, kKeyEmptyValue, &value));
534 ASSERT_EQ(2, value.size());
535 EXPECT_EQ("", value[0]);
536 EXPECT_EQ(kValue, value[1]);
537
538 EXPECT_TRUE(store_.GetStringList(kGroup, kKeyValueEmpty, &value));
539 ASSERT_EQ(2, value.size());
540 EXPECT_EQ(kValue, value[0]);
541 EXPECT_EQ("", value[1]);
542
543 EXPECT_TRUE(store_.GetStringList(kGroup, kKeyEmpty, &value));
544 ASSERT_EQ(0, value.size());
545
546 EXPECT_TRUE(store_.GetStringList(kGroup, kKeyValueEmptyValue, &value));
547 ASSERT_EQ(3, value.size());
548 EXPECT_EQ(kValue, value[0]);
549 EXPECT_EQ("", value[1]);
550 EXPECT_EQ(kValue2, value[2]);
551
552 EXPECT_FALSE(store_.GetStringList("unknown-string-lists", kKeyEmpty, &value));
553 EXPECT_FALSE(store_.GetStringList(kGroup, "some-key", &value));
554 EXPECT_TRUE(store_.GetStringList(kGroup, kKeyValues, NULL));
555 ASSERT_TRUE(store_.Close());
556}
557
558TEST_F(KeyFileStoreTest, SetStringList) {
559 static const char kGroup[] = "strings";
560 static const char kKeyEmpty[] = "e";
561 static const char kKeyEmptyValue[] = "ev";
562 static const char kKeyValueEmpty[] = "ve";
563 static const char kKeyValueEmptyValue[] = "vev";
564 static const char kKeyValues[] = "v";
565 static const char kValue[] = "abc";
566 static const char kValue2[] = "pqr";
567 static const char kValue3[] = "xyz";
568 ASSERT_TRUE(store_.Open());
569 {
570 vector<string> value;
571 ASSERT_TRUE(store_.SetStringList(kGroup, kKeyEmpty, value));
572 }
573 {
574 vector<string> value;
575 value.push_back("");
576 value.push_back(kValue);
577 ASSERT_TRUE(store_.SetStringList(kGroup, kKeyEmptyValue, value));
578 }
579 {
580 vector<string> value;
581 value.push_back(kValue);
582 value.push_back("");
583 ASSERT_TRUE(store_.SetStringList(kGroup, kKeyValueEmpty, value));
584 }
585 {
586 vector<string> value;
587 value.push_back(kValue);
588 value.push_back("");
589 value.push_back(kValue2);
590 ASSERT_TRUE(store_.SetStringList(kGroup, kKeyValueEmptyValue, value));
591 }
592 {
593 vector<string> value;
594 value.push_back(kValue);
595 value.push_back(kValue2);
596 value.push_back(kValue3);
597 ASSERT_TRUE(store_.SetStringList(kGroup, kKeyValues, value));
598 }
599 ASSERT_TRUE(store_.Close());
Ben Chanc9638612012-09-13 16:20:46 -0700600 EXPECT_EQ(base::StringPrintf(KEY_FILE_EXTRA_NEW_LINE
Darin Petkovb2841fd2011-06-30 12:54:12 -0700601 "[%s]\n"
602 "%s=\n"
603 "%s=;%s;\n"
604 "%s=%s;;\n"
605 "%s=%s;;%s;\n"
606 "%s=%s;%s;%s;\n",
607 kGroup,
608 kKeyEmpty,
609 kKeyEmptyValue, kValue,
610 kKeyValueEmpty, kValue,
611 kKeyValueEmptyValue, kValue, kValue2,
612 kKeyValues, kValue, kValue2, kValue3),
613 ReadKeyFile());
614}
615
Darin Petkov86964e02011-06-29 13:49:28 -0700616TEST_F(KeyFileStoreTest, GetCryptedString) {
617 static const char kGroup[] = "crypto-group";
618 static const char kKey[] = "secret";
619 WriteKeyFile(base::StringPrintf("[%s]\n"
620 "%s=%s\n",
621 kGroup, kKey, kROT47Text));
622 ASSERT_TRUE(store_.Open());
623 string value;
624 EXPECT_TRUE(store_.GetCryptedString(kGroup, kKey, &value));
625 EXPECT_EQ(kPlainText, value);
626 EXPECT_FALSE(store_.GetCryptedString("something-else", kKey, &value));
627 EXPECT_FALSE(store_.GetCryptedString(kGroup, "non-secret", &value));
628 EXPECT_TRUE(store_.GetCryptedString(kGroup, kKey, NULL));
629 ASSERT_TRUE(store_.Close());
630}
631
632TEST_F(KeyFileStoreTest, SetCryptedString) {
633 static const char kGroup[] = "crypted-string-group";
634 static const char kKey[] = "test-string";
635 ASSERT_TRUE(store_.Open());
636 ASSERT_TRUE(store_.SetCryptedString(kGroup, kKey, kPlainText));
637 ASSERT_TRUE(store_.Close());
Ben Chanc9638612012-09-13 16:20:46 -0700638 EXPECT_EQ(base::StringPrintf(KEY_FILE_EXTRA_NEW_LINE
Darin Petkov86964e02011-06-29 13:49:28 -0700639 "[%s]\n"
640 "%s=%s\n",
641 kGroup, kKey, kROT47Text),
642 ReadKeyFile());
643}
644
Chris Masoneb9c00592011-10-06 13:10:39 -0700645TEST_F(KeyFileStoreTest, PersistAcrossClose) {
646 static const char kGroup[] = "string-group";
647 static const char kKey1[] = "test-string";
648 static const char kValue1[] = "foo";
649 static const char kKey2[] = "empty-string";
650 static const char kValue2[] = "";
651 ASSERT_TRUE(store_.Open());
652 ASSERT_TRUE(store_.SetString(kGroup, kKey1, kValue1));
653 ASSERT_TRUE(store_.Close());
654 ASSERT_TRUE(store_.Open());
655 ASSERT_TRUE(store_.SetString(kGroup, kKey2, kValue2));
656 string value;
657 ASSERT_TRUE(store_.GetString(kGroup, kKey1, &value));
658 ASSERT_EQ(kValue1, value);
659 ASSERT_TRUE(store_.GetString(kGroup, kKey2, &value));
660 ASSERT_EQ(kValue2, value);
661 ASSERT_TRUE(store_.Close());
662}
663
664bool KeyFileStoreTest::OpenCheckClose(const string &group,
665 const string &key,
666 const string &expected_value) {
667 KeyFileStore store(&glib_);
668 store.set_path(test_file_);
669 EXPECT_TRUE(store.Open());
670 string value;
671 bool could_get = store.GetString(group, key, &value);
672 store.set_path(FilePath("")); // Don't persist to disk.
673 store.Close();
674 return could_get && expected_value == value;
675}
676
677TEST_F(KeyFileStoreTest, Flush) {
678 static const char kGroup[] = "string-group";
679 static const char kKey1[] = "test-string";
680 static const char kValue1[] = "foo";
681 static const char kKey2[] = "empty-string";
682 static const char kValue2[] = "";
683 ASSERT_TRUE(store_.Open());
684 ASSERT_TRUE(store_.SetString(kGroup, kKey1, kValue1));
685 ASSERT_TRUE(store_.Flush());
686 ASSERT_TRUE(OpenCheckClose(kGroup, kKey1, kValue1));
687
688 ASSERT_TRUE(store_.SetString(kGroup, kKey2, kValue2));
689 ASSERT_TRUE(store_.Flush());
690 ASSERT_TRUE(OpenCheckClose(kGroup, kKey2, kValue2));
691
692 EXPECT_TRUE(store_.DeleteKey(kGroup, kKey1));
693 ASSERT_TRUE(store_.Flush());
694 ASSERT_FALSE(OpenCheckClose(kGroup, kKey1, kValue1));
695}
696
Paul Stewart5dc40aa2011-10-28 19:43:43 -0700697TEST_F(KeyFileStoreTest, EmptyFile) {
698 ASSERT_TRUE(store_.Open());
699 ASSERT_TRUE(store_.Close());
700 EXPECT_FALSE(store_.IsNonEmpty());
701}
702
703TEST_F(KeyFileStoreTest, SetHeader) {
704 ASSERT_TRUE(store_.Open());
705 ASSERT_TRUE(store_.SetHeader("this is a test"));
706 ASSERT_TRUE(store_.Close());
707 EXPECT_TRUE(store_.IsNonEmpty());
708 ASSERT_TRUE(store_.Open());
709}
710
Darin Petkov083047b2011-06-23 20:42:48 -0700711TEST_F(KeyFileStoreTest, Combo) {
712 static const char kGroupA[] = "square";
713 static const char kGroupB[] = "circle";
714 static const char kGroupC[] = "triangle";
715 static const char kGroupX[] = "pentagon";
716 static const char kKeyString[] = "color";
Darin Petkovb2841fd2011-06-30 12:54:12 -0700717 static const char kKeyStringList[] = "alternative-colors";
Darin Petkov083047b2011-06-23 20:42:48 -0700718 static const char kKeyInt[] = "area";
719 static const char kKeyBool[] = "visible";
720 static const char kValueStringA[] = "blue";
721 static const char kValueStringB[] = "red";
722 static const char kValueStringC[] = "yellow";
723 static const char kValueStringCNew[] = "purple";
724 const int kValueIntA = 5;
725 const int kValueIntB = 10;
726 const int kValueIntBNew = 333;
727 WriteKeyFile(base::StringPrintf("[%s]\n"
728 "%s=%s\n"
Darin Petkovb2841fd2011-06-30 12:54:12 -0700729 "%s=%s;%s\n"
Darin Petkov083047b2011-06-23 20:42:48 -0700730 "%s=%d\n"
731 "[%s]\n"
732 "%s=%s\n"
Darin Petkovb2841fd2011-06-30 12:54:12 -0700733 "%s=%s;%s\n"
Darin Petkov083047b2011-06-23 20:42:48 -0700734 "%s=%d\n"
735 "%s=true\n"
736 "[%s]\n"
737 "%s=%s\n"
738 "%s=false\n",
739 kGroupA,
740 kKeyString, kValueStringA,
Darin Petkovb2841fd2011-06-30 12:54:12 -0700741 kKeyStringList, kValueStringB, kValueStringC,
Darin Petkov083047b2011-06-23 20:42:48 -0700742 kKeyInt, kValueIntA,
743 kGroupB,
744 kKeyString, kValueStringB,
Darin Petkovb2841fd2011-06-30 12:54:12 -0700745 kKeyStringList, kValueStringA, kValueStringC,
Darin Petkov083047b2011-06-23 20:42:48 -0700746 kKeyInt, kValueIntB,
747 kKeyBool,
748 kGroupC,
749 kKeyString, kValueStringC,
750 kKeyBool));
751 ASSERT_TRUE(store_.Open());
752
753 EXPECT_TRUE(store_.ContainsGroup(kGroupA));
754 EXPECT_TRUE(store_.ContainsGroup(kGroupB));
755 EXPECT_TRUE(store_.ContainsGroup(kGroupC));
756 EXPECT_FALSE(store_.ContainsGroup(kGroupX));
757
758 set<string> groups = store_.GetGroups();
759 EXPECT_EQ(3, groups.size());
760 EXPECT_TRUE(ContainsKey(groups, kGroupA));
761 EXPECT_TRUE(ContainsKey(groups, kGroupB));
762 EXPECT_TRUE(ContainsKey(groups, kGroupC));
763 EXPECT_FALSE(ContainsKey(groups, kGroupX));
764
765 {
766 string value;
767 EXPECT_TRUE(store_.GetString(kGroupB, kKeyString, &value));
768 EXPECT_EQ(kValueStringB, value);
769 EXPECT_TRUE(store_.GetString(kGroupA, kKeyString, &value));
770 EXPECT_EQ(kValueStringA, value);
771 EXPECT_TRUE(store_.GetString(kGroupC, kKeyString, &value));
772 EXPECT_EQ(kValueStringC, value);
773 }
774 {
Darin Petkovb2841fd2011-06-30 12:54:12 -0700775 vector<string> value;
776 EXPECT_TRUE(store_.GetStringList(kGroupB, kKeyStringList, &value));
777 ASSERT_EQ(2, value.size());
778 EXPECT_EQ(kValueStringA, value[0]);
779 EXPECT_EQ(kValueStringC, value[1]);
780 EXPECT_TRUE(store_.GetStringList(kGroupA, kKeyStringList, &value));
781 ASSERT_EQ(2, value.size());
782 EXPECT_EQ(kValueStringB, value[0]);
783 EXPECT_EQ(kValueStringC, value[1]);
784 EXPECT_FALSE(store_.GetStringList(kGroupC, kKeyStringList, &value));
785 }
786 {
Darin Petkov083047b2011-06-23 20:42:48 -0700787 int value = 0;
788 EXPECT_TRUE(store_.GetInt(kGroupB, kKeyInt, &value));
789 EXPECT_EQ(kValueIntB, value);
790 EXPECT_TRUE(store_.GetInt(kGroupA, kKeyInt, &value));
791 EXPECT_EQ(kValueIntA, value);
792 EXPECT_FALSE(store_.GetInt(kGroupC, kKeyInt, &value));
793 }
794 {
795 bool value = false;
796 EXPECT_TRUE(store_.GetBool(kGroupB, kKeyBool, &value));
797 EXPECT_TRUE(value);
798 EXPECT_TRUE(store_.GetBool(kGroupC, kKeyBool, &value));
799 EXPECT_FALSE(value);
800 EXPECT_FALSE(store_.GetBool(kGroupA, kKeyBool, &value));
801 }
802
803 EXPECT_TRUE(store_.DeleteGroup(kGroupA));
Chris Masone9d779932011-08-25 16:33:41 -0700804 EXPECT_TRUE(store_.DeleteGroup(kGroupA));
Darin Petkov083047b2011-06-23 20:42:48 -0700805
806 EXPECT_FALSE(store_.ContainsGroup(kGroupA));
807 EXPECT_TRUE(store_.ContainsGroup(kGroupB));
808 EXPECT_TRUE(store_.ContainsGroup(kGroupC));
809
810 groups = store_.GetGroups();
811 EXPECT_EQ(2, groups.size());
812 EXPECT_FALSE(ContainsKey(groups, kGroupA));
813 EXPECT_TRUE(ContainsKey(groups, kGroupB));
814 EXPECT_TRUE(ContainsKey(groups, kGroupC));
815
816 EXPECT_TRUE(store_.SetBool(kGroupB, kKeyBool, false));
817 EXPECT_TRUE(store_.SetInt(kGroupB, kKeyInt, kValueIntBNew));
818 EXPECT_TRUE(store_.SetString(kGroupC, kKeyString, kValueStringCNew));
Darin Petkovb2841fd2011-06-30 12:54:12 -0700819 store_.SetStringList(kGroupB,
820 kKeyStringList,
821 vector<string>(1, kValueStringB));
Darin Petkov083047b2011-06-23 20:42:48 -0700822
823 EXPECT_TRUE(store_.DeleteKey(kGroupB, kKeyString));
Chris Masone9d779932011-08-25 16:33:41 -0700824 EXPECT_TRUE(store_.DeleteKey(kGroupB, kKeyString));
Darin Petkov083047b2011-06-23 20:42:48 -0700825
826 {
827 string value;
828 EXPECT_FALSE(store_.GetString(kGroupB, kKeyString, &value));
829 EXPECT_FALSE(store_.GetString(kGroupA, kKeyString, &value));
830 EXPECT_TRUE(store_.GetString(kGroupC, kKeyString, &value));
831 EXPECT_EQ(kValueStringCNew, value);
832 }
Darin Petkovb2841fd2011-06-30 12:54:12 -0700833 {
834 vector<string> value;
835 EXPECT_TRUE(store_.GetStringList(kGroupB, kKeyStringList, &value));
836 ASSERT_EQ(1, value.size());
837 EXPECT_EQ(kValueStringB, value[0]);
838 EXPECT_FALSE(store_.GetStringList(kGroupA, kKeyStringList, &value));
839 EXPECT_FALSE(store_.GetStringList(kGroupC, kKeyStringList, &value));
840 }
Darin Petkov083047b2011-06-23 20:42:48 -0700841 {
842 int value = 0;
843 EXPECT_TRUE(store_.GetInt(kGroupB, kKeyInt, &value));
844 EXPECT_EQ(kValueIntBNew, value);
845 EXPECT_FALSE(store_.GetInt(kGroupA, kKeyInt, &value));
846 EXPECT_FALSE(store_.GetInt(kGroupC, kKeyInt, &value));
847 }
Darin Petkov083047b2011-06-23 20:42:48 -0700848 {
849 bool value = false;
850 EXPECT_TRUE(store_.GetBool(kGroupB, kKeyBool, &value));
851 EXPECT_FALSE(value);
852 EXPECT_TRUE(store_.GetBool(kGroupC, kKeyBool, &value));
853 EXPECT_FALSE(value);
854 EXPECT_FALSE(store_.GetBool(kGroupA, kKeyBool, &value));
855 }
856
857 ASSERT_TRUE(store_.Close());
Ben Chanc9638612012-09-13 16:20:46 -0700858 EXPECT_EQ(base::StringPrintf(KEY_FILE_EXTRA_NEW_LINE
Darin Petkov083047b2011-06-23 20:42:48 -0700859 "[%s]\n"
Darin Petkovb2841fd2011-06-30 12:54:12 -0700860 "%s=%s;\n"
Darin Petkov083047b2011-06-23 20:42:48 -0700861 "%s=%d\n"
862 "%s=false\n"
863 "\n"
864 "[%s]\n"
865 "%s=%s\n"
866 "%s=false\n",
867 kGroupB,
Darin Petkovb2841fd2011-06-30 12:54:12 -0700868 kKeyStringList, kValueStringB,
Darin Petkov083047b2011-06-23 20:42:48 -0700869 kKeyInt, kValueIntBNew,
870 kKeyBool,
871 kGroupC,
872 kKeyString, kValueStringCNew,
873 kKeyBool),
874 ReadKeyFile());
875}
876
877} // namespace shill