1a77c5e24c871e2b25b2ca4def689388ba6c6892bRebecca Silberstein//
2a77c5e24c871e2b25b2ca4def689388ba6c6892bRebecca Silberstein// Copyright (C) 2015 The Android Open Source Project
3a77c5e24c871e2b25b2ca4def689388ba6c6892bRebecca Silberstein//
4a77c5e24c871e2b25b2ca4def689388ba6c6892bRebecca Silberstein// Licensed under the Apache License, Version 2.0 (the "License");
5a77c5e24c871e2b25b2ca4def689388ba6c6892bRebecca Silberstein// you may not use this file except in compliance with the License.
6a77c5e24c871e2b25b2ca4def689388ba6c6892bRebecca Silberstein// You may obtain a copy of the License at
7a77c5e24c871e2b25b2ca4def689388ba6c6892bRebecca Silberstein//
8a77c5e24c871e2b25b2ca4def689388ba6c6892bRebecca Silberstein//      http://www.apache.org/licenses/LICENSE-2.0
9a77c5e24c871e2b25b2ca4def689388ba6c6892bRebecca Silberstein//
10a77c5e24c871e2b25b2ca4def689388ba6c6892bRebecca Silberstein// Unless required by applicable law or agreed to in writing, software
11a77c5e24c871e2b25b2ca4def689388ba6c6892bRebecca Silberstein// distributed under the License is distributed on an "AS IS" BASIS,
12a77c5e24c871e2b25b2ca4def689388ba6c6892bRebecca Silberstein// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13a77c5e24c871e2b25b2ca4def689388ba6c6892bRebecca Silberstein// See the License for the specific language governing permissions and
14a77c5e24c871e2b25b2ca4def689388ba6c6892bRebecca Silberstein// limitations under the License.
15a77c5e24c871e2b25b2ca4def689388ba6c6892bRebecca Silberstein//
16a77c5e24c871e2b25b2ca4def689388ba6c6892bRebecca Silberstein
17a77c5e24c871e2b25b2ca4def689388ba6c6892bRebecca Silberstein#include "shill/dhcp_properties.h"
18a77c5e24c871e2b25b2ca4def689388ba6c6892bRebecca Silberstein
1962d57630fe05899743f319326bd99168fc2cd69cRebecca Silberstein#if defined(__ANDROID__)
2062d57630fe05899743f319326bd99168fc2cd69cRebecca Silberstein#include <dbus/service_constants.h>
2162d57630fe05899743f319326bd99168fc2cd69cRebecca Silberstein#else
22a77c5e24c871e2b25b2ca4def689388ba6c6892bRebecca Silberstein#include <chromeos/dbus/service_constants.h>
2362d57630fe05899743f319326bd99168fc2cd69cRebecca Silberstein#endif  // __ANDROID__
24a77c5e24c871e2b25b2ca4def689388ba6c6892bRebecca Silberstein#include <gtest/gtest.h>
25a77c5e24c871e2b25b2ca4def689388ba6c6892bRebecca Silberstein
26a77c5e24c871e2b25b2ca4def689388ba6c6892bRebecca Silberstein#include "shill/mock_property_store.h"
27a77c5e24c871e2b25b2ca4def689388ba6c6892bRebecca Silberstein#include "shill/mock_store.h"
28a77c5e24c871e2b25b2ca4def689388ba6c6892bRebecca Silberstein
29a77c5e24c871e2b25b2ca4def689388ba6c6892bRebecca Silbersteinusing std::string;
30a77c5e24c871e2b25b2ca4def689388ba6c6892bRebecca Silbersteinusing std::unique_ptr;
31a77c5e24c871e2b25b2ca4def689388ba6c6892bRebecca Silbersteinusing testing::_;
32a77c5e24c871e2b25b2ca4def689388ba6c6892bRebecca Silbersteinusing testing::DoAll;
33a77c5e24c871e2b25b2ca4def689388ba6c6892bRebecca Silbersteinusing testing::Mock;
34a77c5e24c871e2b25b2ca4def689388ba6c6892bRebecca Silbersteinusing testing::Return;
35a77c5e24c871e2b25b2ca4def689388ba6c6892bRebecca Silbersteinusing testing::SetArgumentPointee;
36a77c5e24c871e2b25b2ca4def689388ba6c6892bRebecca Silbersteinusing testing::Test;
37a77c5e24c871e2b25b2ca4def689388ba6c6892bRebecca Silberstein
38a77c5e24c871e2b25b2ca4def689388ba6c6892bRebecca Silbersteinnamespace shill {
39a77c5e24c871e2b25b2ca4def689388ba6c6892bRebecca Silberstein
40a77c5e24c871e2b25b2ca4def689388ba6c6892bRebecca Silbersteinnamespace {
41a77c5e24c871e2b25b2ca4def689388ba6c6892bRebecca Silbersteinconst char kVendorClass[] = "Chromebook";
42a77c5e24c871e2b25b2ca4def689388ba6c6892bRebecca Silbersteinconst char kHostname[] = "TestHost";
43a77c5e24c871e2b25b2ca4def689388ba6c6892bRebecca Silbersteinconst char kStorageID[] = "dhcp_service_id";
44a77c5e24c871e2b25b2ca4def689388ba6c6892bRebecca Silbersteinconst char kOverrideValue[] = "override";
45a77c5e24c871e2b25b2ca4def689388ba6c6892bRebecca Silberstein}
46a77c5e24c871e2b25b2ca4def689388ba6c6892bRebecca Silberstein
47a77c5e24c871e2b25b2ca4def689388ba6c6892bRebecca Silbersteinclass DhcpPropertiesTest : public Test {
48a77c5e24c871e2b25b2ca4def689388ba6c6892bRebecca Silberstein public:
49a77c5e24c871e2b25b2ca4def689388ba6c6892bRebecca Silberstein  DhcpPropertiesTest() { }
50a77c5e24c871e2b25b2ca4def689388ba6c6892bRebecca Silberstein
51a77c5e24c871e2b25b2ca4def689388ba6c6892bRebecca Silberstein  virtual ~DhcpPropertiesTest() { }
52a77c5e24c871e2b25b2ca4def689388ba6c6892bRebecca Silberstein
53a77c5e24c871e2b25b2ca4def689388ba6c6892bRebecca Silberstein protected:
54a77c5e24c871e2b25b2ca4def689388ba6c6892bRebecca Silberstein  DhcpProperties dhcp_properties_;
55a77c5e24c871e2b25b2ca4def689388ba6c6892bRebecca Silberstein};
56a77c5e24c871e2b25b2ca4def689388ba6c6892bRebecca Silberstein
57a77c5e24c871e2b25b2ca4def689388ba6c6892bRebecca SilbersteinTEST_F(DhcpPropertiesTest, Ctor) {
58a77c5e24c871e2b25b2ca4def689388ba6c6892bRebecca Silberstein  EXPECT_TRUE(dhcp_properties_.properties_.IsEmpty());
59a77c5e24c871e2b25b2ca4def689388ba6c6892bRebecca Silberstein}
60a77c5e24c871e2b25b2ca4def689388ba6c6892bRebecca Silberstein
61a77c5e24c871e2b25b2ca4def689388ba6c6892bRebecca SilbersteinTEST_F(DhcpPropertiesTest, InitPropertyStore) {
62a77c5e24c871e2b25b2ca4def689388ba6c6892bRebecca Silberstein  PropertyStore store;
63a77c5e24c871e2b25b2ca4def689388ba6c6892bRebecca Silberstein  dhcp_properties_.InitPropertyStore(&store);
64a77c5e24c871e2b25b2ca4def689388ba6c6892bRebecca Silberstein
65a77c5e24c871e2b25b2ca4def689388ba6c6892bRebecca Silberstein  Error error;
66a77c5e24c871e2b25b2ca4def689388ba6c6892bRebecca Silberstein  string value_in_prop_store;
67a77c5e24c871e2b25b2ca4def689388ba6c6892bRebecca Silberstein  // DHCPProperty.Hostname is a valid option.
68a77c5e24c871e2b25b2ca4def689388ba6c6892bRebecca Silberstein  EXPECT_FALSE(store.GetStringProperty("DHCPProperty.Hostname",
69a77c5e24c871e2b25b2ca4def689388ba6c6892bRebecca Silberstein                                       &value_in_prop_store,
70a77c5e24c871e2b25b2ca4def689388ba6c6892bRebecca Silberstein                                       &error));
71a77c5e24c871e2b25b2ca4def689388ba6c6892bRebecca Silberstein  EXPECT_EQ(Error::kNotFound, error.type());
72a77c5e24c871e2b25b2ca4def689388ba6c6892bRebecca Silberstein
73a77c5e24c871e2b25b2ca4def689388ba6c6892bRebecca Silberstein  // DHCPProperty.VendorClass is a valid option.
74a77c5e24c871e2b25b2ca4def689388ba6c6892bRebecca Silberstein  EXPECT_FALSE(store.GetStringProperty("DHCPProperty.VendorClass",
75a77c5e24c871e2b25b2ca4def689388ba6c6892bRebecca Silberstein                                       &value_in_prop_store,
76a77c5e24c871e2b25b2ca4def689388ba6c6892bRebecca Silberstein                                       &error));
77a77c5e24c871e2b25b2ca4def689388ba6c6892bRebecca Silberstein  EXPECT_EQ(Error::kNotFound, error.type());
78a77c5e24c871e2b25b2ca4def689388ba6c6892bRebecca Silberstein
79a77c5e24c871e2b25b2ca4def689388ba6c6892bRebecca Silberstein  // DhcpProperty.NotAProp is not a valid option.
80a77c5e24c871e2b25b2ca4def689388ba6c6892bRebecca Silberstein  EXPECT_FALSE(store.GetStringProperty("DHCPProperty.NotAProp",
81a77c5e24c871e2b25b2ca4def689388ba6c6892bRebecca Silberstein                                       &value_in_prop_store,
82a77c5e24c871e2b25b2ca4def689388ba6c6892bRebecca Silberstein                                       &error));
83a77c5e24c871e2b25b2ca4def689388ba6c6892bRebecca Silberstein  EXPECT_EQ(Error::kInvalidProperty, error.type());
84a77c5e24c871e2b25b2ca4def689388ba6c6892bRebecca Silberstein}
85a77c5e24c871e2b25b2ca4def689388ba6c6892bRebecca Silberstein
86a77c5e24c871e2b25b2ca4def689388ba6c6892bRebecca SilbersteinTEST_F(DhcpPropertiesTest, SetMappedStringPropertyOverrideExisting) {
87a77c5e24c871e2b25b2ca4def689388ba6c6892bRebecca Silberstein  PropertyStore store;
88a77c5e24c871e2b25b2ca4def689388ba6c6892bRebecca Silberstein  dhcp_properties_.InitPropertyStore(&store);
89a77c5e24c871e2b25b2ca4def689388ba6c6892bRebecca Silberstein  dhcp_properties_.properties_.SetString("Hostname", kHostname);
90a77c5e24c871e2b25b2ca4def689388ba6c6892bRebecca Silberstein
91a77c5e24c871e2b25b2ca4def689388ba6c6892bRebecca Silberstein  Error error;
92a77c5e24c871e2b25b2ca4def689388ba6c6892bRebecca Silberstein  EXPECT_TRUE(store.SetStringProperty("DHCPProperty.Hostname", kOverrideValue, &error));
93a77c5e24c871e2b25b2ca4def689388ba6c6892bRebecca Silberstein  EXPECT_EQ(kOverrideValue, dhcp_properties_.properties_.GetString("Hostname"));
94a77c5e24c871e2b25b2ca4def689388ba6c6892bRebecca Silberstein}
95a77c5e24c871e2b25b2ca4def689388ba6c6892bRebecca Silberstein
96a77c5e24c871e2b25b2ca4def689388ba6c6892bRebecca SilbersteinTEST_F(DhcpPropertiesTest, SetMappedStringPropertyNoExistingValue) {
97a77c5e24c871e2b25b2ca4def689388ba6c6892bRebecca Silberstein  PropertyStore store;
98a77c5e24c871e2b25b2ca4def689388ba6c6892bRebecca Silberstein  dhcp_properties_.InitPropertyStore(&store);
99a77c5e24c871e2b25b2ca4def689388ba6c6892bRebecca Silberstein
100a77c5e24c871e2b25b2ca4def689388ba6c6892bRebecca Silberstein  Error error;
101a77c5e24c871e2b25b2ca4def689388ba6c6892bRebecca Silberstein  EXPECT_TRUE(store.SetStringProperty("DHCPProperty.Hostname", kHostname, &error));
102a77c5e24c871e2b25b2ca4def689388ba6c6892bRebecca Silberstein  EXPECT_EQ(kHostname, dhcp_properties_.properties_.GetString("Hostname"));
103a77c5e24c871e2b25b2ca4def689388ba6c6892bRebecca Silberstein}
104a77c5e24c871e2b25b2ca4def689388ba6c6892bRebecca Silberstein
105a77c5e24c871e2b25b2ca4def689388ba6c6892bRebecca SilbersteinTEST_F(DhcpPropertiesTest, SetMappedStringPropertySameAsExistingValue) {
106a77c5e24c871e2b25b2ca4def689388ba6c6892bRebecca Silberstein  PropertyStore store;
107a77c5e24c871e2b25b2ca4def689388ba6c6892bRebecca Silberstein  dhcp_properties_.InitPropertyStore(&store);
108a77c5e24c871e2b25b2ca4def689388ba6c6892bRebecca Silberstein  dhcp_properties_.properties_.SetString("Hostname", kHostname);
109a77c5e24c871e2b25b2ca4def689388ba6c6892bRebecca Silberstein
110a77c5e24c871e2b25b2ca4def689388ba6c6892bRebecca Silberstein  Error error;
111a77c5e24c871e2b25b2ca4def689388ba6c6892bRebecca Silberstein  EXPECT_FALSE(store.SetStringProperty("DHCPProperty.Hostname", kHostname, &error));
112a77c5e24c871e2b25b2ca4def689388ba6c6892bRebecca Silberstein  EXPECT_EQ(kHostname, dhcp_properties_.properties_.GetString("Hostname"));
113a77c5e24c871e2b25b2ca4def689388ba6c6892bRebecca Silberstein}
114a77c5e24c871e2b25b2ca4def689388ba6c6892bRebecca Silberstein
115a77c5e24c871e2b25b2ca4def689388ba6c6892bRebecca SilbersteinTEST_F(DhcpPropertiesTest, GetMappedStringPropertyWithSetValue) {
116a77c5e24c871e2b25b2ca4def689388ba6c6892bRebecca Silberstein  PropertyStore store;
117a77c5e24c871e2b25b2ca4def689388ba6c6892bRebecca Silberstein  dhcp_properties_.InitPropertyStore(&store);
118a77c5e24c871e2b25b2ca4def689388ba6c6892bRebecca Silberstein  dhcp_properties_.properties_.SetString("Hostname", kHostname);
119a77c5e24c871e2b25b2ca4def689388ba6c6892bRebecca Silberstein
120a77c5e24c871e2b25b2ca4def689388ba6c6892bRebecca Silberstein  Error error;
121a77c5e24c871e2b25b2ca4def689388ba6c6892bRebecca Silberstein  string value_in_prop_store;
122a77c5e24c871e2b25b2ca4def689388ba6c6892bRebecca Silberstein  store.GetStringProperty("DHCPProperty.Hostname", &value_in_prop_store, &error);
123a77c5e24c871e2b25b2ca4def689388ba6c6892bRebecca Silberstein  EXPECT_EQ(kHostname, value_in_prop_store);
124a77c5e24c871e2b25b2ca4def689388ba6c6892bRebecca Silberstein}
125a77c5e24c871e2b25b2ca4def689388ba6c6892bRebecca Silberstein
126a77c5e24c871e2b25b2ca4def689388ba6c6892bRebecca SilbersteinTEST_F(DhcpPropertiesTest, GetMappedStringPropertyNoExistingValue) {
127a77c5e24c871e2b25b2ca4def689388ba6c6892bRebecca Silberstein  PropertyStore store;
128a77c5e24c871e2b25b2ca4def689388ba6c6892bRebecca Silberstein  dhcp_properties_.InitPropertyStore(&store);
129a77c5e24c871e2b25b2ca4def689388ba6c6892bRebecca Silberstein
130a77c5e24c871e2b25b2ca4def689388ba6c6892bRebecca Silberstein  Error error;
131a77c5e24c871e2b25b2ca4def689388ba6c6892bRebecca Silberstein  string value_in_prop_store;
132a77c5e24c871e2b25b2ca4def689388ba6c6892bRebecca Silberstein  store.GetStringProperty("DHCPProperty.Hostname", &value_in_prop_store, &error);
133a77c5e24c871e2b25b2ca4def689388ba6c6892bRebecca Silberstein  EXPECT_EQ(Error::kNotFound, error.type());
134a77c5e24c871e2b25b2ca4def689388ba6c6892bRebecca Silberstein}
135a77c5e24c871e2b25b2ca4def689388ba6c6892bRebecca Silberstein
136a77c5e24c871e2b25b2ca4def689388ba6c6892bRebecca SilbersteinTEST_F(DhcpPropertiesTest, ClearMappedStringPropertyWithSetValue) {
137a77c5e24c871e2b25b2ca4def689388ba6c6892bRebecca Silberstein  PropertyStore store;
138a77c5e24c871e2b25b2ca4def689388ba6c6892bRebecca Silberstein  dhcp_properties_.InitPropertyStore(&store);
139a77c5e24c871e2b25b2ca4def689388ba6c6892bRebecca Silberstein  dhcp_properties_.properties_.SetString("Hostname", kHostname);
140a77c5e24c871e2b25b2ca4def689388ba6c6892bRebecca Silberstein
141a77c5e24c871e2b25b2ca4def689388ba6c6892bRebecca Silberstein  Error error;
142a77c5e24c871e2b25b2ca4def689388ba6c6892bRebecca Silberstein  string value_in_prop_store;
143a77c5e24c871e2b25b2ca4def689388ba6c6892bRebecca Silberstein  store.ClearProperty("DHCPProperty.Hostname", &error);
144a77c5e24c871e2b25b2ca4def689388ba6c6892bRebecca Silberstein  EXPECT_FALSE(dhcp_properties_.properties_.ContainsString("Hostname"));
145a77c5e24c871e2b25b2ca4def689388ba6c6892bRebecca Silberstein}
146a77c5e24c871e2b25b2ca4def689388ba6c6892bRebecca Silberstein
147a77c5e24c871e2b25b2ca4def689388ba6c6892bRebecca SilbersteinTEST_F(DhcpPropertiesTest, ClearMappedStringPropertyNoExistingValue) {
148a77c5e24c871e2b25b2ca4def689388ba6c6892bRebecca Silberstein  PropertyStore store;
149a77c5e24c871e2b25b2ca4def689388ba6c6892bRebecca Silberstein  dhcp_properties_.InitPropertyStore(&store);
150a77c5e24c871e2b25b2ca4def689388ba6c6892bRebecca Silberstein
151a77c5e24c871e2b25b2ca4def689388ba6c6892bRebecca Silberstein  Error error;
152a77c5e24c871e2b25b2ca4def689388ba6c6892bRebecca Silberstein  string value_in_prop_store;
153a77c5e24c871e2b25b2ca4def689388ba6c6892bRebecca Silberstein  store.ClearProperty("DHCPProperty.Hostname", &error);
154a77c5e24c871e2b25b2ca4def689388ba6c6892bRebecca Silberstein  EXPECT_EQ(Error::kNotFound, error.type());
155a77c5e24c871e2b25b2ca4def689388ba6c6892bRebecca Silberstein}
156a77c5e24c871e2b25b2ca4def689388ba6c6892bRebecca Silberstein
157a77c5e24c871e2b25b2ca4def689388ba6c6892bRebecca SilbersteinTEST_F(DhcpPropertiesTest, LoadEmpty) {
158a77c5e24c871e2b25b2ca4def689388ba6c6892bRebecca Silberstein  MockStore storage;
159a77c5e24c871e2b25b2ca4def689388ba6c6892bRebecca Silberstein  EXPECT_CALL(storage, GetString(kStorageID, "DHCPProperty.VendorClass", _))
160a77c5e24c871e2b25b2ca4def689388ba6c6892bRebecca Silberstein      .WillOnce(Return(false));
161a77c5e24c871e2b25b2ca4def689388ba6c6892bRebecca Silberstein  EXPECT_CALL(storage, GetString(kStorageID, "DHCPProperty.Hostname", _))
162a77c5e24c871e2b25b2ca4def689388ba6c6892bRebecca Silberstein      .WillOnce(Return(false));
163a77c5e24c871e2b25b2ca4def689388ba6c6892bRebecca Silberstein  dhcp_properties_.Load(&storage, kStorageID);
164a77c5e24c871e2b25b2ca4def689388ba6c6892bRebecca Silberstein  EXPECT_TRUE(dhcp_properties_.properties_.IsEmpty());
165a77c5e24c871e2b25b2ca4def689388ba6c6892bRebecca Silberstein}
166a77c5e24c871e2b25b2ca4def689388ba6c6892bRebecca Silberstein
167a77c5e24c871e2b25b2ca4def689388ba6c6892bRebecca SilbersteinTEST_F(DhcpPropertiesTest, Load) {
168a77c5e24c871e2b25b2ca4def689388ba6c6892bRebecca Silberstein  MockStore storage;
169a77c5e24c871e2b25b2ca4def689388ba6c6892bRebecca Silberstein  EXPECT_CALL(storage, GetString(kStorageID, "DHCPProperty.VendorClass", _))
170a77c5e24c871e2b25b2ca4def689388ba6c6892bRebecca Silberstein      .WillOnce(DoAll(SetArgumentPointee<2>(string(kVendorClass)),
171a77c5e24c871e2b25b2ca4def689388ba6c6892bRebecca Silberstein                      Return(true)));
172a77c5e24c871e2b25b2ca4def689388ba6c6892bRebecca Silberstein  EXPECT_CALL(storage, GetString(kStorageID, "DHCPProperty.Hostname", _))
173a77c5e24c871e2b25b2ca4def689388ba6c6892bRebecca Silberstein      .WillOnce(DoAll(SetArgumentPointee<2>(string(kHostname)),
174a77c5e24c871e2b25b2ca4def689388ba6c6892bRebecca Silberstein                      Return(true)));
175a77c5e24c871e2b25b2ca4def689388ba6c6892bRebecca Silberstein  dhcp_properties_.Load(&storage, kStorageID);
176a77c5e24c871e2b25b2ca4def689388ba6c6892bRebecca Silberstein  EXPECT_EQ(kVendorClass,
177a77c5e24c871e2b25b2ca4def689388ba6c6892bRebecca Silberstein            dhcp_properties_.properties_.GetString("VendorClass"));
178a77c5e24c871e2b25b2ca4def689388ba6c6892bRebecca Silberstein  EXPECT_EQ(kHostname, dhcp_properties_.properties_.GetString("Hostname"));
179a77c5e24c871e2b25b2ca4def689388ba6c6892bRebecca Silberstein}
180a77c5e24c871e2b25b2ca4def689388ba6c6892bRebecca Silberstein
181a77c5e24c871e2b25b2ca4def689388ba6c6892bRebecca SilbersteinTEST_F(DhcpPropertiesTest, LoadWithValuesSetAndClearRequired) {
182a77c5e24c871e2b25b2ca4def689388ba6c6892bRebecca Silberstein  MockStore storage;
183a77c5e24c871e2b25b2ca4def689388ba6c6892bRebecca Silberstein  dhcp_properties_.properties_.SetString("Hostname", kHostname);
184a77c5e24c871e2b25b2ca4def689388ba6c6892bRebecca Silberstein
185a77c5e24c871e2b25b2ca4def689388ba6c6892bRebecca Silberstein  EXPECT_CALL(storage, GetString(kStorageID, "DHCPProperty.VendorClass", _))
186a77c5e24c871e2b25b2ca4def689388ba6c6892bRebecca Silberstein      .WillOnce(DoAll(SetArgumentPointee<2>(string(kVendorClass)),
187a77c5e24c871e2b25b2ca4def689388ba6c6892bRebecca Silberstein                      Return(true)));
188a77c5e24c871e2b25b2ca4def689388ba6c6892bRebecca Silberstein  EXPECT_CALL(storage, GetString(kStorageID, "DHCPProperty.Hostname", _))
189a77c5e24c871e2b25b2ca4def689388ba6c6892bRebecca Silberstein      .WillOnce(Return(false));
190a77c5e24c871e2b25b2ca4def689388ba6c6892bRebecca Silberstein  dhcp_properties_.Load(&storage, kStorageID);
191a77c5e24c871e2b25b2ca4def689388ba6c6892bRebecca Silberstein  EXPECT_EQ(kVendorClass, dhcp_properties_.properties_.GetString("VendorClass"));
192a77c5e24c871e2b25b2ca4def689388ba6c6892bRebecca Silberstein  EXPECT_FALSE(dhcp_properties_.properties_.Contains("Hostname"));
193a77c5e24c871e2b25b2ca4def689388ba6c6892bRebecca Silberstein}
194a77c5e24c871e2b25b2ca4def689388ba6c6892bRebecca Silberstein
195a77c5e24c871e2b25b2ca4def689388ba6c6892bRebecca SilbersteinTEST_F(DhcpPropertiesTest, SaveWithValuesSet) {
196a77c5e24c871e2b25b2ca4def689388ba6c6892bRebecca Silberstein  MockStore storage;
197a77c5e24c871e2b25b2ca4def689388ba6c6892bRebecca Silberstein  dhcp_properties_.properties_.SetString("VendorClass", kVendorClass);
198a77c5e24c871e2b25b2ca4def689388ba6c6892bRebecca Silberstein  dhcp_properties_.properties_.SetString("Hostname", "");
199a77c5e24c871e2b25b2ca4def689388ba6c6892bRebecca Silberstein
200a77c5e24c871e2b25b2ca4def689388ba6c6892bRebecca Silberstein  EXPECT_CALL(storage,
201a77c5e24c871e2b25b2ca4def689388ba6c6892bRebecca Silberstein              SetString(kStorageID, "DHCPProperty.VendorClass", kVendorClass))
202a77c5e24c871e2b25b2ca4def689388ba6c6892bRebecca Silberstein      .WillOnce(Return(true));
203a77c5e24c871e2b25b2ca4def689388ba6c6892bRebecca Silberstein  EXPECT_CALL(storage,
204a77c5e24c871e2b25b2ca4def689388ba6c6892bRebecca Silberstein              SetString(kStorageID, "DHCPProperty.Hostname", ""))
205a77c5e24c871e2b25b2ca4def689388ba6c6892bRebecca Silberstein      .WillOnce(Return(true));
206a77c5e24c871e2b25b2ca4def689388ba6c6892bRebecca Silberstein  dhcp_properties_.Save(&storage, kStorageID);
207a77c5e24c871e2b25b2ca4def689388ba6c6892bRebecca Silberstein}
208a77c5e24c871e2b25b2ca4def689388ba6c6892bRebecca Silberstein
209a77c5e24c871e2b25b2ca4def689388ba6c6892bRebecca SilbersteinTEST_F(DhcpPropertiesTest, SavePropertyNotSetShouldBeDeleted) {
210a77c5e24c871e2b25b2ca4def689388ba6c6892bRebecca Silberstein  MockStore storage;
211a77c5e24c871e2b25b2ca4def689388ba6c6892bRebecca Silberstein  dhcp_properties_.properties_.SetString("VendorClass", kVendorClass);
212a77c5e24c871e2b25b2ca4def689388ba6c6892bRebecca Silberstein
213a77c5e24c871e2b25b2ca4def689388ba6c6892bRebecca Silberstein  EXPECT_CALL(storage, SetString(_, _, _)).Times(0);
214a77c5e24c871e2b25b2ca4def689388ba6c6892bRebecca Silberstein  EXPECT_CALL(storage,
215a77c5e24c871e2b25b2ca4def689388ba6c6892bRebecca Silberstein              SetString(kStorageID, "DHCPProperty.VendorClass", kVendorClass))
216a77c5e24c871e2b25b2ca4def689388ba6c6892bRebecca Silberstein      .WillOnce(Return(true));
217a77c5e24c871e2b25b2ca4def689388ba6c6892bRebecca Silberstein  EXPECT_CALL(storage,
218a77c5e24c871e2b25b2ca4def689388ba6c6892bRebecca Silberstein              DeleteKey(kStorageID, "DHCPProperty.Hostname"))
219a77c5e24c871e2b25b2ca4def689388ba6c6892bRebecca Silberstein      .WillOnce(Return(true));
220a77c5e24c871e2b25b2ca4def689388ba6c6892bRebecca Silberstein  dhcp_properties_.Save(&storage, kStorageID);
221a77c5e24c871e2b25b2ca4def689388ba6c6892bRebecca Silberstein}
222a77c5e24c871e2b25b2ca4def689388ba6c6892bRebecca Silberstein
223a77c5e24c871e2b25b2ca4def689388ba6c6892bRebecca SilbersteinTEST_F(DhcpPropertiesTest, CombineIntoEmpty) {
224a77c5e24c871e2b25b2ca4def689388ba6c6892bRebecca Silberstein  DhcpProperties to_merge;
225a77c5e24c871e2b25b2ca4def689388ba6c6892bRebecca Silberstein  to_merge.properties_.SetString("VendorClass", kVendorClass);
226a77c5e24c871e2b25b2ca4def689388ba6c6892bRebecca Silberstein  to_merge.properties_.SetString("Hostname", kHostname);
227a77c5e24c871e2b25b2ca4def689388ba6c6892bRebecca Silberstein
228a77c5e24c871e2b25b2ca4def689388ba6c6892bRebecca Silberstein  unique_ptr<DhcpProperties> merged_props =
229a77c5e24c871e2b25b2ca4def689388ba6c6892bRebecca Silberstein      DhcpProperties::Combine(dhcp_properties_, to_merge);
230a77c5e24c871e2b25b2ca4def689388ba6c6892bRebecca Silberstein  EXPECT_EQ(merged_props->properties_, to_merge.properties_);
231a77c5e24c871e2b25b2ca4def689388ba6c6892bRebecca Silberstein}
232a77c5e24c871e2b25b2ca4def689388ba6c6892bRebecca Silberstein
233a77c5e24c871e2b25b2ca4def689388ba6c6892bRebecca SilbersteinTEST_F(DhcpPropertiesTest, CombineEmptyIntoExisting) {
234a77c5e24c871e2b25b2ca4def689388ba6c6892bRebecca Silberstein  DhcpProperties to_merge;
235a77c5e24c871e2b25b2ca4def689388ba6c6892bRebecca Silberstein  dhcp_properties_.properties_.SetString("VendorClass", kVendorClass);
236a77c5e24c871e2b25b2ca4def689388ba6c6892bRebecca Silberstein  dhcp_properties_.properties_.SetString("Hostname", kHostname);
237a77c5e24c871e2b25b2ca4def689388ba6c6892bRebecca Silberstein
238a77c5e24c871e2b25b2ca4def689388ba6c6892bRebecca Silberstein  unique_ptr<DhcpProperties> merged_props =
239a77c5e24c871e2b25b2ca4def689388ba6c6892bRebecca Silberstein      DhcpProperties::Combine(dhcp_properties_, to_merge);
240a77c5e24c871e2b25b2ca4def689388ba6c6892bRebecca Silberstein  EXPECT_EQ(merged_props->properties_, dhcp_properties_.properties_);
241a77c5e24c871e2b25b2ca4def689388ba6c6892bRebecca Silberstein}
242a77c5e24c871e2b25b2ca4def689388ba6c6892bRebecca Silberstein
243a77c5e24c871e2b25b2ca4def689388ba6c6892bRebecca SilbersteinTEST_F(DhcpPropertiesTest, CombineConflicting) {
244a77c5e24c871e2b25b2ca4def689388ba6c6892bRebecca Silberstein  DhcpProperties to_merge;
245a77c5e24c871e2b25b2ca4def689388ba6c6892bRebecca Silberstein  to_merge.properties_.SetString("VendorClass", kOverrideValue);
246a77c5e24c871e2b25b2ca4def689388ba6c6892bRebecca Silberstein  to_merge.properties_.SetString("Hostname", kHostname);
247a77c5e24c871e2b25b2ca4def689388ba6c6892bRebecca Silberstein  dhcp_properties_.properties_.SetString("VendorClass", kVendorClass);
248a77c5e24c871e2b25b2ca4def689388ba6c6892bRebecca Silberstein
249a77c5e24c871e2b25b2ca4def689388ba6c6892bRebecca Silberstein  unique_ptr<DhcpProperties> merged_props =
250a77c5e24c871e2b25b2ca4def689388ba6c6892bRebecca Silberstein      DhcpProperties::Combine(dhcp_properties_, to_merge);
251a77c5e24c871e2b25b2ca4def689388ba6c6892bRebecca Silberstein  EXPECT_EQ(kOverrideValue, merged_props->properties_.GetString("VendorClass"));
252a77c5e24c871e2b25b2ca4def689388ba6c6892bRebecca Silberstein  EXPECT_EQ(kHostname, merged_props->properties_.GetString("Hostname"));
253a77c5e24c871e2b25b2ca4def689388ba6c6892bRebecca Silberstein}
254a77c5e24c871e2b25b2ca4def689388ba6c6892bRebecca Silberstein
255a77c5e24c871e2b25b2ca4def689388ba6c6892bRebecca SilbersteinTEST_F(DhcpPropertiesTest, GetValueForProperty) {
256a77c5e24c871e2b25b2ca4def689388ba6c6892bRebecca Silberstein  string value;
257a77c5e24c871e2b25b2ca4def689388ba6c6892bRebecca Silberstein  EXPECT_FALSE(dhcp_properties_.GetValueForProperty("VendorClass", &value));
258a77c5e24c871e2b25b2ca4def689388ba6c6892bRebecca Silberstein  EXPECT_FALSE(dhcp_properties_.GetValueForProperty("Hostname", &value));
259a77c5e24c871e2b25b2ca4def689388ba6c6892bRebecca Silberstein
260a77c5e24c871e2b25b2ca4def689388ba6c6892bRebecca Silberstein  dhcp_properties_.properties_.SetString("VendorClass", kVendorClass);
261a77c5e24c871e2b25b2ca4def689388ba6c6892bRebecca Silberstein  EXPECT_TRUE(dhcp_properties_.GetValueForProperty("VendorClass", &value));
262a77c5e24c871e2b25b2ca4def689388ba6c6892bRebecca Silberstein  EXPECT_EQ(kVendorClass, value);
263a77c5e24c871e2b25b2ca4def689388ba6c6892bRebecca Silberstein  EXPECT_FALSE(dhcp_properties_.GetValueForProperty("Hostname", &value));
264a77c5e24c871e2b25b2ca4def689388ba6c6892bRebecca Silberstein
265a77c5e24c871e2b25b2ca4def689388ba6c6892bRebecca Silberstein  dhcp_properties_.properties_.SetString("Hostname", kHostname);
266a77c5e24c871e2b25b2ca4def689388ba6c6892bRebecca Silberstein  EXPECT_TRUE(dhcp_properties_.GetValueForProperty("VendorClass", &value));
267a77c5e24c871e2b25b2ca4def689388ba6c6892bRebecca Silberstein  EXPECT_EQ(kVendorClass, value);
268a77c5e24c871e2b25b2ca4def689388ba6c6892bRebecca Silberstein  EXPECT_TRUE(dhcp_properties_.GetValueForProperty("Hostname", &value));
269a77c5e24c871e2b25b2ca4def689388ba6c6892bRebecca Silberstein  EXPECT_EQ(kHostname, value);
270a77c5e24c871e2b25b2ca4def689388ba6c6892bRebecca Silberstein}
271a77c5e24c871e2b25b2ca4def689388ba6c6892bRebecca Silberstein
272a77c5e24c871e2b25b2ca4def689388ba6c6892bRebecca Silberstein} // namespace shill
273