blob: a48e3713850b2e385d3054190341ef04ea43958e [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;
Paul Stewart21f7b342013-11-19 10:15:58 -080034using testing::Mock;
Darin Petkovf7897bc2011-06-08 17:13:36 -070035using testing::Return;
36using testing::SetArgumentPointee;
Darin Petkove7cb7f82011-06-03 13:21:51 -070037using testing::Test;
38
39namespace shill {
40
Darin Petkov92c43902011-06-09 20:46:06 -070041namespace {
Darin Petkova7b89492011-07-27 12:48:17 -070042const char kDeviceName[] = "eth0";
Paul Stewartd32f4842012-01-11 16:08:13 -080043const char kHostName[] = "hostname";
Paul Stewartd408fdf2012-05-07 17:15:57 -070044const char kLeaseFileSuffix[] = "leasefilesuffix";
45const bool kArpGateway = true;
Paul Stewart75a68b92013-10-24 10:50:27 -070046const bool kHasHostname = true;
47const bool kHasLeaseSuffix = true;
48const bool kMinimalConfig = true;
Darin Petkov92c43902011-06-09 20:46:06 -070049} // namespace {}
50
Chris Masone43b48a12011-07-01 13:37:07 -070051class DHCPConfigTest : public PropertyStoreTest {
Darin Petkove7cb7f82011-06-03 13:21:51 -070052 public:
Darin Petkovf7897bc2011-06-08 17:13:36 -070053 DHCPConfigTest()
Darin Petkovf65e9282011-06-21 14:29:56 -070054 : proxy_(new MockDHCPProxy()),
Darin Petkova7b89492011-07-27 12:48:17 -070055 proxy_factory_(this),
Jorge Lucangeli Obesad43cc62012-04-11 16:25:43 -070056 minijail_(new MockMinijail()),
Chris Masone19e30402011-07-19 15:48:47 -070057 config_(new DHCPConfig(&control_,
Chris Masone2176a882011-09-14 22:29:15 -070058 dispatcher(),
Chris Masone19e30402011-07-19 15:48:47 -070059 DHCPProvider::GetInstance(),
Darin Petkov92c43902011-06-09 20:46:06 -070060 kDeviceName,
Paul Stewartd32f4842012-01-11 16:08:13 -080061 kHostName,
Paul Stewartd408fdf2012-05-07 17:15:57 -070062 kLeaseFileSuffix,
63 kArpGateway,
Paul Stewart75a68b92013-10-24 10:50:27 -070064 !kMinimalConfig,
Chris Masone2176a882011-09-14 22:29:15 -070065 glib())) {}
Darin Petkova7b89492011-07-27 12:48:17 -070066
67 virtual void SetUp() {
Darin Petkovab565bb2011-10-06 02:55:51 -070068 config_->proxy_factory_ = &proxy_factory_;
Jorge Lucangeli Obesad43cc62012-04-11 16:25:43 -070069 config_->minijail_ = minijail_.get();
Darin Petkova7b89492011-07-27 12:48:17 -070070 }
71
72 virtual void TearDown() {
Darin Petkovab565bb2011-10-06 02:55:51 -070073 config_->proxy_factory_ = NULL;
Jorge Lucangeli Obesad43cc62012-04-11 16:25:43 -070074 config_->minijail_ = NULL;
Darin Petkov98dd6a02011-06-10 15:12:57 -070075 }
Darin Petkove7cb7f82011-06-03 13:21:51 -070076
Jorge Lucangeli Obesad43cc62012-04-11 16:25:43 -070077 DHCPConfigRefPtr CreateMockMinijailConfig(const string &hostname,
Paul Stewart75a68b92013-10-24 10:50:27 -070078 const string &lease_suffix,
79 bool arp_gateway,
80 bool minimal_config);
Paul Stewartd408fdf2012-05-07 17:15:57 -070081 DHCPConfigRefPtr CreateRunningConfig(const string &hostname,
82 const string &lease_suffix,
Paul Stewart75a68b92013-10-24 10:50:27 -070083 bool arp_gateway,
84 bool minimal_config);
Paul Stewartd408fdf2012-05-07 17:15:57 -070085 void StopRunningConfigAndExpect(DHCPConfigRefPtr config,
86 bool lease_file_exists);
87
Darin Petkove7cb7f82011-06-03 13:21:51 -070088 protected:
Darin Petkova7b89492011-07-27 12:48:17 -070089 class TestProxyFactory : public ProxyFactory {
90 public:
Paul Stewart7355ce12011-09-02 10:47:01 -070091 explicit TestProxyFactory(DHCPConfigTest *test) : test_(test) {}
Darin Petkova7b89492011-07-27 12:48:17 -070092
mukesh agrawal1830fa12011-09-26 14:31:40 -070093 virtual DHCPProxyInterface *CreateDHCPProxy(const string &/*service*/) {
Darin Petkova7b89492011-07-27 12:48:17 -070094 return test_->proxy_.release();
95 }
96
97 private:
98 DHCPConfigTest *test_;
99 };
100
Paul Stewartd408fdf2012-05-07 17:15:57 -0700101 static const int kPID;
102 static const unsigned int kTag;
103
104 FilePath lease_file_;
105 FilePath pid_file_;
106 ScopedTempDir temp_dir_;
Darin Petkova7b89492011-07-27 12:48:17 -0700107 scoped_ptr<MockDHCPProxy> proxy_;
108 TestProxyFactory proxy_factory_;
Chris Masone19e30402011-07-19 15:48:47 -0700109 MockControl control_;
Jorge Lucangeli Obesad43cc62012-04-11 16:25:43 -0700110 scoped_ptr<MockMinijail> minijail_;
Darin Petkovf7897bc2011-06-08 17:13:36 -0700111 DHCPConfigRefPtr config_;
Darin Petkove7cb7f82011-06-03 13:21:51 -0700112};
113
Paul Stewartd408fdf2012-05-07 17:15:57 -0700114const int DHCPConfigTest::kPID = 123456;
115const unsigned int DHCPConfigTest::kTag = 77;
116
Jorge Lucangeli Obesad43cc62012-04-11 16:25:43 -0700117DHCPConfigRefPtr DHCPConfigTest::CreateMockMinijailConfig(
Paul Stewart75a68b92013-10-24 10:50:27 -0700118 const string &hostname,
119 const string &lease_suffix,
120 bool arp_gateway,
121 bool minimal_config) {
Jorge Lucangeli Obesad43cc62012-04-11 16:25:43 -0700122 DHCPConfigRefPtr config(new DHCPConfig(&control_,
123 dispatcher(),
124 DHCPProvider::GetInstance(),
125 kDeviceName,
126 hostname,
127 lease_suffix,
128 arp_gateway,
Paul Stewart75a68b92013-10-24 10:50:27 -0700129 minimal_config,
Jorge Lucangeli Obesad43cc62012-04-11 16:25:43 -0700130 glib()));
131 config->minijail_ = minijail_.get();
Jorge Lucangeli Obesad43cc62012-04-11 16:25:43 -0700132
133 return config;
134}
135
Paul Stewart75a68b92013-10-24 10:50:27 -0700136DHCPConfigRefPtr DHCPConfigTest::CreateRunningConfig(
137 const string &hostname,
138 const string &lease_suffix,
139 bool arp_gateway,
140 bool minimal_config) {
Paul Stewartd408fdf2012-05-07 17:15:57 -0700141 DHCPConfigRefPtr config(new DHCPConfig(&control_,
142 dispatcher(),
143 DHCPProvider::GetInstance(),
144 kDeviceName,
145 hostname,
146 lease_suffix,
147 arp_gateway,
Paul Stewart75a68b92013-10-24 10:50:27 -0700148 minimal_config,
Paul Stewartd408fdf2012-05-07 17:15:57 -0700149 glib()));
Jorge Lucangeli Obesad43cc62012-04-11 16:25:43 -0700150 config->minijail_ = minijail_.get();
151 EXPECT_CALL(*minijail_, RunAndDestroy(_, _, _))
152 .WillOnce(DoAll(SetArgumentPointee<2>(kPID), Return(true)));
Paul Stewartd408fdf2012-05-07 17:15:57 -0700153 EXPECT_CALL(*glib(), ChildWatchAdd(kPID, _, _)).WillOnce(Return(kTag));
154 EXPECT_TRUE(config->Start());
155 EXPECT_EQ(kPID, config->pid_);
156 EXPECT_EQ(config.get(), DHCPProvider::GetInstance()->GetConfig(kPID).get());
157 EXPECT_EQ(kTag, config->child_watch_tag_);
158
159 EXPECT_TRUE(temp_dir_.CreateUniqueTempDir());
160 config->root_ = temp_dir_.path();
Jorge Lucangeli Obes2f3169d2012-04-25 11:38:25 -0700161 FilePath varrun = temp_dir_.path().Append("var/run/dhcpcd");
Paul Stewartd408fdf2012-05-07 17:15:57 -0700162 EXPECT_TRUE(file_util::CreateDirectory(varrun));
163 pid_file_ = varrun.Append(base::StringPrintf("dhcpcd-%s.pid", kDeviceName));
164 FilePath varlib = temp_dir_.path().Append("var/lib/dhcpcd");
165 EXPECT_TRUE(file_util::CreateDirectory(varlib));
166 lease_file_ =
167 varlib.Append(base::StringPrintf("dhcpcd-%s.lease", kDeviceName));
168 EXPECT_EQ(0, file_util::WriteFile(pid_file_, "", 0));
169 EXPECT_EQ(0, file_util::WriteFile(lease_file_, "", 0));
170 EXPECT_TRUE(file_util::PathExists(pid_file_));
171 EXPECT_TRUE(file_util::PathExists(lease_file_));
172
173 return config;
174}
175
176void DHCPConfigTest::StopRunningConfigAndExpect(DHCPConfigRefPtr config,
177 bool lease_file_exists) {
mukesh agrawal6c6655d2012-12-06 14:49:50 -0800178 ScopedMockLog log;
179 // We use a non-zero exit status so that we get the log message.
180 EXPECT_CALL(log, Log(_, _, ::testing::EndsWith("status 10")));
181 DHCPConfig::ChildWatchCallback(kPID, 10, config.get());
Paul Stewartd408fdf2012-05-07 17:15:57 -0700182 EXPECT_EQ(NULL, DHCPProvider::GetInstance()->GetConfig(kPID).get());
183
184 EXPECT_FALSE(file_util::PathExists(pid_file_));
185 EXPECT_EQ(lease_file_exists, file_util::PathExists(lease_file_));
186}
187
Darin Petkove7cb7f82011-06-03 13:21:51 -0700188TEST_F(DHCPConfigTest, GetIPv4AddressString) {
Darin Petkovf7897bc2011-06-08 17:13:36 -0700189 EXPECT_EQ("255.255.255.255", config_->GetIPv4AddressString(0xffffffff));
190 EXPECT_EQ("0.0.0.0", config_->GetIPv4AddressString(0));
191 EXPECT_EQ("1.2.3.4", config_->GetIPv4AddressString(0x04030201));
Darin Petkove7cb7f82011-06-03 13:21:51 -0700192}
193
Darin Petkova7b89492011-07-27 12:48:17 -0700194TEST_F(DHCPConfigTest, InitProxy) {
195 static const char kService[] = ":1.200";
Darin Petkova7b89492011-07-27 12:48:17 -0700196 EXPECT_TRUE(proxy_.get());
197 EXPECT_FALSE(config_->proxy_.get());
Eric Shienbrood9a245532012-03-07 14:20:39 -0500198 config_->InitProxy(kService);
Darin Petkova7b89492011-07-27 12:48:17 -0700199 EXPECT_FALSE(proxy_.get());
200 EXPECT_TRUE(config_->proxy_.get());
201
202 config_->InitProxy(kService);
Darin Petkova7b89492011-07-27 12:48:17 -0700203}
204
Paul Stewart65bcd082012-11-16 09:37:14 -0800205TEST_F(DHCPConfigTest, ParseClasslessStaticRoutes) {
206 const string kDefaultAddress = "0.0.0.0";
207 const string kDefaultDestination = kDefaultAddress + "/0";
208 const string kRouter0 = "10.0.0.254";
209 const string kAddress1 = "192.168.1.0";
210 const string kDestination1 = kAddress1 + "/24";
211 // Last gateway missing, leaving an odd number of parameters.
212 const string kBrokenClasslessRoutes0 = kDefaultDestination + " " + kRouter0 +
213 " " + kDestination1;
214 IPConfig::Properties properties;
215 EXPECT_FALSE(DHCPConfig::ParseClasslessStaticRoutes(kBrokenClasslessRoutes0,
216 &properties));
217 EXPECT_TRUE(properties.routes.empty());
218 EXPECT_TRUE(properties.gateway.empty());
219
220 // Gateway argument for the second route is malformed, but we were able
221 // to salvage a default gateway.
222 const string kBrokenRouter1 = "10.0.0";
223 const string kBrokenClasslessRoutes1 = kBrokenClasslessRoutes0 + " " +
224 kBrokenRouter1;
225 EXPECT_FALSE(DHCPConfig::ParseClasslessStaticRoutes(kBrokenClasslessRoutes1,
226 &properties));
227 EXPECT_TRUE(properties.routes.empty());
228 EXPECT_EQ(kRouter0, properties.gateway);
229
230 const string kRouter1 = "10.0.0.253";
231 const string kRouter2 = "10.0.0.252";
232 const string kClasslessRoutes0 = kDefaultDestination + " " + kRouter2 + " " +
233 kDestination1 + " " + kRouter1;
234 EXPECT_TRUE(DHCPConfig::ParseClasslessStaticRoutes(kClasslessRoutes0,
235 &properties));
236 // The old default route is preserved.
237 EXPECT_EQ(kRouter0, properties.gateway);
238
239 // The two routes (including the one which would have otherwise been
240 // classified as a default route) are added to the routing table.
241 EXPECT_EQ(2, properties.routes.size());
242 const IPConfig::Route &route0 = properties.routes[0];
243 EXPECT_EQ(kDefaultAddress, route0.host);
244 EXPECT_EQ("0.0.0.0", route0.netmask);
245 EXPECT_EQ(kRouter2, route0.gateway);
246
247 const IPConfig::Route &route1 = properties.routes[1];
248 EXPECT_EQ(kAddress1, route1.host);
249 EXPECT_EQ("255.255.255.0", route1.netmask);
250 EXPECT_EQ(kRouter1, route1.gateway);
251
252 // A malformed routing table should not affect the current table.
253 EXPECT_FALSE(DHCPConfig::ParseClasslessStaticRoutes(kBrokenClasslessRoutes1,
254 &properties));
255 EXPECT_EQ(2, properties.routes.size());
256 EXPECT_EQ(kRouter0, properties.gateway);
257}
258
Darin Petkove7cb7f82011-06-03 13:21:51 -0700259TEST_F(DHCPConfigTest, ParseConfiguration) {
260 DHCPConfig::Configuration conf;
261 conf[DHCPConfig::kConfigurationKeyIPAddress].writer().append_uint32(
262 0x01020304);
263 conf[DHCPConfig::kConfigurationKeySubnetCIDR].writer().append_byte(
264 16);
265 conf[DHCPConfig::kConfigurationKeyBroadcastAddress].writer().append_uint32(
266 0x10203040);
267 {
Darin Petkove7cb7f82011-06-03 13:21:51 -0700268 vector<unsigned int> routers;
269 routers.push_back(0x02040608);
270 routers.push_back(0x03050709);
Darin Petkovf7897bc2011-06-08 17:13:36 -0700271 DBus::MessageIter writer =
272 conf[DHCPConfig::kConfigurationKeyRouters].writer();
Darin Petkove7cb7f82011-06-03 13:21:51 -0700273 writer << routers;
Darin Petkove7cb7f82011-06-03 13:21:51 -0700274 }
275 {
Darin Petkove7cb7f82011-06-03 13:21:51 -0700276 vector<unsigned int> dns;
277 dns.push_back(0x09070503);
278 dns.push_back(0x08060402);
Darin Petkovf7897bc2011-06-08 17:13:36 -0700279 DBus::MessageIter writer = conf[DHCPConfig::kConfigurationKeyDNS].writer();
Darin Petkove7cb7f82011-06-03 13:21:51 -0700280 writer << dns;
Darin Petkove7cb7f82011-06-03 13:21:51 -0700281 }
282 conf[DHCPConfig::kConfigurationKeyDomainName].writer().append_string(
283 "domain-name");
284 {
Darin Petkove7cb7f82011-06-03 13:21:51 -0700285 vector<string> search;
286 search.push_back("foo.com");
287 search.push_back("bar.com");
Darin Petkovf7897bc2011-06-08 17:13:36 -0700288 DBus::MessageIter writer =
289 conf[DHCPConfig::kConfigurationKeyDomainSearch].writer();
Darin Petkove7cb7f82011-06-03 13:21:51 -0700290 writer << search;
Darin Petkove7cb7f82011-06-03 13:21:51 -0700291 }
292 conf[DHCPConfig::kConfigurationKeyMTU].writer().append_uint16(600);
293 conf["UnknownKey"] = DBus::Variant();
294
Darin Petkove7cb7f82011-06-03 13:21:51 -0700295 IPConfig::Properties properties;
Darin Petkovf7897bc2011-06-08 17:13:36 -0700296 ASSERT_TRUE(config_->ParseConfiguration(conf, &properties));
Darin Petkove7cb7f82011-06-03 13:21:51 -0700297 EXPECT_EQ("4.3.2.1", properties.address);
Paul Stewart48100b02012-03-19 07:53:52 -0700298 EXPECT_EQ(16, properties.subnet_prefix);
Darin Petkove7cb7f82011-06-03 13:21:51 -0700299 EXPECT_EQ("64.48.32.16", properties.broadcast_address);
300 EXPECT_EQ("8.6.4.2", properties.gateway);
301 ASSERT_EQ(2, properties.dns_servers.size());
302 EXPECT_EQ("3.5.7.9", properties.dns_servers[0]);
303 EXPECT_EQ("2.4.6.8", properties.dns_servers[1]);
304 EXPECT_EQ("domain-name", properties.domain_name);
305 ASSERT_EQ(2, properties.domain_search.size());
306 EXPECT_EQ("foo.com", properties.domain_search[0]);
307 EXPECT_EQ("bar.com", properties.domain_search[1]);
308 EXPECT_EQ(600, properties.mtu);
309}
310
Darin Petkov92c43902011-06-09 20:46:06 -0700311TEST_F(DHCPConfigTest, StartFail) {
Jorge Lucangeli Obesad43cc62012-04-11 16:25:43 -0700312 EXPECT_CALL(*minijail_, RunAndDestroy(_, _, _)).WillOnce(Return(false));
Chris Masone2176a882011-09-14 22:29:15 -0700313 EXPECT_CALL(*glib(), ChildWatchAdd(_, _, _)).Times(0);
Darin Petkovf7897bc2011-06-08 17:13:36 -0700314 EXPECT_FALSE(config_->Start());
315 EXPECT_EQ(0, config_->pid_);
Darin Petkov92c43902011-06-09 20:46:06 -0700316}
Darin Petkovf7897bc2011-06-08 17:13:36 -0700317
Paul Stewart75a68b92013-10-24 10:50:27 -0700318MATCHER_P4(IsDHCPCDArgs, has_hostname, has_arp_gateway, has_lease_suffix,
319 has_minimal_config, "") {
Paul Stewartd32f4842012-01-11 16:08:13 -0800320 if (string(arg[0]) != "/sbin/dhcpcd" ||
Paul Stewart75a68b92013-10-24 10:50:27 -0700321 string(arg[1]) != "-B" ||
322 string(arg[2]) != "-q") {
Paul Stewartd32f4842012-01-11 16:08:13 -0800323 return false;
324 }
325
Paul Stewart75a68b92013-10-24 10:50:27 -0700326 int end_offset = 3;
Paul Stewartd32f4842012-01-11 16:08:13 -0800327 if (has_hostname) {
Paul Stewartd408fdf2012-05-07 17:15:57 -0700328 if (string(arg[end_offset]) != "-h" ||
329 string(arg[end_offset + 1]) != kHostName) {
Paul Stewartd32f4842012-01-11 16:08:13 -0800330 return false;
331 }
Paul Stewartd408fdf2012-05-07 17:15:57 -0700332 end_offset += 2;
Paul Stewartd32f4842012-01-11 16:08:13 -0800333 }
334
Paul Stewartd408fdf2012-05-07 17:15:57 -0700335 if (has_arp_gateway) {
Paul Stewart75a68b92013-10-24 10:50:27 -0700336 if (string(arg[end_offset]) != "-R" ||
337 string(arg[end_offset + 1]) != "-U") {
Paul Stewartd408fdf2012-05-07 17:15:57 -0700338 return false;
Paul Stewart75a68b92013-10-24 10:50:27 -0700339 }
340 end_offset += 2;
341 }
342
343 if (has_minimal_config) {
344 if (string(arg[end_offset]) != "-f" ||
345 string(arg[end_offset + 1]) != "/etc/dhcpcd-minimal.conf") {
346 return false;
347 }
348 end_offset += 2;
Paul Stewartd408fdf2012-05-07 17:15:57 -0700349 }
350
351 string device_arg = has_lease_suffix ?
352 string(kDeviceName) + "=" + string(kLeaseFileSuffix) : kDeviceName;
353 return string(arg[end_offset]) == device_arg && arg[end_offset + 1] == NULL;
Paul Stewartd32f4842012-01-11 16:08:13 -0800354}
355
356TEST_F(DHCPConfigTest, StartWithHostname) {
Paul Stewart75a68b92013-10-24 10:50:27 -0700357 EXPECT_CALL(*minijail_, RunAndDestroy(_, IsDHCPCDArgs(kHasHostname,
358 kArpGateway,
359 kHasLeaseSuffix,
360 !kMinimalConfig), _))
361 .WillOnce(Return(false));
Paul Stewartd32f4842012-01-11 16:08:13 -0800362 EXPECT_FALSE(config_->Start());
363}
364
365TEST_F(DHCPConfigTest, StartWithoutHostname) {
Jorge Lucangeli Obesad43cc62012-04-11 16:25:43 -0700366 DHCPConfigRefPtr config = CreateMockMinijailConfig("",
367 kLeaseFileSuffix,
Paul Stewart75a68b92013-10-24 10:50:27 -0700368 kArpGateway,
369 !kMinimalConfig);
370 EXPECT_CALL(*minijail_, RunAndDestroy(_, IsDHCPCDArgs(!kHasHostname,
371 kArpGateway,
372 kHasLeaseSuffix,
373 !kMinimalConfig), _))
374 .WillOnce(Return(false));
Paul Stewartd408fdf2012-05-07 17:15:57 -0700375 EXPECT_FALSE(config->Start());
376}
377
378TEST_F(DHCPConfigTest, StartWithoutArpGateway) {
Jorge Lucangeli Obesad43cc62012-04-11 16:25:43 -0700379 DHCPConfigRefPtr config = CreateMockMinijailConfig(kHostName,
380 kLeaseFileSuffix,
Paul Stewart75a68b92013-10-24 10:50:27 -0700381 !kArpGateway,
382 !kMinimalConfig);
383 EXPECT_CALL(*minijail_, RunAndDestroy(_, IsDHCPCDArgs(kHasHostname,
384 !kArpGateway,
385 kHasLeaseSuffix,
386 !kMinimalConfig), _))
387 .WillOnce(Return(false));
Paul Stewartd408fdf2012-05-07 17:15:57 -0700388 EXPECT_FALSE(config->Start());
389}
390
391TEST_F(DHCPConfigTest, StartWithoutLeaseSuffix) {
Jorge Lucangeli Obesad43cc62012-04-11 16:25:43 -0700392 DHCPConfigRefPtr config = CreateMockMinijailConfig(kHostName,
393 kDeviceName,
Paul Stewart75a68b92013-10-24 10:50:27 -0700394 kArpGateway,
395 !kMinimalConfig);
396 EXPECT_CALL(*minijail_, RunAndDestroy(_, IsDHCPCDArgs(kHasHostname,
397 kArpGateway,
398 !kHasLeaseSuffix,
399 !kMinimalConfig), _))
400 .WillOnce(Return(false));
401 EXPECT_FALSE(config->Start());
402}
403
404TEST_F(DHCPConfigTest, StartWithMinimalConfig) {
405 DHCPConfigRefPtr config = CreateMockMinijailConfig(kHostName,
406 kLeaseFileSuffix,
407 kArpGateway,
408 kMinimalConfig);
409 EXPECT_CALL(*minijail_, RunAndDestroy(_, IsDHCPCDArgs(kHasHostname,
410 kArpGateway,
411 kHasLeaseSuffix,
412 kMinimalConfig), _))
413 .WillOnce(Return(false));
Paul Stewartd32f4842012-01-11 16:08:13 -0800414 EXPECT_FALSE(config->Start());
415}
416
Darin Petkovf9b0ca82011-06-20 12:10:23 -0700417namespace {
418
Paul Stewartc5099532013-12-12 07:53:15 -0800419class DHCPConfigCallbackTest : public DHCPConfigTest {
Darin Petkovf9b0ca82011-06-20 12:10:23 -0700420 public:
Paul Stewartc5099532013-12-12 07:53:15 -0800421 virtual void SetUp() {
422 DHCPConfigTest::SetUp();
423 config_->RegisterUpdateCallback(
424 Bind(&DHCPConfigCallbackTest::SuccessCallback, Unretained(this)));
425 config_->RegisterFailureCallback(
426 Bind(&DHCPConfigCallbackTest::FailureCallback, Unretained(this)));
427 ip_config_ = config_;
Darin Petkovf9b0ca82011-06-20 12:10:23 -0700428 }
429
Paul Stewartc5099532013-12-12 07:53:15 -0800430 MOCK_METHOD1(SuccessCallback, void(const IPConfigRefPtr &ipconfig));
431 MOCK_METHOD1(FailureCallback, void(const IPConfigRefPtr &ipconfig));
432
433 // The mock methods above take IPConfigRefPtr because this is the type
434 // that the registered callbacks take. This conversion of the DHCP
435 // config ref pointer eases our work in setting up expectations.
436 const IPConfigRefPtr &ConfigRef() { return ip_config_; }
Darin Petkovf9b0ca82011-06-20 12:10:23 -0700437
438 private:
Paul Stewartc5099532013-12-12 07:53:15 -0800439 IPConfigRefPtr ip_config_;
Darin Petkovf9b0ca82011-06-20 12:10:23 -0700440};
441
mukesh agrawalcc0fded2012-05-09 13:40:58 -0700442void DoNothing() {}
443
Darin Petkovf9b0ca82011-06-20 12:10:23 -0700444} // namespace {}
445
Paul Stewartc5099532013-12-12 07:53:15 -0800446TEST_F(DHCPConfigCallbackTest, ProcessEventSignalFail) {
Darin Petkovf9b0ca82011-06-20 12:10:23 -0700447 DHCPConfig::Configuration conf;
448 conf[DHCPConfig::kConfigurationKeyIPAddress].writer().append_uint32(
449 0x01020304);
Paul Stewartc5099532013-12-12 07:53:15 -0800450 EXPECT_CALL(*this, SuccessCallback(_)).Times(0);
451 EXPECT_CALL(*this, FailureCallback(ConfigRef()));
mukesh agrawalcc0fded2012-05-09 13:40:58 -0700452 config_->lease_acquisition_timeout_callback_.Reset(base::Bind(&DoNothing));
Darin Petkovf9b0ca82011-06-20 12:10:23 -0700453 config_->ProcessEventSignal(DHCPConfig::kReasonFail, conf);
Paul Stewartc5099532013-12-12 07:53:15 -0800454 Mock::VerifyAndClearExpectations(this);
Darin Petkovf9b0ca82011-06-20 12:10:23 -0700455 EXPECT_TRUE(config_->properties().address.empty());
mukesh agrawalcc0fded2012-05-09 13:40:58 -0700456 EXPECT_TRUE(config_->lease_acquisition_timeout_callback_.IsCancelled());
Darin Petkovf9b0ca82011-06-20 12:10:23 -0700457}
458
Paul Stewartc5099532013-12-12 07:53:15 -0800459TEST_F(DHCPConfigCallbackTest, ProcessEventSignalSuccess) {
Darin Petkovf9b0ca82011-06-20 12:10:23 -0700460 static const char * const kReasons[] = {
461 DHCPConfig::kReasonBound,
462 DHCPConfig::kReasonRebind,
463 DHCPConfig::kReasonReboot,
464 DHCPConfig::kReasonRenew
465 };
466 for (size_t r = 0; r < arraysize(kReasons); r++) {
467 DHCPConfig::Configuration conf;
468 string message = string(kReasons[r]) + " failed";
469 conf[DHCPConfig::kConfigurationKeyIPAddress].writer().append_uint32(r);
Paul Stewartc5099532013-12-12 07:53:15 -0800470 EXPECT_CALL(*this, SuccessCallback(ConfigRef()));
471 EXPECT_CALL(*this, FailureCallback(_)).Times(0);
mukesh agrawalcc0fded2012-05-09 13:40:58 -0700472 config_->lease_acquisition_timeout_callback_.Reset(base::Bind(&DoNothing));
Darin Petkovf9b0ca82011-06-20 12:10:23 -0700473 config_->ProcessEventSignal(kReasons[r], conf);
Paul Stewartc5099532013-12-12 07:53:15 -0800474 EXPECT_TRUE(Mock::VerifyAndClearExpectations(this)) << message;
Paul Stewart83224402011-11-30 14:52:30 -0800475 EXPECT_EQ(base::StringPrintf("%zu.0.0.0", r), config_->properties().address)
Darin Petkovf9b0ca82011-06-20 12:10:23 -0700476 << message;
mukesh agrawalcc0fded2012-05-09 13:40:58 -0700477 EXPECT_TRUE(config_->lease_acquisition_timeout_callback_.IsCancelled());
Darin Petkovf9b0ca82011-06-20 12:10:23 -0700478 }
479}
480
Paul Stewartc5099532013-12-12 07:53:15 -0800481TEST_F(DHCPConfigCallbackTest, ProcessEventSignalUnknown) {
Darin Petkovf9b0ca82011-06-20 12:10:23 -0700482 DHCPConfig::Configuration conf;
483 conf[DHCPConfig::kConfigurationKeyIPAddress].writer().append_uint32(
484 0x01020304);
485 static const char kReasonUnknown[] = "UNKNOWN_REASON";
Paul Stewartc5099532013-12-12 07:53:15 -0800486 EXPECT_CALL(*this, SuccessCallback(_)).Times(0);
487 EXPECT_CALL(*this, FailureCallback(_)).Times(0);
mukesh agrawalcc0fded2012-05-09 13:40:58 -0700488 config_->lease_acquisition_timeout_callback_.Reset(base::Bind(&DoNothing));
Darin Petkovf9b0ca82011-06-20 12:10:23 -0700489 config_->ProcessEventSignal(kReasonUnknown, conf);
Paul Stewartc5099532013-12-12 07:53:15 -0800490 Mock::VerifyAndClearExpectations(this);
Darin Petkovf9b0ca82011-06-20 12:10:23 -0700491 EXPECT_TRUE(config_->properties().address.empty());
mukesh agrawalcc0fded2012-05-09 13:40:58 -0700492 EXPECT_FALSE(config_->lease_acquisition_timeout_callback_.IsCancelled());
Darin Petkovf9b0ca82011-06-20 12:10:23 -0700493}
494
Paul Stewartc5099532013-12-12 07:53:15 -0800495TEST_F(DHCPConfigCallbackTest, ProcessEventSignalGatewayArp) {
Paul Stewart94571f12013-09-10 17:26:07 -0700496 DHCPConfig::Configuration conf;
497 conf[DHCPConfig::kConfigurationKeyIPAddress].writer().append_uint32(
498 0x01020304);
Paul Stewartc5099532013-12-12 07:53:15 -0800499 EXPECT_CALL(*this, SuccessCallback(ConfigRef()));
500 EXPECT_CALL(*this, FailureCallback(_)).Times(0);
Paul Stewart94571f12013-09-10 17:26:07 -0700501 EXPECT_CALL(*minijail_, RunAndDestroy(_, _, _)).WillOnce(Return(true));
502 config_->Start();
503 config_->ProcessEventSignal(DHCPConfig::kReasonGatewayArp, conf);
Paul Stewartc5099532013-12-12 07:53:15 -0800504 Mock::VerifyAndClearExpectations(this);
Paul Stewart94571f12013-09-10 17:26:07 -0700505 EXPECT_EQ("4.3.2.1", config_->properties().address);
506 EXPECT_FALSE(config_->lease_acquisition_timeout_callback_.IsCancelled());
507 EXPECT_TRUE(config_->is_gateway_arp_active_);
508
509 // If the timeout gets called, we shouldn't lose the lease since GatewayArp
510 // is active.
511 ScopedMockLog log;
512 EXPECT_CALL(log, Log(_, _, _)).Times(AnyNumber());
513 EXPECT_CALL(log, Log(_, _, ::testing::EndsWith(
514 "Continuing to use our previous lease, due to gateway-ARP.")));
Paul Stewartc5099532013-12-12 07:53:15 -0800515 EXPECT_CALL(*this, SuccessCallback(_)).Times(0);
516 EXPECT_CALL(*this, FailureCallback(_)).Times(0);
Paul Stewart94571f12013-09-10 17:26:07 -0700517 config_->lease_acquisition_timeout_callback_.callback().Run();
Paul Stewartc5099532013-12-12 07:53:15 -0800518 Mock::VerifyAndClearExpectations(this);
Paul Stewart94571f12013-09-10 17:26:07 -0700519 EXPECT_TRUE(config_->is_gateway_arp_active_);
520
521 // An official reply from a DHCP server should reset our GatewayArp state.
Paul Stewartc5099532013-12-12 07:53:15 -0800522 EXPECT_CALL(*this, SuccessCallback(ConfigRef()));
523 EXPECT_CALL(*this, FailureCallback(_)).Times(0);
Paul Stewart94571f12013-09-10 17:26:07 -0700524 config_->ProcessEventSignal(DHCPConfig::kReasonRenew, conf);
Paul Stewartc5099532013-12-12 07:53:15 -0800525 Mock::VerifyAndClearExpectations(this);
Paul Stewart94571f12013-09-10 17:26:07 -0700526 EXPECT_FALSE(config_->is_gateway_arp_active_);
527}
528
Paul Stewartc5099532013-12-12 07:53:15 -0800529TEST_F(DHCPConfigCallbackTest, ProcessEventSignalGatewayArpNak) {
Paul Stewart94571f12013-09-10 17:26:07 -0700530 DHCPConfig::Configuration conf;
531 conf[DHCPConfig::kConfigurationKeyIPAddress].writer().append_uint32(
532 0x01020304);
Paul Stewart94571f12013-09-10 17:26:07 -0700533 EXPECT_CALL(*minijail_, RunAndDestroy(_, _, _)).WillOnce(Return(true));
534 config_->Start();
535 config_->ProcessEventSignal(DHCPConfig::kReasonGatewayArp, conf);
536 EXPECT_TRUE(config_->is_gateway_arp_active_);
537
538 // Sending a NAK should clear is_gateway_arp_active_.
539 config_->ProcessEventSignal(DHCPConfig::kReasonNak, conf);
540 EXPECT_FALSE(config_->is_gateway_arp_active_);
Paul Stewartc5099532013-12-12 07:53:15 -0800541 Mock::VerifyAndClearExpectations(this);
Paul Stewart94571f12013-09-10 17:26:07 -0700542
543 // If the timeout gets called, we should lose the lease since GatewayArp
544 // is not active any more.
Paul Stewartc5099532013-12-12 07:53:15 -0800545 EXPECT_CALL(*this, SuccessCallback(_)).Times(0);
546 EXPECT_CALL(*this, FailureCallback(ConfigRef()));
Paul Stewart94571f12013-09-10 17:26:07 -0700547 config_->lease_acquisition_timeout_callback_.callback().Run();
Paul Stewartc5099532013-12-12 07:53:15 -0800548 Mock::VerifyAndClearExpectations(this);
Paul Stewart94571f12013-09-10 17:26:07 -0700549}
Darin Petkovf9b0ca82011-06-20 12:10:23 -0700550
Darin Petkov98dd6a02011-06-10 15:12:57 -0700551TEST_F(DHCPConfigTest, ReleaseIP) {
552 config_->pid_ = 1 << 18; // Ensure unknown positive PID.
Paul Stewarta02ee492012-05-16 10:04:53 -0700553 config_->arp_gateway_ = false;
Darin Petkovaceede32011-07-18 15:32:38 -0700554 EXPECT_CALL(*proxy_, Release(kDeviceName)).Times(1);
Darin Petkova7b89492011-07-27 12:48:17 -0700555 config_->proxy_.reset(proxy_.release());
Paul Stewart217c61d2013-06-13 15:12:02 -0700556 EXPECT_TRUE(config_->ReleaseIP(IPConfig::kReleaseReasonDisconnect));
Darin Petkov98dd6a02011-06-10 15:12:57 -0700557 config_->pid_ = 0;
558}
559
Paul Stewarta02ee492012-05-16 10:04:53 -0700560TEST_F(DHCPConfigTest, ReleaseIPArpGW) {
561 config_->pid_ = 1 << 18; // Ensure unknown positive PID.
562 config_->arp_gateway_ = true;
563 EXPECT_CALL(*proxy_, Release(kDeviceName)).Times(0);
564 config_->proxy_.reset(proxy_.release());
Paul Stewart217c61d2013-06-13 15:12:02 -0700565 EXPECT_TRUE(config_->ReleaseIP(IPConfig::kReleaseReasonDisconnect));
566 config_->pid_ = 0;
567}
568
569TEST_F(DHCPConfigTest, ReleaseIPStaticIPWithLease) {
570 config_->pid_ = 1 << 18; // Ensure unknown positive PID.
571 config_->arp_gateway_ = true;
572 config_->is_lease_active_ = true;
573 EXPECT_CALL(*proxy_, Release(kDeviceName));
574 config_->proxy_.reset(proxy_.release());
575 EXPECT_TRUE(config_->ReleaseIP(IPConfig::kReleaseReasonStaticIP));
576 EXPECT_EQ(NULL, config_->proxy_.get());
577 config_->pid_ = 0;
578}
579
580TEST_F(DHCPConfigTest, ReleaseIPStaticIPWithoutLease) {
581 config_->pid_ = 1 << 18; // Ensure unknown positive PID.
582 config_->arp_gateway_ = true;
583 config_->is_lease_active_ = false;
584 EXPECT_CALL(*proxy_, Release(kDeviceName)).Times(0);
585 MockDHCPProxy *proxy_pointer = proxy_.get();
586 config_->proxy_.reset(proxy_.release());
587 EXPECT_TRUE(config_->ReleaseIP(IPConfig::kReleaseReasonStaticIP));
588 // Expect that proxy has not been released.
589 EXPECT_EQ(proxy_pointer, config_->proxy_.get());
Paul Stewarta02ee492012-05-16 10:04:53 -0700590 config_->pid_ = 0;
591}
592
Darin Petkov98dd6a02011-06-10 15:12:57 -0700593TEST_F(DHCPConfigTest, RenewIP) {
Paul Stewart21f7b342013-11-19 10:15:58 -0800594 EXPECT_CALL(*minijail_, RunAndDestroy(_, _, _)).WillOnce(Return(false));
595 config_->pid_ = 0;
596 EXPECT_FALSE(config_->RenewIP()); // Expect a call to Start() if pid_ is 0.
597 Mock::VerifyAndClearExpectations(minijail_.get());
598 EXPECT_CALL(*minijail_, RunAndDestroy(_, _, _)).Times(0);
mukesh agrawalcc0fded2012-05-09 13:40:58 -0700599 EXPECT_TRUE(config_->lease_acquisition_timeout_callback_.IsCancelled());
Darin Petkov98dd6a02011-06-10 15:12:57 -0700600 config_->pid_ = 456;
Paul Stewartc02344a2012-08-17 16:57:37 -0700601 EXPECT_FALSE(config_->RenewIP()); // Expect no crash with NULL proxy.
Darin Petkovaceede32011-07-18 15:32:38 -0700602 EXPECT_CALL(*proxy_, Rebind(kDeviceName)).Times(1);
Darin Petkova7b89492011-07-27 12:48:17 -0700603 config_->proxy_.reset(proxy_.release());
Darin Petkov98dd6a02011-06-10 15:12:57 -0700604 EXPECT_TRUE(config_->RenewIP());
mukesh agrawalcc0fded2012-05-09 13:40:58 -0700605 EXPECT_FALSE(config_->lease_acquisition_timeout_callback_.IsCancelled());
Darin Petkov98dd6a02011-06-10 15:12:57 -0700606 config_->pid_ = 0;
607}
608
609TEST_F(DHCPConfigTest, RequestIP) {
mukesh agrawalcc0fded2012-05-09 13:40:58 -0700610 EXPECT_TRUE(config_->lease_acquisition_timeout_callback_.IsCancelled());
Darin Petkov98dd6a02011-06-10 15:12:57 -0700611 config_->pid_ = 567;
Darin Petkovaceede32011-07-18 15:32:38 -0700612 EXPECT_CALL(*proxy_, Rebind(kDeviceName)).Times(1);
Darin Petkova7b89492011-07-27 12:48:17 -0700613 config_->proxy_.reset(proxy_.release());
Darin Petkov98dd6a02011-06-10 15:12:57 -0700614 EXPECT_TRUE(config_->RenewIP());
mukesh agrawalcc0fded2012-05-09 13:40:58 -0700615 EXPECT_FALSE(config_->lease_acquisition_timeout_callback_.IsCancelled());
616 config_->pid_ = 0;
617}
618
Paul Stewartc5099532013-12-12 07:53:15 -0800619TEST_F(DHCPConfigCallbackTest, RequestIPTimeout) {
620 EXPECT_CALL(*this, SuccessCallback(_)).Times(0);
621 EXPECT_CALL(*this, FailureCallback(ConfigRef()));
mukesh agrawalcc0fded2012-05-09 13:40:58 -0700622 config_->lease_acquisition_timeout_seconds_ = 0;
623 config_->pid_ = 567;
624 EXPECT_CALL(*proxy_, Rebind(kDeviceName)).Times(1);
625 config_->proxy_.reset(proxy_.release());
626 config_->RenewIP();
627 config_->dispatcher_->DispatchPendingEvents();
Paul Stewartc5099532013-12-12 07:53:15 -0800628 Mock::VerifyAndClearExpectations(this);
Darin Petkov98dd6a02011-06-10 15:12:57 -0700629 config_->pid_ = 0;
630}
631
632TEST_F(DHCPConfigTest, Restart) {
633 const int kPID1 = 1 << 17; // Ensure unknown positive PID.
634 const int kPID2 = 987;
635 const unsigned int kTag1 = 11;
636 const unsigned int kTag2 = 22;
637 config_->pid_ = kPID1;
638 config_->child_watch_tag_ = kTag1;
639 DHCPProvider::GetInstance()->BindPID(kPID1, config_);
Chris Masone2176a882011-09-14 22:29:15 -0700640 EXPECT_CALL(*glib(), SourceRemove(kTag1)).WillOnce(Return(true));
Jorge Lucangeli Obesad43cc62012-04-11 16:25:43 -0700641 EXPECT_CALL(*minijail_, RunAndDestroy(_, _, _)).WillOnce(
642 DoAll(SetArgumentPointee<2>(kPID2), Return(true)));
Chris Masone2176a882011-09-14 22:29:15 -0700643 EXPECT_CALL(*glib(), ChildWatchAdd(kPID2, _, _)).WillOnce(Return(kTag2));
Darin Petkov98dd6a02011-06-10 15:12:57 -0700644 EXPECT_TRUE(config_->Restart());
645 EXPECT_EQ(kPID2, config_->pid_);
646 EXPECT_EQ(config_.get(), DHCPProvider::GetInstance()->GetConfig(kPID2).get());
647 EXPECT_EQ(kTag2, config_->child_watch_tag_);
648 DHCPProvider::GetInstance()->UnbindPID(kPID2);
649 config_->pid_ = 0;
650 config_->child_watch_tag_ = 0;
651}
652
653TEST_F(DHCPConfigTest, RestartNoClient) {
654 const int kPID = 777;
655 const unsigned int kTag = 66;
Chris Masone2176a882011-09-14 22:29:15 -0700656 EXPECT_CALL(*glib(), SourceRemove(_)).Times(0);
Jorge Lucangeli Obesad43cc62012-04-11 16:25:43 -0700657 EXPECT_CALL(*minijail_, RunAndDestroy(_, _, _)).WillOnce(
658 DoAll(SetArgumentPointee<2>(kPID), Return(true)));
Chris Masone2176a882011-09-14 22:29:15 -0700659 EXPECT_CALL(*glib(), ChildWatchAdd(kPID, _, _)).WillOnce(Return(kTag));
Darin Petkov98dd6a02011-06-10 15:12:57 -0700660 EXPECT_TRUE(config_->Restart());
661 EXPECT_EQ(kPID, config_->pid_);
662 EXPECT_EQ(config_.get(), DHCPProvider::GetInstance()->GetConfig(kPID).get());
663 EXPECT_EQ(kTag, config_->child_watch_tag_);
664 DHCPProvider::GetInstance()->UnbindPID(kPID);
665 config_->pid_ = 0;
666 config_->child_watch_tag_ = 0;
667}
668
Paul Stewartd408fdf2012-05-07 17:15:57 -0700669TEST_F(DHCPConfigTest, StartSuccessEphemeral) {
670 DHCPConfigRefPtr config =
Paul Stewart75a68b92013-10-24 10:50:27 -0700671 CreateRunningConfig(kHostName, kDeviceName, kArpGateway, !kMinimalConfig);
Paul Stewartd408fdf2012-05-07 17:15:57 -0700672 StopRunningConfigAndExpect(config, false);
673}
Darin Petkov92c43902011-06-09 20:46:06 -0700674
Paul Stewartd408fdf2012-05-07 17:15:57 -0700675TEST_F(DHCPConfigTest, StartSuccessPersistent) {
676 DHCPConfigRefPtr config =
Paul Stewart75a68b92013-10-24 10:50:27 -0700677 CreateRunningConfig(kHostName, kLeaseFileSuffix, kArpGateway,
678 !kMinimalConfig);
Paul Stewartd408fdf2012-05-07 17:15:57 -0700679 StopRunningConfigAndExpect(config, true);
Darin Petkovf7897bc2011-06-08 17:13:36 -0700680}
681
Paul Stewartc5099532013-12-12 07:53:15 -0800682TEST_F(DHCPConfigCallbackTest, StartTimeout) {
683 EXPECT_CALL(*this, SuccessCallback(_)).Times(0);
684 EXPECT_CALL(*this, FailureCallback(ConfigRef()));
mukesh agrawalcc0fded2012-05-09 13:40:58 -0700685 config_->lease_acquisition_timeout_seconds_ = 0;
686 config_->proxy_.reset(proxy_.release());
Jorge Lucangeli Obesad43cc62012-04-11 16:25:43 -0700687 EXPECT_CALL(*minijail_, RunAndDestroy(_, _, _)).WillOnce(Return(true));
mukesh agrawalcc0fded2012-05-09 13:40:58 -0700688 config_->Start();
689 config_->dispatcher_->DispatchPendingEvents();
Paul Stewartc5099532013-12-12 07:53:15 -0800690 Mock::VerifyAndClearExpectations(this);
mukesh agrawalcc0fded2012-05-09 13:40:58 -0700691}
692
Darin Petkov98dd6a02011-06-10 15:12:57 -0700693TEST_F(DHCPConfigTest, Stop) {
Darin Petkov98dd6a02011-06-10 15:12:57 -0700694 const int kPID = 1 << 17; // Ensure unknown positive PID.
mukesh agrawal1835e772013-01-15 18:35:03 -0800695 ScopedMockLog log;
696 EXPECT_CALL(log, Log(_, _, _)).Times(AnyNumber());
697 EXPECT_CALL(log, Log(_, _, ContainsRegex(
Darin Petkov3fe17662013-02-04 14:19:08 +0100698 base::StringPrintf("Stopping.+%s", __func__))));
Darin Petkov98dd6a02011-06-10 15:12:57 -0700699 config_->pid_ = kPID;
Darin Petkov3fe17662013-02-04 14:19:08 +0100700 DHCPProvider::GetInstance()->BindPID(kPID, config_);
mukesh agrawal1835e772013-01-15 18:35:03 -0800701 config_->Stop(__func__);
mukesh agrawalcc0fded2012-05-09 13:40:58 -0700702 EXPECT_TRUE(config_->lease_acquisition_timeout_callback_.IsCancelled());
Darin Petkov3fe17662013-02-04 14:19:08 +0100703 EXPECT_FALSE(DHCPProvider::GetInstance()->GetConfig(kPID));
704 EXPECT_FALSE(config_->pid_);
mukesh agrawalcc0fded2012-05-09 13:40:58 -0700705}
706
707TEST_F(DHCPConfigTest, StopDuringRequestIP) {
708 config_->pid_ = 567;
709 EXPECT_CALL(*proxy_, Rebind(kDeviceName)).Times(1);
710 config_->proxy_.reset(proxy_.release());
711 EXPECT_TRUE(config_->RenewIP());
712 EXPECT_FALSE(config_->lease_acquisition_timeout_callback_.IsCancelled());
713 config_->pid_ = 0; // Keep Stop from killing a real process.
mukesh agrawal1835e772013-01-15 18:35:03 -0800714 config_->Stop(__func__);
mukesh agrawalcc0fded2012-05-09 13:40:58 -0700715 EXPECT_TRUE(config_->lease_acquisition_timeout_callback_.IsCancelled());
Darin Petkov98dd6a02011-06-10 15:12:57 -0700716}
717
mukesh agrawal6bb9e7c2012-01-30 14:57:54 -0800718TEST_F(DHCPConfigTest, SetProperty) {
Chris Masone43b48a12011-07-01 13:37:07 -0700719 ::DBus::Error error;
720 // Ensure that an attempt to write a R/O property returns InvalidArgs error.
mukesh agrawal6bb9e7c2012-01-30 14:57:54 -0800721 EXPECT_FALSE(DBusAdaptor::SetProperty(config_->mutable_store(),
Ben Chan0295e0f2013-09-20 13:47:29 -0700722 kAddressProperty,
mukesh agrawal6bb9e7c2012-01-30 14:57:54 -0800723 PropertyStoreTest::kStringV,
724 &error));
mukesh agrawalbebf1b82013-04-23 15:06:33 -0700725 ASSERT_TRUE(error.is_set()); // name() may be invalid otherwise
Chris Masone9d779932011-08-25 16:33:41 -0700726 EXPECT_EQ(invalid_args(), error.name());
Chris Masone43b48a12011-07-01 13:37:07 -0700727}
728
Darin Petkove7cb7f82011-06-03 13:21:51 -0700729} // namespace shill