blob: c92b8ebafada5ab84ec040c5ada62e04a209a552 [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 III991a8e82022-10-11 15:02:47 -070022using std::literals::string_view_literals::operator""sv;
William A. Kennington III59e5b912022-11-02 02:49:46 -070023using testing::Key;
24using testing::UnorderedElementsAre;
William A. Kennington III991a8e82022-10-11 15:02:47 -070025
William A. Kennington III84bfe672022-07-13 14:15:30 -070026class TestEthernetInterface : public stdplus::gtest::TestWithTmp
Ratan Gupta47722dc2017-05-26 18:32:23 +053027{
Gunnar Mills57d9c502018-09-14 14:42:34 -050028 public:
William A. Kennington III9ede1b72022-11-21 01:59:28 -080029 stdplus::Pinned<sdbusplus::bus_t> bus;
William A. Kennington III5b179382022-11-15 15:23:26 -080030 std::filesystem::path confDir;
William A. Kennington IIIde70ccf2022-11-20 17:18:01 -080031 TestManager manager;
Manojkiran Edaacd6dd52019-10-15 15:00:51 +053032 MockEthernetInterface interface;
Gunnar Mills57d9c502018-09-14 14:42:34 -050033 TestEthernetInterface() :
William A. Kennington III84bfe672022-07-13 14:15:30 -070034 bus(sdbusplus::bus::new_default()), confDir(CaseTmpDir()),
35 manager(bus, "/xyz/openbmc_test/network", confDir),
William A. Kennington IIIebb1ad02019-04-21 18:02:49 -070036 interface(makeInterface(bus, manager))
Ratan Gupta47722dc2017-05-26 18:32:23 +053037
Patrick Williams89d734b2023-05-10 07:50:25 -050038 {}
Ratan Gupta47722dc2017-05-26 18:32:23 +053039
William A. Kennington III9ede1b72022-11-21 01:59:28 -080040 static MockEthernetInterface
41 makeInterface(stdplus::PinnedRef<sdbusplus::bus_t> bus,
42 TestManager& manager)
William A. Kennington IIIebb1ad02019-04-21 18:02:49 -070043 {
William A. Kennington III9c441fd2023-02-24 13:40:01 -080044 AllIntfInfo info{InterfaceInfo{
45 .type = ARPHRD_ETHER, .idx = 1, .flags = 0, .name = "test0"}};
William A. Kennington III77848562022-10-26 17:32:57 -070046 return {bus, manager, info, "/xyz/openbmc_test/network"sv,
47 config::Parser()};
William A. Kennington IIIebb1ad02019-04-21 18:02:49 -070048 }
49
William A. Kennington III59e5b912022-11-02 02:49:46 -070050 auto createIPObject(IP::Protocol addressType, const std::string& ipaddress,
William A. Kennington IIIe25f8b42022-10-11 14:43:28 -070051 uint8_t subnetMask)
Gunnar Mills57d9c502018-09-14 14:42:34 -050052 {
William A. Kennington III59e5b912022-11-02 02:49:46 -070053 return interface.ip(addressType, ipaddress, subnetMask, "");
Gunnar Mills57d9c502018-09-14 14:42:34 -050054 }
Asmitha Karunanithi003b8b72022-01-06 04:17:59 -060055
56 void setNtpServers()
57 {
58 ServerList ntpServers = {"10.1.1.1", "10.2.2.2", "10.3.3.3"};
59 interface.EthernetInterfaceIntf::ntpServers(ntpServers);
60 }
61
62 ServerList getNtpServers()
63 {
64 return interface.EthernetInterfaceIntf::ntpServers();
65 }
Ratan Gupta47722dc2017-05-26 18:32:23 +053066};
67
William A. Kennington III9ecb90e2022-10-14 03:12:43 -070068TEST_F(TestEthernetInterface, Fields)
69{
70 EXPECT_EQ(0, interface.mtu());
71 EXPECT_EQ("", interface.macAddress());
72 EXPECT_FALSE(interface.linkUp());
73
William A. Kennington IIIb7d6a1a2023-06-17 02:00:53 -070074 constexpr stdplus::EtherAddr mac{0x11, 0x22, 0x33, 0x44, 0x55, 0x66};
William A. Kennington III9ecb90e2022-10-14 03:12:43 -070075 constexpr unsigned mtu = 150;
76
William A. Kennington III9c441fd2023-02-24 13:40:01 -080077 AllIntfInfo info{InterfaceInfo{.type = ARPHRD_ETHER,
78 .idx = 2,
William A. Kennington III13d665c2022-11-15 20:34:40 -080079 .flags = IFF_RUNNING,
80 .name = "test1",
81 .mac = mac,
82 .mtu = mtu}};
William A. Kennington III77848562022-10-26 17:32:57 -070083 MockEthernetInterface intf(bus, manager, info,
William A. Kennington IIId298f932022-10-17 14:31:38 -070084 "/xyz/openbmc_test/network"sv, config::Parser());
William A. Kennington III9ecb90e2022-10-14 03:12:43 -070085
86 EXPECT_EQ(mtu, intf.mtu());
William A. Kennington IIIb7d6a1a2023-06-17 02:00:53 -070087 EXPECT_EQ(stdplus::toStr(mac), intf.macAddress());
William A. Kennington III9ecb90e2022-10-14 03:12:43 -070088 EXPECT_TRUE(intf.linkUp());
89}
90
Ratan Gupta47722dc2017-05-26 18:32:23 +053091TEST_F(TestEthernetInterface, NoIPaddress)
92{
William A. Kennington III59e5b912022-11-02 02:49:46 -070093 EXPECT_TRUE(interface.addrs.empty());
Ratan Gupta47722dc2017-05-26 18:32:23 +053094}
95
96TEST_F(TestEthernetInterface, AddIPAddress)
97{
William A. Kennington III59e5b912022-11-02 02:49:46 -070098 createIPObject(IP::Protocol::IPv4, "10.10.10.10", 16);
William A. Kennington III9b2a20d2023-06-17 14:05:48 -070099 EXPECT_THAT(interface.addrs, UnorderedElementsAre(Key(stdplus::SubnetAny(
100 stdplus::In4Addr{10, 10, 10, 10}, 16))));
Ratan Gupta47722dc2017-05-26 18:32:23 +0530101}
102
103TEST_F(TestEthernetInterface, AddMultipleAddress)
104{
William A. Kennington III59e5b912022-11-02 02:49:46 -0700105 createIPObject(IP::Protocol::IPv4, "10.10.10.10", 16);
106 createIPObject(IP::Protocol::IPv4, "20.20.20.20", 16);
107 EXPECT_THAT(
108 interface.addrs,
William A. Kennington III9b2a20d2023-06-17 14:05:48 -0700109 UnorderedElementsAre(
110 Key(stdplus::SubnetAny(stdplus::In4Addr{10, 10, 10, 10}, 16)),
111 Key(stdplus::SubnetAny(stdplus::In4Addr{20, 20, 20, 20}, 16))));
Ratan Gupta47722dc2017-05-26 18:32:23 +0530112}
113
114TEST_F(TestEthernetInterface, DeleteIPAddress)
115{
William A. Kennington III59e5b912022-11-02 02:49:46 -0700116 createIPObject(IP::Protocol::IPv4, "10.10.10.10", 16);
117 createIPObject(IP::Protocol::IPv4, "20.20.20.20", 16);
William A. Kennington III9b2a20d2023-06-17 14:05:48 -0700118 interface.addrs
119 .at(stdplus::SubnetAny(stdplus::In4Addr{10, 10, 10, 10}, 16))
120 ->delete_();
121 EXPECT_THAT(interface.addrs, UnorderedElementsAre(Key(stdplus::SubnetAny(
122 stdplus::In4Addr{20, 20, 20, 20}, 16))));
Ratan Gupta47722dc2017-05-26 18:32:23 +0530123}
124
125TEST_F(TestEthernetInterface, CheckObjectPath)
126{
William A. Kennington III59e5b912022-11-02 02:49:46 -0700127 auto path = createIPObject(IP::Protocol::IPv4, "10.10.10.10", 16);
128 EXPECT_EQ(path.parent_path(), "/xyz/openbmc_test/network/test0");
129 EXPECT_EQ(path.filename(), "10.10.10.10/16");
Ratan Gupta47722dc2017-05-26 18:32:23 +0530130}
131
Manojkiran Edaacd6dd52019-10-15 15:00:51 +0530132TEST_F(TestEthernetInterface, addStaticNameServers)
Ratan Gupta09f61572017-08-23 16:53:52 +0530133{
Gunnar Mills57d9c502018-09-14 14:42:34 -0500134 ServerList servers = {"9.1.1.1", "9.2.2.2", "9.3.3.3"};
William A. Kennington IIIde70ccf2022-11-20 17:18:01 -0800135 EXPECT_CALL(manager.mockReload, schedule());
Manojkiran Edaacd6dd52019-10-15 15:00:51 +0530136 interface.staticNameServers(servers);
William A. Kennington III5b179382022-11-15 15:23:26 -0800137 config::Parser parser((confDir / "00-bmc-test0.network").native());
William A. Kennington III34bb3e22022-08-18 15:17:22 -0700138 EXPECT_EQ(servers, parser.map.getValueStrings("Network", "DNS"));
Ratan Gupta09f61572017-08-23 16:53:52 +0530139}
140
Manojkiran Edaacd6dd52019-10-15 15:00:51 +0530141TEST_F(TestEthernetInterface, getDynamicNameServers)
142{
143 ServerList servers = {"9.1.1.1", "9.2.2.2", "9.3.3.3"};
144 EXPECT_CALL(interface, getNameServerFromResolvd())
145 .WillRepeatedly(testing::Return(servers));
146 EXPECT_EQ(interface.getNameServerFromResolvd(), servers);
147}
148
Asmitha Karunanithi003b8b72022-01-06 04:17:59 -0600149TEST_F(TestEthernetInterface, addStaticNTPServers)
Ratan Guptac9645fe2017-08-23 16:53:52 +0530150{
Gunnar Mills57d9c502018-09-14 14:42:34 -0500151 ServerList servers = {"10.1.1.1", "10.2.2.2", "10.3.3.3"};
William A. Kennington IIIde70ccf2022-11-20 17:18:01 -0800152 EXPECT_CALL(manager.mockReload, schedule());
Asmitha Karunanithi003b8b72022-01-06 04:17:59 -0600153 interface.staticNTPServers(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", "NTP"));
Ratan Guptac9645fe2017-08-23 16:53:52 +0530156}
157
Asmitha Karunanithi003b8b72022-01-06 04:17:59 -0600158TEST_F(TestEthernetInterface, addNTPServers)
159{
160 using namespace sdbusplus::xyz::openbmc_project::Common::Error;
161 ServerList servers = {"10.1.1.1", "10.2.2.2", "10.3.3.3"};
162 EXPECT_THROW(interface.ntpServers(servers), NotAllowed);
163}
164
165TEST_F(TestEthernetInterface, getNTPServers)
166{
167 ServerList servers = {"10.1.1.1", "10.2.2.2", "10.3.3.3"};
168 setNtpServers();
169 EXPECT_EQ(getNtpServers(), servers);
170}
171
Ravi Tejaa5a09442020-07-17 00:57:33 -0500172TEST_F(TestEthernetInterface, addGateway)
173{
174 std::string gateway = "10.3.3.3";
175 interface.defaultGateway(gateway);
176 EXPECT_EQ(interface.defaultGateway(), gateway);
Jiaqing Zhaoc2e061f2022-04-07 21:55:48 +0800177 interface.defaultGateway("");
178 EXPECT_EQ(interface.defaultGateway(), "");
Ravi Tejaa5a09442020-07-17 00:57:33 -0500179}
180
181TEST_F(TestEthernetInterface, addGateway6)
182{
183 std::string gateway6 = "ffff:ffff:ffff:fe80::1";
184 interface.defaultGateway6(gateway6);
185 EXPECT_EQ(interface.defaultGateway6(), gateway6);
Jiaqing Zhaoc2e061f2022-04-07 21:55:48 +0800186 interface.defaultGateway6("");
187 EXPECT_EQ(interface.defaultGateway6(), "");
Ravi Tejaa5a09442020-07-17 00:57:33 -0500188}
189
William A. Kennington III8060c0d2022-08-18 19:19:34 -0700190TEST_F(TestEthernetInterface, DHCPEnabled)
191{
William A. Kennington IIIde70ccf2022-11-20 17:18:01 -0800192 EXPECT_CALL(manager.mockReload, schedule())
193 .WillRepeatedly(testing::Return());
William A. Kennington III8060c0d2022-08-18 19:19:34 -0700194
195 using DHCPConf = EthernetInterfaceIntf::DHCPConf;
196 auto test = [&](DHCPConf conf, bool dhcp4, bool dhcp6, bool ra) {
197 EXPECT_EQ(conf, interface.dhcpEnabled());
198 EXPECT_EQ(dhcp4, interface.dhcp4());
199 EXPECT_EQ(dhcp6, interface.dhcp6());
200 EXPECT_EQ(ra, interface.ipv6AcceptRA());
201 };
202 test(DHCPConf::both, /*dhcp4=*/true, /*dhcp6=*/true, /*ra=*/true);
203
204 auto set_test = [&](DHCPConf conf, bool dhcp4, bool dhcp6, bool ra) {
205 EXPECT_EQ(conf, interface.dhcpEnabled(conf));
206 test(conf, dhcp4, dhcp6, ra);
207 };
208 set_test(DHCPConf::none, /*dhcp4=*/false, /*dhcp6=*/false, /*ra=*/false);
209 set_test(DHCPConf::v4, /*dhcp4=*/true, /*dhcp6=*/false, /*ra=*/false);
210 set_test(DHCPConf::v6stateless, /*dhcp4=*/false, /*dhcp6=*/false,
211 /*ra=*/true);
212 set_test(DHCPConf::v6, /*dhcp4=*/false, /*dhcp6=*/true, /*ra=*/true);
213 set_test(DHCPConf::v4v6stateless, /*dhcp4=*/true, /*dhcp6=*/false,
214 /*ra=*/true);
215 set_test(DHCPConf::both, /*dhcp4=*/true, /*dhcp6=*/true, /*ra=*/true);
216
217 auto ind_test = [&](DHCPConf conf, bool dhcp4, bool dhcp6, bool ra) {
218 EXPECT_EQ(dhcp4, interface.dhcp4(dhcp4));
219 EXPECT_EQ(dhcp6, interface.dhcp6(dhcp6));
220 EXPECT_EQ(ra, interface.ipv6AcceptRA(ra));
221 test(conf, dhcp4, dhcp6, ra);
222 };
223 ind_test(DHCPConf::none, /*dhcp4=*/false, /*dhcp6=*/false, /*ra=*/false);
224 ind_test(DHCPConf::v4, /*dhcp4=*/true, /*dhcp6=*/false, /*ra=*/false);
225 ind_test(DHCPConf::v6stateless, /*dhcp4=*/false, /*dhcp6=*/false,
226 /*ra=*/true);
227 ind_test(DHCPConf::v6, /*dhcp4=*/false, /*dhcp6=*/true, /*ra=*/false);
228 set_test(DHCPConf::v6, /*dhcp4=*/false, /*dhcp6=*/true, /*ra=*/true);
229 ind_test(DHCPConf::v4v6stateless, /*dhcp4=*/true, /*dhcp6=*/false,
230 /*ra=*/true);
231 ind_test(DHCPConf::both, /*dhcp4=*/true, /*dhcp6=*/true, /*ra=*/false);
232 set_test(DHCPConf::both, /*dhcp4=*/true, /*dhcp6=*/true, /*ra=*/true);
233}
234
Gunnar Mills57d9c502018-09-14 14:42:34 -0500235} // namespace network
236} // namespace phosphor