blob: 9e525587f2e6a5604e86844596834b0b943a75a7 [file] [log] [blame]
// Copyright (c) 2011 The Chromium OS Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include <base/file_util.h>
#include <base/stl_util-inl.h>
#include <base/stringprintf.h>
#include <base/memory/scoped_temp_dir.h>
#include <gtest/gtest.h>
#include "shill/key_file_store.h"
using std::set;
using std::string;
using testing::Test;
namespace shill {
class KeyFileStoreTest : public Test {
public:
KeyFileStoreTest() : store_(&glib_) {}
virtual void SetUp() {
ASSERT_TRUE(temp_dir_.CreateUniqueTempDir());
store_.set_path(temp_dir_.path().Append("test-key-file-store"));
}
virtual void TearDown() {
store_.set_path(FilePath("")); // Don't try to save the store.
ASSERT_TRUE(temp_dir_.Delete());
}
protected:
string ReadKeyFile();
void WriteKeyFile(string data);
GLib glib_; // Use real GLib for testing KeyFileStore.
ScopedTempDir temp_dir_;
KeyFileStore store_;
};
string KeyFileStoreTest::ReadKeyFile() {
string data;
EXPECT_TRUE(file_util::ReadFileToString(store_.path(), &data));
return data;
}
void KeyFileStoreTest::WriteKeyFile(string data) {
EXPECT_EQ(data.size(),
file_util::WriteFile(store_.path(), data.data(), data.size()));
}
TEST_F(KeyFileStoreTest, OpenClose) {
EXPECT_FALSE(store_.key_file_);
ASSERT_TRUE(store_.Open());
EXPECT_TRUE(store_.key_file_);
ASSERT_TRUE(store_.Close());
EXPECT_FALSE(store_.key_file_);
ASSERT_TRUE(store_.Open());
EXPECT_TRUE(store_.key_file_);
ASSERT_TRUE(store_.Close());
EXPECT_FALSE(store_.key_file_);
ASSERT_TRUE(store_.Open());
store_.set_path(FilePath(""));
ASSERT_FALSE(store_.Close());
EXPECT_FALSE(store_.key_file_);
}
TEST_F(KeyFileStoreTest, OpenFail) {
WriteKeyFile("garbage\n");
EXPECT_FALSE(store_.Open());
EXPECT_FALSE(store_.key_file_);
}
TEST_F(KeyFileStoreTest, GetGroups) {
static const char kGroupA[] = "g-a";
static const char kGroupB[] = "g-b";
static const char kGroupC[] = "g-c";
WriteKeyFile(base::StringPrintf("[%s]\n"
"[%s]\n"
"[%s]\n",
kGroupA, kGroupB, kGroupC));
ASSERT_TRUE(store_.Open());
set<string> groups = store_.GetGroups();
EXPECT_EQ(3, groups.size());
EXPECT_TRUE(ContainsKey(groups, kGroupA));
EXPECT_TRUE(ContainsKey(groups, kGroupB));
EXPECT_TRUE(ContainsKey(groups, kGroupC));
EXPECT_FALSE(ContainsKey(groups, "g-x"));
ASSERT_TRUE(store_.Close());
}
TEST_F(KeyFileStoreTest, ContainsGroup) {
static const char kGroupA[] = "group-a";
static const char kGroupB[] = "group-b";
static const char kGroupC[] = "group-c";
WriteKeyFile(base::StringPrintf("[%s]\n"
"[%s]\n"
"[%s]\n",
kGroupA, kGroupB, kGroupC));
ASSERT_TRUE(store_.Open());
EXPECT_TRUE(store_.ContainsGroup(kGroupA));
EXPECT_TRUE(store_.ContainsGroup(kGroupB));
EXPECT_TRUE(store_.ContainsGroup(kGroupC));
EXPECT_FALSE(store_.ContainsGroup("group-d"));
ASSERT_TRUE(store_.Close());
}
TEST_F(KeyFileStoreTest, DeleteKey) {
static const char kGroup[] = "the-group";
static const char kKeyDead[] = "dead";
static const char kKeyAlive[] = "alive";
const int kValueAlive = 3;
WriteKeyFile(base::StringPrintf("[%s]\n"
"%s=5\n"
"%s=%d\n",
kGroup, kKeyDead, kKeyAlive, kValueAlive));
ASSERT_TRUE(store_.Open());
EXPECT_TRUE(store_.DeleteKey(kGroup, kKeyDead));
EXPECT_FALSE(store_.DeleteKey(kGroup, "random-key"));
EXPECT_FALSE(store_.DeleteKey("random-group", kKeyAlive));
ASSERT_TRUE(store_.Close());
EXPECT_EQ(base::StringPrintf("\n"
"[%s]\n"
"%s=%d\n",
kGroup, kKeyAlive, kValueAlive),
ReadKeyFile());
}
TEST_F(KeyFileStoreTest, DeleteGroup) {
static const char kGroupA[] = "group-a";
static const char kGroupB[] = "group-b";
static const char kGroupC[] = "group-c";
WriteKeyFile(base::StringPrintf("[%s]\n"
"[%s]\n"
"key-to-be-deleted=true\n"
"[%s]\n",
kGroupA, kGroupB, kGroupC));
ASSERT_TRUE(store_.Open());
EXPECT_TRUE(store_.DeleteGroup(kGroupB));
EXPECT_FALSE(store_.DeleteGroup("group-d"));
ASSERT_TRUE(store_.Close());
EXPECT_EQ(base::StringPrintf("\n"
"[%s]\n"
"\n"
"[%s]\n",
kGroupA, kGroupC),
ReadKeyFile());
}
TEST_F(KeyFileStoreTest, GetString) {
static const char kGroup[] = "something";
static const char kKey[] = "foo";
static const char kValue[] = "bar";
WriteKeyFile(base::StringPrintf("[%s]\n"
"%s=%s\n",
kGroup, kKey, kValue));
ASSERT_TRUE(store_.Open());
string value;
EXPECT_TRUE(store_.GetString(kGroup, kKey, &value));
EXPECT_EQ(kValue, value);
EXPECT_FALSE(store_.GetString("something-else", kKey, &value));
EXPECT_FALSE(store_.GetString(kGroup, "bar", &value));
EXPECT_TRUE(store_.GetString(kGroup, kKey, NULL));
ASSERT_TRUE(store_.Close());
}
TEST_F(KeyFileStoreTest, SetString) {
static const char kGroup[] = "string-group";
static const char kKey1[] = "test-string";
static const char kValue1[] = "foo";
static const char kKey2[] = "empty-string";
static const char kValue2[] = "";
ASSERT_TRUE(store_.Open());
ASSERT_TRUE(store_.SetString(kGroup, kKey1, kValue1));
ASSERT_TRUE(store_.SetString(kGroup, kKey2, kValue2));
ASSERT_TRUE(store_.Close());
EXPECT_EQ(base::StringPrintf("\n"
"[%s]\n"
"%s=%s\n"
"%s=%s\n",
kGroup, kKey1, kValue1, kKey2, kValue2),
ReadKeyFile());
}
TEST_F(KeyFileStoreTest, GetBool) {
static const char kGroup[] = "boo";
static const char kKeyTrue[] = "foo";
static const char kKeyFalse[] = "bar";
static const char kKeyBad[] = "zoo";
WriteKeyFile(base::StringPrintf("[%s]\n"
"%s=true\n"
"%s=false\n"
"%s=moo\n",
kGroup, kKeyTrue, kKeyFalse, kKeyBad));
ASSERT_TRUE(store_.Open());
{
bool value = true;
EXPECT_TRUE(store_.GetBool(kGroup, kKeyFalse, &value));
EXPECT_FALSE(value);
}
{
bool value = false;
EXPECT_TRUE(store_.GetBool(kGroup, kKeyTrue, &value));
EXPECT_TRUE(value);
}
{
bool value;
EXPECT_FALSE(store_.GetBool(kGroup, kKeyBad, &value));
EXPECT_FALSE(store_.GetBool(kGroup, "unknown", &value));
EXPECT_FALSE(store_.GetBool("unknown", kKeyTrue, &value));
}
EXPECT_TRUE(store_.GetBool(kGroup, kKeyFalse, NULL));
ASSERT_TRUE(store_.Close());
}
TEST_F(KeyFileStoreTest, SetBool) {
static const char kGroup[] = "bool-group";
static const char kKeyTrue[] = "test-true-bool";
static const char kKeyFalse[] = "test-false-bool";
ASSERT_TRUE(store_.Open());
ASSERT_TRUE(store_.SetBool(kGroup, kKeyTrue, true));
ASSERT_TRUE(store_.SetBool(kGroup, kKeyFalse, false));
ASSERT_TRUE(store_.Close());
EXPECT_EQ(base::StringPrintf("\n"
"[%s]\n"
"%s=true\n"
"%s=false\n",
kGroup, kKeyTrue, kKeyFalse),
ReadKeyFile());
}
TEST_F(KeyFileStoreTest, GetInt) {
static const char kGroup[] = "numbers";
static const char kKeyPos[] = "pos";
static const char kKeyNeg[] = "neg";
static const char kKeyBad[] = "bad";
const int kValuePos = 50;
const int kValueNeg = -20;
static const char kValueBad[] = "nan";
WriteKeyFile(base::StringPrintf("[%s]\n"
"%s=%d\n"
"%s=%d\n"
"%s=%s\n",
kGroup,
kKeyPos, kValuePos,
kKeyNeg, kValueNeg,
kKeyBad, kValueBad));
ASSERT_TRUE(store_.Open());
{
int value = 0;
EXPECT_TRUE(store_.GetInt(kGroup, kKeyNeg, &value));
EXPECT_EQ(kValueNeg, value);
}
{
int value = 0;
EXPECT_TRUE(store_.GetInt(kGroup, kKeyPos, &value));
EXPECT_EQ(kValuePos, value);
}
{
int value;
EXPECT_FALSE(store_.GetInt(kGroup, kKeyBad, &value));
EXPECT_FALSE(store_.GetInt(kGroup, "invalid", &value));
EXPECT_FALSE(store_.GetInt("invalid", kKeyPos, &value));
}
EXPECT_TRUE(store_.GetInt(kGroup, kKeyPos, NULL));
ASSERT_TRUE(store_.Close());
}
TEST_F(KeyFileStoreTest, SetInt) {
static const char kGroup[] = "int-group";
static const char kKey1[] = "test-int";
static const char kKey2[] = "test-negative";
const int kValue1 = 5;
const int kValue2 = -10;
ASSERT_TRUE(store_.Open());
ASSERT_TRUE(store_.SetInt(kGroup, kKey1, kValue1));
ASSERT_TRUE(store_.SetInt(kGroup, kKey2, kValue2));
ASSERT_TRUE(store_.Close());
EXPECT_EQ(base::StringPrintf("\n"
"[%s]\n"
"%s=%d\n"
"%s=%d\n",
kGroup, kKey1, kValue1, kKey2, kValue2),
ReadKeyFile());
}
TEST_F(KeyFileStoreTest, Combo) {
static const char kGroupA[] = "square";
static const char kGroupB[] = "circle";
static const char kGroupC[] = "triangle";
static const char kGroupX[] = "pentagon";
static const char kKeyString[] = "color";
static const char kKeyInt[] = "area";
static const char kKeyBool[] = "visible";
static const char kValueStringA[] = "blue";
static const char kValueStringB[] = "red";
static const char kValueStringC[] = "yellow";
static const char kValueStringCNew[] = "purple";
const int kValueIntA = 5;
const int kValueIntB = 10;
const int kValueIntBNew = 333;
WriteKeyFile(base::StringPrintf("[%s]\n"
"%s=%s\n"
"%s=%d\n"
"[%s]\n"
"%s=%s\n"
"%s=%d\n"
"%s=true\n"
"[%s]\n"
"%s=%s\n"
"%s=false\n",
kGroupA,
kKeyString, kValueStringA,
kKeyInt, kValueIntA,
kGroupB,
kKeyString, kValueStringB,
kKeyInt, kValueIntB,
kKeyBool,
kGroupC,
kKeyString, kValueStringC,
kKeyBool));
ASSERT_TRUE(store_.Open());
EXPECT_TRUE(store_.ContainsGroup(kGroupA));
EXPECT_TRUE(store_.ContainsGroup(kGroupB));
EXPECT_TRUE(store_.ContainsGroup(kGroupC));
EXPECT_FALSE(store_.ContainsGroup(kGroupX));
set<string> groups = store_.GetGroups();
EXPECT_EQ(3, groups.size());
EXPECT_TRUE(ContainsKey(groups, kGroupA));
EXPECT_TRUE(ContainsKey(groups, kGroupB));
EXPECT_TRUE(ContainsKey(groups, kGroupC));
EXPECT_FALSE(ContainsKey(groups, kGroupX));
{
string value;
EXPECT_TRUE(store_.GetString(kGroupB, kKeyString, &value));
EXPECT_EQ(kValueStringB, value);
EXPECT_TRUE(store_.GetString(kGroupA, kKeyString, &value));
EXPECT_EQ(kValueStringA, value);
EXPECT_TRUE(store_.GetString(kGroupC, kKeyString, &value));
EXPECT_EQ(kValueStringC, value);
}
{
int value = 0;
EXPECT_TRUE(store_.GetInt(kGroupB, kKeyInt, &value));
EXPECT_EQ(kValueIntB, value);
EXPECT_TRUE(store_.GetInt(kGroupA, kKeyInt, &value));
EXPECT_EQ(kValueIntA, value);
EXPECT_FALSE(store_.GetInt(kGroupC, kKeyInt, &value));
}
{
bool value = false;
EXPECT_TRUE(store_.GetBool(kGroupB, kKeyBool, &value));
EXPECT_TRUE(value);
EXPECT_TRUE(store_.GetBool(kGroupC, kKeyBool, &value));
EXPECT_FALSE(value);
EXPECT_FALSE(store_.GetBool(kGroupA, kKeyBool, &value));
}
EXPECT_TRUE(store_.DeleteGroup(kGroupA));
EXPECT_FALSE(store_.DeleteGroup(kGroupA));
EXPECT_FALSE(store_.ContainsGroup(kGroupA));
EXPECT_TRUE(store_.ContainsGroup(kGroupB));
EXPECT_TRUE(store_.ContainsGroup(kGroupC));
groups = store_.GetGroups();
EXPECT_EQ(2, groups.size());
EXPECT_FALSE(ContainsKey(groups, kGroupA));
EXPECT_TRUE(ContainsKey(groups, kGroupB));
EXPECT_TRUE(ContainsKey(groups, kGroupC));
EXPECT_TRUE(store_.SetBool(kGroupB, kKeyBool, false));
EXPECT_TRUE(store_.SetInt(kGroupB, kKeyInt, kValueIntBNew));
EXPECT_TRUE(store_.SetString(kGroupC, kKeyString, kValueStringCNew));
EXPECT_TRUE(store_.DeleteKey(kGroupB, kKeyString));
EXPECT_FALSE(store_.DeleteKey(kGroupB, kKeyString));
{
string value;
EXPECT_FALSE(store_.GetString(kGroupB, kKeyString, &value));
EXPECT_FALSE(store_.GetString(kGroupA, kKeyString, &value));
EXPECT_TRUE(store_.GetString(kGroupC, kKeyString, &value));
EXPECT_EQ(kValueStringCNew, value);
}
{
int value = 0;
EXPECT_TRUE(store_.GetInt(kGroupB, kKeyInt, &value));
EXPECT_EQ(kValueIntBNew, value);
EXPECT_FALSE(store_.GetInt(kGroupA, kKeyInt, &value));
EXPECT_FALSE(store_.GetInt(kGroupC, kKeyInt, &value));
}
{
bool value = false;
EXPECT_TRUE(store_.GetBool(kGroupB, kKeyBool, &value));
EXPECT_FALSE(value);
EXPECT_TRUE(store_.GetBool(kGroupC, kKeyBool, &value));
EXPECT_FALSE(value);
EXPECT_FALSE(store_.GetBool(kGroupA, kKeyBool, &value));
}
ASSERT_TRUE(store_.Close());
EXPECT_EQ(base::StringPrintf("\n"
"[%s]\n"
"%s=%d\n"
"%s=false\n"
"\n"
"[%s]\n"
"%s=%s\n"
"%s=false\n",
kGroupB,
kKeyInt, kValueIntBNew,
kKeyBool,
kGroupC,
kKeyString, kValueStringCNew,
kKeyBool),
ReadKeyFile());
}
} // namespace shill