blob: 16051cb7f2b8336503108c67a4023220f5d9cbc8 [file] [log] [blame]
Darin Petkove02b3ca2011-05-31 16:00:44 -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
Chris Masone19e30402011-07-19 15:48:47 -07005#include "shill/ipconfig.h"
6
Eric Shienbrood3e20a232012-02-16 11:35:56 -05007#include <base/bind.h>
Darin Petkovf65e9282011-06-21 14:29:56 -07008#include <gtest/gtest.h>
Darin Petkovefb09c32011-06-07 20:24:17 -07009
Chris Masone19e30402011-07-19 15:48:47 -070010#include "shill/mock_control.h"
Chris Masone8a7b8be2011-07-22 12:43:37 -070011#include "shill/mock_store.h"
Darin Petkove02b3ca2011-05-31 16:00:44 -070012
Eric Shienbrood3e20a232012-02-16 11:35:56 -050013using base::Bind;
14using base::Unretained;
Chris Masone8a7b8be2011-07-22 12:43:37 -070015using std::string;
16using testing::_;
17using testing::Return;
18using testing::SaveArg;
19using testing::SetArgumentPointee;
20using testing::StrictMock;
Darin Petkovefb09c32011-06-07 20:24:17 -070021using testing::Test;
22
Darin Petkove02b3ca2011-05-31 16:00:44 -070023namespace shill {
Darin Petkove02b3ca2011-05-31 16:00:44 -070024
Darin Petkovf65e9282011-06-21 14:29:56 -070025namespace {
26const char kDeviceName[] = "testdevice";
27} // namespace {}
28
Darin Petkove02b3ca2011-05-31 16:00:44 -070029class IPConfigTest : public Test {
30 public:
Chris Masone19e30402011-07-19 15:48:47 -070031 IPConfigTest() : ipconfig_(new IPConfig(&control_, kDeviceName)) {}
Darin Petkove02b3ca2011-05-31 16:00:44 -070032
33 protected:
Chris Masone19e30402011-07-19 15:48:47 -070034 MockControl control_;
Darin Petkovefb09c32011-06-07 20:24:17 -070035 IPConfigRefPtr ipconfig_;
Darin Petkove02b3ca2011-05-31 16:00:44 -070036};
37
Darin Petkovf65e9282011-06-21 14:29:56 -070038TEST_F(IPConfigTest, DeviceName) {
39 EXPECT_EQ(kDeviceName, ipconfig_->device_name());
Darin Petkovefb09c32011-06-07 20:24:17 -070040}
41
Darin Petkov92c43902011-06-09 20:46:06 -070042TEST_F(IPConfigTest, RequestIP) {
43 EXPECT_FALSE(ipconfig_->RequestIP());
Darin Petkovefb09c32011-06-07 20:24:17 -070044}
45
Darin Petkov92c43902011-06-09 20:46:06 -070046TEST_F(IPConfigTest, RenewIP) {
47 EXPECT_FALSE(ipconfig_->RenewIP());
48}
49
50TEST_F(IPConfigTest, ReleaseIP) {
51 EXPECT_FALSE(ipconfig_->ReleaseIP());
Darin Petkovefb09c32011-06-07 20:24:17 -070052}
53
Chris Masone8a7b8be2011-07-22 12:43:37 -070054TEST_F(IPConfigTest, SaveLoad) {
55 StrictMock<MockStore> storage;
56 string id, key, value;
57 EXPECT_CALL(storage, SetString(_, _, _))
58 .WillOnce(DoAll(SaveArg<0>(&id),
59 SaveArg<1>(&key),
60 SaveArg<2>(&value),
61 Return(true)));
Chris Masone34af2182011-08-22 11:59:36 -070062 ASSERT_TRUE(ipconfig_->Save(&storage, ""));
Chris Masone8a7b8be2011-07-22 12:43:37 -070063
64 EXPECT_CALL(storage, ContainsGroup(id))
65 .WillOnce(Return(true));
66 EXPECT_CALL(storage, GetString(id, key, _))
67 .WillOnce(DoAll(SetArgumentPointee<2>(value), Return(true)));
Chris Masone34af2182011-08-22 11:59:36 -070068 ASSERT_TRUE(ipconfig_->Load(&storage, ""));
Chris Masone8a7b8be2011-07-22 12:43:37 -070069}
70
Darin Petkovefb09c32011-06-07 20:24:17 -070071TEST_F(IPConfigTest, UpdateProperties) {
72 IPConfig::Properties properties;
73 properties.address = "1.2.3.4";
Paul Stewart48100b02012-03-19 07:53:52 -070074 properties.subnet_prefix = 24;
Darin Petkovefb09c32011-06-07 20:24:17 -070075 properties.broadcast_address = "11.22.33.44";
76 properties.gateway = "5.6.7.8";
77 properties.dns_servers.push_back("10.20.30.40");
78 properties.dns_servers.push_back("20.30.40.50");
79 properties.domain_name = "foo.org";
80 properties.domain_search.push_back("zoo.org");
81 properties.domain_search.push_back("zoo.com");
82 properties.mtu = 700;
Darin Petkovf9b0ca82011-06-20 12:10:23 -070083 ipconfig_->UpdateProperties(properties, true);
Darin Petkovefb09c32011-06-07 20:24:17 -070084 EXPECT_EQ("1.2.3.4", ipconfig_->properties().address);
Paul Stewart48100b02012-03-19 07:53:52 -070085 EXPECT_EQ(24, ipconfig_->properties().subnet_prefix);
Darin Petkovefb09c32011-06-07 20:24:17 -070086 EXPECT_EQ("11.22.33.44", ipconfig_->properties().broadcast_address);
87 EXPECT_EQ("5.6.7.8", ipconfig_->properties().gateway);
88 ASSERT_EQ(2, ipconfig_->properties().dns_servers.size());
89 EXPECT_EQ("10.20.30.40", ipconfig_->properties().dns_servers[0]);
90 EXPECT_EQ("20.30.40.50", ipconfig_->properties().dns_servers[1]);
91 ASSERT_EQ(2, ipconfig_->properties().domain_search.size());
92 EXPECT_EQ("zoo.org", ipconfig_->properties().domain_search[0]);
93 EXPECT_EQ("zoo.com", ipconfig_->properties().domain_search[1]);
94 EXPECT_EQ("foo.org", ipconfig_->properties().domain_name);
95 EXPECT_EQ(700, ipconfig_->properties().mtu);
96}
97
Darin Petkovf9b0ca82011-06-20 12:10:23 -070098namespace {
99
Darin Petkovefb09c32011-06-07 20:24:17 -0700100class UpdateCallbackTest {
101 public:
Chris Masone2b105542011-06-22 10:58:09 -0700102 UpdateCallbackTest(const IPConfigRefPtr &ipconfig, bool success)
Darin Petkovefb09c32011-06-07 20:24:17 -0700103 : ipconfig_(ipconfig),
Darin Petkovf9b0ca82011-06-20 12:10:23 -0700104 success_(success),
Darin Petkovefb09c32011-06-07 20:24:17 -0700105 called_(false) {}
106
Chris Masone2b105542011-06-22 10:58:09 -0700107 void Callback(const IPConfigRefPtr &ipconfig, bool success) {
Darin Petkovefb09c32011-06-07 20:24:17 -0700108 called_ = true;
Darin Petkovf9b0ca82011-06-20 12:10:23 -0700109 EXPECT_EQ(ipconfig_.get(), ipconfig.get());
110 EXPECT_EQ(success_, success);
Darin Petkovefb09c32011-06-07 20:24:17 -0700111 }
112
113 bool called() const { return called_; }
114
115 private:
116 IPConfigRefPtr ipconfig_;
Darin Petkovf9b0ca82011-06-20 12:10:23 -0700117 bool success_;
Darin Petkovefb09c32011-06-07 20:24:17 -0700118 bool called_;
119};
120
Darin Petkovf9b0ca82011-06-20 12:10:23 -0700121} // namespace {}
122
Darin Petkovefb09c32011-06-07 20:24:17 -0700123TEST_F(IPConfigTest, UpdateCallback) {
Darin Petkovf9b0ca82011-06-20 12:10:23 -0700124 for (int success = 0; success < 2; success++) {
125 UpdateCallbackTest callback_test(ipconfig_, success);
126 ASSERT_FALSE(callback_test.called());
127 ipconfig_->RegisterUpdateCallback(
Eric Shienbrood3e20a232012-02-16 11:35:56 -0500128 Bind(&UpdateCallbackTest::Callback, Unretained(&callback_test)));
Darin Petkovf9b0ca82011-06-20 12:10:23 -0700129 ipconfig_->UpdateProperties(IPConfig::Properties(), success);
130 EXPECT_TRUE(callback_test.called());
131 }
Darin Petkove02b3ca2011-05-31 16:00:44 -0700132}
133
134} // namespace shill