1 // 2 // Copyright (C) 2012 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 UPDATE_ENGINE_COMMON_FAKE_PREFS_H_ 18 #define UPDATE_ENGINE_COMMON_FAKE_PREFS_H_ 19 20 #include <map> 21 #include <string> 22 #include <vector> 23 24 #include <base/macros.h> 25 26 #include "update_engine/common/prefs_interface.h" 27 28 namespace chromeos_update_engine { 29 30 // Implements a fake preference store by storing the value associated with 31 // a key in a std::map, suitable for testing. It doesn't allow to set a value on 32 // a key with a different type than the previously set type. This enforces the 33 // type of a given key to be fixed. Also the class checks that the Get*() 34 // methods aren't called on a key set with a different type. 35 36 class FakePrefs : public PrefsInterface { 37 public: 38 FakePrefs() = default; 39 ~FakePrefs(); 40 41 // PrefsInterface methods. 42 bool GetString(const std::string& key, std::string* value) const override; 43 bool SetString(const std::string& key, const std::string& value) override; 44 bool GetInt64(const std::string& key, int64_t* value) const override; 45 bool SetInt64(const std::string& key, const int64_t value) override; 46 bool GetBoolean(const std::string& key, bool* value) const override; 47 bool SetBoolean(const std::string& key, const bool value) override; 48 49 bool Exists(const std::string& key) const override; 50 bool Delete(const std::string& key) override; 51 52 bool GetSubKeys(const std::string& ns, 53 std::vector<std::string>* keys) const override; 54 55 void AddObserver(const std::string& key, 56 ObserverInterface* observer) override; 57 void RemoveObserver(const std::string& key, 58 ObserverInterface* observer) override; 59 60 private: 61 enum class PrefType { 62 kString, 63 kInt64, 64 kBool, 65 }; 66 struct PrefValue { 67 std::string as_str; 68 int64_t as_int64; 69 bool as_bool; 70 }; 71 72 struct PrefTypeValue { 73 PrefType type; 74 PrefValue value; 75 }; 76 77 // Class to store compile-time type-dependent constants. 78 template <typename T> 79 class PrefConsts { 80 public: 81 // The PrefType associated with T. 82 static FakePrefs::PrefType const type; 83 84 // The data member pointer to PrefValue associated with T. 85 static T FakePrefs::PrefValue::*const member; 86 }; 87 88 // Returns a string representation of the PrefType useful for logging. 89 static std::string GetTypeName(PrefType type); 90 91 // Checks that the |key| is either not present or has the given |type|. 92 void CheckKeyType(const std::string& key, PrefType type) const; 93 94 // Helper function to set a value of the passed |key|. It sets the type based 95 // on the template parameter T. 96 template <typename T> 97 void SetValue(const std::string& key, const T& value); 98 99 // Helper function to get a value from the map checking for invalid calls. 100 // The function fails the test if you attempt to read a value defined as a 101 // different type. Returns whether the get succeeded. 102 template <typename T> 103 bool GetValue(const std::string& key, T* value) const; 104 105 // Container for all the key/value pairs. 106 std::map<std::string, PrefTypeValue> values_; 107 108 // The registered observers watching for changes. 109 std::map<std::string, std::vector<ObserverInterface*>> observers_; 110 111 DISALLOW_COPY_AND_ASSIGN(FakePrefs); 112 }; 113 114 } // namespace chromeos_update_engine 115 116 #endif // UPDATE_ENGINE_COMMON_FAKE_PREFS_H_ 117