1c0beca55d290fe0b1c96d78cbbcf94b05c23f5a5Peter Qiu//
2c0beca55d290fe0b1c96d78cbbcf94b05c23f5a5Peter Qiu// Copyright (C) 2012 The Android Open Source Project
3c0beca55d290fe0b1c96d78cbbcf94b05c23f5a5Peter Qiu//
4c0beca55d290fe0b1c96d78cbbcf94b05c23f5a5Peter Qiu// Licensed under the Apache License, Version 2.0 (the "License");
5c0beca55d290fe0b1c96d78cbbcf94b05c23f5a5Peter Qiu// you may not use this file except in compliance with the License.
6c0beca55d290fe0b1c96d78cbbcf94b05c23f5a5Peter Qiu// You may obtain a copy of the License at
7c0beca55d290fe0b1c96d78cbbcf94b05c23f5a5Peter Qiu//
8c0beca55d290fe0b1c96d78cbbcf94b05c23f5a5Peter Qiu//      http://www.apache.org/licenses/LICENSE-2.0
9c0beca55d290fe0b1c96d78cbbcf94b05c23f5a5Peter Qiu//
10c0beca55d290fe0b1c96d78cbbcf94b05c23f5a5Peter Qiu// Unless required by applicable law or agreed to in writing, software
11c0beca55d290fe0b1c96d78cbbcf94b05c23f5a5Peter Qiu// distributed under the License is distributed on an "AS IS" BASIS,
12c0beca55d290fe0b1c96d78cbbcf94b05c23f5a5Peter Qiu// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13c0beca55d290fe0b1c96d78cbbcf94b05c23f5a5Peter Qiu// See the License for the specific language governing permissions and
14c0beca55d290fe0b1c96d78cbbcf94b05c23f5a5Peter Qiu// limitations under the License.
15c0beca55d290fe0b1c96d78cbbcf94b05c23f5a5Peter Qiu//
16083047b53b55abe96200705618fa724e2e3ce715Darin Petkov
178a7b8be27dd4570b182fb7ea1b4c5c9f107f3f8bChris Masone#include "shill/key_file_store.h"
188a7b8be27dd4570b182fb7ea1b4c5c9f107f3f8bChris Masone
198913328944aab4e1cfbb4d6493f43dfc5e28d935mukesh agrawal#include <sys/stat.h>
208913328944aab4e1cfbb4d6493f43dfc5e28d935mukesh agrawal
210709b5a6bed9f9db0d13b3da77152dbd050edc30mukesh agrawal#include <memory>
228a5322984f2d81bcbfd8d44c59747a11bd9b904bAlex Vakulenko#include <set>
238a5322984f2d81bcbfd8d44c59747a11bd9b904bAlex Vakulenko#include <string>
248a5322984f2d81bcbfd8d44c59747a11bd9b904bAlex Vakulenko#include <vector>
258a5322984f2d81bcbfd8d44c59747a11bd9b904bAlex Vakulenko
26a0ddf46e466bd4ba3d20952f0a6988c680c1af14Ben Chan#include <base/files/file_enumerator.h>
2711c213f3cf64f27a0e42ee6da95e98bd1d4b3202Ben Chan#include <base/files/file_util.h>
285ad1606ad8b3f74b2b7960a3003a2d1ca75d52b8Paul Stewart#include <base/files/scoped_temp_dir.h>
293e20a2341d0aeb7681e4ee0f89eae6817ade2b3bEric Shienbrood#include <base/stl_util.h>
30a0ddf46e466bd4ba3d20952f0a6988c680c1af14Ben Chan#include <base/strings/string_number_conversions.h>
31a0ddf46e466bd4ba3d20952f0a6988c680c1af14Ben Chan#include <base/strings/stringprintf.h>
32083047b53b55abe96200705618fa724e2e3ce715Darin Petkov#include <gtest/gtest.h>
33083047b53b55abe96200705618fa724e2e3ce715Darin Petkov
345b9ec98964b316efa4ed658dcb35a66482f52f56Paul Stewart#include "shill/key_value_store.h"
355b9ec98964b316efa4ed658dcb35a66482f52f56Paul Stewart
36a0ddf46e466bd4ba3d20952f0a6988c680c1af14Ben Chanusing base::FileEnumerator;
370e1cdeae24dd678a5fe27c840802582c0ca45ec0Albert Chaulkusing base::FilePath;
38083047b53b55abe96200705618fa724e2e3ce715Darin Petkovusing std::set;
39083047b53b55abe96200705618fa724e2e3ce715Darin Petkovusing std::string;
400709b5a6bed9f9db0d13b3da77152dbd050edc30mukesh agrawalusing std::unique_ptr;
41b2841fda690034b6952fe56ef1931200bb3b8e12Darin Petkovusing std::vector;
42083047b53b55abe96200705618fa724e2e3ce715Darin Petkovusing testing::Test;
43083047b53b55abe96200705618fa724e2e3ce715Darin Petkov
44083047b53b55abe96200705618fa724e2e3ce715Darin Petkovnamespace shill {
45083047b53b55abe96200705618fa724e2e3ce715Darin Petkov
4686964e0bae1a38c6817243959026603b4b8c69b7Darin Petkovnamespace {
4786964e0bae1a38c6817243959026603b4b8c69b7Darin Petkovconst char kPlainText[] = "This is a test!";
4886964e0bae1a38c6817243959026603b4b8c69b7Darin Petkovconst char kROT47Text[] = "rot47:%9:D :D 2 E6DEP";
498a5322984f2d81bcbfd8d44c59747a11bd9b904bAlex Vakulenko}  // namespace
5086964e0bae1a38c6817243959026603b4b8c69b7Darin Petkov
51083047b53b55abe96200705618fa724e2e3ce715Darin Petkovclass KeyFileStoreTest : public Test {
52083047b53b55abe96200705618fa724e2e3ce715Darin Petkov public:
531a25fac8a1f60f0ed6a52b2f35d1e3489d280d3emukesh agrawal  KeyFileStoreTest() {}
54083047b53b55abe96200705618fa724e2e3ce715Darin Petkov
55083047b53b55abe96200705618fa724e2e3ce715Darin Petkov  virtual void SetUp() {
56083047b53b55abe96200705618fa724e2e3ce715Darin Petkov    ASSERT_TRUE(temp_dir_.CreateUniqueTempDir());
57b9c00597eb1f6d2560f7e88cb0d1f627228840d4Chris Masone    test_file_ = temp_dir_.path().Append("test-key-file-store");
5878e0584ef181fc8a6cfd4d3b54644af21829d2efmukesh agrawal    store_.reset(new KeyFileStore(test_file_));
59083047b53b55abe96200705618fa724e2e3ce715Darin Petkov  }
60083047b53b55abe96200705618fa724e2e3ce715Darin Petkov
61083047b53b55abe96200705618fa724e2e3ce715Darin Petkov  virtual void TearDown() {
62083047b53b55abe96200705618fa724e2e3ce715Darin Petkov    ASSERT_TRUE(temp_dir_.Delete());
63083047b53b55abe96200705618fa724e2e3ce715Darin Petkov  }
64083047b53b55abe96200705618fa724e2e3ce715Darin Petkov
65083047b53b55abe96200705618fa724e2e3ce715Darin Petkov protected:
66083047b53b55abe96200705618fa724e2e3ce715Darin Petkov  string ReadKeyFile();
67083047b53b55abe96200705618fa724e2e3ce715Darin Petkov  void WriteKeyFile(string data);
68083047b53b55abe96200705618fa724e2e3ce715Darin Petkov
695ad1606ad8b3f74b2b7960a3003a2d1ca75d52b8Paul Stewart  base::ScopedTempDir temp_dir_;
70b9c00597eb1f6d2560f7e88cb0d1f627228840d4Chris Masone  FilePath test_file_;
710709b5a6bed9f9db0d13b3da77152dbd050edc30mukesh agrawal  unique_ptr<KeyFileStore> store_;
72083047b53b55abe96200705618fa724e2e3ce715Darin Petkov};
73083047b53b55abe96200705618fa724e2e3ce715Darin Petkov
74083047b53b55abe96200705618fa724e2e3ce715Darin Petkovstring KeyFileStoreTest::ReadKeyFile() {
75083047b53b55abe96200705618fa724e2e3ce715Darin Petkov  string data;
7661bd113b69390e97802413f21b9de8041195158dmukesh agrawal  EXPECT_TRUE(base::ReadFileToString(test_file_, &data));
77083047b53b55abe96200705618fa724e2e3ce715Darin Petkov  return data;
78083047b53b55abe96200705618fa724e2e3ce715Darin Petkov}
79083047b53b55abe96200705618fa724e2e3ce715Darin Petkov
80083047b53b55abe96200705618fa724e2e3ce715Darin Petkovvoid KeyFileStoreTest::WriteKeyFile(string data) {
81083047b53b55abe96200705618fa724e2e3ce715Darin Petkov  EXPECT_EQ(data.size(),
8261bd113b69390e97802413f21b9de8041195158dmukesh agrawal            base::WriteFile(test_file_, data.data(), data.size()));
83083047b53b55abe96200705618fa724e2e3ce715Darin Petkov}
84083047b53b55abe96200705618fa724e2e3ce715Darin Petkov
85083047b53b55abe96200705618fa724e2e3ce715Darin PetkovTEST_F(KeyFileStoreTest, OpenClose) {
860709b5a6bed9f9db0d13b3da77152dbd050edc30mukesh agrawal  EXPECT_FALSE(store_->key_file_);
870709b5a6bed9f9db0d13b3da77152dbd050edc30mukesh agrawal
880709b5a6bed9f9db0d13b3da77152dbd050edc30mukesh agrawal  EXPECT_FALSE(store_->IsNonEmpty());
890709b5a6bed9f9db0d13b3da77152dbd050edc30mukesh agrawal  ASSERT_TRUE(store_->Open());
900709b5a6bed9f9db0d13b3da77152dbd050edc30mukesh agrawal  EXPECT_TRUE(store_->key_file_);
910709b5a6bed9f9db0d13b3da77152dbd050edc30mukesh agrawal  EXPECT_EQ(1, store_->crypto_.cryptos_.size());
920709b5a6bed9f9db0d13b3da77152dbd050edc30mukesh agrawal  ASSERT_TRUE(store_->Close());
930709b5a6bed9f9db0d13b3da77152dbd050edc30mukesh agrawal  EXPECT_FALSE(store_->key_file_);
949697024ace339503445d8e2b4a0e2cf07d674d71Gary Morain  FileEnumerator file_enumerator(temp_dir_.path(),
959697024ace339503445d8e2b4a0e2cf07d674d71Gary Morain                                 false /* not recursive */,
969697024ace339503445d8e2b4a0e2cf07d674d71Gary Morain                                 FileEnumerator::FILES);
979697024ace339503445d8e2b4a0e2cf07d674d71Gary Morain
989697024ace339503445d8e2b4a0e2cf07d674d71Gary Morain  // Verify that the file actually got written with the right name.
999697024ace339503445d8e2b4a0e2cf07d674d71Gary Morain  EXPECT_EQ(test_file_.value(), file_enumerator.Next().value());
100a0ddf46e466bd4ba3d20952f0a6988c680c1af14Ben Chan  FileEnumerator::FileInfo file_info = file_enumerator.GetInfo();
1019697024ace339503445d8e2b4a0e2cf07d674d71Gary Morain
1029697024ace339503445d8e2b4a0e2cf07d674d71Gary Morain  // Verify that the profile is a regular file, readable and writeable by the
1039697024ace339503445d8e2b4a0e2cf07d674d71Gary Morain  // owner only.
104a0ddf46e466bd4ba3d20952f0a6988c680c1af14Ben Chan  EXPECT_EQ(S_IFREG | S_IRUSR | S_IWUSR, file_info.stat().st_mode);
105083047b53b55abe96200705618fa724e2e3ce715Darin Petkov
1060709b5a6bed9f9db0d13b3da77152dbd050edc30mukesh agrawal  ASSERT_TRUE(store_->Open());
1070709b5a6bed9f9db0d13b3da77152dbd050edc30mukesh agrawal  EXPECT_TRUE(store_->key_file_);
1080709b5a6bed9f9db0d13b3da77152dbd050edc30mukesh agrawal  ASSERT_TRUE(store_->Close());
1090709b5a6bed9f9db0d13b3da77152dbd050edc30mukesh agrawal  EXPECT_FALSE(store_->key_file_);
110083047b53b55abe96200705618fa724e2e3ce715Darin Petkov
1110709b5a6bed9f9db0d13b3da77152dbd050edc30mukesh agrawal  ASSERT_TRUE(store_->Open());
1128913328944aab4e1cfbb4d6493f43dfc5e28d935mukesh agrawal  // Replace file with directory, to force Flush() to fail.
1138913328944aab4e1cfbb4d6493f43dfc5e28d935mukesh agrawal  ASSERT_TRUE(base::DeleteFile(test_file_, false));
1148913328944aab4e1cfbb4d6493f43dfc5e28d935mukesh agrawal  ASSERT_TRUE(base::CreateDirectory(test_file_));
1150709b5a6bed9f9db0d13b3da77152dbd050edc30mukesh agrawal  ASSERT_FALSE(store_->Close());
1160709b5a6bed9f9db0d13b3da77152dbd050edc30mukesh agrawal  EXPECT_FALSE(store_->key_file_);
117083047b53b55abe96200705618fa724e2e3ce715Darin Petkov}
118083047b53b55abe96200705618fa724e2e3ce715Darin Petkov
119083047b53b55abe96200705618fa724e2e3ce715Darin PetkovTEST_F(KeyFileStoreTest, OpenFail) {
120083047b53b55abe96200705618fa724e2e3ce715Darin Petkov  WriteKeyFile("garbage\n");
1210709b5a6bed9f9db0d13b3da77152dbd050edc30mukesh agrawal  EXPECT_FALSE(store_->Open());
1220709b5a6bed9f9db0d13b3da77152dbd050edc30mukesh agrawal  EXPECT_FALSE(store_->key_file_);
123083047b53b55abe96200705618fa724e2e3ce715Darin Petkov}
124083047b53b55abe96200705618fa724e2e3ce715Darin Petkov
1252ebc16da6068c8c61658b39cf70d157d7d0911ebPaul StewartTEST_F(KeyFileStoreTest, MarkAsCorrupted) {
1260709b5a6bed9f9db0d13b3da77152dbd050edc30mukesh agrawal  EXPECT_FALSE(store_->MarkAsCorrupted());
1270709b5a6bed9f9db0d13b3da77152dbd050edc30mukesh agrawal  EXPECT_FALSE(store_->IsNonEmpty());
1282ebc16da6068c8c61658b39cf70d157d7d0911ebPaul Stewart  WriteKeyFile("garbage\n");
1290709b5a6bed9f9db0d13b3da77152dbd050edc30mukesh agrawal  EXPECT_TRUE(store_->IsNonEmpty());
13061bd113b69390e97802413f21b9de8041195158dmukesh agrawal  EXPECT_TRUE(base::PathExists(test_file_));
1310709b5a6bed9f9db0d13b3da77152dbd050edc30mukesh agrawal  EXPECT_TRUE(store_->MarkAsCorrupted());
1320709b5a6bed9f9db0d13b3da77152dbd050edc30mukesh agrawal  EXPECT_FALSE(store_->IsNonEmpty());
13361bd113b69390e97802413f21b9de8041195158dmukesh agrawal  EXPECT_FALSE(base::PathExists(test_file_));
13461bd113b69390e97802413f21b9de8041195158dmukesh agrawal  EXPECT_TRUE(base::PathExists(FilePath(test_file_.value() + ".corrupted")));
1352ebc16da6068c8c61658b39cf70d157d7d0911ebPaul Stewart}
1362ebc16da6068c8c61658b39cf70d157d7d0911ebPaul Stewart
137083047b53b55abe96200705618fa724e2e3ce715Darin PetkovTEST_F(KeyFileStoreTest, GetGroups) {
138083047b53b55abe96200705618fa724e2e3ce715Darin Petkov  static const char kGroupA[] = "g-a";
139083047b53b55abe96200705618fa724e2e3ce715Darin Petkov  static const char kGroupB[] = "g-b";
140083047b53b55abe96200705618fa724e2e3ce715Darin Petkov  static const char kGroupC[] = "g-c";
141083047b53b55abe96200705618fa724e2e3ce715Darin Petkov  WriteKeyFile(base::StringPrintf("[%s]\n"
142083047b53b55abe96200705618fa724e2e3ce715Darin Petkov                                  "[%s]\n"
143083047b53b55abe96200705618fa724e2e3ce715Darin Petkov                                  "[%s]\n",
144083047b53b55abe96200705618fa724e2e3ce715Darin Petkov                                  kGroupA, kGroupB, kGroupC));
1450709b5a6bed9f9db0d13b3da77152dbd050edc30mukesh agrawal  EXPECT_TRUE(store_->IsNonEmpty());
1460709b5a6bed9f9db0d13b3da77152dbd050edc30mukesh agrawal  ASSERT_TRUE(store_->Open());
1470709b5a6bed9f9db0d13b3da77152dbd050edc30mukesh agrawal  set<string> groups = store_->GetGroups();
148083047b53b55abe96200705618fa724e2e3ce715Darin Petkov  EXPECT_EQ(3, groups.size());
149083047b53b55abe96200705618fa724e2e3ce715Darin Petkov  EXPECT_TRUE(ContainsKey(groups, kGroupA));
150083047b53b55abe96200705618fa724e2e3ce715Darin Petkov  EXPECT_TRUE(ContainsKey(groups, kGroupB));
151083047b53b55abe96200705618fa724e2e3ce715Darin Petkov  EXPECT_TRUE(ContainsKey(groups, kGroupC));
152083047b53b55abe96200705618fa724e2e3ce715Darin Petkov  EXPECT_FALSE(ContainsKey(groups, "g-x"));
1530709b5a6bed9f9db0d13b3da77152dbd050edc30mukesh agrawal  ASSERT_TRUE(store_->Close());
154083047b53b55abe96200705618fa724e2e3ce715Darin Petkov}
155083047b53b55abe96200705618fa724e2e3ce715Darin Petkov
156a41e38d57e4fa37bd2c8de6447890b4e1951acb7Paul StewartTEST_F(KeyFileStoreTest, GetGroupsWithKey) {
157a41e38d57e4fa37bd2c8de6447890b4e1951acb7Paul Stewart  static const char kGroupA[] = "g-a";
158a41e38d57e4fa37bd2c8de6447890b4e1951acb7Paul Stewart  static const char kGroupB[] = "g-b";
159a41e38d57e4fa37bd2c8de6447890b4e1951acb7Paul Stewart  static const char kGroupC[] = "g-c";
160a41e38d57e4fa37bd2c8de6447890b4e1951acb7Paul Stewart  static const char kKeyA[] = "k-a";
161a41e38d57e4fa37bd2c8de6447890b4e1951acb7Paul Stewart  static const char kKeyB[] = "k-b";
162a41e38d57e4fa37bd2c8de6447890b4e1951acb7Paul Stewart  static const char kValue[] = "true";
163a41e38d57e4fa37bd2c8de6447890b4e1951acb7Paul Stewart  WriteKeyFile(base::StringPrintf("[%s]\n"
164a41e38d57e4fa37bd2c8de6447890b4e1951acb7Paul Stewart                                  "%s=%s\n"
165a41e38d57e4fa37bd2c8de6447890b4e1951acb7Paul Stewart                                  "[%s]\n"
166a41e38d57e4fa37bd2c8de6447890b4e1951acb7Paul Stewart                                  "%s=%s\n"
167a41e38d57e4fa37bd2c8de6447890b4e1951acb7Paul Stewart                                  "%s=%s\n"
168a41e38d57e4fa37bd2c8de6447890b4e1951acb7Paul Stewart                                  "[%s]\n"
169a41e38d57e4fa37bd2c8de6447890b4e1951acb7Paul Stewart                                  "%s=%s\n",
170a41e38d57e4fa37bd2c8de6447890b4e1951acb7Paul Stewart                                  kGroupA, kKeyA, kValue,
171a41e38d57e4fa37bd2c8de6447890b4e1951acb7Paul Stewart                                  kGroupB, kKeyA, kValue, kKeyB, kValue,
172a41e38d57e4fa37bd2c8de6447890b4e1951acb7Paul Stewart                                  kGroupC, kKeyB, kValue));
1730709b5a6bed9f9db0d13b3da77152dbd050edc30mukesh agrawal  EXPECT_TRUE(store_->IsNonEmpty());
1740709b5a6bed9f9db0d13b3da77152dbd050edc30mukesh agrawal  ASSERT_TRUE(store_->Open());
1750709b5a6bed9f9db0d13b3da77152dbd050edc30mukesh agrawal  set<string> groups_a = store_->GetGroupsWithKey(kKeyA);
176a41e38d57e4fa37bd2c8de6447890b4e1951acb7Paul Stewart  EXPECT_EQ(2, groups_a.size());
177a41e38d57e4fa37bd2c8de6447890b4e1951acb7Paul Stewart  EXPECT_TRUE(ContainsKey(groups_a, kGroupA));
178a41e38d57e4fa37bd2c8de6447890b4e1951acb7Paul Stewart  EXPECT_TRUE(ContainsKey(groups_a, kGroupB));
1790709b5a6bed9f9db0d13b3da77152dbd050edc30mukesh agrawal  set<string> groups_b = store_->GetGroupsWithKey(kKeyB);
180a41e38d57e4fa37bd2c8de6447890b4e1951acb7Paul Stewart  EXPECT_EQ(2, groups_b.size());
181a41e38d57e4fa37bd2c8de6447890b4e1951acb7Paul Stewart  EXPECT_TRUE(ContainsKey(groups_b, kGroupB));
182a41e38d57e4fa37bd2c8de6447890b4e1951acb7Paul Stewart  EXPECT_TRUE(ContainsKey(groups_b, kGroupC));
1830709b5a6bed9f9db0d13b3da77152dbd050edc30mukesh agrawal  ASSERT_TRUE(store_->Close());
184a41e38d57e4fa37bd2c8de6447890b4e1951acb7Paul Stewart}
185a41e38d57e4fa37bd2c8de6447890b4e1951acb7Paul Stewart
186083047b53b55abe96200705618fa724e2e3ce715Darin PetkovTEST_F(KeyFileStoreTest, ContainsGroup) {
187083047b53b55abe96200705618fa724e2e3ce715Darin Petkov  static const char kGroupA[] = "group-a";
188083047b53b55abe96200705618fa724e2e3ce715Darin Petkov  static const char kGroupB[] = "group-b";
189083047b53b55abe96200705618fa724e2e3ce715Darin Petkov  static const char kGroupC[] = "group-c";
190083047b53b55abe96200705618fa724e2e3ce715Darin Petkov  WriteKeyFile(base::StringPrintf("[%s]\n"
191083047b53b55abe96200705618fa724e2e3ce715Darin Petkov                                  "[%s]\n"
192083047b53b55abe96200705618fa724e2e3ce715Darin Petkov                                  "[%s]\n",
193083047b53b55abe96200705618fa724e2e3ce715Darin Petkov                                  kGroupA, kGroupB, kGroupC));
1940709b5a6bed9f9db0d13b3da77152dbd050edc30mukesh agrawal  ASSERT_TRUE(store_->Open());
1950709b5a6bed9f9db0d13b3da77152dbd050edc30mukesh agrawal  EXPECT_TRUE(store_->ContainsGroup(kGroupA));
1960709b5a6bed9f9db0d13b3da77152dbd050edc30mukesh agrawal  EXPECT_TRUE(store_->ContainsGroup(kGroupB));
1970709b5a6bed9f9db0d13b3da77152dbd050edc30mukesh agrawal  EXPECT_TRUE(store_->ContainsGroup(kGroupC));
1980709b5a6bed9f9db0d13b3da77152dbd050edc30mukesh agrawal  EXPECT_FALSE(store_->ContainsGroup("group-d"));
1990709b5a6bed9f9db0d13b3da77152dbd050edc30mukesh agrawal  ASSERT_TRUE(store_->Close());
200083047b53b55abe96200705618fa724e2e3ce715Darin Petkov}
201083047b53b55abe96200705618fa724e2e3ce715Darin Petkov
2025b9ec98964b316efa4ed658dcb35a66482f52f56Paul StewartTEST_F(KeyFileStoreTest, GetGroupsWithProperties) {
2035b9ec98964b316efa4ed658dcb35a66482f52f56Paul Stewart  static const char kGroupA[] = "group-a";
2045b9ec98964b316efa4ed658dcb35a66482f52f56Paul Stewart  static const char kGroupB[] = "group-b";
2055b9ec98964b316efa4ed658dcb35a66482f52f56Paul Stewart  static const char kGroupC[] = "group-c";
2065b9ec98964b316efa4ed658dcb35a66482f52f56Paul Stewart  static const char kAttributeA[] = "attr-a";
2075b9ec98964b316efa4ed658dcb35a66482f52f56Paul Stewart  static const char kAttributeB[] = "attr-b";
2085b9ec98964b316efa4ed658dcb35a66482f52f56Paul Stewart  static const char kAttributeC[] = "attr-c";
2095b9ec98964b316efa4ed658dcb35a66482f52f56Paul Stewart  static const char kValueA_0[] = "val-a";
2105b9ec98964b316efa4ed658dcb35a66482f52f56Paul Stewart  static const char kValueA_1[] = "val-b";
2115b9ec98964b316efa4ed658dcb35a66482f52f56Paul Stewart  static const int kValueB_0 = 1;
2125b9ec98964b316efa4ed658dcb35a66482f52f56Paul Stewart  static const int kValueB_1 = 2;
2135b9ec98964b316efa4ed658dcb35a66482f52f56Paul Stewart  static const bool kValueC_0 = true;
2145b9ec98964b316efa4ed658dcb35a66482f52f56Paul Stewart  static const char kValueC_0_string[] = "true";
2155b9ec98964b316efa4ed658dcb35a66482f52f56Paul Stewart  static const bool kValueC_1 = false;
2165b9ec98964b316efa4ed658dcb35a66482f52f56Paul Stewart  static const char kValueC_1_string[] = "false";
2175b9ec98964b316efa4ed658dcb35a66482f52f56Paul Stewart  WriteKeyFile(base::StringPrintf("[%s]\n"
2185b9ec98964b316efa4ed658dcb35a66482f52f56Paul Stewart                                  "%s=%s\n"
2195b9ec98964b316efa4ed658dcb35a66482f52f56Paul Stewart                                  "%s=%d\n"
2205b9ec98964b316efa4ed658dcb35a66482f52f56Paul Stewart                                  "%s=%s\n"
2215b9ec98964b316efa4ed658dcb35a66482f52f56Paul Stewart                                  "[%s]\n"
2225b9ec98964b316efa4ed658dcb35a66482f52f56Paul Stewart                                  "%s=%s\n"
2235b9ec98964b316efa4ed658dcb35a66482f52f56Paul Stewart                                  "%s=%d\n"
2245b9ec98964b316efa4ed658dcb35a66482f52f56Paul Stewart                                  "%s=%s\n"
2255b9ec98964b316efa4ed658dcb35a66482f52f56Paul Stewart                                  "[%s]\n"
2265b9ec98964b316efa4ed658dcb35a66482f52f56Paul Stewart                                  "%s=%s\n"
2275b9ec98964b316efa4ed658dcb35a66482f52f56Paul Stewart                                  "%s=%d\n"
2285b9ec98964b316efa4ed658dcb35a66482f52f56Paul Stewart                                  "%s=%s\n",
2295b9ec98964b316efa4ed658dcb35a66482f52f56Paul Stewart                                  kGroupA,
2305b9ec98964b316efa4ed658dcb35a66482f52f56Paul Stewart                                  kAttributeA, kValueA_0,
2315b9ec98964b316efa4ed658dcb35a66482f52f56Paul Stewart                                  kAttributeB, kValueB_0,
2325b9ec98964b316efa4ed658dcb35a66482f52f56Paul Stewart                                  kAttributeC, kValueC_0_string,
2335b9ec98964b316efa4ed658dcb35a66482f52f56Paul Stewart                                  kGroupB,
2345b9ec98964b316efa4ed658dcb35a66482f52f56Paul Stewart                                  kAttributeA, kValueA_0,
2355b9ec98964b316efa4ed658dcb35a66482f52f56Paul Stewart                                  kAttributeB, kValueB_1,
2365b9ec98964b316efa4ed658dcb35a66482f52f56Paul Stewart                                  kAttributeC, kValueC_0_string,
2375b9ec98964b316efa4ed658dcb35a66482f52f56Paul Stewart                                  kGroupC,
2385b9ec98964b316efa4ed658dcb35a66482f52f56Paul Stewart                                  kAttributeA, kValueA_0,
2395b9ec98964b316efa4ed658dcb35a66482f52f56Paul Stewart                                  kAttributeB, kValueB_0,
2405b9ec98964b316efa4ed658dcb35a66482f52f56Paul Stewart                                  kAttributeC, kValueC_1_string));
2410709b5a6bed9f9db0d13b3da77152dbd050edc30mukesh agrawal  ASSERT_TRUE(store_->Open());
2425b9ec98964b316efa4ed658dcb35a66482f52f56Paul Stewart  {
2435b9ec98964b316efa4ed658dcb35a66482f52f56Paul Stewart    KeyValueStore args;
2445b9ec98964b316efa4ed658dcb35a66482f52f56Paul Stewart    args.SetString(kAttributeA, kValueA_0);
2455b9ec98964b316efa4ed658dcb35a66482f52f56Paul Stewart    args.SetInt(kAttributeB, kValueB_0);
2460709b5a6bed9f9db0d13b3da77152dbd050edc30mukesh agrawal    set<string> results = store_->GetGroupsWithProperties(args);
2475b9ec98964b316efa4ed658dcb35a66482f52f56Paul Stewart    EXPECT_EQ(2, results.size());
2485b9ec98964b316efa4ed658dcb35a66482f52f56Paul Stewart    EXPECT_TRUE(results.find(kGroupA) != results.end());
2495b9ec98964b316efa4ed658dcb35a66482f52f56Paul Stewart    EXPECT_TRUE(results.find(kGroupC) != results.end());
2505b9ec98964b316efa4ed658dcb35a66482f52f56Paul Stewart  }
2515b9ec98964b316efa4ed658dcb35a66482f52f56Paul Stewart  {
2525b9ec98964b316efa4ed658dcb35a66482f52f56Paul Stewart    KeyValueStore args;
2535b9ec98964b316efa4ed658dcb35a66482f52f56Paul Stewart    args.SetString(kAttributeA, kValueA_0);
2545b9ec98964b316efa4ed658dcb35a66482f52f56Paul Stewart    args.SetBool(kAttributeC, kValueC_0);
2550709b5a6bed9f9db0d13b3da77152dbd050edc30mukesh agrawal    set<string> results = store_->GetGroupsWithProperties(args);
2565b9ec98964b316efa4ed658dcb35a66482f52f56Paul Stewart    EXPECT_EQ(2, results.size());
2575b9ec98964b316efa4ed658dcb35a66482f52f56Paul Stewart    EXPECT_TRUE(results.find(kGroupA) != results.end());
2585b9ec98964b316efa4ed658dcb35a66482f52f56Paul Stewart    EXPECT_TRUE(results.find(kGroupB) != results.end());
2595b9ec98964b316efa4ed658dcb35a66482f52f56Paul Stewart  }
2605b9ec98964b316efa4ed658dcb35a66482f52f56Paul Stewart  {
2615b9ec98964b316efa4ed658dcb35a66482f52f56Paul Stewart    KeyValueStore args;
2625b9ec98964b316efa4ed658dcb35a66482f52f56Paul Stewart    args.SetBool(kAttributeC, kValueC_1);
2630709b5a6bed9f9db0d13b3da77152dbd050edc30mukesh agrawal    set<string> results = store_->GetGroupsWithProperties(args);
2645b9ec98964b316efa4ed658dcb35a66482f52f56Paul Stewart    EXPECT_EQ(1, results.size());
2655b9ec98964b316efa4ed658dcb35a66482f52f56Paul Stewart    EXPECT_TRUE(results.find(kGroupC) != results.end());
2665b9ec98964b316efa4ed658dcb35a66482f52f56Paul Stewart  }
2675b9ec98964b316efa4ed658dcb35a66482f52f56Paul Stewart  {
2685b9ec98964b316efa4ed658dcb35a66482f52f56Paul Stewart    KeyValueStore args;
2695b9ec98964b316efa4ed658dcb35a66482f52f56Paul Stewart    args.SetString(kAttributeA, kValueA_0);
2700709b5a6bed9f9db0d13b3da77152dbd050edc30mukesh agrawal    set<string> results = store_->GetGroupsWithProperties(args);
2715b9ec98964b316efa4ed658dcb35a66482f52f56Paul Stewart    EXPECT_EQ(3, results.size());
2725b9ec98964b316efa4ed658dcb35a66482f52f56Paul Stewart    EXPECT_TRUE(results.find(kGroupA) != results.end());
2735b9ec98964b316efa4ed658dcb35a66482f52f56Paul Stewart    EXPECT_TRUE(results.find(kGroupB) != results.end());
2745b9ec98964b316efa4ed658dcb35a66482f52f56Paul Stewart    EXPECT_TRUE(results.find(kGroupC) != results.end());
2755b9ec98964b316efa4ed658dcb35a66482f52f56Paul Stewart  }
2765b9ec98964b316efa4ed658dcb35a66482f52f56Paul Stewart  {
2775b9ec98964b316efa4ed658dcb35a66482f52f56Paul Stewart    KeyValueStore args;
2785b9ec98964b316efa4ed658dcb35a66482f52f56Paul Stewart    args.SetString(kAttributeA, kValueA_1);
2790709b5a6bed9f9db0d13b3da77152dbd050edc30mukesh agrawal    set<string> results = store_->GetGroupsWithProperties(args);
2805b9ec98964b316efa4ed658dcb35a66482f52f56Paul Stewart    EXPECT_EQ(0, results.size());
2815b9ec98964b316efa4ed658dcb35a66482f52f56Paul Stewart  }
2820709b5a6bed9f9db0d13b3da77152dbd050edc30mukesh agrawal  ASSERT_TRUE(store_->Close());
2835b9ec98964b316efa4ed658dcb35a66482f52f56Paul Stewart}
2845b9ec98964b316efa4ed658dcb35a66482f52f56Paul Stewart
285083047b53b55abe96200705618fa724e2e3ce715Darin PetkovTEST_F(KeyFileStoreTest, DeleteKey) {
286083047b53b55abe96200705618fa724e2e3ce715Darin Petkov  static const char kGroup[] = "the-group";
287083047b53b55abe96200705618fa724e2e3ce715Darin Petkov  static const char kKeyDead[] = "dead";
288083047b53b55abe96200705618fa724e2e3ce715Darin Petkov  static const char kKeyAlive[] = "alive";
289083047b53b55abe96200705618fa724e2e3ce715Darin Petkov  const int kValueAlive = 3;
290083047b53b55abe96200705618fa724e2e3ce715Darin Petkov  WriteKeyFile(base::StringPrintf("[%s]\n"
291083047b53b55abe96200705618fa724e2e3ce715Darin Petkov                                  "%s=5\n"
292083047b53b55abe96200705618fa724e2e3ce715Darin Petkov                                  "%s=%d\n",
293083047b53b55abe96200705618fa724e2e3ce715Darin Petkov                                  kGroup, kKeyDead, kKeyAlive, kValueAlive));
2940709b5a6bed9f9db0d13b3da77152dbd050edc30mukesh agrawal  ASSERT_TRUE(store_->Open());
2950709b5a6bed9f9db0d13b3da77152dbd050edc30mukesh agrawal  EXPECT_TRUE(store_->DeleteKey(kGroup, kKeyDead));
2960709b5a6bed9f9db0d13b3da77152dbd050edc30mukesh agrawal  EXPECT_TRUE(store_->DeleteKey(kGroup, "random-key"));
2970709b5a6bed9f9db0d13b3da77152dbd050edc30mukesh agrawal  EXPECT_FALSE(store_->DeleteKey("random-group", kKeyAlive));
2980709b5a6bed9f9db0d13b3da77152dbd050edc30mukesh agrawal  ASSERT_TRUE(store_->Close());
299a0ddf46e466bd4ba3d20952f0a6988c680c1af14Ben Chan  EXPECT_EQ(base::StringPrintf("[%s]\n"
300083047b53b55abe96200705618fa724e2e3ce715Darin Petkov                               "%s=%d\n",
301083047b53b55abe96200705618fa724e2e3ce715Darin Petkov                               kGroup, kKeyAlive, kValueAlive),
302083047b53b55abe96200705618fa724e2e3ce715Darin Petkov            ReadKeyFile());
303083047b53b55abe96200705618fa724e2e3ce715Darin Petkov}
304083047b53b55abe96200705618fa724e2e3ce715Darin Petkov
305083047b53b55abe96200705618fa724e2e3ce715Darin PetkovTEST_F(KeyFileStoreTest, DeleteGroup) {
306083047b53b55abe96200705618fa724e2e3ce715Darin Petkov  static const char kGroupA[] = "group-a";
307083047b53b55abe96200705618fa724e2e3ce715Darin Petkov  static const char kGroupB[] = "group-b";
308083047b53b55abe96200705618fa724e2e3ce715Darin Petkov  static const char kGroupC[] = "group-c";
309083047b53b55abe96200705618fa724e2e3ce715Darin Petkov  WriteKeyFile(base::StringPrintf("[%s]\n"
310083047b53b55abe96200705618fa724e2e3ce715Darin Petkov                                  "[%s]\n"
311083047b53b55abe96200705618fa724e2e3ce715Darin Petkov                                  "key-to-be-deleted=true\n"
312083047b53b55abe96200705618fa724e2e3ce715Darin Petkov                                  "[%s]\n",
313083047b53b55abe96200705618fa724e2e3ce715Darin Petkov                                  kGroupA, kGroupB, kGroupC));
3140709b5a6bed9f9db0d13b3da77152dbd050edc30mukesh agrawal  ASSERT_TRUE(store_->Open());
3150709b5a6bed9f9db0d13b3da77152dbd050edc30mukesh agrawal  EXPECT_TRUE(store_->DeleteGroup(kGroupB));
3160709b5a6bed9f9db0d13b3da77152dbd050edc30mukesh agrawal  EXPECT_TRUE(store_->DeleteGroup("group-d"));
3170709b5a6bed9f9db0d13b3da77152dbd050edc30mukesh agrawal  ASSERT_TRUE(store_->Close());
318a0ddf46e466bd4ba3d20952f0a6988c680c1af14Ben Chan  EXPECT_EQ(base::StringPrintf("[%s]\n"
319083047b53b55abe96200705618fa724e2e3ce715Darin Petkov                               "\n"
320083047b53b55abe96200705618fa724e2e3ce715Darin Petkov                               "[%s]\n",
321083047b53b55abe96200705618fa724e2e3ce715Darin Petkov                               kGroupA, kGroupC),
322083047b53b55abe96200705618fa724e2e3ce715Darin Petkov            ReadKeyFile());
323083047b53b55abe96200705618fa724e2e3ce715Darin Petkov}
324083047b53b55abe96200705618fa724e2e3ce715Darin Petkov
325083047b53b55abe96200705618fa724e2e3ce715Darin PetkovTEST_F(KeyFileStoreTest, GetString) {
326083047b53b55abe96200705618fa724e2e3ce715Darin Petkov  static const char kGroup[] = "something";
327083047b53b55abe96200705618fa724e2e3ce715Darin Petkov  static const char kKey[] = "foo";
328083047b53b55abe96200705618fa724e2e3ce715Darin Petkov  static const char kValue[] = "bar";
329083047b53b55abe96200705618fa724e2e3ce715Darin Petkov  WriteKeyFile(base::StringPrintf("[%s]\n"
330083047b53b55abe96200705618fa724e2e3ce715Darin Petkov                                  "%s=%s\n",
331083047b53b55abe96200705618fa724e2e3ce715Darin Petkov                                  kGroup, kKey, kValue));
3320709b5a6bed9f9db0d13b3da77152dbd050edc30mukesh agrawal  ASSERT_TRUE(store_->Open());
333083047b53b55abe96200705618fa724e2e3ce715Darin Petkov  string value;
3340709b5a6bed9f9db0d13b3da77152dbd050edc30mukesh agrawal  EXPECT_TRUE(store_->GetString(kGroup, kKey, &value));
335083047b53b55abe96200705618fa724e2e3ce715Darin Petkov  EXPECT_EQ(kValue, value);
3360709b5a6bed9f9db0d13b3da77152dbd050edc30mukesh agrawal  EXPECT_FALSE(store_->GetString("something-else", kKey, &value));
3370709b5a6bed9f9db0d13b3da77152dbd050edc30mukesh agrawal  EXPECT_FALSE(store_->GetString(kGroup, "bar", &value));
3380709b5a6bed9f9db0d13b3da77152dbd050edc30mukesh agrawal  EXPECT_TRUE(store_->GetString(kGroup, kKey, nullptr));
3390709b5a6bed9f9db0d13b3da77152dbd050edc30mukesh agrawal  ASSERT_TRUE(store_->Close());
340083047b53b55abe96200705618fa724e2e3ce715Darin Petkov}
341083047b53b55abe96200705618fa724e2e3ce715Darin Petkov
342083047b53b55abe96200705618fa724e2e3ce715Darin PetkovTEST_F(KeyFileStoreTest, SetString) {
343083047b53b55abe96200705618fa724e2e3ce715Darin Petkov  static const char kGroup[] = "string-group";
344083047b53b55abe96200705618fa724e2e3ce715Darin Petkov  static const char kKey1[] = "test-string";
345083047b53b55abe96200705618fa724e2e3ce715Darin Petkov  static const char kValue1[] = "foo";
346083047b53b55abe96200705618fa724e2e3ce715Darin Petkov  static const char kKey2[] = "empty-string";
347083047b53b55abe96200705618fa724e2e3ce715Darin Petkov  static const char kValue2[] = "";
3480709b5a6bed9f9db0d13b3da77152dbd050edc30mukesh agrawal  ASSERT_TRUE(store_->Open());
3490709b5a6bed9f9db0d13b3da77152dbd050edc30mukesh agrawal  ASSERT_TRUE(store_->SetString(kGroup, kKey1, kValue1));
3500709b5a6bed9f9db0d13b3da77152dbd050edc30mukesh agrawal  ASSERT_TRUE(store_->SetString(kGroup, kKey2, kValue2));
3510709b5a6bed9f9db0d13b3da77152dbd050edc30mukesh agrawal  ASSERT_TRUE(store_->Close());
352a0ddf46e466bd4ba3d20952f0a6988c680c1af14Ben Chan  EXPECT_EQ(base::StringPrintf("[%s]\n"
353083047b53b55abe96200705618fa724e2e3ce715Darin Petkov                               "%s=%s\n"
354083047b53b55abe96200705618fa724e2e3ce715Darin Petkov                               "%s=%s\n",
355083047b53b55abe96200705618fa724e2e3ce715Darin Petkov                               kGroup, kKey1, kValue1, kKey2, kValue2),
356083047b53b55abe96200705618fa724e2e3ce715Darin Petkov            ReadKeyFile());
357083047b53b55abe96200705618fa724e2e3ce715Darin Petkov}
358083047b53b55abe96200705618fa724e2e3ce715Darin Petkov
359083047b53b55abe96200705618fa724e2e3ce715Darin PetkovTEST_F(KeyFileStoreTest, GetBool) {
360083047b53b55abe96200705618fa724e2e3ce715Darin Petkov  static const char kGroup[] = "boo";
361083047b53b55abe96200705618fa724e2e3ce715Darin Petkov  static const char kKeyTrue[] = "foo";
362083047b53b55abe96200705618fa724e2e3ce715Darin Petkov  static const char kKeyFalse[] = "bar";
363083047b53b55abe96200705618fa724e2e3ce715Darin Petkov  static const char kKeyBad[] = "zoo";
364083047b53b55abe96200705618fa724e2e3ce715Darin Petkov  WriteKeyFile(base::StringPrintf("[%s]\n"
365083047b53b55abe96200705618fa724e2e3ce715Darin Petkov                                  "%s=true\n"
366083047b53b55abe96200705618fa724e2e3ce715Darin Petkov                                  "%s=false\n"
367083047b53b55abe96200705618fa724e2e3ce715Darin Petkov                                  "%s=moo\n",
368083047b53b55abe96200705618fa724e2e3ce715Darin Petkov                                  kGroup, kKeyTrue, kKeyFalse, kKeyBad));
3690709b5a6bed9f9db0d13b3da77152dbd050edc30mukesh agrawal  ASSERT_TRUE(store_->Open());
370083047b53b55abe96200705618fa724e2e3ce715Darin Petkov  {
371083047b53b55abe96200705618fa724e2e3ce715Darin Petkov    bool value = true;
3720709b5a6bed9f9db0d13b3da77152dbd050edc30mukesh agrawal    EXPECT_TRUE(store_->GetBool(kGroup, kKeyFalse, &value));
373083047b53b55abe96200705618fa724e2e3ce715Darin Petkov    EXPECT_FALSE(value);
374083047b53b55abe96200705618fa724e2e3ce715Darin Petkov  }
375083047b53b55abe96200705618fa724e2e3ce715Darin Petkov  {
376083047b53b55abe96200705618fa724e2e3ce715Darin Petkov    bool value = false;
3770709b5a6bed9f9db0d13b3da77152dbd050edc30mukesh agrawal    EXPECT_TRUE(store_->GetBool(kGroup, kKeyTrue, &value));
378083047b53b55abe96200705618fa724e2e3ce715Darin Petkov    EXPECT_TRUE(value);
379083047b53b55abe96200705618fa724e2e3ce715Darin Petkov  }
380083047b53b55abe96200705618fa724e2e3ce715Darin Petkov  {
381083047b53b55abe96200705618fa724e2e3ce715Darin Petkov    bool value;
3820709b5a6bed9f9db0d13b3da77152dbd050edc30mukesh agrawal    EXPECT_FALSE(store_->GetBool(kGroup, kKeyBad, &value));
3830709b5a6bed9f9db0d13b3da77152dbd050edc30mukesh agrawal    EXPECT_FALSE(store_->GetBool(kGroup, "unknown", &value));
3840709b5a6bed9f9db0d13b3da77152dbd050edc30mukesh agrawal    EXPECT_FALSE(store_->GetBool("unknown", kKeyTrue, &value));
385083047b53b55abe96200705618fa724e2e3ce715Darin Petkov  }
3860709b5a6bed9f9db0d13b3da77152dbd050edc30mukesh agrawal  EXPECT_TRUE(store_->GetBool(kGroup, kKeyFalse, nullptr));
3870709b5a6bed9f9db0d13b3da77152dbd050edc30mukesh agrawal  ASSERT_TRUE(store_->Close());
388083047b53b55abe96200705618fa724e2e3ce715Darin Petkov}
389083047b53b55abe96200705618fa724e2e3ce715Darin Petkov
390083047b53b55abe96200705618fa724e2e3ce715Darin PetkovTEST_F(KeyFileStoreTest, SetBool) {
391083047b53b55abe96200705618fa724e2e3ce715Darin Petkov  static const char kGroup[] = "bool-group";
392083047b53b55abe96200705618fa724e2e3ce715Darin Petkov  static const char kKeyTrue[] = "test-true-bool";
393083047b53b55abe96200705618fa724e2e3ce715Darin Petkov  static const char kKeyFalse[] = "test-false-bool";
3940709b5a6bed9f9db0d13b3da77152dbd050edc30mukesh agrawal  ASSERT_TRUE(store_->Open());
3950709b5a6bed9f9db0d13b3da77152dbd050edc30mukesh agrawal  ASSERT_TRUE(store_->SetBool(kGroup, kKeyTrue, true));
3960709b5a6bed9f9db0d13b3da77152dbd050edc30mukesh agrawal  ASSERT_TRUE(store_->SetBool(kGroup, kKeyFalse, false));
3970709b5a6bed9f9db0d13b3da77152dbd050edc30mukesh agrawal  ASSERT_TRUE(store_->Close());
398a0ddf46e466bd4ba3d20952f0a6988c680c1af14Ben Chan  EXPECT_EQ(base::StringPrintf("[%s]\n"
399083047b53b55abe96200705618fa724e2e3ce715Darin Petkov                               "%s=true\n"
400083047b53b55abe96200705618fa724e2e3ce715Darin Petkov                               "%s=false\n",
401083047b53b55abe96200705618fa724e2e3ce715Darin Petkov                               kGroup, kKeyTrue, kKeyFalse),
402083047b53b55abe96200705618fa724e2e3ce715Darin Petkov            ReadKeyFile());
403083047b53b55abe96200705618fa724e2e3ce715Darin Petkov}
404083047b53b55abe96200705618fa724e2e3ce715Darin Petkov
405083047b53b55abe96200705618fa724e2e3ce715Darin PetkovTEST_F(KeyFileStoreTest, GetInt) {
406083047b53b55abe96200705618fa724e2e3ce715Darin Petkov  static const char kGroup[] = "numbers";
407083047b53b55abe96200705618fa724e2e3ce715Darin Petkov  static const char kKeyPos[] = "pos";
408083047b53b55abe96200705618fa724e2e3ce715Darin Petkov  static const char kKeyNeg[] = "neg";
409083047b53b55abe96200705618fa724e2e3ce715Darin Petkov  static const char kKeyBad[] = "bad";
410083047b53b55abe96200705618fa724e2e3ce715Darin Petkov  const int kValuePos = 50;
411083047b53b55abe96200705618fa724e2e3ce715Darin Petkov  const int kValueNeg = -20;
412083047b53b55abe96200705618fa724e2e3ce715Darin Petkov  static const char kValueBad[] = "nan";
413083047b53b55abe96200705618fa724e2e3ce715Darin Petkov  WriteKeyFile(base::StringPrintf("[%s]\n"
414083047b53b55abe96200705618fa724e2e3ce715Darin Petkov                                  "%s=%d\n"
415083047b53b55abe96200705618fa724e2e3ce715Darin Petkov                                  "%s=%d\n"
416083047b53b55abe96200705618fa724e2e3ce715Darin Petkov                                  "%s=%s\n",
417083047b53b55abe96200705618fa724e2e3ce715Darin Petkov                                  kGroup,
418083047b53b55abe96200705618fa724e2e3ce715Darin Petkov                                  kKeyPos, kValuePos,
419083047b53b55abe96200705618fa724e2e3ce715Darin Petkov                                  kKeyNeg, kValueNeg,
420083047b53b55abe96200705618fa724e2e3ce715Darin Petkov                                  kKeyBad, kValueBad));
4210709b5a6bed9f9db0d13b3da77152dbd050edc30mukesh agrawal  ASSERT_TRUE(store_->Open());
422083047b53b55abe96200705618fa724e2e3ce715Darin Petkov  {
423083047b53b55abe96200705618fa724e2e3ce715Darin Petkov    int value = 0;
4240709b5a6bed9f9db0d13b3da77152dbd050edc30mukesh agrawal    EXPECT_TRUE(store_->GetInt(kGroup, kKeyNeg, &value));
425083047b53b55abe96200705618fa724e2e3ce715Darin Petkov    EXPECT_EQ(kValueNeg, value);
426083047b53b55abe96200705618fa724e2e3ce715Darin Petkov  }
427083047b53b55abe96200705618fa724e2e3ce715Darin Petkov  {
428083047b53b55abe96200705618fa724e2e3ce715Darin Petkov    int value = 0;
4290709b5a6bed9f9db0d13b3da77152dbd050edc30mukesh agrawal    EXPECT_TRUE(store_->GetInt(kGroup, kKeyPos, &value));
430083047b53b55abe96200705618fa724e2e3ce715Darin Petkov    EXPECT_EQ(kValuePos, value);
431083047b53b55abe96200705618fa724e2e3ce715Darin Petkov  }
432083047b53b55abe96200705618fa724e2e3ce715Darin Petkov  {
433083047b53b55abe96200705618fa724e2e3ce715Darin Petkov    int value;
4340709b5a6bed9f9db0d13b3da77152dbd050edc30mukesh agrawal    EXPECT_FALSE(store_->GetInt(kGroup, kKeyBad, &value));
4350709b5a6bed9f9db0d13b3da77152dbd050edc30mukesh agrawal    EXPECT_FALSE(store_->GetInt(kGroup, "invalid", &value));
4360709b5a6bed9f9db0d13b3da77152dbd050edc30mukesh agrawal    EXPECT_FALSE(store_->GetInt("invalid", kKeyPos, &value));
437083047b53b55abe96200705618fa724e2e3ce715Darin Petkov  }
4380709b5a6bed9f9db0d13b3da77152dbd050edc30mukesh agrawal  EXPECT_TRUE(store_->GetInt(kGroup, kKeyPos, nullptr));
4390709b5a6bed9f9db0d13b3da77152dbd050edc30mukesh agrawal  ASSERT_TRUE(store_->Close());
440083047b53b55abe96200705618fa724e2e3ce715Darin Petkov}
441083047b53b55abe96200705618fa724e2e3ce715Darin Petkov
442083047b53b55abe96200705618fa724e2e3ce715Darin PetkovTEST_F(KeyFileStoreTest, SetInt) {
443083047b53b55abe96200705618fa724e2e3ce715Darin Petkov  static const char kGroup[] = "int-group";
444083047b53b55abe96200705618fa724e2e3ce715Darin Petkov  static const char kKey1[] = "test-int";
445083047b53b55abe96200705618fa724e2e3ce715Darin Petkov  static const char kKey2[] = "test-negative";
446083047b53b55abe96200705618fa724e2e3ce715Darin Petkov  const int kValue1 = 5;
447083047b53b55abe96200705618fa724e2e3ce715Darin Petkov  const int kValue2 = -10;
4480709b5a6bed9f9db0d13b3da77152dbd050edc30mukesh agrawal  ASSERT_TRUE(store_->Open());
4490709b5a6bed9f9db0d13b3da77152dbd050edc30mukesh agrawal  ASSERT_TRUE(store_->SetInt(kGroup, kKey1, kValue1));
4500709b5a6bed9f9db0d13b3da77152dbd050edc30mukesh agrawal  ASSERT_TRUE(store_->SetInt(kGroup, kKey2, kValue2));
4510709b5a6bed9f9db0d13b3da77152dbd050edc30mukesh agrawal  ASSERT_TRUE(store_->Close());
452a0ddf46e466bd4ba3d20952f0a6988c680c1af14Ben Chan  EXPECT_EQ(base::StringPrintf("[%s]\n"
453083047b53b55abe96200705618fa724e2e3ce715Darin Petkov                               "%s=%d\n"
454083047b53b55abe96200705618fa724e2e3ce715Darin Petkov                               "%s=%d\n",
455083047b53b55abe96200705618fa724e2e3ce715Darin Petkov                               kGroup, kKey1, kValue1, kKey2, kValue2),
45686964e0bae1a38c6817243959026603b4b8c69b7Darin Petkov            ReadKeyFile());
45786964e0bae1a38c6817243959026603b4b8c69b7Darin Petkov}
45886964e0bae1a38c6817243959026603b4b8c69b7Darin Petkov
459dab3b5a9a312cb69ea6dac854772e41885387052Paul StewartTEST_F(KeyFileStoreTest, GetUint64) {
460dab3b5a9a312cb69ea6dac854772e41885387052Paul Stewart  static const char kGroup[] = "numbers";
461dab3b5a9a312cb69ea6dac854772e41885387052Paul Stewart  static const char kKeyGood[] = "good";
462dab3b5a9a312cb69ea6dac854772e41885387052Paul Stewart  static const char kKeyBad[] = "bad";
4637fab89734d88724a288e96a9996b15548c5294c7Ben Chan  const uint64_t kValueGood = 0xFEDCBA9876543210LL;
464dab3b5a9a312cb69ea6dac854772e41885387052Paul Stewart  static const char kValueBad[] = "nan";
465dab3b5a9a312cb69ea6dac854772e41885387052Paul Stewart  // Use base::Uint64ToString() instead of using something like "%llu"
466dab3b5a9a312cb69ea6dac854772e41885387052Paul Stewart  // (not correct for native 64 bit architectures) or PRIu64 (does not
467dab3b5a9a312cb69ea6dac854772e41885387052Paul Stewart  // work correctly using cros_workon_make due to include intricacies).
468dab3b5a9a312cb69ea6dac854772e41885387052Paul Stewart  WriteKeyFile(base::StringPrintf("[%s]\n"
469dab3b5a9a312cb69ea6dac854772e41885387052Paul Stewart                                  "%s=%s\n"
470dab3b5a9a312cb69ea6dac854772e41885387052Paul Stewart                                  "%s=%s\n",
471dab3b5a9a312cb69ea6dac854772e41885387052Paul Stewart                                  kGroup,
472dab3b5a9a312cb69ea6dac854772e41885387052Paul Stewart                                  kKeyGood,
473dab3b5a9a312cb69ea6dac854772e41885387052Paul Stewart                                  base::Uint64ToString(kValueGood).c_str(),
474dab3b5a9a312cb69ea6dac854772e41885387052Paul Stewart                                  kKeyBad, kValueBad));
4750709b5a6bed9f9db0d13b3da77152dbd050edc30mukesh agrawal  ASSERT_TRUE(store_->Open());
476dab3b5a9a312cb69ea6dac854772e41885387052Paul Stewart  {
4777fab89734d88724a288e96a9996b15548c5294c7Ben Chan    uint64_t value = 0;
4780709b5a6bed9f9db0d13b3da77152dbd050edc30mukesh agrawal    EXPECT_TRUE(store_->GetUint64(kGroup, kKeyGood, &value));
479dab3b5a9a312cb69ea6dac854772e41885387052Paul Stewart    EXPECT_EQ(kValueGood, value);
480dab3b5a9a312cb69ea6dac854772e41885387052Paul Stewart  }
481dab3b5a9a312cb69ea6dac854772e41885387052Paul Stewart  {
4827fab89734d88724a288e96a9996b15548c5294c7Ben Chan    uint64_t value;
4830709b5a6bed9f9db0d13b3da77152dbd050edc30mukesh agrawal    EXPECT_FALSE(store_->GetUint64(kGroup, kKeyBad, &value));
4840709b5a6bed9f9db0d13b3da77152dbd050edc30mukesh agrawal    EXPECT_FALSE(store_->GetUint64(kGroup, "invalid", &value));
4850709b5a6bed9f9db0d13b3da77152dbd050edc30mukesh agrawal    EXPECT_FALSE(store_->GetUint64("invalid", kKeyGood, &value));
486dab3b5a9a312cb69ea6dac854772e41885387052Paul Stewart  }
4870709b5a6bed9f9db0d13b3da77152dbd050edc30mukesh agrawal  EXPECT_TRUE(store_->GetUint64(kGroup, kKeyGood, nullptr));
4880709b5a6bed9f9db0d13b3da77152dbd050edc30mukesh agrawal  ASSERT_TRUE(store_->Close());
489dab3b5a9a312cb69ea6dac854772e41885387052Paul Stewart}
490dab3b5a9a312cb69ea6dac854772e41885387052Paul Stewart
491dab3b5a9a312cb69ea6dac854772e41885387052Paul StewartTEST_F(KeyFileStoreTest, SetUint64) {
492dab3b5a9a312cb69ea6dac854772e41885387052Paul Stewart  static const char kGroup[] = "int-group";
493dab3b5a9a312cb69ea6dac854772e41885387052Paul Stewart  static const char kKey[] = "test-int";
4947fab89734d88724a288e96a9996b15548c5294c7Ben Chan  const uint64_t kValue = 0xFEDCBA9876543210LL;
4950709b5a6bed9f9db0d13b3da77152dbd050edc30mukesh agrawal  ASSERT_TRUE(store_->Open());
4960709b5a6bed9f9db0d13b3da77152dbd050edc30mukesh agrawal  ASSERT_TRUE(store_->SetUint64(kGroup, kKey, kValue));
4970709b5a6bed9f9db0d13b3da77152dbd050edc30mukesh agrawal  ASSERT_TRUE(store_->Close());
498a0ddf46e466bd4ba3d20952f0a6988c680c1af14Ben Chan  EXPECT_EQ(base::StringPrintf("[%s]\n"
499dab3b5a9a312cb69ea6dac854772e41885387052Paul Stewart                               "%s=%s\n",
500dab3b5a9a312cb69ea6dac854772e41885387052Paul Stewart                               kGroup, kKey,
501dab3b5a9a312cb69ea6dac854772e41885387052Paul Stewart                               base::Uint64ToString(kValue).c_str()),
502dab3b5a9a312cb69ea6dac854772e41885387052Paul Stewart            ReadKeyFile());
503dab3b5a9a312cb69ea6dac854772e41885387052Paul Stewart}
504dab3b5a9a312cb69ea6dac854772e41885387052Paul Stewart
505b2841fda690034b6952fe56ef1931200bb3b8e12Darin PetkovTEST_F(KeyFileStoreTest, GetStringList) {
506b2841fda690034b6952fe56ef1931200bb3b8e12Darin Petkov  static const char kGroup[] = "string-lists";
507b2841fda690034b6952fe56ef1931200bb3b8e12Darin Petkov  static const char kKeyEmpty[] = "empty";
508b2841fda690034b6952fe56ef1931200bb3b8e12Darin Petkov  static const char kKeyEmptyValue[] = "empty-value";
509b2841fda690034b6952fe56ef1931200bb3b8e12Darin Petkov  static const char kKeyValueEmpty[] = "value-empty";
510b2841fda690034b6952fe56ef1931200bb3b8e12Darin Petkov  static const char kKeyValueEmptyValue[] = "value-empty-value";
511b2841fda690034b6952fe56ef1931200bb3b8e12Darin Petkov  static const char kKeyValues[] = "values";
512b2841fda690034b6952fe56ef1931200bb3b8e12Darin Petkov  static const char kValue[] = "value";
513b2841fda690034b6952fe56ef1931200bb3b8e12Darin Petkov  static const char kValue2[] = "value2";
514b2841fda690034b6952fe56ef1931200bb3b8e12Darin Petkov  static const char kValue3[] = "value3";
515b2841fda690034b6952fe56ef1931200bb3b8e12Darin Petkov  WriteKeyFile(base::StringPrintf("[%s]\n"
516b2841fda690034b6952fe56ef1931200bb3b8e12Darin Petkov                                  "%s=\n"
517b2841fda690034b6952fe56ef1931200bb3b8e12Darin Petkov                                  "%s=;%s\n"
518b2841fda690034b6952fe56ef1931200bb3b8e12Darin Petkov                                  "%s=%s;;\n"
519b2841fda690034b6952fe56ef1931200bb3b8e12Darin Petkov                                  "%s=%s;;%s\n"
520b2841fda690034b6952fe56ef1931200bb3b8e12Darin Petkov                                  "%s=%s;%s;%s\n",
521b2841fda690034b6952fe56ef1931200bb3b8e12Darin Petkov                                  kGroup,
522b2841fda690034b6952fe56ef1931200bb3b8e12Darin Petkov                                  kKeyEmpty,
523b2841fda690034b6952fe56ef1931200bb3b8e12Darin Petkov                                  kKeyEmptyValue, kValue,
524b2841fda690034b6952fe56ef1931200bb3b8e12Darin Petkov                                  kKeyValueEmpty, kValue,
525b2841fda690034b6952fe56ef1931200bb3b8e12Darin Petkov                                  kKeyValueEmptyValue, kValue, kValue2,
526b2841fda690034b6952fe56ef1931200bb3b8e12Darin Petkov                                  kKeyValues, kValue, kValue2, kValue3));
5270709b5a6bed9f9db0d13b3da77152dbd050edc30mukesh agrawal  ASSERT_TRUE(store_->Open());
528b2841fda690034b6952fe56ef1931200bb3b8e12Darin Petkov
529b2841fda690034b6952fe56ef1931200bb3b8e12Darin Petkov  vector<string> value;
530b2841fda690034b6952fe56ef1931200bb3b8e12Darin Petkov
5310709b5a6bed9f9db0d13b3da77152dbd050edc30mukesh agrawal  EXPECT_TRUE(store_->GetStringList(kGroup, kKeyValues, &value));
532b2841fda690034b6952fe56ef1931200bb3b8e12Darin Petkov  ASSERT_EQ(3, value.size());
533b2841fda690034b6952fe56ef1931200bb3b8e12Darin Petkov  EXPECT_EQ(kValue, value[0]);
534b2841fda690034b6952fe56ef1931200bb3b8e12Darin Petkov  EXPECT_EQ(kValue2, value[1]);
535b2841fda690034b6952fe56ef1931200bb3b8e12Darin Petkov  EXPECT_EQ(kValue3, value[2]);
536b2841fda690034b6952fe56ef1931200bb3b8e12Darin Petkov
5370709b5a6bed9f9db0d13b3da77152dbd050edc30mukesh agrawal  EXPECT_TRUE(store_->GetStringList(kGroup, kKeyEmptyValue, &value));
538b2841fda690034b6952fe56ef1931200bb3b8e12Darin Petkov  ASSERT_EQ(2, value.size());
539b2841fda690034b6952fe56ef1931200bb3b8e12Darin Petkov  EXPECT_EQ("", value[0]);
540b2841fda690034b6952fe56ef1931200bb3b8e12Darin Petkov  EXPECT_EQ(kValue, value[1]);
541b2841fda690034b6952fe56ef1931200bb3b8e12Darin Petkov
5420709b5a6bed9f9db0d13b3da77152dbd050edc30mukesh agrawal  EXPECT_TRUE(store_->GetStringList(kGroup, kKeyValueEmpty, &value));
543b2841fda690034b6952fe56ef1931200bb3b8e12Darin Petkov  ASSERT_EQ(2, value.size());
544b2841fda690034b6952fe56ef1931200bb3b8e12Darin Petkov  EXPECT_EQ(kValue, value[0]);
545b2841fda690034b6952fe56ef1931200bb3b8e12Darin Petkov  EXPECT_EQ("", value[1]);
546b2841fda690034b6952fe56ef1931200bb3b8e12Darin Petkov
5470709b5a6bed9f9db0d13b3da77152dbd050edc30mukesh agrawal  EXPECT_TRUE(store_->GetStringList(kGroup, kKeyEmpty, &value));
548b2841fda690034b6952fe56ef1931200bb3b8e12Darin Petkov  ASSERT_EQ(0, value.size());
549b2841fda690034b6952fe56ef1931200bb3b8e12Darin Petkov
5500709b5a6bed9f9db0d13b3da77152dbd050edc30mukesh agrawal  EXPECT_TRUE(store_->GetStringList(kGroup, kKeyValueEmptyValue, &value));
551b2841fda690034b6952fe56ef1931200bb3b8e12Darin Petkov  ASSERT_EQ(3, value.size());
552b2841fda690034b6952fe56ef1931200bb3b8e12Darin Petkov  EXPECT_EQ(kValue, value[0]);
553b2841fda690034b6952fe56ef1931200bb3b8e12Darin Petkov  EXPECT_EQ("", value[1]);
554b2841fda690034b6952fe56ef1931200bb3b8e12Darin Petkov  EXPECT_EQ(kValue2, value[2]);
555b2841fda690034b6952fe56ef1931200bb3b8e12Darin Petkov
55678e0584ef181fc8a6cfd4d3b54644af21829d2efmukesh agrawal  EXPECT_FALSE(store_->GetStringList("unknown-string-lists",
55778e0584ef181fc8a6cfd4d3b54644af21829d2efmukesh agrawal                                     kKeyEmpty,
55878e0584ef181fc8a6cfd4d3b54644af21829d2efmukesh agrawal                                     &value));
5590709b5a6bed9f9db0d13b3da77152dbd050edc30mukesh agrawal  EXPECT_FALSE(store_->GetStringList(kGroup, "some-key", &value));
5600709b5a6bed9f9db0d13b3da77152dbd050edc30mukesh agrawal  EXPECT_TRUE(store_->GetStringList(kGroup, kKeyValues, nullptr));
5610709b5a6bed9f9db0d13b3da77152dbd050edc30mukesh agrawal  ASSERT_TRUE(store_->Close());
562b2841fda690034b6952fe56ef1931200bb3b8e12Darin Petkov}
563b2841fda690034b6952fe56ef1931200bb3b8e12Darin Petkov
564b2841fda690034b6952fe56ef1931200bb3b8e12Darin PetkovTEST_F(KeyFileStoreTest, SetStringList) {
565b2841fda690034b6952fe56ef1931200bb3b8e12Darin Petkov  static const char kGroup[] = "strings";
566b2841fda690034b6952fe56ef1931200bb3b8e12Darin Petkov  static const char kKeyEmpty[] = "e";
567b2841fda690034b6952fe56ef1931200bb3b8e12Darin Petkov  static const char kKeyEmptyValue[] = "ev";
568b2841fda690034b6952fe56ef1931200bb3b8e12Darin Petkov  static const char kKeyValueEmpty[] = "ve";
569b2841fda690034b6952fe56ef1931200bb3b8e12Darin Petkov  static const char kKeyValueEmptyValue[] = "vev";
570b2841fda690034b6952fe56ef1931200bb3b8e12Darin Petkov  static const char kKeyValues[] = "v";
571b2841fda690034b6952fe56ef1931200bb3b8e12Darin Petkov  static const char kValue[] = "abc";
572b2841fda690034b6952fe56ef1931200bb3b8e12Darin Petkov  static const char kValue2[] = "pqr";
573b2841fda690034b6952fe56ef1931200bb3b8e12Darin Petkov  static const char kValue3[] = "xyz";
5740709b5a6bed9f9db0d13b3da77152dbd050edc30mukesh agrawal  ASSERT_TRUE(store_->Open());
575b2841fda690034b6952fe56ef1931200bb3b8e12Darin Petkov  {
576b2841fda690034b6952fe56ef1931200bb3b8e12Darin Petkov    vector<string> value;
5770709b5a6bed9f9db0d13b3da77152dbd050edc30mukesh agrawal    ASSERT_TRUE(store_->SetStringList(kGroup, kKeyEmpty, value));
578b2841fda690034b6952fe56ef1931200bb3b8e12Darin Petkov  }
579b2841fda690034b6952fe56ef1931200bb3b8e12Darin Petkov  {
580b2841fda690034b6952fe56ef1931200bb3b8e12Darin Petkov    vector<string> value;
581b2841fda690034b6952fe56ef1931200bb3b8e12Darin Petkov    value.push_back("");
582b2841fda690034b6952fe56ef1931200bb3b8e12Darin Petkov    value.push_back(kValue);
5830709b5a6bed9f9db0d13b3da77152dbd050edc30mukesh agrawal    ASSERT_TRUE(store_->SetStringList(kGroup, kKeyEmptyValue, value));
584b2841fda690034b6952fe56ef1931200bb3b8e12Darin Petkov  }
585b2841fda690034b6952fe56ef1931200bb3b8e12Darin Petkov  {
586b2841fda690034b6952fe56ef1931200bb3b8e12Darin Petkov    vector<string> value;
587b2841fda690034b6952fe56ef1931200bb3b8e12Darin Petkov    value.push_back(kValue);
588b2841fda690034b6952fe56ef1931200bb3b8e12Darin Petkov    value.push_back("");
5890709b5a6bed9f9db0d13b3da77152dbd050edc30mukesh agrawal    ASSERT_TRUE(store_->SetStringList(kGroup, kKeyValueEmpty, value));
590b2841fda690034b6952fe56ef1931200bb3b8e12Darin Petkov  }
591b2841fda690034b6952fe56ef1931200bb3b8e12Darin Petkov  {
592b2841fda690034b6952fe56ef1931200bb3b8e12Darin Petkov    vector<string> value;
593b2841fda690034b6952fe56ef1931200bb3b8e12Darin Petkov    value.push_back(kValue);
594b2841fda690034b6952fe56ef1931200bb3b8e12Darin Petkov    value.push_back("");
595b2841fda690034b6952fe56ef1931200bb3b8e12Darin Petkov    value.push_back(kValue2);
5960709b5a6bed9f9db0d13b3da77152dbd050edc30mukesh agrawal    ASSERT_TRUE(store_->SetStringList(kGroup, kKeyValueEmptyValue, value));
597b2841fda690034b6952fe56ef1931200bb3b8e12Darin Petkov  }
598b2841fda690034b6952fe56ef1931200bb3b8e12Darin Petkov  {
599b2841fda690034b6952fe56ef1931200bb3b8e12Darin Petkov    vector<string> value;
600b2841fda690034b6952fe56ef1931200bb3b8e12Darin Petkov    value.push_back(kValue);
601b2841fda690034b6952fe56ef1931200bb3b8e12Darin Petkov    value.push_back(kValue2);
602b2841fda690034b6952fe56ef1931200bb3b8e12Darin Petkov    value.push_back(kValue3);
6030709b5a6bed9f9db0d13b3da77152dbd050edc30mukesh agrawal    ASSERT_TRUE(store_->SetStringList(kGroup, kKeyValues, value));
604b2841fda690034b6952fe56ef1931200bb3b8e12Darin Petkov  }
6050709b5a6bed9f9db0d13b3da77152dbd050edc30mukesh agrawal  ASSERT_TRUE(store_->Close());
606a0ddf46e466bd4ba3d20952f0a6988c680c1af14Ben Chan  EXPECT_EQ(base::StringPrintf("[%s]\n"
607b2841fda690034b6952fe56ef1931200bb3b8e12Darin Petkov                               "%s=\n"
608b2841fda690034b6952fe56ef1931200bb3b8e12Darin Petkov                               "%s=;%s;\n"
609b2841fda690034b6952fe56ef1931200bb3b8e12Darin Petkov                               "%s=%s;;\n"
610b2841fda690034b6952fe56ef1931200bb3b8e12Darin Petkov                               "%s=%s;;%s;\n"
611b2841fda690034b6952fe56ef1931200bb3b8e12Darin Petkov                               "%s=%s;%s;%s;\n",
612b2841fda690034b6952fe56ef1931200bb3b8e12Darin Petkov                               kGroup,
613b2841fda690034b6952fe56ef1931200bb3b8e12Darin Petkov                               kKeyEmpty,
614b2841fda690034b6952fe56ef1931200bb3b8e12Darin Petkov                               kKeyEmptyValue, kValue,
615b2841fda690034b6952fe56ef1931200bb3b8e12Darin Petkov                               kKeyValueEmpty, kValue,
616b2841fda690034b6952fe56ef1931200bb3b8e12Darin Petkov                               kKeyValueEmptyValue, kValue, kValue2,
617b2841fda690034b6952fe56ef1931200bb3b8e12Darin Petkov                               kKeyValues, kValue, kValue2, kValue3),
618b2841fda690034b6952fe56ef1931200bb3b8e12Darin Petkov            ReadKeyFile());
619b2841fda690034b6952fe56ef1931200bb3b8e12Darin Petkov}
620b2841fda690034b6952fe56ef1931200bb3b8e12Darin Petkov
62186964e0bae1a38c6817243959026603b4b8c69b7Darin PetkovTEST_F(KeyFileStoreTest, GetCryptedString) {
62286964e0bae1a38c6817243959026603b4b8c69b7Darin Petkov  static const char kGroup[] = "crypto-group";
62386964e0bae1a38c6817243959026603b4b8c69b7Darin Petkov  static const char kKey[] = "secret";
62486964e0bae1a38c6817243959026603b4b8c69b7Darin Petkov  WriteKeyFile(base::StringPrintf("[%s]\n"
62586964e0bae1a38c6817243959026603b4b8c69b7Darin Petkov                                  "%s=%s\n",
62686964e0bae1a38c6817243959026603b4b8c69b7Darin Petkov                                  kGroup, kKey, kROT47Text));
6270709b5a6bed9f9db0d13b3da77152dbd050edc30mukesh agrawal  ASSERT_TRUE(store_->Open());
62886964e0bae1a38c6817243959026603b4b8c69b7Darin Petkov  string value;
6290709b5a6bed9f9db0d13b3da77152dbd050edc30mukesh agrawal  EXPECT_TRUE(store_->GetCryptedString(kGroup, kKey, &value));
63086964e0bae1a38c6817243959026603b4b8c69b7Darin Petkov  EXPECT_EQ(kPlainText, value);
6310709b5a6bed9f9db0d13b3da77152dbd050edc30mukesh agrawal  EXPECT_FALSE(store_->GetCryptedString("something-else", kKey, &value));
6320709b5a6bed9f9db0d13b3da77152dbd050edc30mukesh agrawal  EXPECT_FALSE(store_->GetCryptedString(kGroup, "non-secret", &value));
6330709b5a6bed9f9db0d13b3da77152dbd050edc30mukesh agrawal  EXPECT_TRUE(store_->GetCryptedString(kGroup, kKey, nullptr));
6340709b5a6bed9f9db0d13b3da77152dbd050edc30mukesh agrawal  ASSERT_TRUE(store_->Close());
63586964e0bae1a38c6817243959026603b4b8c69b7Darin Petkov}
63686964e0bae1a38c6817243959026603b4b8c69b7Darin Petkov
63786964e0bae1a38c6817243959026603b4b8c69b7Darin PetkovTEST_F(KeyFileStoreTest, SetCryptedString) {
63886964e0bae1a38c6817243959026603b4b8c69b7Darin Petkov  static const char kGroup[] = "crypted-string-group";
63986964e0bae1a38c6817243959026603b4b8c69b7Darin Petkov  static const char kKey[] = "test-string";
6400709b5a6bed9f9db0d13b3da77152dbd050edc30mukesh agrawal  ASSERT_TRUE(store_->Open());
6410709b5a6bed9f9db0d13b3da77152dbd050edc30mukesh agrawal  ASSERT_TRUE(store_->SetCryptedString(kGroup, kKey, kPlainText));
6420709b5a6bed9f9db0d13b3da77152dbd050edc30mukesh agrawal  ASSERT_TRUE(store_->Close());
643a0ddf46e466bd4ba3d20952f0a6988c680c1af14Ben Chan  EXPECT_EQ(base::StringPrintf("[%s]\n"
64486964e0bae1a38c6817243959026603b4b8c69b7Darin Petkov                               "%s=%s\n",
64586964e0bae1a38c6817243959026603b4b8c69b7Darin Petkov                               kGroup, kKey, kROT47Text),
646083047b53b55abe96200705618fa724e2e3ce715Darin Petkov            ReadKeyFile());
647083047b53b55abe96200705618fa724e2e3ce715Darin Petkov}
648083047b53b55abe96200705618fa724e2e3ce715Darin Petkov
649b9c00597eb1f6d2560f7e88cb0d1f627228840d4Chris MasoneTEST_F(KeyFileStoreTest, PersistAcrossClose) {
650b9c00597eb1f6d2560f7e88cb0d1f627228840d4Chris Masone  static const char kGroup[] = "string-group";
651b9c00597eb1f6d2560f7e88cb0d1f627228840d4Chris Masone  static const char kKey1[] = "test-string";
652b9c00597eb1f6d2560f7e88cb0d1f627228840d4Chris Masone  static const char kValue1[] = "foo";
653b9c00597eb1f6d2560f7e88cb0d1f627228840d4Chris Masone  static const char kKey2[] = "empty-string";
654b9c00597eb1f6d2560f7e88cb0d1f627228840d4Chris Masone  static const char kValue2[] = "";
6550709b5a6bed9f9db0d13b3da77152dbd050edc30mukesh agrawal  ASSERT_TRUE(store_->Open());
6560709b5a6bed9f9db0d13b3da77152dbd050edc30mukesh agrawal  ASSERT_TRUE(store_->SetString(kGroup, kKey1, kValue1));
6570709b5a6bed9f9db0d13b3da77152dbd050edc30mukesh agrawal  ASSERT_TRUE(store_->Close());
6580709b5a6bed9f9db0d13b3da77152dbd050edc30mukesh agrawal  ASSERT_TRUE(store_->Open());
6590709b5a6bed9f9db0d13b3da77152dbd050edc30mukesh agrawal  ASSERT_TRUE(store_->SetString(kGroup, kKey2, kValue2));
660b9c00597eb1f6d2560f7e88cb0d1f627228840d4Chris Masone  string value;
6610709b5a6bed9f9db0d13b3da77152dbd050edc30mukesh agrawal  ASSERT_TRUE(store_->GetString(kGroup, kKey1, &value));
662b9c00597eb1f6d2560f7e88cb0d1f627228840d4Chris Masone  ASSERT_EQ(kValue1, value);
6630709b5a6bed9f9db0d13b3da77152dbd050edc30mukesh agrawal  ASSERT_TRUE(store_->GetString(kGroup, kKey2, &value));
664b9c00597eb1f6d2560f7e88cb0d1f627228840d4Chris Masone  ASSERT_EQ(kValue2, value);
6650709b5a6bed9f9db0d13b3da77152dbd050edc30mukesh agrawal  ASSERT_TRUE(store_->Close());
666b9c00597eb1f6d2560f7e88cb0d1f627228840d4Chris Masone}
667b9c00597eb1f6d2560f7e88cb0d1f627228840d4Chris Masone
66894ba50c6e1b07bb56af0c6c8fe71c4de30a0f9f5mukesh agrawalnamespace {
66994ba50c6e1b07bb56af0c6c8fe71c4de30a0f9f5mukesh agrawalclass ReadOnlyKeyFileStore : public KeyFileStore {
67094ba50c6e1b07bb56af0c6c8fe71c4de30a0f9f5mukesh agrawal public:
67178e0584ef181fc8a6cfd4d3b54644af21829d2efmukesh agrawal  explicit ReadOnlyKeyFileStore(const base::FilePath& path)
67278e0584ef181fc8a6cfd4d3b54644af21829d2efmukesh agrawal      : KeyFileStore(path) {}
67394ba50c6e1b07bb56af0c6c8fe71c4de30a0f9f5mukesh agrawal  bool Flush() override { return true; }
67494ba50c6e1b07bb56af0c6c8fe71c4de30a0f9f5mukesh agrawal};
67594ba50c6e1b07bb56af0c6c8fe71c4de30a0f9f5mukesh agrawal
67694ba50c6e1b07bb56af0c6c8fe71c4de30a0f9f5mukesh agrawalbool OpenCheckClose(const FilePath& path,
67794ba50c6e1b07bb56af0c6c8fe71c4de30a0f9f5mukesh agrawal                    const string& group,
67894ba50c6e1b07bb56af0c6c8fe71c4de30a0f9f5mukesh agrawal                    const string& key,
67994ba50c6e1b07bb56af0c6c8fe71c4de30a0f9f5mukesh agrawal                    const string& expected_value) {
68078e0584ef181fc8a6cfd4d3b54644af21829d2efmukesh agrawal  ReadOnlyKeyFileStore store(path);  // Don't modify file owned by caller.
681b9c00597eb1f6d2560f7e88cb0d1f627228840d4Chris Masone  EXPECT_TRUE(store.Open());
682b9c00597eb1f6d2560f7e88cb0d1f627228840d4Chris Masone  string value;
683b9c00597eb1f6d2560f7e88cb0d1f627228840d4Chris Masone  bool could_get = store.GetString(group, key, &value);
684b9c00597eb1f6d2560f7e88cb0d1f627228840d4Chris Masone  store.Close();
685b9c00597eb1f6d2560f7e88cb0d1f627228840d4Chris Masone  return could_get && expected_value == value;
686b9c00597eb1f6d2560f7e88cb0d1f627228840d4Chris Masone}
687b9c00597eb1f6d2560f7e88cb0d1f627228840d4Chris Masone
688b9c00597eb1f6d2560f7e88cb0d1f627228840d4Chris MasoneTEST_F(KeyFileStoreTest, Flush) {
689b9c00597eb1f6d2560f7e88cb0d1f627228840d4Chris Masone  static const char kGroup[] = "string-group";
690b9c00597eb1f6d2560f7e88cb0d1f627228840d4Chris Masone  static const char kKey1[] = "test-string";
691b9c00597eb1f6d2560f7e88cb0d1f627228840d4Chris Masone  static const char kValue1[] = "foo";
692b9c00597eb1f6d2560f7e88cb0d1f627228840d4Chris Masone  static const char kKey2[] = "empty-string";
693b9c00597eb1f6d2560f7e88cb0d1f627228840d4Chris Masone  static const char kValue2[] = "";
6940709b5a6bed9f9db0d13b3da77152dbd050edc30mukesh agrawal  ASSERT_TRUE(store_->Open());
6950709b5a6bed9f9db0d13b3da77152dbd050edc30mukesh agrawal  ASSERT_TRUE(store_->SetString(kGroup, kKey1, kValue1));
6960709b5a6bed9f9db0d13b3da77152dbd050edc30mukesh agrawal  ASSERT_TRUE(store_->Flush());
69794ba50c6e1b07bb56af0c6c8fe71c4de30a0f9f5mukesh agrawal  ASSERT_TRUE(OpenCheckClose(test_file_, kGroup, kKey1, kValue1));
698b9c00597eb1f6d2560f7e88cb0d1f627228840d4Chris Masone
6990709b5a6bed9f9db0d13b3da77152dbd050edc30mukesh agrawal  ASSERT_TRUE(store_->SetString(kGroup, kKey2, kValue2));
7000709b5a6bed9f9db0d13b3da77152dbd050edc30mukesh agrawal  ASSERT_TRUE(store_->Flush());
70194ba50c6e1b07bb56af0c6c8fe71c4de30a0f9f5mukesh agrawal  ASSERT_TRUE(OpenCheckClose(test_file_, kGroup, kKey2, kValue2));
702b9c00597eb1f6d2560f7e88cb0d1f627228840d4Chris Masone
7030709b5a6bed9f9db0d13b3da77152dbd050edc30mukesh agrawal  EXPECT_TRUE(store_->DeleteKey(kGroup, kKey1));
7040709b5a6bed9f9db0d13b3da77152dbd050edc30mukesh agrawal  ASSERT_TRUE(store_->Flush());
70594ba50c6e1b07bb56af0c6c8fe71c4de30a0f9f5mukesh agrawal  ASSERT_FALSE(OpenCheckClose(test_file_, kGroup, kKey1, kValue1));
706b9c00597eb1f6d2560f7e88cb0d1f627228840d4Chris Masone}
70794ba50c6e1b07bb56af0c6c8fe71c4de30a0f9f5mukesh agrawal}  // namespace
708b9c00597eb1f6d2560f7e88cb0d1f627228840d4Chris Masone
7095dc40aad05908dc435e623e56392780ef6d1079ePaul StewartTEST_F(KeyFileStoreTest, EmptyFile) {
7100709b5a6bed9f9db0d13b3da77152dbd050edc30mukesh agrawal  ASSERT_TRUE(store_->Open());
7110709b5a6bed9f9db0d13b3da77152dbd050edc30mukesh agrawal  ASSERT_TRUE(store_->Close());
7120709b5a6bed9f9db0d13b3da77152dbd050edc30mukesh agrawal  EXPECT_FALSE(store_->IsNonEmpty());
7135dc40aad05908dc435e623e56392780ef6d1079ePaul Stewart}
7145dc40aad05908dc435e623e56392780ef6d1079ePaul Stewart
7155dc40aad05908dc435e623e56392780ef6d1079ePaul StewartTEST_F(KeyFileStoreTest, SetHeader) {
7160709b5a6bed9f9db0d13b3da77152dbd050edc30mukesh agrawal  ASSERT_TRUE(store_->Open());
7170709b5a6bed9f9db0d13b3da77152dbd050edc30mukesh agrawal  ASSERT_TRUE(store_->SetHeader("this is a test"));
7180709b5a6bed9f9db0d13b3da77152dbd050edc30mukesh agrawal  ASSERT_TRUE(store_->Close());
7190709b5a6bed9f9db0d13b3da77152dbd050edc30mukesh agrawal  EXPECT_TRUE(store_->IsNonEmpty());
7200709b5a6bed9f9db0d13b3da77152dbd050edc30mukesh agrawal  ASSERT_TRUE(store_->Open());
7215dc40aad05908dc435e623e56392780ef6d1079ePaul Stewart}
7225dc40aad05908dc435e623e56392780ef6d1079ePaul Stewart
723083047b53b55abe96200705618fa724e2e3ce715Darin PetkovTEST_F(KeyFileStoreTest, Combo) {
724083047b53b55abe96200705618fa724e2e3ce715Darin Petkov  static const char kGroupA[] = "square";
725083047b53b55abe96200705618fa724e2e3ce715Darin Petkov  static const char kGroupB[] = "circle";
726083047b53b55abe96200705618fa724e2e3ce715Darin Petkov  static const char kGroupC[] = "triangle";
727083047b53b55abe96200705618fa724e2e3ce715Darin Petkov  static const char kGroupX[] = "pentagon";
728083047b53b55abe96200705618fa724e2e3ce715Darin Petkov  static const char kKeyString[] = "color";
729b2841fda690034b6952fe56ef1931200bb3b8e12Darin Petkov  static const char kKeyStringList[] = "alternative-colors";
730083047b53b55abe96200705618fa724e2e3ce715Darin Petkov  static const char kKeyInt[] = "area";
731083047b53b55abe96200705618fa724e2e3ce715Darin Petkov  static const char kKeyBool[] = "visible";
732083047b53b55abe96200705618fa724e2e3ce715Darin Petkov  static const char kValueStringA[] = "blue";
733083047b53b55abe96200705618fa724e2e3ce715Darin Petkov  static const char kValueStringB[] = "red";
734083047b53b55abe96200705618fa724e2e3ce715Darin Petkov  static const char kValueStringC[] = "yellow";
735083047b53b55abe96200705618fa724e2e3ce715Darin Petkov  static const char kValueStringCNew[] = "purple";
736083047b53b55abe96200705618fa724e2e3ce715Darin Petkov  const int kValueIntA = 5;
737083047b53b55abe96200705618fa724e2e3ce715Darin Petkov  const int kValueIntB = 10;
738083047b53b55abe96200705618fa724e2e3ce715Darin Petkov  const int kValueIntBNew = 333;
739083047b53b55abe96200705618fa724e2e3ce715Darin Petkov  WriteKeyFile(base::StringPrintf("[%s]\n"
740083047b53b55abe96200705618fa724e2e3ce715Darin Petkov                                  "%s=%s\n"
741b2841fda690034b6952fe56ef1931200bb3b8e12Darin Petkov                                  "%s=%s;%s\n"
742083047b53b55abe96200705618fa724e2e3ce715Darin Petkov                                  "%s=%d\n"
743083047b53b55abe96200705618fa724e2e3ce715Darin Petkov                                  "[%s]\n"
744083047b53b55abe96200705618fa724e2e3ce715Darin Petkov                                  "%s=%s\n"
745b2841fda690034b6952fe56ef1931200bb3b8e12Darin Petkov                                  "%s=%s;%s\n"
746083047b53b55abe96200705618fa724e2e3ce715Darin Petkov                                  "%s=%d\n"
747083047b53b55abe96200705618fa724e2e3ce715Darin Petkov                                  "%s=true\n"
748083047b53b55abe96200705618fa724e2e3ce715Darin Petkov                                  "[%s]\n"
749083047b53b55abe96200705618fa724e2e3ce715Darin Petkov                                  "%s=%s\n"
750083047b53b55abe96200705618fa724e2e3ce715Darin Petkov                                  "%s=false\n",
751083047b53b55abe96200705618fa724e2e3ce715Darin Petkov                                  kGroupA,
752083047b53b55abe96200705618fa724e2e3ce715Darin Petkov                                  kKeyString, kValueStringA,
753b2841fda690034b6952fe56ef1931200bb3b8e12Darin Petkov                                  kKeyStringList, kValueStringB, kValueStringC,
754083047b53b55abe96200705618fa724e2e3ce715Darin Petkov                                  kKeyInt, kValueIntA,
755083047b53b55abe96200705618fa724e2e3ce715Darin Petkov                                  kGroupB,
756083047b53b55abe96200705618fa724e2e3ce715Darin Petkov                                  kKeyString, kValueStringB,
757b2841fda690034b6952fe56ef1931200bb3b8e12Darin Petkov                                  kKeyStringList, kValueStringA, kValueStringC,
758083047b53b55abe96200705618fa724e2e3ce715Darin Petkov                                  kKeyInt, kValueIntB,
759083047b53b55abe96200705618fa724e2e3ce715Darin Petkov                                  kKeyBool,
760083047b53b55abe96200705618fa724e2e3ce715Darin Petkov                                  kGroupC,
761083047b53b55abe96200705618fa724e2e3ce715Darin Petkov                                  kKeyString, kValueStringC,
762083047b53b55abe96200705618fa724e2e3ce715Darin Petkov                                  kKeyBool));
7630709b5a6bed9f9db0d13b3da77152dbd050edc30mukesh agrawal  ASSERT_TRUE(store_->Open());
764083047b53b55abe96200705618fa724e2e3ce715Darin Petkov
7650709b5a6bed9f9db0d13b3da77152dbd050edc30mukesh agrawal  EXPECT_TRUE(store_->ContainsGroup(kGroupA));
7660709b5a6bed9f9db0d13b3da77152dbd050edc30mukesh agrawal  EXPECT_TRUE(store_->ContainsGroup(kGroupB));
7670709b5a6bed9f9db0d13b3da77152dbd050edc30mukesh agrawal  EXPECT_TRUE(store_->ContainsGroup(kGroupC));
7680709b5a6bed9f9db0d13b3da77152dbd050edc30mukesh agrawal  EXPECT_FALSE(store_->ContainsGroup(kGroupX));
769083047b53b55abe96200705618fa724e2e3ce715Darin Petkov
7700709b5a6bed9f9db0d13b3da77152dbd050edc30mukesh agrawal  set<string> groups = store_->GetGroups();
771083047b53b55abe96200705618fa724e2e3ce715Darin Petkov  EXPECT_EQ(3, groups.size());
772083047b53b55abe96200705618fa724e2e3ce715Darin Petkov  EXPECT_TRUE(ContainsKey(groups, kGroupA));
773083047b53b55abe96200705618fa724e2e3ce715Darin Petkov  EXPECT_TRUE(ContainsKey(groups, kGroupB));
774083047b53b55abe96200705618fa724e2e3ce715Darin Petkov  EXPECT_TRUE(ContainsKey(groups, kGroupC));
775083047b53b55abe96200705618fa724e2e3ce715Darin Petkov  EXPECT_FALSE(ContainsKey(groups, kGroupX));
776083047b53b55abe96200705618fa724e2e3ce715Darin Petkov
777083047b53b55abe96200705618fa724e2e3ce715Darin Petkov  {
778083047b53b55abe96200705618fa724e2e3ce715Darin Petkov    string value;
7790709b5a6bed9f9db0d13b3da77152dbd050edc30mukesh agrawal    EXPECT_TRUE(store_->GetString(kGroupB, kKeyString, &value));
780083047b53b55abe96200705618fa724e2e3ce715Darin Petkov    EXPECT_EQ(kValueStringB, value);
7810709b5a6bed9f9db0d13b3da77152dbd050edc30mukesh agrawal    EXPECT_TRUE(store_->GetString(kGroupA, kKeyString, &value));
782083047b53b55abe96200705618fa724e2e3ce715Darin Petkov    EXPECT_EQ(kValueStringA, value);
7830709b5a6bed9f9db0d13b3da77152dbd050edc30mukesh agrawal    EXPECT_TRUE(store_->GetString(kGroupC, kKeyString, &value));
784083047b53b55abe96200705618fa724e2e3ce715Darin Petkov    EXPECT_EQ(kValueStringC, value);
785083047b53b55abe96200705618fa724e2e3ce715Darin Petkov  }
786083047b53b55abe96200705618fa724e2e3ce715Darin Petkov  {
787b2841fda690034b6952fe56ef1931200bb3b8e12Darin Petkov    vector<string> value;
7880709b5a6bed9f9db0d13b3da77152dbd050edc30mukesh agrawal    EXPECT_TRUE(store_->GetStringList(kGroupB, kKeyStringList, &value));
789b2841fda690034b6952fe56ef1931200bb3b8e12Darin Petkov    ASSERT_EQ(2, value.size());
790b2841fda690034b6952fe56ef1931200bb3b8e12Darin Petkov    EXPECT_EQ(kValueStringA, value[0]);
791b2841fda690034b6952fe56ef1931200bb3b8e12Darin Petkov    EXPECT_EQ(kValueStringC, value[1]);
7920709b5a6bed9f9db0d13b3da77152dbd050edc30mukesh agrawal    EXPECT_TRUE(store_->GetStringList(kGroupA, kKeyStringList, &value));
793b2841fda690034b6952fe56ef1931200bb3b8e12Darin Petkov    ASSERT_EQ(2, value.size());
794b2841fda690034b6952fe56ef1931200bb3b8e12Darin Petkov    EXPECT_EQ(kValueStringB, value[0]);
795b2841fda690034b6952fe56ef1931200bb3b8e12Darin Petkov    EXPECT_EQ(kValueStringC, value[1]);
7960709b5a6bed9f9db0d13b3da77152dbd050edc30mukesh agrawal    EXPECT_FALSE(store_->GetStringList(kGroupC, kKeyStringList, &value));
797b2841fda690034b6952fe56ef1931200bb3b8e12Darin Petkov  }
798b2841fda690034b6952fe56ef1931200bb3b8e12Darin Petkov  {
799083047b53b55abe96200705618fa724e2e3ce715Darin Petkov    int value = 0;
8000709b5a6bed9f9db0d13b3da77152dbd050edc30mukesh agrawal    EXPECT_TRUE(store_->GetInt(kGroupB, kKeyInt, &value));
801083047b53b55abe96200705618fa724e2e3ce715Darin Petkov    EXPECT_EQ(kValueIntB, value);
8020709b5a6bed9f9db0d13b3da77152dbd050edc30mukesh agrawal    EXPECT_TRUE(store_->GetInt(kGroupA, kKeyInt, &value));
803083047b53b55abe96200705618fa724e2e3ce715Darin Petkov    EXPECT_EQ(kValueIntA, value);
8040709b5a6bed9f9db0d13b3da77152dbd050edc30mukesh agrawal    EXPECT_FALSE(store_->GetInt(kGroupC, kKeyInt, &value));
805083047b53b55abe96200705618fa724e2e3ce715Darin Petkov  }
806083047b53b55abe96200705618fa724e2e3ce715Darin Petkov  {
807083047b53b55abe96200705618fa724e2e3ce715Darin Petkov    bool value = false;
8080709b5a6bed9f9db0d13b3da77152dbd050edc30mukesh agrawal    EXPECT_TRUE(store_->GetBool(kGroupB, kKeyBool, &value));
809083047b53b55abe96200705618fa724e2e3ce715Darin Petkov    EXPECT_TRUE(value);
8100709b5a6bed9f9db0d13b3da77152dbd050edc30mukesh agrawal    EXPECT_TRUE(store_->GetBool(kGroupC, kKeyBool, &value));
811083047b53b55abe96200705618fa724e2e3ce715Darin Petkov    EXPECT_FALSE(value);
8120709b5a6bed9f9db0d13b3da77152dbd050edc30mukesh agrawal    EXPECT_FALSE(store_->GetBool(kGroupA, kKeyBool, &value));
813083047b53b55abe96200705618fa724e2e3ce715Darin Petkov  }
814083047b53b55abe96200705618fa724e2e3ce715Darin Petkov
8150709b5a6bed9f9db0d13b3da77152dbd050edc30mukesh agrawal  EXPECT_TRUE(store_->DeleteGroup(kGroupA));
8160709b5a6bed9f9db0d13b3da77152dbd050edc30mukesh agrawal  EXPECT_TRUE(store_->DeleteGroup(kGroupA));
817083047b53b55abe96200705618fa724e2e3ce715Darin Petkov
8180709b5a6bed9f9db0d13b3da77152dbd050edc30mukesh agrawal  EXPECT_FALSE(store_->ContainsGroup(kGroupA));
8190709b5a6bed9f9db0d13b3da77152dbd050edc30mukesh agrawal  EXPECT_TRUE(store_->ContainsGroup(kGroupB));
8200709b5a6bed9f9db0d13b3da77152dbd050edc30mukesh agrawal  EXPECT_TRUE(store_->ContainsGroup(kGroupC));
821083047b53b55abe96200705618fa724e2e3ce715Darin Petkov
8220709b5a6bed9f9db0d13b3da77152dbd050edc30mukesh agrawal  groups = store_->GetGroups();
823083047b53b55abe96200705618fa724e2e3ce715Darin Petkov  EXPECT_EQ(2, groups.size());
824083047b53b55abe96200705618fa724e2e3ce715Darin Petkov  EXPECT_FALSE(ContainsKey(groups, kGroupA));
825083047b53b55abe96200705618fa724e2e3ce715Darin Petkov  EXPECT_TRUE(ContainsKey(groups, kGroupB));
826083047b53b55abe96200705618fa724e2e3ce715Darin Petkov  EXPECT_TRUE(ContainsKey(groups, kGroupC));
827083047b53b55abe96200705618fa724e2e3ce715Darin Petkov
8280709b5a6bed9f9db0d13b3da77152dbd050edc30mukesh agrawal  EXPECT_TRUE(store_->SetBool(kGroupB, kKeyBool, false));
8290709b5a6bed9f9db0d13b3da77152dbd050edc30mukesh agrawal  EXPECT_TRUE(store_->SetInt(kGroupB, kKeyInt, kValueIntBNew));
8300709b5a6bed9f9db0d13b3da77152dbd050edc30mukesh agrawal  EXPECT_TRUE(store_->SetString(kGroupC, kKeyString, kValueStringCNew));
8310709b5a6bed9f9db0d13b3da77152dbd050edc30mukesh agrawal  store_->SetStringList(kGroupB,
832b2841fda690034b6952fe56ef1931200bb3b8e12Darin Petkov                       kKeyStringList,
833b2841fda690034b6952fe56ef1931200bb3b8e12Darin Petkov                       vector<string>(1, kValueStringB));
834083047b53b55abe96200705618fa724e2e3ce715Darin Petkov
8350709b5a6bed9f9db0d13b3da77152dbd050edc30mukesh agrawal  EXPECT_TRUE(store_->DeleteKey(kGroupB, kKeyString));
8360709b5a6bed9f9db0d13b3da77152dbd050edc30mukesh agrawal  EXPECT_TRUE(store_->DeleteKey(kGroupB, kKeyString));
837083047b53b55abe96200705618fa724e2e3ce715Darin Petkov
838083047b53b55abe96200705618fa724e2e3ce715Darin Petkov  {
839083047b53b55abe96200705618fa724e2e3ce715Darin Petkov    string value;
8400709b5a6bed9f9db0d13b3da77152dbd050edc30mukesh agrawal    EXPECT_FALSE(store_->GetString(kGroupB, kKeyString, &value));
8410709b5a6bed9f9db0d13b3da77152dbd050edc30mukesh agrawal    EXPECT_FALSE(store_->GetString(kGroupA, kKeyString, &value));
8420709b5a6bed9f9db0d13b3da77152dbd050edc30mukesh agrawal    EXPECT_TRUE(store_->GetString(kGroupC, kKeyString, &value));
843083047b53b55abe96200705618fa724e2e3ce715Darin Petkov    EXPECT_EQ(kValueStringCNew, value);
844083047b53b55abe96200705618fa724e2e3ce715Darin Petkov  }
845b2841fda690034b6952fe56ef1931200bb3b8e12Darin Petkov  {
846b2841fda690034b6952fe56ef1931200bb3b8e12Darin Petkov    vector<string> value;
8470709b5a6bed9f9db0d13b3da77152dbd050edc30mukesh agrawal    EXPECT_TRUE(store_->GetStringList(kGroupB, kKeyStringList, &value));
848b2841fda690034b6952fe56ef1931200bb3b8e12Darin Petkov    ASSERT_EQ(1, value.size());
849b2841fda690034b6952fe56ef1931200bb3b8e12Darin Petkov    EXPECT_EQ(kValueStringB, value[0]);
8500709b5a6bed9f9db0d13b3da77152dbd050edc30mukesh agrawal    EXPECT_FALSE(store_->GetStringList(kGroupA, kKeyStringList, &value));
8510709b5a6bed9f9db0d13b3da77152dbd050edc30mukesh agrawal    EXPECT_FALSE(store_->GetStringList(kGroupC, kKeyStringList, &value));
852b2841fda690034b6952fe56ef1931200bb3b8e12Darin Petkov  }
853083047b53b55abe96200705618fa724e2e3ce715Darin Petkov  {
854083047b53b55abe96200705618fa724e2e3ce715Darin Petkov    int value = 0;
8550709b5a6bed9f9db0d13b3da77152dbd050edc30mukesh agrawal    EXPECT_TRUE(store_->GetInt(kGroupB, kKeyInt, &value));
856083047b53b55abe96200705618fa724e2e3ce715Darin Petkov    EXPECT_EQ(kValueIntBNew, value);
8570709b5a6bed9f9db0d13b3da77152dbd050edc30mukesh agrawal    EXPECT_FALSE(store_->GetInt(kGroupA, kKeyInt, &value));
8580709b5a6bed9f9db0d13b3da77152dbd050edc30mukesh agrawal    EXPECT_FALSE(store_->GetInt(kGroupC, kKeyInt, &value));
859083047b53b55abe96200705618fa724e2e3ce715Darin Petkov  }
860083047b53b55abe96200705618fa724e2e3ce715Darin Petkov  {
861083047b53b55abe96200705618fa724e2e3ce715Darin Petkov    bool value = false;
8620709b5a6bed9f9db0d13b3da77152dbd050edc30mukesh agrawal    EXPECT_TRUE(store_->GetBool(kGroupB, kKeyBool, &value));
863083047b53b55abe96200705618fa724e2e3ce715Darin Petkov    EXPECT_FALSE(value);
8640709b5a6bed9f9db0d13b3da77152dbd050edc30mukesh agrawal    EXPECT_TRUE(store_->GetBool(kGroupC, kKeyBool, &value));
865083047b53b55abe96200705618fa724e2e3ce715Darin Petkov    EXPECT_FALSE(value);
8660709b5a6bed9f9db0d13b3da77152dbd050edc30mukesh agrawal    EXPECT_FALSE(store_->GetBool(kGroupA, kKeyBool, &value));
867083047b53b55abe96200705618fa724e2e3ce715Darin Petkov  }
868083047b53b55abe96200705618fa724e2e3ce715Darin Petkov
8690709b5a6bed9f9db0d13b3da77152dbd050edc30mukesh agrawal  ASSERT_TRUE(store_->Close());
870a0ddf46e466bd4ba3d20952f0a6988c680c1af14Ben Chan  EXPECT_EQ(base::StringPrintf("[%s]\n"
871b2841fda690034b6952fe56ef1931200bb3b8e12Darin Petkov                               "%s=%s;\n"
872083047b53b55abe96200705618fa724e2e3ce715Darin Petkov                               "%s=%d\n"
873083047b53b55abe96200705618fa724e2e3ce715Darin Petkov                               "%s=false\n"
874083047b53b55abe96200705618fa724e2e3ce715Darin Petkov                               "\n"
875083047b53b55abe96200705618fa724e2e3ce715Darin Petkov                               "[%s]\n"
876083047b53b55abe96200705618fa724e2e3ce715Darin Petkov                               "%s=%s\n"
877083047b53b55abe96200705618fa724e2e3ce715Darin Petkov                               "%s=false\n",
878083047b53b55abe96200705618fa724e2e3ce715Darin Petkov                               kGroupB,
879b2841fda690034b6952fe56ef1931200bb3b8e12Darin Petkov                               kKeyStringList, kValueStringB,
880083047b53b55abe96200705618fa724e2e3ce715Darin Petkov                               kKeyInt, kValueIntBNew,
881083047b53b55abe96200705618fa724e2e3ce715Darin Petkov                               kKeyBool,
882083047b53b55abe96200705618fa724e2e3ce715Darin Petkov                               kGroupC,
883083047b53b55abe96200705618fa724e2e3ce715Darin Petkov                               kKeyString, kValueStringCNew,
884083047b53b55abe96200705618fa724e2e3ce715Darin Petkov                               kKeyBool),
885083047b53b55abe96200705618fa724e2e3ce715Darin Petkov            ReadKeyFile());
886083047b53b55abe96200705618fa724e2e3ce715Darin Petkov}
887083047b53b55abe96200705618fa724e2e3ce715Darin Petkov
888083047b53b55abe96200705618fa724e2e3ce715Darin Petkov}  // namespace shill
889