// // Copyright (C) 2015 The Android Open Source Project // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // #ifndef SHILL_DHCP_PROPERTIES_H_ #define SHILL_DHCP_PROPERTIES_H_ #include <string> #include <gtest/gtest_prod.h> // for FRIEND_TEST #include "shill/accessor_interface.h" #include "shill/key_value_store.h" namespace shill { class Error; class PropertyStore; class StoreInterface; class DhcpProperties { public: static const char kHostnameProperty[]; static const char kVendorClassProperty[]; DhcpProperties(); virtual ~DhcpProperties(); // Adds property accessors to the DhcpProperty parameters in |this| // to |store|. void InitPropertyStore(PropertyStore* store); // Loads DHCP properties from |storage| in group |id|. virtual void Load(StoreInterface* store, const std::string& id); // Saves DHCP properties to |storage| in group |id|. virtual void Save(StoreInterface* store, const std::string& id) const; // Combines two DHCP property objects and returns a // std::unique_ptr<DhcpProperties>. The new DhcpProperties instance is the // union of the key-value pairs in |base| and |to_merge|. For keys which // exist in both |base| and |to_merge|, the value is taken from |to_merge|. // EX: |base| stores {"VendorClass": "v1", "Hostname": "host1"} // |to_merge| stores {"Hostname": "differentname"} // returned DhcpProperties will store: // {"VendorClass": "v1", "Hostname": "differentname"} // EX: |base| stores {"Hostname": "host1"} // |to_merge| stores {"Hostname": "differentname", "VendorClass": "vc"} // returned DhcpProperties will store: // {"Hostname": "differentname", "VendorClass": "vc"} static std::unique_ptr<DhcpProperties> Combine( const DhcpProperties& base, const DhcpProperties& to_merge); // Retrieves the value for a property with |name| in |value| if it is set. // Returns true if the property was found. bool GetValueForProperty(const std::string& name, std::string* value) const; const KeyValueStore& properties() const { return properties_; }; private: FRIEND_TEST(DhcpPropertiesTest, ClearMappedStringPropertyNoExistingValue); FRIEND_TEST(DhcpPropertiesTest, ClearMappedStringPropertyWithSetValue); FRIEND_TEST(DhcpPropertiesTest, CombineIntoEmpty); FRIEND_TEST(DhcpPropertiesTest, CombineEmptyIntoExisting); FRIEND_TEST(DhcpPropertiesTest, CombineConflicting); FRIEND_TEST(DhcpPropertiesTest, Ctor); FRIEND_TEST(DhcpPropertiesTest, GetMappedStringPropertyNoExistingValue); FRIEND_TEST(DhcpPropertiesTest, GetMappedStringPropertyWithSetValue); FRIEND_TEST(DhcpPropertiesTest, GetValueForProperty); FRIEND_TEST(DhcpPropertiesTest, Load); FRIEND_TEST(DhcpPropertiesTest, LoadEmpty); FRIEND_TEST(DhcpPropertiesTest, LoadWithValuesSetAndClearRequired); FRIEND_TEST(DhcpPropertiesTest, SaveWithValuesSet); FRIEND_TEST(DhcpPropertiesTest, SavePropertyNotSetShouldBeDeleted); FRIEND_TEST(DhcpPropertiesTest, SetMappedStringPropertyNoExistingValue); FRIEND_TEST(DhcpPropertiesTest, SetMappedStringPropertyOverrideExisting); FRIEND_TEST(DhcpPropertiesTest, SetMappedStringPropertySameAsExistingValue); void ClearMappedStringProperty(const size_t& index, Error* error); std::string GetMappedStringProperty(const size_t& index, Error* error); bool SetMappedStringProperty( const size_t& index, const std::string& value, Error* error); // KeyValueStore tracking values for DhcpProperties settings. KeyValueStore properties_; DISALLOW_COPY_AND_ASSIGN(DhcpProperties); }; } // namespace shill #endif // SHILL_DHCP_PROPERTIES_H_