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 #include "shill/dhcp_properties.h" 18 19 #if defined(__ANDROID__) 20 #include <dbus/service_constants.h> 21 #else 22 #include <chromeos/dbus/service_constants.h> 23 #endif // __ANDROID__ 24 #include <gtest/gtest.h> 25 26 #include "shill/mock_property_store.h" 27 #include "shill/mock_store.h" 28 29 using std::string; 30 using std::unique_ptr; 31 using testing::_; 32 using testing::DoAll; 33 using testing::Mock; 34 using testing::Return; 35 using testing::SetArgumentPointee; 36 using testing::Test; 37 38 namespace shill { 39 40 namespace { 41 const char kVendorClass[] = "Chromebook"; 42 const char kHostname[] = "TestHost"; 43 const char kStorageID[] = "dhcp_service_id"; 44 const char kOverrideValue[] = "override"; 45 } 46 47 class DhcpPropertiesTest : public Test { 48 public: 49 DhcpPropertiesTest() { } 50 51 virtual ~DhcpPropertiesTest() { } 52 53 protected: 54 DhcpProperties dhcp_properties_; 55 }; 56 57 TEST_F(DhcpPropertiesTest, Ctor) { 58 EXPECT_TRUE(dhcp_properties_.properties_.IsEmpty()); 59 } 60 61 TEST_F(DhcpPropertiesTest, InitPropertyStore) { 62 PropertyStore store; 63 dhcp_properties_.InitPropertyStore(&store); 64 65 Error error; 66 string value_in_prop_store; 67 // DHCPProperty.Hostname is a valid option. 68 EXPECT_FALSE(store.GetStringProperty("DHCPProperty.Hostname", 69 &value_in_prop_store, 70 &error)); 71 EXPECT_EQ(Error::kNotFound, error.type()); 72 73 // DHCPProperty.VendorClass is a valid option. 74 EXPECT_FALSE(store.GetStringProperty("DHCPProperty.VendorClass", 75 &value_in_prop_store, 76 &error)); 77 EXPECT_EQ(Error::kNotFound, error.type()); 78 79 // DhcpProperty.NotAProp is not a valid option. 80 EXPECT_FALSE(store.GetStringProperty("DHCPProperty.NotAProp", 81 &value_in_prop_store, 82 &error)); 83 EXPECT_EQ(Error::kInvalidProperty, error.type()); 84 } 85 86 TEST_F(DhcpPropertiesTest, SetMappedStringPropertyOverrideExisting) { 87 PropertyStore store; 88 dhcp_properties_.InitPropertyStore(&store); 89 dhcp_properties_.properties_.SetString("Hostname", kHostname); 90 91 Error error; 92 EXPECT_TRUE(store.SetStringProperty("DHCPProperty.Hostname", kOverrideValue, &error)); 93 EXPECT_EQ(kOverrideValue, dhcp_properties_.properties_.GetString("Hostname")); 94 } 95 96 TEST_F(DhcpPropertiesTest, SetMappedStringPropertyNoExistingValue) { 97 PropertyStore store; 98 dhcp_properties_.InitPropertyStore(&store); 99 100 Error error; 101 EXPECT_TRUE(store.SetStringProperty("DHCPProperty.Hostname", kHostname, &error)); 102 EXPECT_EQ(kHostname, dhcp_properties_.properties_.GetString("Hostname")); 103 } 104 105 TEST_F(DhcpPropertiesTest, SetMappedStringPropertySameAsExistingValue) { 106 PropertyStore store; 107 dhcp_properties_.InitPropertyStore(&store); 108 dhcp_properties_.properties_.SetString("Hostname", kHostname); 109 110 Error error; 111 EXPECT_FALSE(store.SetStringProperty("DHCPProperty.Hostname", kHostname, &error)); 112 EXPECT_EQ(kHostname, dhcp_properties_.properties_.GetString("Hostname")); 113 } 114 115 TEST_F(DhcpPropertiesTest, GetMappedStringPropertyWithSetValue) { 116 PropertyStore store; 117 dhcp_properties_.InitPropertyStore(&store); 118 dhcp_properties_.properties_.SetString("Hostname", kHostname); 119 120 Error error; 121 string value_in_prop_store; 122 store.GetStringProperty("DHCPProperty.Hostname", &value_in_prop_store, &error); 123 EXPECT_EQ(kHostname, value_in_prop_store); 124 } 125 126 TEST_F(DhcpPropertiesTest, GetMappedStringPropertyNoExistingValue) { 127 PropertyStore store; 128 dhcp_properties_.InitPropertyStore(&store); 129 130 Error error; 131 string value_in_prop_store; 132 store.GetStringProperty("DHCPProperty.Hostname", &value_in_prop_store, &error); 133 EXPECT_EQ(Error::kNotFound, error.type()); 134 } 135 136 TEST_F(DhcpPropertiesTest, ClearMappedStringPropertyWithSetValue) { 137 PropertyStore store; 138 dhcp_properties_.InitPropertyStore(&store); 139 dhcp_properties_.properties_.SetString("Hostname", kHostname); 140 141 Error error; 142 string value_in_prop_store; 143 store.ClearProperty("DHCPProperty.Hostname", &error); 144 EXPECT_FALSE(dhcp_properties_.properties_.ContainsString("Hostname")); 145 } 146 147 TEST_F(DhcpPropertiesTest, ClearMappedStringPropertyNoExistingValue) { 148 PropertyStore store; 149 dhcp_properties_.InitPropertyStore(&store); 150 151 Error error; 152 string value_in_prop_store; 153 store.ClearProperty("DHCPProperty.Hostname", &error); 154 EXPECT_EQ(Error::kNotFound, error.type()); 155 } 156 157 TEST_F(DhcpPropertiesTest, LoadEmpty) { 158 MockStore storage; 159 EXPECT_CALL(storage, GetString(kStorageID, "DHCPProperty.VendorClass", _)) 160 .WillOnce(Return(false)); 161 EXPECT_CALL(storage, GetString(kStorageID, "DHCPProperty.Hostname", _)) 162 .WillOnce(Return(false)); 163 dhcp_properties_.Load(&storage, kStorageID); 164 EXPECT_TRUE(dhcp_properties_.properties_.IsEmpty()); 165 } 166 167 TEST_F(DhcpPropertiesTest, Load) { 168 MockStore storage; 169 EXPECT_CALL(storage, GetString(kStorageID, "DHCPProperty.VendorClass", _)) 170 .WillOnce(DoAll(SetArgumentPointee<2>(string(kVendorClass)), 171 Return(true))); 172 EXPECT_CALL(storage, GetString(kStorageID, "DHCPProperty.Hostname", _)) 173 .WillOnce(DoAll(SetArgumentPointee<2>(string(kHostname)), 174 Return(true))); 175 dhcp_properties_.Load(&storage, kStorageID); 176 EXPECT_EQ(kVendorClass, 177 dhcp_properties_.properties_.GetString("VendorClass")); 178 EXPECT_EQ(kHostname, dhcp_properties_.properties_.GetString("Hostname")); 179 } 180 181 TEST_F(DhcpPropertiesTest, LoadWithValuesSetAndClearRequired) { 182 MockStore storage; 183 dhcp_properties_.properties_.SetString("Hostname", kHostname); 184 185 EXPECT_CALL(storage, GetString(kStorageID, "DHCPProperty.VendorClass", _)) 186 .WillOnce(DoAll(SetArgumentPointee<2>(string(kVendorClass)), 187 Return(true))); 188 EXPECT_CALL(storage, GetString(kStorageID, "DHCPProperty.Hostname", _)) 189 .WillOnce(Return(false)); 190 dhcp_properties_.Load(&storage, kStorageID); 191 EXPECT_EQ(kVendorClass, dhcp_properties_.properties_.GetString("VendorClass")); 192 EXPECT_FALSE(dhcp_properties_.properties_.Contains("Hostname")); 193 } 194 195 TEST_F(DhcpPropertiesTest, SaveWithValuesSet) { 196 MockStore storage; 197 dhcp_properties_.properties_.SetString("VendorClass", kVendorClass); 198 dhcp_properties_.properties_.SetString("Hostname", ""); 199 200 EXPECT_CALL(storage, 201 SetString(kStorageID, "DHCPProperty.VendorClass", kVendorClass)) 202 .WillOnce(Return(true)); 203 EXPECT_CALL(storage, 204 SetString(kStorageID, "DHCPProperty.Hostname", "")) 205 .WillOnce(Return(true)); 206 dhcp_properties_.Save(&storage, kStorageID); 207 } 208 209 TEST_F(DhcpPropertiesTest, SavePropertyNotSetShouldBeDeleted) { 210 MockStore storage; 211 dhcp_properties_.properties_.SetString("VendorClass", kVendorClass); 212 213 EXPECT_CALL(storage, SetString(_, _, _)).Times(0); 214 EXPECT_CALL(storage, 215 SetString(kStorageID, "DHCPProperty.VendorClass", kVendorClass)) 216 .WillOnce(Return(true)); 217 EXPECT_CALL(storage, 218 DeleteKey(kStorageID, "DHCPProperty.Hostname")) 219 .WillOnce(Return(true)); 220 dhcp_properties_.Save(&storage, kStorageID); 221 } 222 223 TEST_F(DhcpPropertiesTest, CombineIntoEmpty) { 224 DhcpProperties to_merge; 225 to_merge.properties_.SetString("VendorClass", kVendorClass); 226 to_merge.properties_.SetString("Hostname", kHostname); 227 228 unique_ptr<DhcpProperties> merged_props = 229 DhcpProperties::Combine(dhcp_properties_, to_merge); 230 EXPECT_EQ(merged_props->properties_, to_merge.properties_); 231 } 232 233 TEST_F(DhcpPropertiesTest, CombineEmptyIntoExisting) { 234 DhcpProperties to_merge; 235 dhcp_properties_.properties_.SetString("VendorClass", kVendorClass); 236 dhcp_properties_.properties_.SetString("Hostname", kHostname); 237 238 unique_ptr<DhcpProperties> merged_props = 239 DhcpProperties::Combine(dhcp_properties_, to_merge); 240 EXPECT_EQ(merged_props->properties_, dhcp_properties_.properties_); 241 } 242 243 TEST_F(DhcpPropertiesTest, CombineConflicting) { 244 DhcpProperties to_merge; 245 to_merge.properties_.SetString("VendorClass", kOverrideValue); 246 to_merge.properties_.SetString("Hostname", kHostname); 247 dhcp_properties_.properties_.SetString("VendorClass", kVendorClass); 248 249 unique_ptr<DhcpProperties> merged_props = 250 DhcpProperties::Combine(dhcp_properties_, to_merge); 251 EXPECT_EQ(kOverrideValue, merged_props->properties_.GetString("VendorClass")); 252 EXPECT_EQ(kHostname, merged_props->properties_.GetString("Hostname")); 253 } 254 255 TEST_F(DhcpPropertiesTest, GetValueForProperty) { 256 string value; 257 EXPECT_FALSE(dhcp_properties_.GetValueForProperty("VendorClass", &value)); 258 EXPECT_FALSE(dhcp_properties_.GetValueForProperty("Hostname", &value)); 259 260 dhcp_properties_.properties_.SetString("VendorClass", kVendorClass); 261 EXPECT_TRUE(dhcp_properties_.GetValueForProperty("VendorClass", &value)); 262 EXPECT_EQ(kVendorClass, value); 263 EXPECT_FALSE(dhcp_properties_.GetValueForProperty("Hostname", &value)); 264 265 dhcp_properties_.properties_.SetString("Hostname", kHostname); 266 EXPECT_TRUE(dhcp_properties_.GetValueForProperty("VendorClass", &value)); 267 EXPECT_EQ(kVendorClass, value); 268 EXPECT_TRUE(dhcp_properties_.GetValueForProperty("Hostname", &value)); 269 EXPECT_EQ(kHostname, value); 270 } 271 272 } // namespace shill 273