blob: 312530d7b2b63a15961d43ecfa78fd14547d5acd [file] [log] [blame]
mukesh agrawal6bb9e7c2012-01-30 14:57:54 -08001// Copyright (c) 2012 The Chromium OS Authors. All rights reserved.
Darin Petkove7cb7f82011-06-03 13:21:51 -07002// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
Chris Masone8a7b8be2011-07-22 12:43:37 -07005#include "shill/dhcp_config.h"
6
Eric Shienbrood3e20a232012-02-16 11:35:56 -05007#include <base/bind.h>
Darin Petkov92c43902011-06-09 20:46:06 -07008#include <base/file_util.h>
Paul Stewart5ad16062013-02-21 18:10:48 -08009#include <base/files/scoped_temp_dir.h>
Darin Petkov92c43902011-06-09 20:46:06 -070010#include <base/stringprintf.h>
Chris Masone43b48a12011-07-01 13:37:07 -070011#include <chromeos/dbus/service_constants.h>
Chris Masone8a7b8be2011-07-22 12:43:37 -070012#include <gtest/gtest.h>
Darin Petkov92c43902011-06-09 20:46:06 -070013
Chris Masone43b48a12011-07-01 13:37:07 -070014#include "shill/dbus_adaptor.h"
Darin Petkovf7897bc2011-06-08 17:13:36 -070015#include "shill/dhcp_provider.h"
Paul Stewart26b327e2011-10-19 11:38:09 -070016#include "shill/event_dispatcher.h"
Chris Masone19e30402011-07-19 15:48:47 -070017#include "shill/mock_control.h"
Darin Petkov98dd6a02011-06-10 15:12:57 -070018#include "shill/mock_dhcp_proxy.h"
Darin Petkovf7897bc2011-06-08 17:13:36 -070019#include "shill/mock_glib.h"
mukesh agrawal6c6655d2012-12-06 14:49:50 -080020#include "shill/mock_log.h"
Jorge Lucangeli Obesad43cc62012-04-11 16:25:43 -070021#include "shill/mock_minijail.h"
Chris Masone43b48a12011-07-01 13:37:07 -070022#include "shill/property_store_unittest.h"
Darin Petkova7b89492011-07-27 12:48:17 -070023#include "shill/proxy_factory.h"
Darin Petkove7cb7f82011-06-03 13:21:51 -070024
Eric Shienbrood3e20a232012-02-16 11:35:56 -050025using base::Bind;
Albert Chaulk0e1cdea2013-02-27 15:32:55 -080026using base::FilePath;
Paul Stewart5ad16062013-02-21 18:10:48 -080027using base::ScopedTempDir;
Eric Shienbrood3e20a232012-02-16 11:35:56 -050028using base::Unretained;
Darin Petkove7cb7f82011-06-03 13:21:51 -070029using std::string;
30using std::vector;
Darin Petkovf7897bc2011-06-08 17:13:36 -070031using testing::_;
mukesh agrawal1835e772013-01-15 18:35:03 -080032using testing::AnyNumber;
33using testing::ContainsRegex;
Darin Petkovf7897bc2011-06-08 17:13:36 -070034using testing::Return;
35using testing::SetArgumentPointee;
Darin Petkove7cb7f82011-06-03 13:21:51 -070036using testing::Test;
37
38namespace shill {
39
Darin Petkov92c43902011-06-09 20:46:06 -070040namespace {
Darin Petkova7b89492011-07-27 12:48:17 -070041const char kDeviceName[] = "eth0";
Paul Stewartd32f4842012-01-11 16:08:13 -080042const char kHostName[] = "hostname";
Paul Stewartd408fdf2012-05-07 17:15:57 -070043const char kLeaseFileSuffix[] = "leasefilesuffix";
44const bool kArpGateway = true;
Paul Stewart75a68b92013-10-24 10:50:27 -070045const bool kHasHostname = true;
46const bool kHasLeaseSuffix = true;
47const bool kMinimalConfig = true;
Darin Petkov92c43902011-06-09 20:46:06 -070048} // namespace {}
49
Chris Masone43b48a12011-07-01 13:37:07 -070050class DHCPConfigTest : public PropertyStoreTest {
Darin Petkove7cb7f82011-06-03 13:21:51 -070051 public:
Darin Petkovf7897bc2011-06-08 17:13:36 -070052 DHCPConfigTest()
Darin Petkovf65e9282011-06-21 14:29:56 -070053 : proxy_(new MockDHCPProxy()),
Darin Petkova7b89492011-07-27 12:48:17 -070054 proxy_factory_(this),
Jorge Lucangeli Obesad43cc62012-04-11 16:25:43 -070055 minijail_(new MockMinijail()),
Chris Masone19e30402011-07-19 15:48:47 -070056 config_(new DHCPConfig(&control_,
Chris Masone2176a882011-09-14 22:29:15 -070057 dispatcher(),
Chris Masone19e30402011-07-19 15:48:47 -070058 DHCPProvider::GetInstance(),
Darin Petkov92c43902011-06-09 20:46:06 -070059 kDeviceName,
Paul Stewartd32f4842012-01-11 16:08:13 -080060 kHostName,
Paul Stewartd408fdf2012-05-07 17:15:57 -070061 kLeaseFileSuffix,
62 kArpGateway,
Paul Stewart75a68b92013-10-24 10:50:27 -070063 !kMinimalConfig,
Chris Masone2176a882011-09-14 22:29:15 -070064 glib())) {}
Darin Petkova7b89492011-07-27 12:48:17 -070065
66 virtual void SetUp() {
Darin Petkovab565bb2011-10-06 02:55:51 -070067 config_->proxy_factory_ = &proxy_factory_;
Jorge Lucangeli Obesad43cc62012-04-11 16:25:43 -070068 config_->minijail_ = minijail_.get();
Darin Petkova7b89492011-07-27 12:48:17 -070069 }
70
71 virtual void TearDown() {
Darin Petkovab565bb2011-10-06 02:55:51 -070072 config_->proxy_factory_ = NULL;
Jorge Lucangeli Obesad43cc62012-04-11 16:25:43 -070073 config_->minijail_ = NULL;
Darin Petkov98dd6a02011-06-10 15:12:57 -070074 }
Darin Petkove7cb7f82011-06-03 13:21:51 -070075
Jorge Lucangeli Obesad43cc62012-04-11 16:25:43 -070076 DHCPConfigRefPtr CreateMockMinijailConfig(const string &hostname,
Paul Stewart75a68b92013-10-24 10:50:27 -070077 const string &lease_suffix,
78 bool arp_gateway,
79 bool minimal_config);
Paul Stewartd408fdf2012-05-07 17:15:57 -070080 DHCPConfigRefPtr CreateRunningConfig(const string &hostname,
81 const string &lease_suffix,
Paul Stewart75a68b92013-10-24 10:50:27 -070082 bool arp_gateway,
83 bool minimal_config);
Paul Stewartd408fdf2012-05-07 17:15:57 -070084 void StopRunningConfigAndExpect(DHCPConfigRefPtr config,
85 bool lease_file_exists);
86
Darin Petkove7cb7f82011-06-03 13:21:51 -070087 protected:
Darin Petkova7b89492011-07-27 12:48:17 -070088 class TestProxyFactory : public ProxyFactory {
89 public:
Paul Stewart7355ce12011-09-02 10:47:01 -070090 explicit TestProxyFactory(DHCPConfigTest *test) : test_(test) {}
Darin Petkova7b89492011-07-27 12:48:17 -070091
mukesh agrawal1830fa12011-09-26 14:31:40 -070092 virtual DHCPProxyInterface *CreateDHCPProxy(const string &/*service*/) {
Darin Petkova7b89492011-07-27 12:48:17 -070093 return test_->proxy_.release();
94 }
95
96 private:
97 DHCPConfigTest *test_;
98 };
99
Paul Stewartd408fdf2012-05-07 17:15:57 -0700100 static const int kPID;
101 static const unsigned int kTag;
102
103 FilePath lease_file_;
104 FilePath pid_file_;
105 ScopedTempDir temp_dir_;
Darin Petkova7b89492011-07-27 12:48:17 -0700106 scoped_ptr<MockDHCPProxy> proxy_;
107 TestProxyFactory proxy_factory_;
Chris Masone19e30402011-07-19 15:48:47 -0700108 MockControl control_;
Jorge Lucangeli Obesad43cc62012-04-11 16:25:43 -0700109 scoped_ptr<MockMinijail> minijail_;
Darin Petkovf7897bc2011-06-08 17:13:36 -0700110 DHCPConfigRefPtr config_;
Darin Petkove7cb7f82011-06-03 13:21:51 -0700111};
112
Paul Stewartd408fdf2012-05-07 17:15:57 -0700113const int DHCPConfigTest::kPID = 123456;
114const unsigned int DHCPConfigTest::kTag = 77;
115
Jorge Lucangeli Obesad43cc62012-04-11 16:25:43 -0700116DHCPConfigRefPtr DHCPConfigTest::CreateMockMinijailConfig(
Paul Stewart75a68b92013-10-24 10:50:27 -0700117 const string &hostname,
118 const string &lease_suffix,
119 bool arp_gateway,
120 bool minimal_config) {
Jorge Lucangeli Obesad43cc62012-04-11 16:25:43 -0700121 DHCPConfigRefPtr config(new DHCPConfig(&control_,
122 dispatcher(),
123 DHCPProvider::GetInstance(),
124 kDeviceName,
125 hostname,
126 lease_suffix,
127 arp_gateway,
Paul Stewart75a68b92013-10-24 10:50:27 -0700128 minimal_config,
Jorge Lucangeli Obesad43cc62012-04-11 16:25:43 -0700129 glib()));
130 config->minijail_ = minijail_.get();
Jorge Lucangeli Obesad43cc62012-04-11 16:25:43 -0700131
132 return config;
133}
134
Paul Stewart75a68b92013-10-24 10:50:27 -0700135DHCPConfigRefPtr DHCPConfigTest::CreateRunningConfig(
136 const string &hostname,
137 const string &lease_suffix,
138 bool arp_gateway,
139 bool minimal_config) {
Paul Stewartd408fdf2012-05-07 17:15:57 -0700140 DHCPConfigRefPtr config(new DHCPConfig(&control_,
141 dispatcher(),
142 DHCPProvider::GetInstance(),
143 kDeviceName,
144 hostname,
145 lease_suffix,
146 arp_gateway,
Paul Stewart75a68b92013-10-24 10:50:27 -0700147 minimal_config,
Paul Stewartd408fdf2012-05-07 17:15:57 -0700148 glib()));
Jorge Lucangeli Obesad43cc62012-04-11 16:25:43 -0700149 config->minijail_ = minijail_.get();
150 EXPECT_CALL(*minijail_, RunAndDestroy(_, _, _))
151 .WillOnce(DoAll(SetArgumentPointee<2>(kPID), Return(true)));
Paul Stewartd408fdf2012-05-07 17:15:57 -0700152 EXPECT_CALL(*glib(), ChildWatchAdd(kPID, _, _)).WillOnce(Return(kTag));
153 EXPECT_TRUE(config->Start());
154 EXPECT_EQ(kPID, config->pid_);
155 EXPECT_EQ(config.get(), DHCPProvider::GetInstance()->GetConfig(kPID).get());
156 EXPECT_EQ(kTag, config->child_watch_tag_);
157
158 EXPECT_TRUE(temp_dir_.CreateUniqueTempDir());
159 config->root_ = temp_dir_.path();
Jorge Lucangeli Obes2f3169d2012-04-25 11:38:25 -0700160 FilePath varrun = temp_dir_.path().Append("var/run/dhcpcd");
Paul Stewartd408fdf2012-05-07 17:15:57 -0700161 EXPECT_TRUE(file_util::CreateDirectory(varrun));
162 pid_file_ = varrun.Append(base::StringPrintf("dhcpcd-%s.pid", kDeviceName));
163 FilePath varlib = temp_dir_.path().Append("var/lib/dhcpcd");
164 EXPECT_TRUE(file_util::CreateDirectory(varlib));
165 lease_file_ =
166 varlib.Append(base::StringPrintf("dhcpcd-%s.lease", kDeviceName));
167 EXPECT_EQ(0, file_util::WriteFile(pid_file_, "", 0));
168 EXPECT_EQ(0, file_util::WriteFile(lease_file_, "", 0));
169 EXPECT_TRUE(file_util::PathExists(pid_file_));
170 EXPECT_TRUE(file_util::PathExists(lease_file_));
171
172 return config;
173}
174
175void DHCPConfigTest::StopRunningConfigAndExpect(DHCPConfigRefPtr config,
176 bool lease_file_exists) {
mukesh agrawal6c6655d2012-12-06 14:49:50 -0800177 ScopedMockLog log;
178 // We use a non-zero exit status so that we get the log message.
179 EXPECT_CALL(log, Log(_, _, ::testing::EndsWith("status 10")));
180 DHCPConfig::ChildWatchCallback(kPID, 10, config.get());
Paul Stewartd408fdf2012-05-07 17:15:57 -0700181 EXPECT_EQ(NULL, DHCPProvider::GetInstance()->GetConfig(kPID).get());
182
183 EXPECT_FALSE(file_util::PathExists(pid_file_));
184 EXPECT_EQ(lease_file_exists, file_util::PathExists(lease_file_));
185}
186
Darin Petkove7cb7f82011-06-03 13:21:51 -0700187TEST_F(DHCPConfigTest, GetIPv4AddressString) {
Darin Petkovf7897bc2011-06-08 17:13:36 -0700188 EXPECT_EQ("255.255.255.255", config_->GetIPv4AddressString(0xffffffff));
189 EXPECT_EQ("0.0.0.0", config_->GetIPv4AddressString(0));
190 EXPECT_EQ("1.2.3.4", config_->GetIPv4AddressString(0x04030201));
Darin Petkove7cb7f82011-06-03 13:21:51 -0700191}
192
Darin Petkova7b89492011-07-27 12:48:17 -0700193TEST_F(DHCPConfigTest, InitProxy) {
194 static const char kService[] = ":1.200";
Darin Petkova7b89492011-07-27 12:48:17 -0700195 EXPECT_TRUE(proxy_.get());
196 EXPECT_FALSE(config_->proxy_.get());
Eric Shienbrood9a245532012-03-07 14:20:39 -0500197 config_->InitProxy(kService);
Darin Petkova7b89492011-07-27 12:48:17 -0700198 EXPECT_FALSE(proxy_.get());
199 EXPECT_TRUE(config_->proxy_.get());
200
201 config_->InitProxy(kService);
Darin Petkova7b89492011-07-27 12:48:17 -0700202}
203
Paul Stewart65bcd082012-11-16 09:37:14 -0800204TEST_F(DHCPConfigTest, ParseClasslessStaticRoutes) {
205 const string kDefaultAddress = "0.0.0.0";
206 const string kDefaultDestination = kDefaultAddress + "/0";
207 const string kRouter0 = "10.0.0.254";
208 const string kAddress1 = "192.168.1.0";
209 const string kDestination1 = kAddress1 + "/24";
210 // Last gateway missing, leaving an odd number of parameters.
211 const string kBrokenClasslessRoutes0 = kDefaultDestination + " " + kRouter0 +
212 " " + kDestination1;
213 IPConfig::Properties properties;
214 EXPECT_FALSE(DHCPConfig::ParseClasslessStaticRoutes(kBrokenClasslessRoutes0,
215 &properties));
216 EXPECT_TRUE(properties.routes.empty());
217 EXPECT_TRUE(properties.gateway.empty());
218
219 // Gateway argument for the second route is malformed, but we were able
220 // to salvage a default gateway.
221 const string kBrokenRouter1 = "10.0.0";
222 const string kBrokenClasslessRoutes1 = kBrokenClasslessRoutes0 + " " +
223 kBrokenRouter1;
224 EXPECT_FALSE(DHCPConfig::ParseClasslessStaticRoutes(kBrokenClasslessRoutes1,
225 &properties));
226 EXPECT_TRUE(properties.routes.empty());
227 EXPECT_EQ(kRouter0, properties.gateway);
228
229 const string kRouter1 = "10.0.0.253";
230 const string kRouter2 = "10.0.0.252";
231 const string kClasslessRoutes0 = kDefaultDestination + " " + kRouter2 + " " +
232 kDestination1 + " " + kRouter1;
233 EXPECT_TRUE(DHCPConfig::ParseClasslessStaticRoutes(kClasslessRoutes0,
234 &properties));
235 // The old default route is preserved.
236 EXPECT_EQ(kRouter0, properties.gateway);
237
238 // The two routes (including the one which would have otherwise been
239 // classified as a default route) are added to the routing table.
240 EXPECT_EQ(2, properties.routes.size());
241 const IPConfig::Route &route0 = properties.routes[0];
242 EXPECT_EQ(kDefaultAddress, route0.host);
243 EXPECT_EQ("0.0.0.0", route0.netmask);
244 EXPECT_EQ(kRouter2, route0.gateway);
245
246 const IPConfig::Route &route1 = properties.routes[1];
247 EXPECT_EQ(kAddress1, route1.host);
248 EXPECT_EQ("255.255.255.0", route1.netmask);
249 EXPECT_EQ(kRouter1, route1.gateway);
250
251 // A malformed routing table should not affect the current table.
252 EXPECT_FALSE(DHCPConfig::ParseClasslessStaticRoutes(kBrokenClasslessRoutes1,
253 &properties));
254 EXPECT_EQ(2, properties.routes.size());
255 EXPECT_EQ(kRouter0, properties.gateway);
256}
257
Darin Petkove7cb7f82011-06-03 13:21:51 -0700258TEST_F(DHCPConfigTest, ParseConfiguration) {
259 DHCPConfig::Configuration conf;
260 conf[DHCPConfig::kConfigurationKeyIPAddress].writer().append_uint32(
261 0x01020304);
262 conf[DHCPConfig::kConfigurationKeySubnetCIDR].writer().append_byte(
263 16);
264 conf[DHCPConfig::kConfigurationKeyBroadcastAddress].writer().append_uint32(
265 0x10203040);
266 {
Darin Petkove7cb7f82011-06-03 13:21:51 -0700267 vector<unsigned int> routers;
268 routers.push_back(0x02040608);
269 routers.push_back(0x03050709);
Darin Petkovf7897bc2011-06-08 17:13:36 -0700270 DBus::MessageIter writer =
271 conf[DHCPConfig::kConfigurationKeyRouters].writer();
Darin Petkove7cb7f82011-06-03 13:21:51 -0700272 writer << routers;
Darin Petkove7cb7f82011-06-03 13:21:51 -0700273 }
274 {
Darin Petkove7cb7f82011-06-03 13:21:51 -0700275 vector<unsigned int> dns;
276 dns.push_back(0x09070503);
277 dns.push_back(0x08060402);
Darin Petkovf7897bc2011-06-08 17:13:36 -0700278 DBus::MessageIter writer = conf[DHCPConfig::kConfigurationKeyDNS].writer();
Darin Petkove7cb7f82011-06-03 13:21:51 -0700279 writer << dns;
Darin Petkove7cb7f82011-06-03 13:21:51 -0700280 }
281 conf[DHCPConfig::kConfigurationKeyDomainName].writer().append_string(
282 "domain-name");
283 {
Darin Petkove7cb7f82011-06-03 13:21:51 -0700284 vector<string> search;
285 search.push_back("foo.com");
286 search.push_back("bar.com");
Darin Petkovf7897bc2011-06-08 17:13:36 -0700287 DBus::MessageIter writer =
288 conf[DHCPConfig::kConfigurationKeyDomainSearch].writer();
Darin Petkove7cb7f82011-06-03 13:21:51 -0700289 writer << search;
Darin Petkove7cb7f82011-06-03 13:21:51 -0700290 }
291 conf[DHCPConfig::kConfigurationKeyMTU].writer().append_uint16(600);
292 conf["UnknownKey"] = DBus::Variant();
293
Darin Petkove7cb7f82011-06-03 13:21:51 -0700294 IPConfig::Properties properties;
Darin Petkovf7897bc2011-06-08 17:13:36 -0700295 ASSERT_TRUE(config_->ParseConfiguration(conf, &properties));
Darin Petkove7cb7f82011-06-03 13:21:51 -0700296 EXPECT_EQ("4.3.2.1", properties.address);
Paul Stewart48100b02012-03-19 07:53:52 -0700297 EXPECT_EQ(16, properties.subnet_prefix);
Darin Petkove7cb7f82011-06-03 13:21:51 -0700298 EXPECT_EQ("64.48.32.16", properties.broadcast_address);
299 EXPECT_EQ("8.6.4.2", properties.gateway);
300 ASSERT_EQ(2, properties.dns_servers.size());
301 EXPECT_EQ("3.5.7.9", properties.dns_servers[0]);
302 EXPECT_EQ("2.4.6.8", properties.dns_servers[1]);
303 EXPECT_EQ("domain-name", properties.domain_name);
304 ASSERT_EQ(2, properties.domain_search.size());
305 EXPECT_EQ("foo.com", properties.domain_search[0]);
306 EXPECT_EQ("bar.com", properties.domain_search[1]);
307 EXPECT_EQ(600, properties.mtu);
308}
309
Darin Petkov92c43902011-06-09 20:46:06 -0700310TEST_F(DHCPConfigTest, StartFail) {
Jorge Lucangeli Obesad43cc62012-04-11 16:25:43 -0700311 EXPECT_CALL(*minijail_, RunAndDestroy(_, _, _)).WillOnce(Return(false));
Chris Masone2176a882011-09-14 22:29:15 -0700312 EXPECT_CALL(*glib(), ChildWatchAdd(_, _, _)).Times(0);
Darin Petkovf7897bc2011-06-08 17:13:36 -0700313 EXPECT_FALSE(config_->Start());
314 EXPECT_EQ(0, config_->pid_);
Darin Petkov92c43902011-06-09 20:46:06 -0700315}
Darin Petkovf7897bc2011-06-08 17:13:36 -0700316
Paul Stewart75a68b92013-10-24 10:50:27 -0700317MATCHER_P4(IsDHCPCDArgs, has_hostname, has_arp_gateway, has_lease_suffix,
318 has_minimal_config, "") {
Paul Stewartd32f4842012-01-11 16:08:13 -0800319 if (string(arg[0]) != "/sbin/dhcpcd" ||
Paul Stewart75a68b92013-10-24 10:50:27 -0700320 string(arg[1]) != "-B" ||
321 string(arg[2]) != "-q") {
Paul Stewartd32f4842012-01-11 16:08:13 -0800322 return false;
323 }
324
Paul Stewart75a68b92013-10-24 10:50:27 -0700325 int end_offset = 3;
Paul Stewartd32f4842012-01-11 16:08:13 -0800326 if (has_hostname) {
Paul Stewartd408fdf2012-05-07 17:15:57 -0700327 if (string(arg[end_offset]) != "-h" ||
328 string(arg[end_offset + 1]) != kHostName) {
Paul Stewartd32f4842012-01-11 16:08:13 -0800329 return false;
330 }
Paul Stewartd408fdf2012-05-07 17:15:57 -0700331 end_offset += 2;
Paul Stewartd32f4842012-01-11 16:08:13 -0800332 }
333
Paul Stewartd408fdf2012-05-07 17:15:57 -0700334 if (has_arp_gateway) {
Paul Stewart75a68b92013-10-24 10:50:27 -0700335 if (string(arg[end_offset]) != "-R" ||
336 string(arg[end_offset + 1]) != "-U") {
Paul Stewartd408fdf2012-05-07 17:15:57 -0700337 return false;
Paul Stewart75a68b92013-10-24 10:50:27 -0700338 }
339 end_offset += 2;
340 }
341
342 if (has_minimal_config) {
343 if (string(arg[end_offset]) != "-f" ||
344 string(arg[end_offset + 1]) != "/etc/dhcpcd-minimal.conf") {
345 return false;
346 }
347 end_offset += 2;
Paul Stewartd408fdf2012-05-07 17:15:57 -0700348 }
349
350 string device_arg = has_lease_suffix ?
351 string(kDeviceName) + "=" + string(kLeaseFileSuffix) : kDeviceName;
352 return string(arg[end_offset]) == device_arg && arg[end_offset + 1] == NULL;
Paul Stewartd32f4842012-01-11 16:08:13 -0800353}
354
355TEST_F(DHCPConfigTest, StartWithHostname) {
Paul Stewart75a68b92013-10-24 10:50:27 -0700356 EXPECT_CALL(*minijail_, RunAndDestroy(_, IsDHCPCDArgs(kHasHostname,
357 kArpGateway,
358 kHasLeaseSuffix,
359 !kMinimalConfig), _))
360 .WillOnce(Return(false));
Paul Stewartd32f4842012-01-11 16:08:13 -0800361 EXPECT_FALSE(config_->Start());
362}
363
364TEST_F(DHCPConfigTest, StartWithoutHostname) {
Jorge Lucangeli Obesad43cc62012-04-11 16:25:43 -0700365 DHCPConfigRefPtr config = CreateMockMinijailConfig("",
366 kLeaseFileSuffix,
Paul Stewart75a68b92013-10-24 10:50:27 -0700367 kArpGateway,
368 !kMinimalConfig);
369 EXPECT_CALL(*minijail_, RunAndDestroy(_, IsDHCPCDArgs(!kHasHostname,
370 kArpGateway,
371 kHasLeaseSuffix,
372 !kMinimalConfig), _))
373 .WillOnce(Return(false));
Paul Stewartd408fdf2012-05-07 17:15:57 -0700374 EXPECT_FALSE(config->Start());
375}
376
377TEST_F(DHCPConfigTest, StartWithoutArpGateway) {
Jorge Lucangeli Obesad43cc62012-04-11 16:25:43 -0700378 DHCPConfigRefPtr config = CreateMockMinijailConfig(kHostName,
379 kLeaseFileSuffix,
Paul Stewart75a68b92013-10-24 10:50:27 -0700380 !kArpGateway,
381 !kMinimalConfig);
382 EXPECT_CALL(*minijail_, RunAndDestroy(_, IsDHCPCDArgs(kHasHostname,
383 !kArpGateway,
384 kHasLeaseSuffix,
385 !kMinimalConfig), _))
386 .WillOnce(Return(false));
Paul Stewartd408fdf2012-05-07 17:15:57 -0700387 EXPECT_FALSE(config->Start());
388}
389
390TEST_F(DHCPConfigTest, StartWithoutLeaseSuffix) {
Jorge Lucangeli Obesad43cc62012-04-11 16:25:43 -0700391 DHCPConfigRefPtr config = CreateMockMinijailConfig(kHostName,
392 kDeviceName,
Paul Stewart75a68b92013-10-24 10:50:27 -0700393 kArpGateway,
394 !kMinimalConfig);
395 EXPECT_CALL(*minijail_, RunAndDestroy(_, IsDHCPCDArgs(kHasHostname,
396 kArpGateway,
397 !kHasLeaseSuffix,
398 !kMinimalConfig), _))
399 .WillOnce(Return(false));
400 EXPECT_FALSE(config->Start());
401}
402
403TEST_F(DHCPConfigTest, StartWithMinimalConfig) {
404 DHCPConfigRefPtr config = CreateMockMinijailConfig(kHostName,
405 kLeaseFileSuffix,
406 kArpGateway,
407 kMinimalConfig);
408 EXPECT_CALL(*minijail_, RunAndDestroy(_, IsDHCPCDArgs(kHasHostname,
409 kArpGateway,
410 kHasLeaseSuffix,
411 kMinimalConfig), _))
412 .WillOnce(Return(false));
Paul Stewartd32f4842012-01-11 16:08:13 -0800413 EXPECT_FALSE(config->Start());
414}
415
Darin Petkovf9b0ca82011-06-20 12:10:23 -0700416namespace {
417
418class UpdateCallbackTest {
419 public:
420 UpdateCallbackTest(const string &message,
Chris Masone2b105542011-06-22 10:58:09 -0700421 const IPConfigRefPtr &ipconfig,
Darin Petkovf9b0ca82011-06-20 12:10:23 -0700422 bool success)
423 : message_(message),
424 ipconfig_(ipconfig),
425 success_(success),
426 called_(false) {}
427
Chris Masone2b105542011-06-22 10:58:09 -0700428 void Callback(const IPConfigRefPtr &ipconfig, bool success) {
Darin Petkovf9b0ca82011-06-20 12:10:23 -0700429 called_ = true;
430 EXPECT_EQ(ipconfig_.get(), ipconfig.get()) << message_;
431 EXPECT_EQ(success_, success) << message_;
432 }
433
434 bool called() const { return called_; }
435
436 private:
437 const string message_;
438 IPConfigRefPtr ipconfig_;
439 bool success_;
440 bool called_;
441};
442
mukesh agrawalcc0fded2012-05-09 13:40:58 -0700443void DoNothing() {}
444
Darin Petkovf9b0ca82011-06-20 12:10:23 -0700445} // namespace {}
446
447TEST_F(DHCPConfigTest, ProcessEventSignalFail) {
448 DHCPConfig::Configuration conf;
449 conf[DHCPConfig::kConfigurationKeyIPAddress].writer().append_uint32(
450 0x01020304);
451 UpdateCallbackTest callback_test(DHCPConfig::kReasonFail, config_, false);
452 config_->RegisterUpdateCallback(
Eric Shienbrood3e20a232012-02-16 11:35:56 -0500453 Bind(&UpdateCallbackTest::Callback, Unretained(&callback_test)));
mukesh agrawalcc0fded2012-05-09 13:40:58 -0700454 config_->lease_acquisition_timeout_callback_.Reset(base::Bind(&DoNothing));
Darin Petkovf9b0ca82011-06-20 12:10:23 -0700455 config_->ProcessEventSignal(DHCPConfig::kReasonFail, conf);
456 EXPECT_TRUE(callback_test.called());
457 EXPECT_TRUE(config_->properties().address.empty());
mukesh agrawalcc0fded2012-05-09 13:40:58 -0700458 EXPECT_TRUE(config_->lease_acquisition_timeout_callback_.IsCancelled());
Darin Petkovf9b0ca82011-06-20 12:10:23 -0700459}
460
461TEST_F(DHCPConfigTest, ProcessEventSignalSuccess) {
462 static const char * const kReasons[] = {
463 DHCPConfig::kReasonBound,
464 DHCPConfig::kReasonRebind,
465 DHCPConfig::kReasonReboot,
466 DHCPConfig::kReasonRenew
467 };
468 for (size_t r = 0; r < arraysize(kReasons); r++) {
469 DHCPConfig::Configuration conf;
470 string message = string(kReasons[r]) + " failed";
471 conf[DHCPConfig::kConfigurationKeyIPAddress].writer().append_uint32(r);
472 UpdateCallbackTest callback_test(message, config_, true);
473 config_->RegisterUpdateCallback(
Eric Shienbrood3e20a232012-02-16 11:35:56 -0500474 Bind(&UpdateCallbackTest::Callback, Unretained(&callback_test)));
mukesh agrawalcc0fded2012-05-09 13:40:58 -0700475 config_->lease_acquisition_timeout_callback_.Reset(base::Bind(&DoNothing));
Darin Petkovf9b0ca82011-06-20 12:10:23 -0700476 config_->ProcessEventSignal(kReasons[r], conf);
477 EXPECT_TRUE(callback_test.called()) << message;
Paul Stewart83224402011-11-30 14:52:30 -0800478 EXPECT_EQ(base::StringPrintf("%zu.0.0.0", r), config_->properties().address)
Darin Petkovf9b0ca82011-06-20 12:10:23 -0700479 << message;
mukesh agrawalcc0fded2012-05-09 13:40:58 -0700480 EXPECT_TRUE(config_->lease_acquisition_timeout_callback_.IsCancelled());
Darin Petkovf9b0ca82011-06-20 12:10:23 -0700481 }
482}
483
484TEST_F(DHCPConfigTest, ProcessEventSignalUnknown) {
485 DHCPConfig::Configuration conf;
486 conf[DHCPConfig::kConfigurationKeyIPAddress].writer().append_uint32(
487 0x01020304);
488 static const char kReasonUnknown[] = "UNKNOWN_REASON";
489 UpdateCallbackTest callback_test(kReasonUnknown, config_, false);
490 config_->RegisterUpdateCallback(
Eric Shienbrood3e20a232012-02-16 11:35:56 -0500491 Bind(&UpdateCallbackTest::Callback, Unretained(&callback_test)));
mukesh agrawalcc0fded2012-05-09 13:40:58 -0700492 config_->lease_acquisition_timeout_callback_.Reset(base::Bind(&DoNothing));
Darin Petkovf9b0ca82011-06-20 12:10:23 -0700493 config_->ProcessEventSignal(kReasonUnknown, conf);
494 EXPECT_FALSE(callback_test.called());
495 EXPECT_TRUE(config_->properties().address.empty());
mukesh agrawalcc0fded2012-05-09 13:40:58 -0700496 EXPECT_FALSE(config_->lease_acquisition_timeout_callback_.IsCancelled());
Darin Petkovf9b0ca82011-06-20 12:10:23 -0700497}
498
Paul Stewart94571f12013-09-10 17:26:07 -0700499TEST_F(DHCPConfigTest, ProcessEventSignalGatewayArp) {
500 DHCPConfig::Configuration conf;
501 conf[DHCPConfig::kConfigurationKeyIPAddress].writer().append_uint32(
502 0x01020304);
503 UpdateCallbackTest success_callback_test(DHCPConfig::kReasonGatewayArp,
504 config_, true);
505 config_->RegisterUpdateCallback(
506 Bind(&UpdateCallbackTest::Callback, Unretained(&success_callback_test)));
507 EXPECT_CALL(*minijail_, RunAndDestroy(_, _, _)).WillOnce(Return(true));
508 config_->Start();
509 config_->ProcessEventSignal(DHCPConfig::kReasonGatewayArp, conf);
510 EXPECT_TRUE(success_callback_test.called());
511 EXPECT_EQ("4.3.2.1", config_->properties().address);
512 EXPECT_FALSE(config_->lease_acquisition_timeout_callback_.IsCancelled());
513 EXPECT_TRUE(config_->is_gateway_arp_active_);
514
515 // If the timeout gets called, we shouldn't lose the lease since GatewayArp
516 // is active.
517 ScopedMockLog log;
518 EXPECT_CALL(log, Log(_, _, _)).Times(AnyNumber());
519 EXPECT_CALL(log, Log(_, _, ::testing::EndsWith(
520 "Continuing to use our previous lease, due to gateway-ARP.")));
521 UpdateCallbackTest failure_callback_test("Timeout", config_, true);
522 config_->RegisterUpdateCallback(
523 Bind(&UpdateCallbackTest::Callback, Unretained(&failure_callback_test)));
524 config_->lease_acquisition_timeout_callback_.callback().Run();
525 EXPECT_FALSE(failure_callback_test.called());
526 EXPECT_TRUE(config_->is_gateway_arp_active_);
527
528 // An official reply from a DHCP server should reset our GatewayArp state.
529 UpdateCallbackTest renew_callback_test(DHCPConfig::kReasonRenew,
530 config_, true);
531 config_->RegisterUpdateCallback(
532 Bind(&UpdateCallbackTest::Callback, Unretained(&renew_callback_test)));
533 config_->ProcessEventSignal(DHCPConfig::kReasonRenew, conf);
534 EXPECT_TRUE(renew_callback_test.called());
535 EXPECT_FALSE(config_->is_gateway_arp_active_);
536}
537
538TEST_F(DHCPConfigTest, ProcessEventSignalGatewayArpNak) {
539 DHCPConfig::Configuration conf;
540 conf[DHCPConfig::kConfigurationKeyIPAddress].writer().append_uint32(
541 0x01020304);
542 UpdateCallbackTest success_callback_test(DHCPConfig::kReasonGatewayArp,
543 config_, true);
544 config_->RegisterUpdateCallback(
545 Bind(&UpdateCallbackTest::Callback, Unretained(&success_callback_test)));
546 EXPECT_CALL(*minijail_, RunAndDestroy(_, _, _)).WillOnce(Return(true));
547 config_->Start();
548 config_->ProcessEventSignal(DHCPConfig::kReasonGatewayArp, conf);
549 EXPECT_TRUE(config_->is_gateway_arp_active_);
550
551 // Sending a NAK should clear is_gateway_arp_active_.
552 config_->ProcessEventSignal(DHCPConfig::kReasonNak, conf);
553 EXPECT_FALSE(config_->is_gateway_arp_active_);
554
555 // If the timeout gets called, we should lose the lease since GatewayArp
556 // is not active any more.
557 UpdateCallbackTest failure_callback_test("Timeout", config_, false);
558 config_->RegisterUpdateCallback(
559 Bind(&UpdateCallbackTest::Callback, Unretained(&failure_callback_test)));
560 config_->lease_acquisition_timeout_callback_.callback().Run();
561 EXPECT_TRUE(failure_callback_test.called());
562}
Darin Petkovf9b0ca82011-06-20 12:10:23 -0700563
Darin Petkov98dd6a02011-06-10 15:12:57 -0700564TEST_F(DHCPConfigTest, ReleaseIP) {
565 config_->pid_ = 1 << 18; // Ensure unknown positive PID.
Paul Stewarta02ee492012-05-16 10:04:53 -0700566 config_->arp_gateway_ = false;
Darin Petkovaceede32011-07-18 15:32:38 -0700567 EXPECT_CALL(*proxy_, Release(kDeviceName)).Times(1);
Darin Petkova7b89492011-07-27 12:48:17 -0700568 config_->proxy_.reset(proxy_.release());
Paul Stewart217c61d2013-06-13 15:12:02 -0700569 EXPECT_TRUE(config_->ReleaseIP(IPConfig::kReleaseReasonDisconnect));
Darin Petkov98dd6a02011-06-10 15:12:57 -0700570 config_->pid_ = 0;
571}
572
Paul Stewarta02ee492012-05-16 10:04:53 -0700573TEST_F(DHCPConfigTest, ReleaseIPArpGW) {
574 config_->pid_ = 1 << 18; // Ensure unknown positive PID.
575 config_->arp_gateway_ = true;
576 EXPECT_CALL(*proxy_, Release(kDeviceName)).Times(0);
577 config_->proxy_.reset(proxy_.release());
Paul Stewart217c61d2013-06-13 15:12:02 -0700578 EXPECT_TRUE(config_->ReleaseIP(IPConfig::kReleaseReasonDisconnect));
579 config_->pid_ = 0;
580}
581
582TEST_F(DHCPConfigTest, ReleaseIPStaticIPWithLease) {
583 config_->pid_ = 1 << 18; // Ensure unknown positive PID.
584 config_->arp_gateway_ = true;
585 config_->is_lease_active_ = true;
586 EXPECT_CALL(*proxy_, Release(kDeviceName));
587 config_->proxy_.reset(proxy_.release());
588 EXPECT_TRUE(config_->ReleaseIP(IPConfig::kReleaseReasonStaticIP));
589 EXPECT_EQ(NULL, config_->proxy_.get());
590 config_->pid_ = 0;
591}
592
593TEST_F(DHCPConfigTest, ReleaseIPStaticIPWithoutLease) {
594 config_->pid_ = 1 << 18; // Ensure unknown positive PID.
595 config_->arp_gateway_ = true;
596 config_->is_lease_active_ = false;
597 EXPECT_CALL(*proxy_, Release(kDeviceName)).Times(0);
598 MockDHCPProxy *proxy_pointer = proxy_.get();
599 config_->proxy_.reset(proxy_.release());
600 EXPECT_TRUE(config_->ReleaseIP(IPConfig::kReleaseReasonStaticIP));
601 // Expect that proxy has not been released.
602 EXPECT_EQ(proxy_pointer, config_->proxy_.get());
Paul Stewarta02ee492012-05-16 10:04:53 -0700603 config_->pid_ = 0;
604}
605
Darin Petkov98dd6a02011-06-10 15:12:57 -0700606TEST_F(DHCPConfigTest, RenewIP) {
mukesh agrawalcc0fded2012-05-09 13:40:58 -0700607 EXPECT_TRUE(config_->lease_acquisition_timeout_callback_.IsCancelled());
Darin Petkov98dd6a02011-06-10 15:12:57 -0700608 config_->pid_ = 456;
Paul Stewartc02344a2012-08-17 16:57:37 -0700609 EXPECT_FALSE(config_->RenewIP()); // Expect no crash with NULL proxy.
Darin Petkovaceede32011-07-18 15:32:38 -0700610 EXPECT_CALL(*proxy_, Rebind(kDeviceName)).Times(1);
Darin Petkova7b89492011-07-27 12:48:17 -0700611 config_->proxy_.reset(proxy_.release());
Darin Petkov98dd6a02011-06-10 15:12:57 -0700612 EXPECT_TRUE(config_->RenewIP());
mukesh agrawalcc0fded2012-05-09 13:40:58 -0700613 EXPECT_FALSE(config_->lease_acquisition_timeout_callback_.IsCancelled());
Darin Petkov98dd6a02011-06-10 15:12:57 -0700614 config_->pid_ = 0;
615}
616
617TEST_F(DHCPConfigTest, RequestIP) {
mukesh agrawalcc0fded2012-05-09 13:40:58 -0700618 EXPECT_TRUE(config_->lease_acquisition_timeout_callback_.IsCancelled());
Darin Petkov98dd6a02011-06-10 15:12:57 -0700619 config_->pid_ = 567;
Darin Petkovaceede32011-07-18 15:32:38 -0700620 EXPECT_CALL(*proxy_, Rebind(kDeviceName)).Times(1);
Darin Petkova7b89492011-07-27 12:48:17 -0700621 config_->proxy_.reset(proxy_.release());
Darin Petkov98dd6a02011-06-10 15:12:57 -0700622 EXPECT_TRUE(config_->RenewIP());
mukesh agrawalcc0fded2012-05-09 13:40:58 -0700623 EXPECT_FALSE(config_->lease_acquisition_timeout_callback_.IsCancelled());
624 config_->pid_ = 0;
625}
626
627TEST_F(DHCPConfigTest, RequestIPTimeout) {
628 UpdateCallbackTest callback_test(DHCPConfig::kReasonFail, config_, false);
629 config_->RegisterUpdateCallback(
630 Bind(&UpdateCallbackTest::Callback, Unretained(&callback_test)));
631 config_->lease_acquisition_timeout_seconds_ = 0;
632 config_->pid_ = 567;
633 EXPECT_CALL(*proxy_, Rebind(kDeviceName)).Times(1);
634 config_->proxy_.reset(proxy_.release());
635 config_->RenewIP();
636 config_->dispatcher_->DispatchPendingEvents();
637 EXPECT_TRUE(callback_test.called());
Darin Petkov98dd6a02011-06-10 15:12:57 -0700638 config_->pid_ = 0;
639}
640
641TEST_F(DHCPConfigTest, Restart) {
642 const int kPID1 = 1 << 17; // Ensure unknown positive PID.
643 const int kPID2 = 987;
644 const unsigned int kTag1 = 11;
645 const unsigned int kTag2 = 22;
646 config_->pid_ = kPID1;
647 config_->child_watch_tag_ = kTag1;
648 DHCPProvider::GetInstance()->BindPID(kPID1, config_);
Chris Masone2176a882011-09-14 22:29:15 -0700649 EXPECT_CALL(*glib(), SourceRemove(kTag1)).WillOnce(Return(true));
Jorge Lucangeli Obesad43cc62012-04-11 16:25:43 -0700650 EXPECT_CALL(*minijail_, RunAndDestroy(_, _, _)).WillOnce(
651 DoAll(SetArgumentPointee<2>(kPID2), Return(true)));
Chris Masone2176a882011-09-14 22:29:15 -0700652 EXPECT_CALL(*glib(), ChildWatchAdd(kPID2, _, _)).WillOnce(Return(kTag2));
Darin Petkov98dd6a02011-06-10 15:12:57 -0700653 EXPECT_TRUE(config_->Restart());
654 EXPECT_EQ(kPID2, config_->pid_);
655 EXPECT_EQ(config_.get(), DHCPProvider::GetInstance()->GetConfig(kPID2).get());
656 EXPECT_EQ(kTag2, config_->child_watch_tag_);
657 DHCPProvider::GetInstance()->UnbindPID(kPID2);
658 config_->pid_ = 0;
659 config_->child_watch_tag_ = 0;
660}
661
662TEST_F(DHCPConfigTest, RestartNoClient) {
663 const int kPID = 777;
664 const unsigned int kTag = 66;
Chris Masone2176a882011-09-14 22:29:15 -0700665 EXPECT_CALL(*glib(), SourceRemove(_)).Times(0);
Jorge Lucangeli Obesad43cc62012-04-11 16:25:43 -0700666 EXPECT_CALL(*minijail_, RunAndDestroy(_, _, _)).WillOnce(
667 DoAll(SetArgumentPointee<2>(kPID), Return(true)));
Chris Masone2176a882011-09-14 22:29:15 -0700668 EXPECT_CALL(*glib(), ChildWatchAdd(kPID, _, _)).WillOnce(Return(kTag));
Darin Petkov98dd6a02011-06-10 15:12:57 -0700669 EXPECT_TRUE(config_->Restart());
670 EXPECT_EQ(kPID, config_->pid_);
671 EXPECT_EQ(config_.get(), DHCPProvider::GetInstance()->GetConfig(kPID).get());
672 EXPECT_EQ(kTag, config_->child_watch_tag_);
673 DHCPProvider::GetInstance()->UnbindPID(kPID);
674 config_->pid_ = 0;
675 config_->child_watch_tag_ = 0;
676}
677
Paul Stewartd408fdf2012-05-07 17:15:57 -0700678TEST_F(DHCPConfigTest, StartSuccessEphemeral) {
679 DHCPConfigRefPtr config =
Paul Stewart75a68b92013-10-24 10:50:27 -0700680 CreateRunningConfig(kHostName, kDeviceName, kArpGateway, !kMinimalConfig);
Paul Stewartd408fdf2012-05-07 17:15:57 -0700681 StopRunningConfigAndExpect(config, false);
682}
Darin Petkov92c43902011-06-09 20:46:06 -0700683
Paul Stewartd408fdf2012-05-07 17:15:57 -0700684TEST_F(DHCPConfigTest, StartSuccessPersistent) {
685 DHCPConfigRefPtr config =
Paul Stewart75a68b92013-10-24 10:50:27 -0700686 CreateRunningConfig(kHostName, kLeaseFileSuffix, kArpGateway,
687 !kMinimalConfig);
Paul Stewartd408fdf2012-05-07 17:15:57 -0700688 StopRunningConfigAndExpect(config, true);
Darin Petkovf7897bc2011-06-08 17:13:36 -0700689}
690
mukesh agrawalcc0fded2012-05-09 13:40:58 -0700691TEST_F(DHCPConfigTest, StartTimeout) {
692 UpdateCallbackTest callback_test(DHCPConfig::kReasonFail, config_, false);
693 config_->RegisterUpdateCallback(
694 Bind(&UpdateCallbackTest::Callback, Unretained(&callback_test)));
695 config_->lease_acquisition_timeout_seconds_ = 0;
696 config_->proxy_.reset(proxy_.release());
Jorge Lucangeli Obesad43cc62012-04-11 16:25:43 -0700697 EXPECT_CALL(*minijail_, RunAndDestroy(_, _, _)).WillOnce(Return(true));
mukesh agrawalcc0fded2012-05-09 13:40:58 -0700698 config_->Start();
699 config_->dispatcher_->DispatchPendingEvents();
700 EXPECT_TRUE(callback_test.called());
701}
702
Darin Petkov98dd6a02011-06-10 15:12:57 -0700703TEST_F(DHCPConfigTest, Stop) {
Darin Petkov98dd6a02011-06-10 15:12:57 -0700704 const int kPID = 1 << 17; // Ensure unknown positive PID.
mukesh agrawal1835e772013-01-15 18:35:03 -0800705 ScopedMockLog log;
706 EXPECT_CALL(log, Log(_, _, _)).Times(AnyNumber());
707 EXPECT_CALL(log, Log(_, _, ContainsRegex(
Darin Petkov3fe17662013-02-04 14:19:08 +0100708 base::StringPrintf("Stopping.+%s", __func__))));
Darin Petkov98dd6a02011-06-10 15:12:57 -0700709 config_->pid_ = kPID;
Darin Petkov3fe17662013-02-04 14:19:08 +0100710 DHCPProvider::GetInstance()->BindPID(kPID, config_);
mukesh agrawal1835e772013-01-15 18:35:03 -0800711 config_->Stop(__func__);
mukesh agrawalcc0fded2012-05-09 13:40:58 -0700712 EXPECT_TRUE(config_->lease_acquisition_timeout_callback_.IsCancelled());
Darin Petkov3fe17662013-02-04 14:19:08 +0100713 EXPECT_FALSE(DHCPProvider::GetInstance()->GetConfig(kPID));
714 EXPECT_FALSE(config_->pid_);
mukesh agrawalcc0fded2012-05-09 13:40:58 -0700715}
716
717TEST_F(DHCPConfigTest, StopDuringRequestIP) {
718 config_->pid_ = 567;
719 EXPECT_CALL(*proxy_, Rebind(kDeviceName)).Times(1);
720 config_->proxy_.reset(proxy_.release());
721 EXPECT_TRUE(config_->RenewIP());
722 EXPECT_FALSE(config_->lease_acquisition_timeout_callback_.IsCancelled());
723 config_->pid_ = 0; // Keep Stop from killing a real process.
mukesh agrawal1835e772013-01-15 18:35:03 -0800724 config_->Stop(__func__);
mukesh agrawalcc0fded2012-05-09 13:40:58 -0700725 EXPECT_TRUE(config_->lease_acquisition_timeout_callback_.IsCancelled());
Darin Petkov98dd6a02011-06-10 15:12:57 -0700726}
727
mukesh agrawal6bb9e7c2012-01-30 14:57:54 -0800728TEST_F(DHCPConfigTest, SetProperty) {
Chris Masone43b48a12011-07-01 13:37:07 -0700729 ::DBus::Error error;
730 // Ensure that an attempt to write a R/O property returns InvalidArgs error.
mukesh agrawal6bb9e7c2012-01-30 14:57:54 -0800731 EXPECT_FALSE(DBusAdaptor::SetProperty(config_->mutable_store(),
Ben Chan0295e0f2013-09-20 13:47:29 -0700732 kAddressProperty,
mukesh agrawal6bb9e7c2012-01-30 14:57:54 -0800733 PropertyStoreTest::kStringV,
734 &error));
mukesh agrawalbebf1b82013-04-23 15:06:33 -0700735 ASSERT_TRUE(error.is_set()); // name() may be invalid otherwise
Chris Masone9d779932011-08-25 16:33:41 -0700736 EXPECT_EQ(invalid_args(), error.name());
Chris Masone43b48a12011-07-01 13:37:07 -0700737}
738
Darin Petkove7cb7f82011-06-03 13:21:51 -0700739} // namespace shill