blob: 146fb20da9ea4416b0409ffb39c8d166410db71d [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"
William A. Kennington III5b179382022-11-15 15:23:26 -08003#include "mock_ethernet_interface.hpp"
William A. Kennington IIIde70ccf2022-11-20 17:18:01 -08004#include "test_network_manager.hpp"
Ratan Gupta47722dc2017-05-26 18:32:23 +05305
6#include <net/if.h>
William A. Kennington III9c441fd2023-02-24 13:40:01 -08007#include <net/if_arp.h>
Ratan Gupta255d5142017-08-10 09:02:08 +05308
Gunnar Mills57d9c502018-09-14 14:42:34 -05009#include <sdbusplus/bus.hpp>
William A. Kennington III84bfe672022-07-13 14:15:30 -070010#include <stdplus/gtest/tmp.hpp>
Asmitha Karunanithi003b8b72022-01-06 04:17:59 -060011#include <xyz/openbmc_project/Common/error.hpp>
Gunnar Mills57d9c502018-09-14 14:42:34 -050012
Patrick Williams89d734b2023-05-10 07:50:25 -050013#include <string_view>
14
Gunnar Mills57d9c502018-09-14 14:42:34 -050015#include <gtest/gtest.h>
Ratan Gupta47722dc2017-05-26 18:32:23 +053016
17namespace phosphor
18{
19namespace network
20{
21
William A. Kennington IIIbbf5e9e2023-02-01 14:58:38 -080022using sdbusplus::xyz::openbmc_project::Common::Error::InvalidArgument;
William A. Kennington III991a8e82022-10-11 15:02:47 -070023using std::literals::string_view_literals::operator""sv;
William A. Kennington III59e5b912022-11-02 02:49:46 -070024using testing::Key;
25using testing::UnorderedElementsAre;
William A. Kennington III02d87c12023-06-28 17:59:51 -070026using stdplus::operator""_sub;
William A. Kennington III991a8e82022-10-11 15:02:47 -070027
William A. Kennington III84bfe672022-07-13 14:15:30 -070028class TestEthernetInterface : public stdplus::gtest::TestWithTmp
Ratan Gupta47722dc2017-05-26 18:32:23 +053029{
Gunnar Mills57d9c502018-09-14 14:42:34 -050030 public:
William A. Kennington III9ede1b72022-11-21 01:59:28 -080031 stdplus::Pinned<sdbusplus::bus_t> bus;
William A. Kennington III5b179382022-11-15 15:23:26 -080032 std::filesystem::path confDir;
William A. Kennington IIIde70ccf2022-11-20 17:18:01 -080033 TestManager manager;
Manojkiran Edaacd6dd52019-10-15 15:00:51 +053034 MockEthernetInterface interface;
Gunnar Mills57d9c502018-09-14 14:42:34 -050035 TestEthernetInterface() :
William A. Kennington III84bfe672022-07-13 14:15:30 -070036 bus(sdbusplus::bus::new_default()), confDir(CaseTmpDir()),
37 manager(bus, "/xyz/openbmc_test/network", confDir),
William A. Kennington IIIebb1ad02019-04-21 18:02:49 -070038 interface(makeInterface(bus, manager))
Ratan Gupta47722dc2017-05-26 18:32:23 +053039
Patrick Williams89d734b2023-05-10 07:50:25 -050040 {}
Ratan Gupta47722dc2017-05-26 18:32:23 +053041
Patrick Williamsad205022024-08-16 15:20:07 -040042 static MockEthernetInterface makeInterface(
43 stdplus::PinnedRef<sdbusplus::bus_t> bus, TestManager& manager)
William A. Kennington IIIebb1ad02019-04-21 18:02:49 -070044 {
William A. Kennington III9c441fd2023-02-24 13:40:01 -080045 AllIntfInfo info{InterfaceInfo{
46 .type = ARPHRD_ETHER, .idx = 1, .flags = 0, .name = "test0"}};
William A. Kennington III77848562022-10-26 17:32:57 -070047 return {bus, manager, info, "/xyz/openbmc_test/network"sv,
48 config::Parser()};
William A. Kennington IIIebb1ad02019-04-21 18:02:49 -070049 }
50
William A. Kennington III59e5b912022-11-02 02:49:46 -070051 auto createIPObject(IP::Protocol addressType, const std::string& ipaddress,
William A. Kennington IIIe25f8b42022-10-11 14:43:28 -070052 uint8_t subnetMask)
Gunnar Mills57d9c502018-09-14 14:42:34 -050053 {
William A. Kennington III59e5b912022-11-02 02:49:46 -070054 return interface.ip(addressType, ipaddress, subnetMask, "");
Gunnar Mills57d9c502018-09-14 14:42:34 -050055 }
Asmitha Karunanithi003b8b72022-01-06 04:17:59 -060056
Ravi Tejaab27a812023-05-02 10:01:53 -050057 auto createStaticGatewayObject(const std::string& gateway,
58 IP::Protocol protocol)
59 {
60 return interface.staticGateway(gateway, protocol);
61 }
62
Asmitha Karunanithi003b8b72022-01-06 04:17:59 -060063 void setNtpServers()
64 {
65 ServerList ntpServers = {"10.1.1.1", "10.2.2.2", "10.3.3.3"};
66 interface.EthernetInterfaceIntf::ntpServers(ntpServers);
67 }
68
69 ServerList getNtpServers()
70 {
71 return interface.EthernetInterfaceIntf::ntpServers();
72 }
Ratan Gupta47722dc2017-05-26 18:32:23 +053073};
74
William A. Kennington III9ecb90e2022-10-14 03:12:43 -070075TEST_F(TestEthernetInterface, Fields)
76{
77 EXPECT_EQ(0, interface.mtu());
78 EXPECT_EQ("", interface.macAddress());
79 EXPECT_FALSE(interface.linkUp());
80
William A. Kennington IIIb7d6a1a2023-06-17 02:00:53 -070081 constexpr stdplus::EtherAddr mac{0x11, 0x22, 0x33, 0x44, 0x55, 0x66};
William A. Kennington III9ecb90e2022-10-14 03:12:43 -070082 constexpr unsigned mtu = 150;
83
Patrick Williamsad205022024-08-16 15:20:07 -040084 AllIntfInfo info{InterfaceInfo{
85 .type = ARPHRD_ETHER,
86 .idx = 2,
87 .flags = IFF_RUNNING,
88 .name = "test1",
89 .mac = mac,
90 .mtu = mtu}};
William A. Kennington III77848562022-10-26 17:32:57 -070091 MockEthernetInterface intf(bus, manager, info,
William A. Kennington IIId298f932022-10-17 14:31:38 -070092 "/xyz/openbmc_test/network"sv, config::Parser());
William A. Kennington III9ecb90e2022-10-14 03:12:43 -070093
94 EXPECT_EQ(mtu, intf.mtu());
William A. Kennington IIIb7d6a1a2023-06-17 02:00:53 -070095 EXPECT_EQ(stdplus::toStr(mac), intf.macAddress());
William A. Kennington III9ecb90e2022-10-14 03:12:43 -070096 EXPECT_TRUE(intf.linkUp());
97}
98
Ratan Gupta47722dc2017-05-26 18:32:23 +053099TEST_F(TestEthernetInterface, NoIPaddress)
100{
William A. Kennington III59e5b912022-11-02 02:49:46 -0700101 EXPECT_TRUE(interface.addrs.empty());
Ratan Gupta47722dc2017-05-26 18:32:23 +0530102}
103
104TEST_F(TestEthernetInterface, AddIPAddress)
105{
William A. Kennington III30f3ba22023-06-28 15:50:12 -0700106 EXPECT_THROW(createIPObject(IP::Protocol::IPv4, "127.0.0.1", 16),
107 InvalidArgument);
108 EXPECT_THROW(createIPObject(IP::Protocol::IPv4, "127.0.0.1", 32),
109 InvalidArgument);
110 EXPECT_THROW(createIPObject(IP::Protocol::IPv4, "192.168.1.1", 0),
111 InvalidArgument);
112 EXPECT_THROW(createIPObject(IP::Protocol::IPv6, "::1", 64),
113 InvalidArgument);
114 EXPECT_THROW(createIPObject(IP::Protocol::IPv6, "::", 128),
115 InvalidArgument);
116 EXPECT_THROW(createIPObject(IP::Protocol::IPv6, "fe80::1", 0),
117 InvalidArgument);
118
William A. Kennington III59e5b912022-11-02 02:49:46 -0700119 createIPObject(IP::Protocol::IPv4, "10.10.10.10", 16);
William A. Kennington III02d87c12023-06-28 17:59:51 -0700120 EXPECT_THAT(interface.addrs,
121 UnorderedElementsAre(Key("10.10.10.10/16"_sub)));
Ratan Gupta47722dc2017-05-26 18:32:23 +0530122}
123
124TEST_F(TestEthernetInterface, AddMultipleAddress)
125{
William A. Kennington III59e5b912022-11-02 02:49:46 -0700126 createIPObject(IP::Protocol::IPv4, "10.10.10.10", 16);
127 createIPObject(IP::Protocol::IPv4, "20.20.20.20", 16);
William A. Kennington III02d87c12023-06-28 17:59:51 -0700128 EXPECT_THAT(interface.addrs,
129 UnorderedElementsAre(Key("10.10.10.10/16"_sub),
130 Key("20.20.20.20/16"_sub)));
Ratan Gupta47722dc2017-05-26 18:32:23 +0530131}
132
133TEST_F(TestEthernetInterface, DeleteIPAddress)
134{
William A. Kennington III59e5b912022-11-02 02:49:46 -0700135 createIPObject(IP::Protocol::IPv4, "10.10.10.10", 16);
136 createIPObject(IP::Protocol::IPv4, "20.20.20.20", 16);
William A. Kennington III02d87c12023-06-28 17:59:51 -0700137 interface.addrs.at("10.10.10.10/16"_sub)->delete_();
138 EXPECT_THAT(interface.addrs,
139 UnorderedElementsAre(Key("20.20.20.20/16"_sub)));
Ratan Gupta47722dc2017-05-26 18:32:23 +0530140}
141
142TEST_F(TestEthernetInterface, CheckObjectPath)
143{
William A. Kennington III59e5b912022-11-02 02:49:46 -0700144 auto path = createIPObject(IP::Protocol::IPv4, "10.10.10.10", 16);
145 EXPECT_EQ(path.parent_path(), "/xyz/openbmc_test/network/test0");
146 EXPECT_EQ(path.filename(), "10.10.10.10/16");
Ratan Gupta47722dc2017-05-26 18:32:23 +0530147}
148
Manojkiran Edaacd6dd52019-10-15 15:00:51 +0530149TEST_F(TestEthernetInterface, addStaticNameServers)
Ratan Gupta09f61572017-08-23 16:53:52 +0530150{
Gunnar Mills57d9c502018-09-14 14:42:34 -0500151 ServerList servers = {"9.1.1.1", "9.2.2.2", "9.3.3.3"};
William A. Kennington IIIde70ccf2022-11-20 17:18:01 -0800152 EXPECT_CALL(manager.mockReload, schedule());
Manojkiran Edaacd6dd52019-10-15 15:00:51 +0530153 interface.staticNameServers(servers);
William A. Kennington III5b179382022-11-15 15:23:26 -0800154 config::Parser parser((confDir / "00-bmc-test0.network").native());
William A. Kennington III34bb3e22022-08-18 15:17:22 -0700155 EXPECT_EQ(servers, parser.map.getValueStrings("Network", "DNS"));
Ratan Gupta09f61572017-08-23 16:53:52 +0530156}
157
Manojkiran Edaacd6dd52019-10-15 15:00:51 +0530158TEST_F(TestEthernetInterface, getDynamicNameServers)
159{
160 ServerList servers = {"9.1.1.1", "9.2.2.2", "9.3.3.3"};
161 EXPECT_CALL(interface, getNameServerFromResolvd())
162 .WillRepeatedly(testing::Return(servers));
163 EXPECT_EQ(interface.getNameServerFromResolvd(), servers);
164}
165
Asmitha Karunanithi003b8b72022-01-06 04:17:59 -0600166TEST_F(TestEthernetInterface, addStaticNTPServers)
Ratan Guptac9645fe2017-08-23 16:53:52 +0530167{
Gunnar Mills57d9c502018-09-14 14:42:34 -0500168 ServerList servers = {"10.1.1.1", "10.2.2.2", "10.3.3.3"};
William A. Kennington IIIde70ccf2022-11-20 17:18:01 -0800169 EXPECT_CALL(manager.mockReload, schedule());
Asmitha Karunanithi003b8b72022-01-06 04:17:59 -0600170 interface.staticNTPServers(servers);
William A. Kennington III5b179382022-11-15 15:23:26 -0800171 config::Parser parser((confDir / "00-bmc-test0.network").native());
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);
William A. Kennington IIIbbf5e9e2023-02-01 14:58:38 -0800194 EXPECT_THROW(interface.defaultGateway6("127.0.0.10"), InvalidArgument);
195 EXPECT_THROW(interface.defaultGateway6("0.0.0.0"), InvalidArgument);
196 EXPECT_THROW(interface.defaultGateway6("224.1.0.0"), InvalidArgument);
197 EXPECT_EQ(interface.defaultGateway(), gateway);
Jiaqing Zhaoc2e061f2022-04-07 21:55:48 +0800198 interface.defaultGateway("");
199 EXPECT_EQ(interface.defaultGateway(), "");
William A. Kennington III9ca5c8e2022-12-14 14:40:52 -0800200 interface.defaultGateway("0.0.0.0");
201 EXPECT_EQ(interface.defaultGateway(), "");
Ravi Tejaa5a09442020-07-17 00:57:33 -0500202}
203
204TEST_F(TestEthernetInterface, addGateway6)
205{
William A. Kennington IIIbbf5e9e2023-02-01 14:58:38 -0800206 std::string gateway6 = "fe80::1";
Ravi Tejaa5a09442020-07-17 00:57:33 -0500207 interface.defaultGateway6(gateway6);
208 EXPECT_EQ(interface.defaultGateway6(), gateway6);
William A. Kennington IIIbbf5e9e2023-02-01 14:58:38 -0800209 EXPECT_THROW(interface.defaultGateway6("::1"), InvalidArgument);
210 EXPECT_EQ(interface.defaultGateway6(), gateway6);
Jiaqing Zhaoc2e061f2022-04-07 21:55:48 +0800211 interface.defaultGateway6("");
212 EXPECT_EQ(interface.defaultGateway6(), "");
William A. Kennington III9ca5c8e2022-12-14 14:40:52 -0800213 interface.defaultGateway6("::");
214 EXPECT_EQ(interface.defaultGateway6(), "");
Ravi Tejaa5a09442020-07-17 00:57:33 -0500215}
216
William A. Kennington III8060c0d2022-08-18 19:19:34 -0700217TEST_F(TestEthernetInterface, DHCPEnabled)
218{
William A. Kennington IIIde70ccf2022-11-20 17:18:01 -0800219 EXPECT_CALL(manager.mockReload, schedule())
220 .WillRepeatedly(testing::Return());
William A. Kennington III8060c0d2022-08-18 19:19:34 -0700221
222 using DHCPConf = EthernetInterfaceIntf::DHCPConf;
223 auto test = [&](DHCPConf conf, bool dhcp4, bool dhcp6, bool ra) {
224 EXPECT_EQ(conf, interface.dhcpEnabled());
225 EXPECT_EQ(dhcp4, interface.dhcp4());
226 EXPECT_EQ(dhcp6, interface.dhcp6());
227 EXPECT_EQ(ra, interface.ipv6AcceptRA());
228 };
229 test(DHCPConf::both, /*dhcp4=*/true, /*dhcp6=*/true, /*ra=*/true);
230
231 auto set_test = [&](DHCPConf conf, bool dhcp4, bool dhcp6, bool ra) {
232 EXPECT_EQ(conf, interface.dhcpEnabled(conf));
233 test(conf, dhcp4, dhcp6, ra);
234 };
235 set_test(DHCPConf::none, /*dhcp4=*/false, /*dhcp6=*/false, /*ra=*/false);
236 set_test(DHCPConf::v4, /*dhcp4=*/true, /*dhcp6=*/false, /*ra=*/false);
237 set_test(DHCPConf::v6stateless, /*dhcp4=*/false, /*dhcp6=*/false,
238 /*ra=*/true);
239 set_test(DHCPConf::v6, /*dhcp4=*/false, /*dhcp6=*/true, /*ra=*/true);
240 set_test(DHCPConf::v4v6stateless, /*dhcp4=*/true, /*dhcp6=*/false,
241 /*ra=*/true);
242 set_test(DHCPConf::both, /*dhcp4=*/true, /*dhcp6=*/true, /*ra=*/true);
243
244 auto ind_test = [&](DHCPConf conf, bool dhcp4, bool dhcp6, bool ra) {
245 EXPECT_EQ(dhcp4, interface.dhcp4(dhcp4));
246 EXPECT_EQ(dhcp6, interface.dhcp6(dhcp6));
247 EXPECT_EQ(ra, interface.ipv6AcceptRA(ra));
248 test(conf, dhcp4, dhcp6, ra);
249 };
250 ind_test(DHCPConf::none, /*dhcp4=*/false, /*dhcp6=*/false, /*ra=*/false);
251 ind_test(DHCPConf::v4, /*dhcp4=*/true, /*dhcp6=*/false, /*ra=*/false);
252 ind_test(DHCPConf::v6stateless, /*dhcp4=*/false, /*dhcp6=*/false,
253 /*ra=*/true);
254 ind_test(DHCPConf::v6, /*dhcp4=*/false, /*dhcp6=*/true, /*ra=*/false);
255 set_test(DHCPConf::v6, /*dhcp4=*/false, /*dhcp6=*/true, /*ra=*/true);
256 ind_test(DHCPConf::v4v6stateless, /*dhcp4=*/true, /*dhcp6=*/false,
257 /*ra=*/true);
258 ind_test(DHCPConf::both, /*dhcp4=*/true, /*dhcp6=*/true, /*ra=*/false);
259 set_test(DHCPConf::both, /*dhcp4=*/true, /*dhcp6=*/true, /*ra=*/true);
260}
261
Ravi Tejaab27a812023-05-02 10:01:53 -0500262TEST_F(TestEthernetInterface, AddStaticGateway)
263{
264 createStaticGatewayObject("10.10.10.1", IP::Protocol::IPv4);
265 EXPECT_THAT(interface.staticGateways,
266 UnorderedElementsAre(Key(std::string("10.10.10.1"))));
267}
268
269TEST_F(TestEthernetInterface, AddMultipleStaticGateways)
270{
271 createStaticGatewayObject("10.10.10.1", IP::Protocol::IPv4);
272 createStaticGatewayObject("10.20.30.1", IP::Protocol::IPv4);
273 EXPECT_THAT(interface.staticGateways,
274 UnorderedElementsAre(Key(std::string("10.10.10.1")),
275 Key(std::string("10.20.30.1"))));
276}
277
278TEST_F(TestEthernetInterface, DeleteStaticGateway)
279{
280 createStaticGatewayObject("10.10.10.1", IP::Protocol::IPv4);
281 createStaticGatewayObject("10.20.30.1", IP::Protocol::IPv4);
282
283 interface.staticGateways.at(std::string("10.10.10.1"))->delete_();
284 interface.staticGateways.at(std::string("10.20.30.1"))->delete_();
285 EXPECT_EQ(interface.staticGateways.empty(), true);
286}
287
288TEST_F(TestEthernetInterface, AddIPv6StaticGateway)
289{
290 createStaticGatewayObject("2002:903:15f:325::1", IP::Protocol::IPv6);
291 EXPECT_THAT(interface.staticGateways,
292 UnorderedElementsAre(Key(std::string("2002:903:15f:325::1"))));
293}
294
295TEST_F(TestEthernetInterface, AddMultipleIPv6StaticGateways)
296{
297 createStaticGatewayObject("2003:903:15f:325::1", IP::Protocol::IPv6);
298 createStaticGatewayObject("2004:903:15f:325::1", IP::Protocol::IPv6);
299 EXPECT_THAT(interface.staticGateways,
300 UnorderedElementsAre(Key(std::string("2003:903:15f:325::1")),
301 Key(std::string("2004:903:15f:325::1"))));
302}
303
Gunnar Mills57d9c502018-09-14 14:42:34 -0500304} // namespace network
305} // namespace phosphor