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