1//
2// Copyright (C) 2015 The Android Open Source Project
3//
4// Licensed under the Apache License, Version 2.0 (the "License");
5// you may not use this file except in compliance with the License.
6// You may obtain a copy of the License at
7//
8//      http://www.apache.org/licenses/LICENSE-2.0
9//
10// Unless required by applicable law or agreed to in writing, software
11// distributed under the License is distributed on an "AS IS" BASIS,
12// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13// See the License for the specific language governing permissions and
14// limitations under the License.
15//
16
17#ifndef SHILL_JSON_STORE_H_
18#define SHILL_JSON_STORE_H_
19
20#include <map>
21#include <set>
22#include <string>
23#include <vector>
24
25#include <base/files/file_path.h>
26#include <brillo/variant_dictionary.h>
27#include <gtest/gtest_prod.h>  // for FRIEND_TEST
28
29#include "shill/store_interface.h"
30
31namespace shill {
32
33class JsonStore : public StoreInterface {
34 public:
35  explicit JsonStore(const base::FilePath& path);
36  // TODO(quiche): Determine if we need a dtor. In particular, we'll
37  // need one of StoreInterface implementations are expected to
38  // automatically Flush() before destruction.
39
40  // Inherited from StoreInterface.
41  bool IsNonEmpty() const override;
42  bool Open() override;
43  bool Close() override;
44  bool Flush() override;
45  bool MarkAsCorrupted() override;
46  std::set<std::string> GetGroups() const override;
47  std::set<std::string> GetGroupsWithKey(const std::string& key) const override;
48  std::set<std::string> GetGroupsWithProperties(
49      const KeyValueStore& properties) const override;
50  bool ContainsGroup(const std::string& group) const override;
51  bool DeleteKey(const std::string& group, const std::string& key) override;
52  bool DeleteGroup(const std::string& group) override;
53  bool SetHeader(const std::string& header) override;
54  bool GetString(const std::string& group,
55                 const std::string& key,
56                 std::string* value) const override;
57  bool SetString(const std::string& group,
58                 const std::string& key,
59                 const std::string& value) override;
60  bool GetBool(const std::string& group,
61               const std::string& key,
62               bool* value) const override;
63  bool SetBool(const std::string& group,
64               const std::string& key,
65               bool value) override;
66  bool GetInt(const std::string& group,
67              const std::string& key,
68              int* value) const override;
69  bool SetInt(const std::string& group,
70              const std::string& key,
71              int value) override;
72  bool GetUint64(const std::string& group,
73                 const std::string& key,
74                 uint64_t* value) const override;
75  bool SetUint64(const std::string& group,
76                 const std::string& key,
77                 uint64_t value) override;
78  bool GetStringList(const std::string& group,
79                     const std::string& key,
80                     std::vector<std::string>* value) const override;
81  bool SetStringList(const std::string& group,
82                     const std::string& key,
83                     const std::vector<std::string>& value) override;
84  // GetCryptedString is non-const for legacy reasons. See
85  // KeyFileStore::SetCryptedString() for details.
86  bool GetCryptedString(const std::string& group,
87                        const std::string& key,
88                        std::string* value) override;
89  bool SetCryptedString(const std::string& group,
90                        const std::string& key,
91                        const std::string& value) override;
92
93 private:
94  FRIEND_TEST(JsonStoreTest, CanPersistAndRestoreHeader);  // file_description_
95  // Tests which use |group_name_to_settings_|.
96  FRIEND_TEST(JsonStoreTest, CanPersistAndRestoreAllTypes);
97  FRIEND_TEST(JsonStoreTest, CanPersistAndRestoreNonUtf8Strings);
98  FRIEND_TEST(JsonStoreTest, CanPersistAndRestoreNonUtf8StringList);
99  FRIEND_TEST(JsonStoreTest, CanPersistAndRestoreMultipleGroups);
100  FRIEND_TEST(JsonStoreTest, CanPersistAndRestoreMultipleGroupsWithSameKeys);
101  FRIEND_TEST(JsonStoreTest, CanPersistAndRestoreStringsWithEmbeddedNulls);
102  FRIEND_TEST(JsonStoreTest, CanPersistAndRestoreStringListWithEmbeddedNulls);
103  // Tests which modify |path_|.
104  FRIEND_TEST(JsonStoreTest, FlushFailsWhenPathComponentDoesNotExist);
105
106  template<typename T> bool ReadSetting(
107      const std::string& group, const std::string& key, T* out) const;
108  template<typename T> bool WriteSetting(
109      const std::string& group, const std::string& key, const T& new_value);
110
111  const base::FilePath path_;
112  std::string file_description_;
113  std::map<std::string, brillo::VariantDictionary> group_name_to_settings_;
114
115  DISALLOW_COPY_AND_ASSIGN(JsonStore);
116};
117
118}  // namespace shill
119
120#endif  // SHILL_JSON_STORE_H_
121