blob: 4f2b20456ac726df6a420ab72799fda992f1348d [file] [log] [blame]
Ratan Guptac9645fe2017-08-23 16:53:52 +05301#include "config_parser.hpp"
Ratan Gupta5978dd12017-07-25 13:47:13 +05302#include "ipaddress.hpp"
Ratan Gupta35297172018-11-28 18:40:16 +05303#include "mock_network_manager.hpp"
Gunnar Mills57d9c502018-09-14 14:42:34 -05004#include "mock_syscall.hpp"
William A. Kennington IIIcb64b992019-04-21 18:45:07 -07005#include "util.hpp"
Ratan Gupta47722dc2017-05-26 18:32:23 +05306
Ratan Gupta255d5142017-08-10 09:02:08 +05307#include <arpa/inet.h>
Ratan Gupta47722dc2017-05-26 18:32:23 +05308#include <net/if.h>
9#include <netinet/in.h>
Ratan Gupta255d5142017-08-10 09:02:08 +053010#include <stdlib.h>
11
Ratan Gupta47722dc2017-05-26 18:32:23 +053012#include <exception>
Ratan Guptac9645fe2017-08-23 16:53:52 +053013#include <fstream>
Gunnar Mills57d9c502018-09-14 14:42:34 -050014#include <sdbusplus/bus.hpp>
William A. Kennington III84bfe672022-07-13 14:15:30 -070015#include <stdplus/gtest/tmp.hpp>
Gunnar Mills57d9c502018-09-14 14:42:34 -050016
17#include <gtest/gtest.h>
Ratan Gupta47722dc2017-05-26 18:32:23 +053018
19namespace phosphor
20{
21namespace network
22{
23
William A. Kennington III84bfe672022-07-13 14:15:30 -070024class TestEthernetInterface : public stdplus::gtest::TestWithTmp
Ratan Gupta47722dc2017-05-26 18:32:23 +053025{
Gunnar Mills57d9c502018-09-14 14:42:34 -050026 public:
Patrick Williamsc38b0712022-07-22 19:26:54 -050027 sdbusplus::bus_t bus;
William A. Kennington III84bfe672022-07-13 14:15:30 -070028 std::string confDir;
Ratan Gupta35297172018-11-28 18:40:16 +053029 MockManager manager;
Manojkiran Edaacd6dd52019-10-15 15:00:51 +053030 MockEthernetInterface interface;
Gunnar Mills57d9c502018-09-14 14:42:34 -050031 TestEthernetInterface() :
William A. Kennington III84bfe672022-07-13 14:15:30 -070032 bus(sdbusplus::bus::new_default()), confDir(CaseTmpDir()),
33 manager(bus, "/xyz/openbmc_test/network", confDir),
William A. Kennington IIIebb1ad02019-04-21 18:02:49 -070034 interface(makeInterface(bus, manager))
Ratan Gupta47722dc2017-05-26 18:32:23 +053035
Gunnar Mills57d9c502018-09-14 14:42:34 -050036 {
Gunnar Mills57d9c502018-09-14 14:42:34 -050037 }
Ratan Gupta47722dc2017-05-26 18:32:23 +053038
William A. Kennington IIIcb64b992019-04-21 18:45:07 -070039 static constexpr ether_addr mac{0x11, 0x22, 0x33, 0x44, 0x55, 0x66};
40
Patrick Williamsc38b0712022-07-22 19:26:54 -050041 static MockEthernetInterface makeInterface(sdbusplus::bus_t& bus,
Manojkiran Edaacd6dd52019-10-15 15:00:51 +053042 MockManager& manager)
William A. Kennington IIIebb1ad02019-04-21 18:02:49 -070043 {
William A. Kennington III862275a2019-04-22 20:37:08 -070044 mock_clear();
William A. Kennington IIIcb64b992019-04-21 18:45:07 -070045 mock_addIF("test0", 1, mac);
William A. Kennington III0caf2212022-08-18 18:15:51 -070046 return {bus, "/xyz/openbmc_test/network/test0", config::Parser(),
47 manager, true};
William A. Kennington IIIebb1ad02019-04-21 18:02:49 -070048 }
49
Gunnar Mills57d9c502018-09-14 14:42:34 -050050 int countIPObjects()
51 {
52 return interface.getAddresses().size();
53 }
54
55 bool isIPObjectExist(const std::string& ipaddress)
56 {
57 auto address = interface.getAddresses().find(ipaddress);
58 if (address == interface.getAddresses().end())
Ratan Gupta255d5142017-08-10 09:02:08 +053059 {
Gunnar Mills57d9c502018-09-14 14:42:34 -050060 return false;
Ratan Gupta255d5142017-08-10 09:02:08 +053061 }
Gunnar Mills57d9c502018-09-14 14:42:34 -050062 return true;
63 }
Ratan Gupta255d5142017-08-10 09:02:08 +053064
Gunnar Mills57d9c502018-09-14 14:42:34 -050065 bool deleteIPObject(const std::string& ipaddress)
66 {
67 auto address = interface.getAddresses().find(ipaddress);
68 if (address == interface.getAddresses().end())
Ratan Gupta255d5142017-08-10 09:02:08 +053069 {
Gunnar Mills57d9c502018-09-14 14:42:34 -050070 return false;
Ratan Gupta255d5142017-08-10 09:02:08 +053071 }
Gunnar Mills57d9c502018-09-14 14:42:34 -050072 address->second->delete_();
73 return true;
74 }
Ratan Gupta255d5142017-08-10 09:02:08 +053075
Gunnar Mills57d9c502018-09-14 14:42:34 -050076 std::string getObjectPath(const std::string& ipaddress, uint8_t subnetMask,
Lei YU34027572021-08-11 15:23:52 +080077 IP::AddressOrigin origin)
Gunnar Mills57d9c502018-09-14 14:42:34 -050078 {
79 IP::Protocol addressType = IP::Protocol::IPv4;
Ratan Gupta255d5142017-08-10 09:02:08 +053080
Gunnar Mills57d9c502018-09-14 14:42:34 -050081 return interface.generateObjectPath(addressType, ipaddress, subnetMask,
William A. Kennington IIIe25f8b42022-10-11 14:43:28 -070082 origin);
Gunnar Mills57d9c502018-09-14 14:42:34 -050083 }
84
85 void createIPObject(IP::Protocol addressType, const std::string& ipaddress,
William A. Kennington IIIe25f8b42022-10-11 14:43:28 -070086 uint8_t subnetMask)
Gunnar Mills57d9c502018-09-14 14:42:34 -050087 {
William A. Kennington IIIe25f8b42022-10-11 14:43:28 -070088 interface.ip(addressType, ipaddress, subnetMask, "");
Gunnar Mills57d9c502018-09-14 14:42:34 -050089 }
Ratan Gupta47722dc2017-05-26 18:32:23 +053090};
91
92TEST_F(TestEthernetInterface, NoIPaddress)
93{
94 EXPECT_EQ(countIPObjects(), 0);
Patrick Williams6aef7692021-05-01 06:39:41 -050095 EXPECT_EQ(mac_address::toString(mac), interface.macAddress());
Ratan Gupta47722dc2017-05-26 18:32:23 +053096}
97
98TEST_F(TestEthernetInterface, AddIPAddress)
99{
100 IP::Protocol addressType = IP::Protocol::IPv4;
William A. Kennington IIIe25f8b42022-10-11 14:43:28 -0700101 createIPObject(addressType, "10.10.10.10", 16);
Ratan Gupta47722dc2017-05-26 18:32:23 +0530102 EXPECT_EQ(true, isIPObjectExist("10.10.10.10"));
Ratan Gupta47722dc2017-05-26 18:32:23 +0530103}
104
105TEST_F(TestEthernetInterface, AddMultipleAddress)
106{
107 IP::Protocol addressType = IP::Protocol::IPv4;
William A. Kennington IIIe25f8b42022-10-11 14:43:28 -0700108 createIPObject(addressType, "10.10.10.10", 16);
109 createIPObject(addressType, "20.20.20.20", 16);
Ratan Gupta47722dc2017-05-26 18:32:23 +0530110 EXPECT_EQ(true, isIPObjectExist("10.10.10.10"));
111 EXPECT_EQ(true, isIPObjectExist("20.20.20.20"));
Ratan Gupta47722dc2017-05-26 18:32:23 +0530112}
113
114TEST_F(TestEthernetInterface, DeleteIPAddress)
115{
116 IP::Protocol addressType = IP::Protocol::IPv4;
William A. Kennington IIIe25f8b42022-10-11 14:43:28 -0700117 createIPObject(addressType, "10.10.10.10", 16);
118 createIPObject(addressType, "20.20.20.20", 16);
Ratan Gupta47722dc2017-05-26 18:32:23 +0530119 deleteIPObject("10.10.10.10");
120 EXPECT_EQ(false, isIPObjectExist("10.10.10.10"));
121 EXPECT_EQ(true, isIPObjectExist("20.20.20.20"));
Ratan Gupta47722dc2017-05-26 18:32:23 +0530122}
123
124TEST_F(TestEthernetInterface, DeleteInvalidIPAddress)
125{
126 EXPECT_EQ(false, deleteIPObject("10.10.10.10"));
127}
128
129TEST_F(TestEthernetInterface, CheckObjectPath)
130{
131 std::string ipaddress = "10.10.10.10";
132 uint8_t prefix = 16;
Lei YU34027572021-08-11 15:23:52 +0800133 IP::AddressOrigin origin = IP::AddressOrigin::Static;
Ratan Gupta47722dc2017-05-26 18:32:23 +0530134
135 std::string expectedObjectPath = "/xyz/openbmc_test/network/test0/ipv4/";
136 std::stringstream hexId;
137
138 std::string hashString = ipaddress;
139 hashString += std::to_string(prefix);
Lei YU34027572021-08-11 15:23:52 +0800140 hashString += convertForMessage(origin);
Ratan Gupta47722dc2017-05-26 18:32:23 +0530141
Gunnar Mills57d9c502018-09-14 14:42:34 -0500142 hexId << std::hex << ((std::hash<std::string>{}(hashString)) & 0xFFFFFFFF);
Ratan Gupta47722dc2017-05-26 18:32:23 +0530143 expectedObjectPath += hexId.str();
144
William A. Kennington IIIe25f8b42022-10-11 14:43:28 -0700145 EXPECT_EQ(expectedObjectPath, getObjectPath(ipaddress, prefix, origin));
Lei YU34027572021-08-11 15:23:52 +0800146
147 origin = IP::AddressOrigin::DHCP;
William A. Kennington IIIe25f8b42022-10-11 14:43:28 -0700148 EXPECT_NE(expectedObjectPath, getObjectPath(ipaddress, prefix, origin));
Ratan Gupta47722dc2017-05-26 18:32:23 +0530149}
150
Manojkiran Edaacd6dd52019-10-15 15:00:51 +0530151TEST_F(TestEthernetInterface, addStaticNameServers)
Ratan Gupta09f61572017-08-23 16:53:52 +0530152{
Gunnar Mills57d9c502018-09-14 14:42:34 -0500153 ServerList servers = {"9.1.1.1", "9.2.2.2", "9.3.3.3"};
William A. Kennington IIIbd649af2021-10-08 17:55:13 -0700154 EXPECT_CALL(manager, reloadConfigs());
Manojkiran Edaacd6dd52019-10-15 15:00:51 +0530155 interface.staticNameServers(servers);
Ratan Gupta09f61572017-08-23 16:53:52 +0530156 fs::path filePath = confDir;
157 filePath /= "00-bmc-test0.network";
158 config::Parser parser(filePath.string());
William A. Kennington III34bb3e22022-08-18 15:17:22 -0700159 EXPECT_EQ(servers, parser.map.getValueStrings("Network", "DNS"));
Ratan Gupta09f61572017-08-23 16:53:52 +0530160}
161
Manojkiran Edaacd6dd52019-10-15 15:00:51 +0530162TEST_F(TestEthernetInterface, getDynamicNameServers)
163{
164 ServerList servers = {"9.1.1.1", "9.2.2.2", "9.3.3.3"};
165 EXPECT_CALL(interface, getNameServerFromResolvd())
166 .WillRepeatedly(testing::Return(servers));
167 EXPECT_EQ(interface.getNameServerFromResolvd(), servers);
168}
169
Ratan Guptac9645fe2017-08-23 16:53:52 +0530170TEST_F(TestEthernetInterface, addNTPServers)
171{
Gunnar Mills57d9c502018-09-14 14:42:34 -0500172 ServerList servers = {"10.1.1.1", "10.2.2.2", "10.3.3.3"};
William A. Kennington IIIbd649af2021-10-08 17:55:13 -0700173 EXPECT_CALL(manager, reloadConfigs());
Patrick Williams6aef7692021-05-01 06:39:41 -0500174 interface.ntpServers(servers);
Ratan Guptac9645fe2017-08-23 16:53:52 +0530175 fs::path filePath = confDir;
176 filePath /= "00-bmc-test0.network";
177 config::Parser parser(filePath.string());
William A. Kennington III34bb3e22022-08-18 15:17:22 -0700178 EXPECT_EQ(servers, parser.map.getValueStrings("Network", "NTP"));
Ratan Guptac9645fe2017-08-23 16:53:52 +0530179}
180
Ravi Tejaa5a09442020-07-17 00:57:33 -0500181TEST_F(TestEthernetInterface, addGateway)
182{
183 std::string gateway = "10.3.3.3";
184 interface.defaultGateway(gateway);
185 EXPECT_EQ(interface.defaultGateway(), gateway);
Jiaqing Zhaoc2e061f2022-04-07 21:55:48 +0800186 interface.defaultGateway("");
187 EXPECT_EQ(interface.defaultGateway(), "");
Ravi Tejaa5a09442020-07-17 00:57:33 -0500188}
189
190TEST_F(TestEthernetInterface, addGateway6)
191{
192 std::string gateway6 = "ffff:ffff:ffff:fe80::1";
193 interface.defaultGateway6(gateway6);
194 EXPECT_EQ(interface.defaultGateway6(), gateway6);
Jiaqing Zhaoc2e061f2022-04-07 21:55:48 +0800195 interface.defaultGateway6("");
196 EXPECT_EQ(interface.defaultGateway6(), "");
Ravi Tejaa5a09442020-07-17 00:57:33 -0500197}
198
William A. Kennington III8060c0d2022-08-18 19:19:34 -0700199TEST_F(TestEthernetInterface, DHCPEnabled)
200{
201 EXPECT_CALL(manager, reloadConfigs()).WillRepeatedly(testing::Return());
202
203 using DHCPConf = EthernetInterfaceIntf::DHCPConf;
204 auto test = [&](DHCPConf conf, bool dhcp4, bool dhcp6, bool ra) {
205 EXPECT_EQ(conf, interface.dhcpEnabled());
206 EXPECT_EQ(dhcp4, interface.dhcp4());
207 EXPECT_EQ(dhcp6, interface.dhcp6());
208 EXPECT_EQ(ra, interface.ipv6AcceptRA());
209 };
210 test(DHCPConf::both, /*dhcp4=*/true, /*dhcp6=*/true, /*ra=*/true);
211
212 auto set_test = [&](DHCPConf conf, bool dhcp4, bool dhcp6, bool ra) {
213 EXPECT_EQ(conf, interface.dhcpEnabled(conf));
214 test(conf, dhcp4, dhcp6, ra);
215 };
216 set_test(DHCPConf::none, /*dhcp4=*/false, /*dhcp6=*/false, /*ra=*/false);
217 set_test(DHCPConf::v4, /*dhcp4=*/true, /*dhcp6=*/false, /*ra=*/false);
218 set_test(DHCPConf::v6stateless, /*dhcp4=*/false, /*dhcp6=*/false,
219 /*ra=*/true);
220 set_test(DHCPConf::v6, /*dhcp4=*/false, /*dhcp6=*/true, /*ra=*/true);
221 set_test(DHCPConf::v4v6stateless, /*dhcp4=*/true, /*dhcp6=*/false,
222 /*ra=*/true);
223 set_test(DHCPConf::both, /*dhcp4=*/true, /*dhcp6=*/true, /*ra=*/true);
224
225 auto ind_test = [&](DHCPConf conf, bool dhcp4, bool dhcp6, bool ra) {
226 EXPECT_EQ(dhcp4, interface.dhcp4(dhcp4));
227 EXPECT_EQ(dhcp6, interface.dhcp6(dhcp6));
228 EXPECT_EQ(ra, interface.ipv6AcceptRA(ra));
229 test(conf, dhcp4, dhcp6, ra);
230 };
231 ind_test(DHCPConf::none, /*dhcp4=*/false, /*dhcp6=*/false, /*ra=*/false);
232 ind_test(DHCPConf::v4, /*dhcp4=*/true, /*dhcp6=*/false, /*ra=*/false);
233 ind_test(DHCPConf::v6stateless, /*dhcp4=*/false, /*dhcp6=*/false,
234 /*ra=*/true);
235 ind_test(DHCPConf::v6, /*dhcp4=*/false, /*dhcp6=*/true, /*ra=*/false);
236 set_test(DHCPConf::v6, /*dhcp4=*/false, /*dhcp6=*/true, /*ra=*/true);
237 ind_test(DHCPConf::v4v6stateless, /*dhcp4=*/true, /*dhcp6=*/false,
238 /*ra=*/true);
239 ind_test(DHCPConf::both, /*dhcp4=*/true, /*dhcp6=*/true, /*ra=*/false);
240 set_test(DHCPConf::both, /*dhcp4=*/true, /*dhcp6=*/true, /*ra=*/true);
241}
242
Gunnar Mills57d9c502018-09-14 14:42:34 -0500243} // namespace network
244} // namespace phosphor