blob: c25ee3db802a0bb496b949123cb74a4dd33fc673 [file] [log] [blame]
Darin Petkove7cb7f82011-06-03 13:21:51 -07001// Copyright (c) 2011 The Chromium OS Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
Darin Petkov92c43902011-06-09 20:46:06 -07005#include <base/file_util.h>
6#include <base/memory/scoped_temp_dir.h>
7#include <base/stringprintf.h>
8
Darin Petkove7cb7f82011-06-03 13:21:51 -07009#include "shill/dhcp_config.h"
Darin Petkovf7897bc2011-06-08 17:13:36 -070010#include "shill/dhcp_provider.h"
Darin Petkove7cb7f82011-06-03 13:21:51 -070011#include "shill/mock_control.h"
12#include "shill/mock_device.h"
Darin Petkovf7897bc2011-06-08 17:13:36 -070013#include "shill/mock_glib.h"
Darin Petkove7cb7f82011-06-03 13:21:51 -070014
15using std::string;
16using std::vector;
Darin Petkovf7897bc2011-06-08 17:13:36 -070017using testing::_;
18using testing::Return;
19using testing::SetArgumentPointee;
Darin Petkove7cb7f82011-06-03 13:21:51 -070020using testing::Test;
21
22namespace shill {
23
Darin Petkov92c43902011-06-09 20:46:06 -070024namespace {
25const char kDeviceName[] = "testdevicename";
26} // namespace {}
27
Darin Petkove7cb7f82011-06-03 13:21:51 -070028class DHCPConfigTest : public Test {
29 public:
Darin Petkovf7897bc2011-06-08 17:13:36 -070030 DHCPConfigTest()
Darin Petkov92c43902011-06-09 20:46:06 -070031 : device_(new MockDevice(&control_interface_,
32 NULL,
33 NULL,
34 kDeviceName,
35 0)),
Darin Petkovf7897bc2011-06-08 17:13:36 -070036 config_(new DHCPConfig(DHCPProvider::GetInstance(), device_, &glib_)) {}
Darin Petkove7cb7f82011-06-03 13:21:51 -070037
38 protected:
Darin Petkovf7897bc2011-06-08 17:13:36 -070039 MockGLib glib_;
Darin Petkove7cb7f82011-06-03 13:21:51 -070040 MockControl control_interface_;
41 scoped_refptr<MockDevice> device_;
Darin Petkovf7897bc2011-06-08 17:13:36 -070042 DHCPConfigRefPtr config_;
Darin Petkove7cb7f82011-06-03 13:21:51 -070043};
44
45TEST_F(DHCPConfigTest, GetIPv4AddressString) {
Darin Petkovf7897bc2011-06-08 17:13:36 -070046 EXPECT_EQ("255.255.255.255", config_->GetIPv4AddressString(0xffffffff));
47 EXPECT_EQ("0.0.0.0", config_->GetIPv4AddressString(0));
48 EXPECT_EQ("1.2.3.4", config_->GetIPv4AddressString(0x04030201));
Darin Petkove7cb7f82011-06-03 13:21:51 -070049}
50
51TEST_F(DHCPConfigTest, ParseConfiguration) {
52 DHCPConfig::Configuration conf;
53 conf[DHCPConfig::kConfigurationKeyIPAddress].writer().append_uint32(
54 0x01020304);
55 conf[DHCPConfig::kConfigurationKeySubnetCIDR].writer().append_byte(
56 16);
57 conf[DHCPConfig::kConfigurationKeyBroadcastAddress].writer().append_uint32(
58 0x10203040);
59 {
Darin Petkove7cb7f82011-06-03 13:21:51 -070060 vector<unsigned int> routers;
61 routers.push_back(0x02040608);
62 routers.push_back(0x03050709);
Darin Petkovf7897bc2011-06-08 17:13:36 -070063 DBus::MessageIter writer =
64 conf[DHCPConfig::kConfigurationKeyRouters].writer();
Darin Petkove7cb7f82011-06-03 13:21:51 -070065 writer << routers;
Darin Petkove7cb7f82011-06-03 13:21:51 -070066 }
67 {
Darin Petkove7cb7f82011-06-03 13:21:51 -070068 vector<unsigned int> dns;
69 dns.push_back(0x09070503);
70 dns.push_back(0x08060402);
Darin Petkovf7897bc2011-06-08 17:13:36 -070071 DBus::MessageIter writer = conf[DHCPConfig::kConfigurationKeyDNS].writer();
Darin Petkove7cb7f82011-06-03 13:21:51 -070072 writer << dns;
Darin Petkove7cb7f82011-06-03 13:21:51 -070073 }
74 conf[DHCPConfig::kConfigurationKeyDomainName].writer().append_string(
75 "domain-name");
76 {
Darin Petkove7cb7f82011-06-03 13:21:51 -070077 vector<string> search;
78 search.push_back("foo.com");
79 search.push_back("bar.com");
Darin Petkovf7897bc2011-06-08 17:13:36 -070080 DBus::MessageIter writer =
81 conf[DHCPConfig::kConfigurationKeyDomainSearch].writer();
Darin Petkove7cb7f82011-06-03 13:21:51 -070082 writer << search;
Darin Petkove7cb7f82011-06-03 13:21:51 -070083 }
84 conf[DHCPConfig::kConfigurationKeyMTU].writer().append_uint16(600);
85 conf["UnknownKey"] = DBus::Variant();
86
Darin Petkove7cb7f82011-06-03 13:21:51 -070087 IPConfig::Properties properties;
Darin Petkovf7897bc2011-06-08 17:13:36 -070088 ASSERT_TRUE(config_->ParseConfiguration(conf, &properties));
Darin Petkove7cb7f82011-06-03 13:21:51 -070089 EXPECT_EQ("4.3.2.1", properties.address);
90 EXPECT_EQ(16, properties.subnet_cidr);
91 EXPECT_EQ("64.48.32.16", properties.broadcast_address);
92 EXPECT_EQ("8.6.4.2", properties.gateway);
93 ASSERT_EQ(2, properties.dns_servers.size());
94 EXPECT_EQ("3.5.7.9", properties.dns_servers[0]);
95 EXPECT_EQ("2.4.6.8", properties.dns_servers[1]);
96 EXPECT_EQ("domain-name", properties.domain_name);
97 ASSERT_EQ(2, properties.domain_search.size());
98 EXPECT_EQ("foo.com", properties.domain_search[0]);
99 EXPECT_EQ("bar.com", properties.domain_search[1]);
100 EXPECT_EQ(600, properties.mtu);
101}
102
Darin Petkov92c43902011-06-09 20:46:06 -0700103TEST_F(DHCPConfigTest, StartFail) {
Darin Petkovf7897bc2011-06-08 17:13:36 -0700104 EXPECT_CALL(glib_, SpawnAsync(_, _, _, _, _, _, _, _))
105 .WillOnce(Return(false));
Darin Petkov92c43902011-06-09 20:46:06 -0700106 EXPECT_CALL(glib_, ChildWatchAdd(_, _, _)).Times(0);
Darin Petkovf7897bc2011-06-08 17:13:36 -0700107 EXPECT_FALSE(config_->Start());
108 EXPECT_EQ(0, config_->pid_);
Darin Petkov92c43902011-06-09 20:46:06 -0700109}
Darin Petkovf7897bc2011-06-08 17:13:36 -0700110
Darin Petkov92c43902011-06-09 20:46:06 -0700111TEST_F(DHCPConfigTest, StartSuccess) {
112 const int kPID = 123456;
113 const unsigned int kTag = 55;
Darin Petkovf7897bc2011-06-08 17:13:36 -0700114 EXPECT_CALL(glib_, SpawnAsync(_, _, _, _, _, _, _, _))
115 .WillOnce(DoAll(SetArgumentPointee<6>(kPID), Return(true)));
Darin Petkov92c43902011-06-09 20:46:06 -0700116 EXPECT_CALL(glib_, ChildWatchAdd(kPID, _, _)).WillOnce(Return(kTag));
Darin Petkovf7897bc2011-06-08 17:13:36 -0700117 EXPECT_TRUE(config_->Start());
118 EXPECT_EQ(kPID, config_->pid_);
119 DHCPProvider *provider = DHCPProvider::GetInstance();
120 ASSERT_TRUE(provider->configs_.find(kPID) != provider->configs_.end());
Darin Petkov92c43902011-06-09 20:46:06 -0700121 EXPECT_EQ(config_.get(), provider->configs_.find(kPID)->second.get());
122
123 ScopedTempDir temp_dir;
124 config_->root_ = temp_dir.path();
125 FilePath varrun = temp_dir.path().Append("var/run");
126 EXPECT_TRUE(file_util::CreateDirectory(varrun));
127 FilePath pid_file =
128 varrun.Append(base::StringPrintf("dhcpcd-%s.pid", kDeviceName));
129 FilePath lease_file =
130 varrun.Append(base::StringPrintf("dhcpcd-%s.lease", kDeviceName));
131 EXPECT_EQ(0, file_util::WriteFile(pid_file, "", 0));
132 EXPECT_EQ(0, file_util::WriteFile(lease_file, "", 0));
133 ASSERT_TRUE(file_util::PathExists(pid_file));
134 ASSERT_TRUE(file_util::PathExists(lease_file));
135
136 EXPECT_CALL(glib_, SpawnClosePID(kPID)).Times(1);
137 DHCPConfig::ChildWatchCallback(kPID, 0, config_.get());
138 EXPECT_FALSE(file_util::PathExists(pid_file));
139 EXPECT_FALSE(file_util::PathExists(lease_file));
Darin Petkovf7897bc2011-06-08 17:13:36 -0700140}
141
Darin Petkove7cb7f82011-06-03 13:21:51 -0700142} // namespace shill