blob: a2060607557c0b67eb0a3cc137348069c9b5dd09 [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
5#include <base/file_util.h>
6#include <base/stl_util-inl.h>
7#include <base/stringprintf.h>
8#include <base/memory/scoped_temp_dir.h>
9#include <gtest/gtest.h>
10
11#include "shill/key_file_store.h"
12
13using std::set;
14using std::string;
15using testing::Test;
16
17namespace shill {
18
Darin Petkov86964e02011-06-29 13:49:28 -070019namespace {
20const char kPlainText[] = "This is a test!";
21const char kROT47Text[] = "rot47:%9:D :D 2 E6DEP";
22} // namespace {}
23
Darin Petkov083047b2011-06-23 20:42:48 -070024class KeyFileStoreTest : public Test {
25 public:
26 KeyFileStoreTest() : store_(&glib_) {}
27
28 virtual void SetUp() {
29 ASSERT_TRUE(temp_dir_.CreateUniqueTempDir());
30 store_.set_path(temp_dir_.path().Append("test-key-file-store"));
31 }
32
33 virtual void TearDown() {
34 store_.set_path(FilePath("")); // Don't try to save the store.
35 ASSERT_TRUE(temp_dir_.Delete());
36 }
37
38 protected:
39 string ReadKeyFile();
40 void WriteKeyFile(string data);
41
42 GLib glib_; // Use real GLib for testing KeyFileStore.
43 ScopedTempDir temp_dir_;
44 KeyFileStore store_;
45};
46
47string KeyFileStoreTest::ReadKeyFile() {
48 string data;
49 EXPECT_TRUE(file_util::ReadFileToString(store_.path(), &data));
50 return data;
51}
52
53void KeyFileStoreTest::WriteKeyFile(string data) {
54 EXPECT_EQ(data.size(),
55 file_util::WriteFile(store_.path(), data.data(), data.size()));
56}
57
58TEST_F(KeyFileStoreTest, OpenClose) {
59 EXPECT_FALSE(store_.key_file_);
60
61 ASSERT_TRUE(store_.Open());
62 EXPECT_TRUE(store_.key_file_);
Darin Petkov86964e02011-06-29 13:49:28 -070063 EXPECT_EQ(1, store_.crypto_.cryptos_.size());
Darin Petkov083047b2011-06-23 20:42:48 -070064 ASSERT_TRUE(store_.Close());
65 EXPECT_FALSE(store_.key_file_);
66
67 ASSERT_TRUE(store_.Open());
68 EXPECT_TRUE(store_.key_file_);
69 ASSERT_TRUE(store_.Close());
70 EXPECT_FALSE(store_.key_file_);
71
72 ASSERT_TRUE(store_.Open());
73 store_.set_path(FilePath(""));
74 ASSERT_FALSE(store_.Close());
75 EXPECT_FALSE(store_.key_file_);
76}
77
78TEST_F(KeyFileStoreTest, OpenFail) {
79 WriteKeyFile("garbage\n");
80 EXPECT_FALSE(store_.Open());
81 EXPECT_FALSE(store_.key_file_);
82}
83
84TEST_F(KeyFileStoreTest, GetGroups) {
85 static const char kGroupA[] = "g-a";
86 static const char kGroupB[] = "g-b";
87 static const char kGroupC[] = "g-c";
88 WriteKeyFile(base::StringPrintf("[%s]\n"
89 "[%s]\n"
90 "[%s]\n",
91 kGroupA, kGroupB, kGroupC));
92 ASSERT_TRUE(store_.Open());
93 set<string> groups = store_.GetGroups();
94 EXPECT_EQ(3, groups.size());
95 EXPECT_TRUE(ContainsKey(groups, kGroupA));
96 EXPECT_TRUE(ContainsKey(groups, kGroupB));
97 EXPECT_TRUE(ContainsKey(groups, kGroupC));
98 EXPECT_FALSE(ContainsKey(groups, "g-x"));
99 ASSERT_TRUE(store_.Close());
100}
101
102TEST_F(KeyFileStoreTest, ContainsGroup) {
103 static const char kGroupA[] = "group-a";
104 static const char kGroupB[] = "group-b";
105 static const char kGroupC[] = "group-c";
106 WriteKeyFile(base::StringPrintf("[%s]\n"
107 "[%s]\n"
108 "[%s]\n",
109 kGroupA, kGroupB, kGroupC));
110 ASSERT_TRUE(store_.Open());
111 EXPECT_TRUE(store_.ContainsGroup(kGroupA));
112 EXPECT_TRUE(store_.ContainsGroup(kGroupB));
113 EXPECT_TRUE(store_.ContainsGroup(kGroupC));
114 EXPECT_FALSE(store_.ContainsGroup("group-d"));
115 ASSERT_TRUE(store_.Close());
116}
117
118TEST_F(KeyFileStoreTest, DeleteKey) {
119 static const char kGroup[] = "the-group";
120 static const char kKeyDead[] = "dead";
121 static const char kKeyAlive[] = "alive";
122 const int kValueAlive = 3;
123 WriteKeyFile(base::StringPrintf("[%s]\n"
124 "%s=5\n"
125 "%s=%d\n",
126 kGroup, kKeyDead, kKeyAlive, kValueAlive));
127 ASSERT_TRUE(store_.Open());
128 EXPECT_TRUE(store_.DeleteKey(kGroup, kKeyDead));
129 EXPECT_FALSE(store_.DeleteKey(kGroup, "random-key"));
130 EXPECT_FALSE(store_.DeleteKey("random-group", kKeyAlive));
131 ASSERT_TRUE(store_.Close());
132 EXPECT_EQ(base::StringPrintf("\n"
133 "[%s]\n"
134 "%s=%d\n",
135 kGroup, kKeyAlive, kValueAlive),
136 ReadKeyFile());
137}
138
139TEST_F(KeyFileStoreTest, DeleteGroup) {
140 static const char kGroupA[] = "group-a";
141 static const char kGroupB[] = "group-b";
142 static const char kGroupC[] = "group-c";
143 WriteKeyFile(base::StringPrintf("[%s]\n"
144 "[%s]\n"
145 "key-to-be-deleted=true\n"
146 "[%s]\n",
147 kGroupA, kGroupB, kGroupC));
148 ASSERT_TRUE(store_.Open());
149 EXPECT_TRUE(store_.DeleteGroup(kGroupB));
150 EXPECT_FALSE(store_.DeleteGroup("group-d"));
151 ASSERT_TRUE(store_.Close());
152 EXPECT_EQ(base::StringPrintf("\n"
153 "[%s]\n"
154 "\n"
155 "[%s]\n",
156 kGroupA, kGroupC),
157 ReadKeyFile());
158}
159
160TEST_F(KeyFileStoreTest, GetString) {
161 static const char kGroup[] = "something";
162 static const char kKey[] = "foo";
163 static const char kValue[] = "bar";
164 WriteKeyFile(base::StringPrintf("[%s]\n"
165 "%s=%s\n",
166 kGroup, kKey, kValue));
167 ASSERT_TRUE(store_.Open());
168 string value;
169 EXPECT_TRUE(store_.GetString(kGroup, kKey, &value));
170 EXPECT_EQ(kValue, value);
171 EXPECT_FALSE(store_.GetString("something-else", kKey, &value));
172 EXPECT_FALSE(store_.GetString(kGroup, "bar", &value));
173 EXPECT_TRUE(store_.GetString(kGroup, kKey, NULL));
174 ASSERT_TRUE(store_.Close());
175}
176
177TEST_F(KeyFileStoreTest, SetString) {
178 static const char kGroup[] = "string-group";
179 static const char kKey1[] = "test-string";
180 static const char kValue1[] = "foo";
181 static const char kKey2[] = "empty-string";
182 static const char kValue2[] = "";
183 ASSERT_TRUE(store_.Open());
184 ASSERT_TRUE(store_.SetString(kGroup, kKey1, kValue1));
185 ASSERT_TRUE(store_.SetString(kGroup, kKey2, kValue2));
186 ASSERT_TRUE(store_.Close());
187 EXPECT_EQ(base::StringPrintf("\n"
188 "[%s]\n"
189 "%s=%s\n"
190 "%s=%s\n",
191 kGroup, kKey1, kValue1, kKey2, kValue2),
192 ReadKeyFile());
193}
194
195TEST_F(KeyFileStoreTest, GetBool) {
196 static const char kGroup[] = "boo";
197 static const char kKeyTrue[] = "foo";
198 static const char kKeyFalse[] = "bar";
199 static const char kKeyBad[] = "zoo";
200 WriteKeyFile(base::StringPrintf("[%s]\n"
201 "%s=true\n"
202 "%s=false\n"
203 "%s=moo\n",
204 kGroup, kKeyTrue, kKeyFalse, kKeyBad));
205 ASSERT_TRUE(store_.Open());
206 {
207 bool value = true;
208 EXPECT_TRUE(store_.GetBool(kGroup, kKeyFalse, &value));
209 EXPECT_FALSE(value);
210 }
211 {
212 bool value = false;
213 EXPECT_TRUE(store_.GetBool(kGroup, kKeyTrue, &value));
214 EXPECT_TRUE(value);
215 }
216 {
217 bool value;
218 EXPECT_FALSE(store_.GetBool(kGroup, kKeyBad, &value));
219 EXPECT_FALSE(store_.GetBool(kGroup, "unknown", &value));
220 EXPECT_FALSE(store_.GetBool("unknown", kKeyTrue, &value));
221 }
222 EXPECT_TRUE(store_.GetBool(kGroup, kKeyFalse, NULL));
223 ASSERT_TRUE(store_.Close());
224}
225
226TEST_F(KeyFileStoreTest, SetBool) {
227 static const char kGroup[] = "bool-group";
228 static const char kKeyTrue[] = "test-true-bool";
229 static const char kKeyFalse[] = "test-false-bool";
230 ASSERT_TRUE(store_.Open());
231 ASSERT_TRUE(store_.SetBool(kGroup, kKeyTrue, true));
232 ASSERT_TRUE(store_.SetBool(kGroup, kKeyFalse, false));
233 ASSERT_TRUE(store_.Close());
234 EXPECT_EQ(base::StringPrintf("\n"
235 "[%s]\n"
236 "%s=true\n"
237 "%s=false\n",
238 kGroup, kKeyTrue, kKeyFalse),
239 ReadKeyFile());
240}
241
242TEST_F(KeyFileStoreTest, GetInt) {
243 static const char kGroup[] = "numbers";
244 static const char kKeyPos[] = "pos";
245 static const char kKeyNeg[] = "neg";
246 static const char kKeyBad[] = "bad";
247 const int kValuePos = 50;
248 const int kValueNeg = -20;
249 static const char kValueBad[] = "nan";
250 WriteKeyFile(base::StringPrintf("[%s]\n"
251 "%s=%d\n"
252 "%s=%d\n"
253 "%s=%s\n",
254 kGroup,
255 kKeyPos, kValuePos,
256 kKeyNeg, kValueNeg,
257 kKeyBad, kValueBad));
258 ASSERT_TRUE(store_.Open());
259 {
260 int value = 0;
261 EXPECT_TRUE(store_.GetInt(kGroup, kKeyNeg, &value));
262 EXPECT_EQ(kValueNeg, value);
263 }
264 {
265 int value = 0;
266 EXPECT_TRUE(store_.GetInt(kGroup, kKeyPos, &value));
267 EXPECT_EQ(kValuePos, value);
268 }
269 {
270 int value;
271 EXPECT_FALSE(store_.GetInt(kGroup, kKeyBad, &value));
272 EXPECT_FALSE(store_.GetInt(kGroup, "invalid", &value));
273 EXPECT_FALSE(store_.GetInt("invalid", kKeyPos, &value));
274 }
275 EXPECT_TRUE(store_.GetInt(kGroup, kKeyPos, NULL));
276 ASSERT_TRUE(store_.Close());
277}
278
279TEST_F(KeyFileStoreTest, SetInt) {
280 static const char kGroup[] = "int-group";
281 static const char kKey1[] = "test-int";
282 static const char kKey2[] = "test-negative";
283 const int kValue1 = 5;
284 const int kValue2 = -10;
285 ASSERT_TRUE(store_.Open());
286 ASSERT_TRUE(store_.SetInt(kGroup, kKey1, kValue1));
287 ASSERT_TRUE(store_.SetInt(kGroup, kKey2, kValue2));
288 ASSERT_TRUE(store_.Close());
289 EXPECT_EQ(base::StringPrintf("\n"
290 "[%s]\n"
291 "%s=%d\n"
292 "%s=%d\n",
293 kGroup, kKey1, kValue1, kKey2, kValue2),
294 ReadKeyFile());
295}
296
Darin Petkov86964e02011-06-29 13:49:28 -0700297TEST_F(KeyFileStoreTest, GetCryptedString) {
298 static const char kGroup[] = "crypto-group";
299 static const char kKey[] = "secret";
300 WriteKeyFile(base::StringPrintf("[%s]\n"
301 "%s=%s\n",
302 kGroup, kKey, kROT47Text));
303 ASSERT_TRUE(store_.Open());
304 string value;
305 EXPECT_TRUE(store_.GetCryptedString(kGroup, kKey, &value));
306 EXPECT_EQ(kPlainText, value);
307 EXPECT_FALSE(store_.GetCryptedString("something-else", kKey, &value));
308 EXPECT_FALSE(store_.GetCryptedString(kGroup, "non-secret", &value));
309 EXPECT_TRUE(store_.GetCryptedString(kGroup, kKey, NULL));
310 ASSERT_TRUE(store_.Close());
311}
312
313TEST_F(KeyFileStoreTest, SetCryptedString) {
314 static const char kGroup[] = "crypted-string-group";
315 static const char kKey[] = "test-string";
316 ASSERT_TRUE(store_.Open());
317 ASSERT_TRUE(store_.SetCryptedString(kGroup, kKey, kPlainText));
318 ASSERT_TRUE(store_.Close());
319 EXPECT_EQ(base::StringPrintf("\n"
320 "[%s]\n"
321 "%s=%s\n",
322 kGroup, kKey, kROT47Text),
323 ReadKeyFile());
324}
325
Darin Petkov083047b2011-06-23 20:42:48 -0700326TEST_F(KeyFileStoreTest, Combo) {
327 static const char kGroupA[] = "square";
328 static const char kGroupB[] = "circle";
329 static const char kGroupC[] = "triangle";
330 static const char kGroupX[] = "pentagon";
331 static const char kKeyString[] = "color";
332 static const char kKeyInt[] = "area";
333 static const char kKeyBool[] = "visible";
334 static const char kValueStringA[] = "blue";
335 static const char kValueStringB[] = "red";
336 static const char kValueStringC[] = "yellow";
337 static const char kValueStringCNew[] = "purple";
338 const int kValueIntA = 5;
339 const int kValueIntB = 10;
340 const int kValueIntBNew = 333;
341 WriteKeyFile(base::StringPrintf("[%s]\n"
342 "%s=%s\n"
343 "%s=%d\n"
344 "[%s]\n"
345 "%s=%s\n"
346 "%s=%d\n"
347 "%s=true\n"
348 "[%s]\n"
349 "%s=%s\n"
350 "%s=false\n",
351 kGroupA,
352 kKeyString, kValueStringA,
353 kKeyInt, kValueIntA,
354 kGroupB,
355 kKeyString, kValueStringB,
356 kKeyInt, kValueIntB,
357 kKeyBool,
358 kGroupC,
359 kKeyString, kValueStringC,
360 kKeyBool));
361 ASSERT_TRUE(store_.Open());
362
363 EXPECT_TRUE(store_.ContainsGroup(kGroupA));
364 EXPECT_TRUE(store_.ContainsGroup(kGroupB));
365 EXPECT_TRUE(store_.ContainsGroup(kGroupC));
366 EXPECT_FALSE(store_.ContainsGroup(kGroupX));
367
368 set<string> groups = store_.GetGroups();
369 EXPECT_EQ(3, groups.size());
370 EXPECT_TRUE(ContainsKey(groups, kGroupA));
371 EXPECT_TRUE(ContainsKey(groups, kGroupB));
372 EXPECT_TRUE(ContainsKey(groups, kGroupC));
373 EXPECT_FALSE(ContainsKey(groups, kGroupX));
374
375 {
376 string value;
377 EXPECT_TRUE(store_.GetString(kGroupB, kKeyString, &value));
378 EXPECT_EQ(kValueStringB, value);
379 EXPECT_TRUE(store_.GetString(kGroupA, kKeyString, &value));
380 EXPECT_EQ(kValueStringA, value);
381 EXPECT_TRUE(store_.GetString(kGroupC, kKeyString, &value));
382 EXPECT_EQ(kValueStringC, value);
383 }
384 {
385 int value = 0;
386 EXPECT_TRUE(store_.GetInt(kGroupB, kKeyInt, &value));
387 EXPECT_EQ(kValueIntB, value);
388 EXPECT_TRUE(store_.GetInt(kGroupA, kKeyInt, &value));
389 EXPECT_EQ(kValueIntA, value);
390 EXPECT_FALSE(store_.GetInt(kGroupC, kKeyInt, &value));
391 }
392 {
393 bool value = false;
394 EXPECT_TRUE(store_.GetBool(kGroupB, kKeyBool, &value));
395 EXPECT_TRUE(value);
396 EXPECT_TRUE(store_.GetBool(kGroupC, kKeyBool, &value));
397 EXPECT_FALSE(value);
398 EXPECT_FALSE(store_.GetBool(kGroupA, kKeyBool, &value));
399 }
400
401 EXPECT_TRUE(store_.DeleteGroup(kGroupA));
402 EXPECT_FALSE(store_.DeleteGroup(kGroupA));
403
404 EXPECT_FALSE(store_.ContainsGroup(kGroupA));
405 EXPECT_TRUE(store_.ContainsGroup(kGroupB));
406 EXPECT_TRUE(store_.ContainsGroup(kGroupC));
407
408 groups = store_.GetGroups();
409 EXPECT_EQ(2, groups.size());
410 EXPECT_FALSE(ContainsKey(groups, kGroupA));
411 EXPECT_TRUE(ContainsKey(groups, kGroupB));
412 EXPECT_TRUE(ContainsKey(groups, kGroupC));
413
414 EXPECT_TRUE(store_.SetBool(kGroupB, kKeyBool, false));
415 EXPECT_TRUE(store_.SetInt(kGroupB, kKeyInt, kValueIntBNew));
416 EXPECT_TRUE(store_.SetString(kGroupC, kKeyString, kValueStringCNew));
417
418 EXPECT_TRUE(store_.DeleteKey(kGroupB, kKeyString));
419 EXPECT_FALSE(store_.DeleteKey(kGroupB, kKeyString));
420
421 {
422 string value;
423 EXPECT_FALSE(store_.GetString(kGroupB, kKeyString, &value));
424 EXPECT_FALSE(store_.GetString(kGroupA, kKeyString, &value));
425 EXPECT_TRUE(store_.GetString(kGroupC, kKeyString, &value));
426 EXPECT_EQ(kValueStringCNew, value);
427 }
428
429 {
430 int value = 0;
431 EXPECT_TRUE(store_.GetInt(kGroupB, kKeyInt, &value));
432 EXPECT_EQ(kValueIntBNew, value);
433 EXPECT_FALSE(store_.GetInt(kGroupA, kKeyInt, &value));
434 EXPECT_FALSE(store_.GetInt(kGroupC, kKeyInt, &value));
435 }
436
437 {
438 bool value = false;
439 EXPECT_TRUE(store_.GetBool(kGroupB, kKeyBool, &value));
440 EXPECT_FALSE(value);
441 EXPECT_TRUE(store_.GetBool(kGroupC, kKeyBool, &value));
442 EXPECT_FALSE(value);
443 EXPECT_FALSE(store_.GetBool(kGroupA, kKeyBool, &value));
444 }
445
446 ASSERT_TRUE(store_.Close());
447 EXPECT_EQ(base::StringPrintf("\n"
448 "[%s]\n"
449 "%s=%d\n"
450 "%s=false\n"
451 "\n"
452 "[%s]\n"
453 "%s=%s\n"
454 "%s=false\n",
455 kGroupB,
456 kKeyInt, kValueIntBNew,
457 kKeyBool,
458 kGroupC,
459 kKeyString, kValueStringCNew,
460 kKeyBool),
461 ReadKeyFile());
462}
463
464} // namespace shill