blob: 061e0c98f899a1bb93d4970147b72a18316c124b [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 IIIfd862be2022-10-09 18:40:55 -07005#include "system_queries.hpp"
William A. Kennington IIIcb64b992019-04-21 18:45:07 -07006#include "util.hpp"
Ratan Gupta47722dc2017-05-26 18:32:23 +05307
Ratan Gupta255d5142017-08-10 09:02:08 +05308#include <arpa/inet.h>
Ratan Gupta47722dc2017-05-26 18:32:23 +05309#include <net/if.h>
10#include <netinet/in.h>
Ratan Gupta255d5142017-08-10 09:02:08 +053011#include <stdlib.h>
12
William A. Kennington III991a8e82022-10-11 15:02:47 -070013#include <charconv>
Ratan Gupta47722dc2017-05-26 18:32:23 +053014#include <exception>
Gunnar Mills57d9c502018-09-14 14:42:34 -050015#include <sdbusplus/bus.hpp>
William A. Kennington III84bfe672022-07-13 14:15:30 -070016#include <stdplus/gtest/tmp.hpp>
William A. Kennington III991a8e82022-10-11 15:02:47 -070017#include <string_view>
Asmitha Karunanithi003b8b72022-01-06 04:17:59 -060018#include <xyz/openbmc_project/Common/error.hpp>
Gunnar Mills57d9c502018-09-14 14:42:34 -050019
William A. Kennington III59e5b912022-11-02 02:49:46 -070020#include <gmock/gmock.h>
Gunnar Mills57d9c502018-09-14 14:42:34 -050021#include <gtest/gtest.h>
Ratan Gupta47722dc2017-05-26 18:32:23 +053022
23namespace phosphor
24{
25namespace network
26{
27
William A. Kennington III991a8e82022-10-11 15:02:47 -070028using std::literals::string_view_literals::operator""sv;
William A. Kennington III59e5b912022-11-02 02:49:46 -070029using testing::Key;
30using testing::UnorderedElementsAre;
William A. Kennington III991a8e82022-10-11 15:02:47 -070031
William A. Kennington III84bfe672022-07-13 14:15:30 -070032class TestEthernetInterface : public stdplus::gtest::TestWithTmp
Ratan Gupta47722dc2017-05-26 18:32:23 +053033{
Gunnar Mills57d9c502018-09-14 14:42:34 -050034 public:
Patrick Williamsc38b0712022-07-22 19:26:54 -050035 sdbusplus::bus_t bus;
William A. Kennington III84bfe672022-07-13 14:15:30 -070036 std::string confDir;
Ratan Gupta35297172018-11-28 18:40:16 +053037 MockManager manager;
Manojkiran Edaacd6dd52019-10-15 15:00:51 +053038 MockEthernetInterface interface;
Gunnar Mills57d9c502018-09-14 14:42:34 -050039 TestEthernetInterface() :
William A. Kennington III84bfe672022-07-13 14:15:30 -070040 bus(sdbusplus::bus::new_default()), confDir(CaseTmpDir()),
41 manager(bus, "/xyz/openbmc_test/network", confDir),
William A. Kennington IIIebb1ad02019-04-21 18:02:49 -070042 interface(makeInterface(bus, manager))
Ratan Gupta47722dc2017-05-26 18:32:23 +053043
Gunnar Mills57d9c502018-09-14 14:42:34 -050044 {
Gunnar Mills57d9c502018-09-14 14:42:34 -050045 }
Ratan Gupta47722dc2017-05-26 18:32:23 +053046
Patrick Williamsc38b0712022-07-22 19:26:54 -050047 static MockEthernetInterface makeInterface(sdbusplus::bus_t& bus,
Manojkiran Edaacd6dd52019-10-15 15:00:51 +053048 MockManager& manager)
William A. Kennington IIIebb1ad02019-04-21 18:02:49 -070049 {
William A. Kennington III77848562022-10-26 17:32:57 -070050 system::mock_clear();
51 system::InterfaceInfo info{.idx = 1, .flags = 0, .name = "test0"};
52 system::mock_addIF(info);
53 return {bus, manager, info, "/xyz/openbmc_test/network"sv,
54 config::Parser()};
William A. Kennington IIIebb1ad02019-04-21 18:02:49 -070055 }
56
Gunnar Mills57d9c502018-09-14 14:42:34 -050057 std::string getObjectPath(const std::string& ipaddress, uint8_t subnetMask,
Lei YU34027572021-08-11 15:23:52 +080058 IP::AddressOrigin origin)
Gunnar Mills57d9c502018-09-14 14:42:34 -050059 {
60 IP::Protocol addressType = IP::Protocol::IPv4;
Ratan Gupta255d5142017-08-10 09:02:08 +053061
Gunnar Mills57d9c502018-09-14 14:42:34 -050062 return interface.generateObjectPath(addressType, ipaddress, subnetMask,
William A. Kennington IIIe25f8b42022-10-11 14:43:28 -070063 origin);
Gunnar Mills57d9c502018-09-14 14:42:34 -050064 }
65
William A. Kennington III59e5b912022-11-02 02:49:46 -070066 auto createIPObject(IP::Protocol addressType, const std::string& ipaddress,
William A. Kennington IIIe25f8b42022-10-11 14:43:28 -070067 uint8_t subnetMask)
Gunnar Mills57d9c502018-09-14 14:42:34 -050068 {
William A. Kennington III59e5b912022-11-02 02:49:46 -070069 return interface.ip(addressType, ipaddress, subnetMask, "");
Gunnar Mills57d9c502018-09-14 14:42:34 -050070 }
Asmitha Karunanithi003b8b72022-01-06 04:17:59 -060071
72 void setNtpServers()
73 {
74 ServerList ntpServers = {"10.1.1.1", "10.2.2.2", "10.3.3.3"};
75 interface.EthernetInterfaceIntf::ntpServers(ntpServers);
76 }
77
78 ServerList getNtpServers()
79 {
80 return interface.EthernetInterfaceIntf::ntpServers();
81 }
Ratan Gupta47722dc2017-05-26 18:32:23 +053082};
83
William A. Kennington III9ecb90e2022-10-14 03:12:43 -070084TEST_F(TestEthernetInterface, Fields)
85{
86 EXPECT_EQ(0, interface.mtu());
87 EXPECT_EQ("", interface.macAddress());
88 EXPECT_FALSE(interface.linkUp());
89
William A. Kennington III9ecb90e2022-10-14 03:12:43 -070090 constexpr ether_addr mac{0x11, 0x22, 0x33, 0x44, 0x55, 0x66};
91 constexpr unsigned mtu = 150;
92
William A. Kennington III77848562022-10-26 17:32:57 -070093 system::InterfaceInfo info{.idx = 2,
94 .flags = IFF_RUNNING,
95 .name = "test1",
96 .mac = mac,
97 .mtu = mtu};
98 system::mock_addIF(info);
99 MockEthernetInterface intf(bus, manager, info,
William A. Kennington IIId298f932022-10-17 14:31:38 -0700100 "/xyz/openbmc_test/network"sv, config::Parser());
William A. Kennington III9ecb90e2022-10-14 03:12:43 -0700101
102 EXPECT_EQ(mtu, intf.mtu());
William A. Kennington IIIbb0eacc2022-10-21 15:22:06 -0700103 EXPECT_EQ(std::to_string(mac), intf.macAddress());
William A. Kennington III9ecb90e2022-10-14 03:12:43 -0700104 EXPECT_TRUE(intf.linkUp());
105}
106
Ratan Gupta47722dc2017-05-26 18:32:23 +0530107TEST_F(TestEthernetInterface, NoIPaddress)
108{
William A. Kennington III59e5b912022-11-02 02:49:46 -0700109 EXPECT_TRUE(interface.addrs.empty());
Ratan Gupta47722dc2017-05-26 18:32:23 +0530110}
111
112TEST_F(TestEthernetInterface, AddIPAddress)
113{
William A. Kennington III59e5b912022-11-02 02:49:46 -0700114 createIPObject(IP::Protocol::IPv4, "10.10.10.10", 16);
115 EXPECT_THAT(interface.addrs, UnorderedElementsAre(Key(
116 IfAddr(in_addr{htonl(0x0a0a0a0a)}, 16))));
Ratan Gupta47722dc2017-05-26 18:32:23 +0530117}
118
119TEST_F(TestEthernetInterface, AddMultipleAddress)
120{
William A. Kennington III59e5b912022-11-02 02:49:46 -0700121 createIPObject(IP::Protocol::IPv4, "10.10.10.10", 16);
122 createIPObject(IP::Protocol::IPv4, "20.20.20.20", 16);
123 EXPECT_THAT(
124 interface.addrs,
125 UnorderedElementsAre(Key(IfAddr(in_addr{htonl(0x0a0a0a0a)}, 16)),
126 Key(IfAddr(in_addr{htonl(0x14141414)}, 16))));
Ratan Gupta47722dc2017-05-26 18:32:23 +0530127}
128
129TEST_F(TestEthernetInterface, DeleteIPAddress)
130{
William A. Kennington III59e5b912022-11-02 02:49:46 -0700131 createIPObject(IP::Protocol::IPv4, "10.10.10.10", 16);
132 createIPObject(IP::Protocol::IPv4, "20.20.20.20", 16);
133 interface.addrs.at(IfAddr(in_addr{htonl(0x0a0a0a0a)}, 16))->delete_();
134 EXPECT_THAT(interface.addrs, UnorderedElementsAre(Key(
135 IfAddr(in_addr{htonl(0x14141414)}, 16))));
Ratan Gupta47722dc2017-05-26 18:32:23 +0530136}
137
138TEST_F(TestEthernetInterface, CheckObjectPath)
139{
William A. Kennington III59e5b912022-11-02 02:49:46 -0700140 auto path = createIPObject(IP::Protocol::IPv4, "10.10.10.10", 16);
141 EXPECT_EQ(path.parent_path(), "/xyz/openbmc_test/network/test0");
142 EXPECT_EQ(path.filename(), "10.10.10.10/16");
Ratan Gupta47722dc2017-05-26 18:32:23 +0530143}
144
Manojkiran Edaacd6dd52019-10-15 15:00:51 +0530145TEST_F(TestEthernetInterface, addStaticNameServers)
Ratan Gupta09f61572017-08-23 16:53:52 +0530146{
Gunnar Mills57d9c502018-09-14 14:42:34 -0500147 ServerList servers = {"9.1.1.1", "9.2.2.2", "9.3.3.3"};
William A. Kennington IIIbd649af2021-10-08 17:55:13 -0700148 EXPECT_CALL(manager, reloadConfigs());
Manojkiran Edaacd6dd52019-10-15 15:00:51 +0530149 interface.staticNameServers(servers);
Ratan Gupta09f61572017-08-23 16:53:52 +0530150 fs::path filePath = confDir;
151 filePath /= "00-bmc-test0.network";
152 config::Parser parser(filePath.string());
William A. Kennington III34bb3e22022-08-18 15:17:22 -0700153 EXPECT_EQ(servers, parser.map.getValueStrings("Network", "DNS"));
Ratan Gupta09f61572017-08-23 16:53:52 +0530154}
155
Manojkiran Edaacd6dd52019-10-15 15:00:51 +0530156TEST_F(TestEthernetInterface, getDynamicNameServers)
157{
158 ServerList servers = {"9.1.1.1", "9.2.2.2", "9.3.3.3"};
159 EXPECT_CALL(interface, getNameServerFromResolvd())
160 .WillRepeatedly(testing::Return(servers));
161 EXPECT_EQ(interface.getNameServerFromResolvd(), servers);
162}
163
Asmitha Karunanithi003b8b72022-01-06 04:17:59 -0600164TEST_F(TestEthernetInterface, addStaticNTPServers)
Ratan Guptac9645fe2017-08-23 16:53:52 +0530165{
Gunnar Mills57d9c502018-09-14 14:42:34 -0500166 ServerList servers = {"10.1.1.1", "10.2.2.2", "10.3.3.3"};
William A. Kennington IIIbd649af2021-10-08 17:55:13 -0700167 EXPECT_CALL(manager, reloadConfigs());
Asmitha Karunanithi003b8b72022-01-06 04:17:59 -0600168 interface.staticNTPServers(servers);
Ratan Guptac9645fe2017-08-23 16:53:52 +0530169 fs::path filePath = confDir;
170 filePath /= "00-bmc-test0.network";
171 config::Parser parser(filePath.string());
William A. Kennington III34bb3e22022-08-18 15:17:22 -0700172 EXPECT_EQ(servers, parser.map.getValueStrings("Network", "NTP"));
Ratan Guptac9645fe2017-08-23 16:53:52 +0530173}
174
Asmitha Karunanithi003b8b72022-01-06 04:17:59 -0600175TEST_F(TestEthernetInterface, addNTPServers)
176{
177 using namespace sdbusplus::xyz::openbmc_project::Common::Error;
178 ServerList servers = {"10.1.1.1", "10.2.2.2", "10.3.3.3"};
179 EXPECT_THROW(interface.ntpServers(servers), NotAllowed);
180}
181
182TEST_F(TestEthernetInterface, getNTPServers)
183{
184 ServerList servers = {"10.1.1.1", "10.2.2.2", "10.3.3.3"};
185 setNtpServers();
186 EXPECT_EQ(getNtpServers(), servers);
187}
188
Ravi Tejaa5a09442020-07-17 00:57:33 -0500189TEST_F(TestEthernetInterface, addGateway)
190{
191 std::string gateway = "10.3.3.3";
192 interface.defaultGateway(gateway);
193 EXPECT_EQ(interface.defaultGateway(), gateway);
Jiaqing Zhaoc2e061f2022-04-07 21:55:48 +0800194 interface.defaultGateway("");
195 EXPECT_EQ(interface.defaultGateway(), "");
Ravi Tejaa5a09442020-07-17 00:57:33 -0500196}
197
198TEST_F(TestEthernetInterface, addGateway6)
199{
200 std::string gateway6 = "ffff:ffff:ffff:fe80::1";
201 interface.defaultGateway6(gateway6);
202 EXPECT_EQ(interface.defaultGateway6(), gateway6);
Jiaqing Zhaoc2e061f2022-04-07 21:55:48 +0800203 interface.defaultGateway6("");
204 EXPECT_EQ(interface.defaultGateway6(), "");
Ravi Tejaa5a09442020-07-17 00:57:33 -0500205}
206
William A. Kennington III8060c0d2022-08-18 19:19:34 -0700207TEST_F(TestEthernetInterface, DHCPEnabled)
208{
209 EXPECT_CALL(manager, reloadConfigs()).WillRepeatedly(testing::Return());
210
211 using DHCPConf = EthernetInterfaceIntf::DHCPConf;
212 auto test = [&](DHCPConf conf, bool dhcp4, bool dhcp6, bool ra) {
213 EXPECT_EQ(conf, interface.dhcpEnabled());
214 EXPECT_EQ(dhcp4, interface.dhcp4());
215 EXPECT_EQ(dhcp6, interface.dhcp6());
216 EXPECT_EQ(ra, interface.ipv6AcceptRA());
217 };
218 test(DHCPConf::both, /*dhcp4=*/true, /*dhcp6=*/true, /*ra=*/true);
219
220 auto set_test = [&](DHCPConf conf, bool dhcp4, bool dhcp6, bool ra) {
221 EXPECT_EQ(conf, interface.dhcpEnabled(conf));
222 test(conf, dhcp4, dhcp6, ra);
223 };
224 set_test(DHCPConf::none, /*dhcp4=*/false, /*dhcp6=*/false, /*ra=*/false);
225 set_test(DHCPConf::v4, /*dhcp4=*/true, /*dhcp6=*/false, /*ra=*/false);
226 set_test(DHCPConf::v6stateless, /*dhcp4=*/false, /*dhcp6=*/false,
227 /*ra=*/true);
228 set_test(DHCPConf::v6, /*dhcp4=*/false, /*dhcp6=*/true, /*ra=*/true);
229 set_test(DHCPConf::v4v6stateless, /*dhcp4=*/true, /*dhcp6=*/false,
230 /*ra=*/true);
231 set_test(DHCPConf::both, /*dhcp4=*/true, /*dhcp6=*/true, /*ra=*/true);
232
233 auto ind_test = [&](DHCPConf conf, bool dhcp4, bool dhcp6, bool ra) {
234 EXPECT_EQ(dhcp4, interface.dhcp4(dhcp4));
235 EXPECT_EQ(dhcp6, interface.dhcp6(dhcp6));
236 EXPECT_EQ(ra, interface.ipv6AcceptRA(ra));
237 test(conf, dhcp4, dhcp6, ra);
238 };
239 ind_test(DHCPConf::none, /*dhcp4=*/false, /*dhcp6=*/false, /*ra=*/false);
240 ind_test(DHCPConf::v4, /*dhcp4=*/true, /*dhcp6=*/false, /*ra=*/false);
241 ind_test(DHCPConf::v6stateless, /*dhcp4=*/false, /*dhcp6=*/false,
242 /*ra=*/true);
243 ind_test(DHCPConf::v6, /*dhcp4=*/false, /*dhcp6=*/true, /*ra=*/false);
244 set_test(DHCPConf::v6, /*dhcp4=*/false, /*dhcp6=*/true, /*ra=*/true);
245 ind_test(DHCPConf::v4v6stateless, /*dhcp4=*/true, /*dhcp6=*/false,
246 /*ra=*/true);
247 ind_test(DHCPConf::both, /*dhcp4=*/true, /*dhcp6=*/true, /*ra=*/false);
248 set_test(DHCPConf::both, /*dhcp4=*/true, /*dhcp6=*/true, /*ra=*/true);
249}
250
Gunnar Mills57d9c502018-09-14 14:42:34 -0500251} // namespace network
252} // namespace phosphor