blob: 27d9b1e9badc7240198312152e71e4a9f08eecf4 [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
William A. Kennington III9ede1b72022-11-21 01:59:28 -080042 static MockEthernetInterface
43 makeInterface(stdplus::PinnedRef<sdbusplus::bus_t> bus,
44 TestManager& manager)
William A. Kennington IIIebb1ad02019-04-21 18:02:49 -070045 {
William A. Kennington III9c441fd2023-02-24 13:40:01 -080046 AllIntfInfo info{InterfaceInfo{
47 .type = ARPHRD_ETHER, .idx = 1, .flags = 0, .name = "test0"}};
William A. Kennington III77848562022-10-26 17:32:57 -070048 return {bus, manager, info, "/xyz/openbmc_test/network"sv,
49 config::Parser()};
William A. Kennington IIIebb1ad02019-04-21 18:02:49 -070050 }
51
William A. Kennington III59e5b912022-11-02 02:49:46 -070052 auto createIPObject(IP::Protocol addressType, const std::string& ipaddress,
William A. Kennington IIIe25f8b42022-10-11 14:43:28 -070053 uint8_t subnetMask)
Gunnar Mills57d9c502018-09-14 14:42:34 -050054 {
William A. Kennington III59e5b912022-11-02 02:49:46 -070055 return interface.ip(addressType, ipaddress, subnetMask, "");
Gunnar Mills57d9c502018-09-14 14:42:34 -050056 }
Asmitha Karunanithi003b8b72022-01-06 04:17:59 -060057
58 void setNtpServers()
59 {
60 ServerList ntpServers = {"10.1.1.1", "10.2.2.2", "10.3.3.3"};
61 interface.EthernetInterfaceIntf::ntpServers(ntpServers);
62 }
63
64 ServerList getNtpServers()
65 {
66 return interface.EthernetInterfaceIntf::ntpServers();
67 }
Ratan Gupta47722dc2017-05-26 18:32:23 +053068};
69
William A. Kennington III9ecb90e2022-10-14 03:12:43 -070070TEST_F(TestEthernetInterface, Fields)
71{
72 EXPECT_EQ(0, interface.mtu());
73 EXPECT_EQ("", interface.macAddress());
74 EXPECT_FALSE(interface.linkUp());
75
William A. Kennington IIIb7d6a1a2023-06-17 02:00:53 -070076 constexpr stdplus::EtherAddr mac{0x11, 0x22, 0x33, 0x44, 0x55, 0x66};
William A. Kennington III9ecb90e2022-10-14 03:12:43 -070077 constexpr unsigned mtu = 150;
78
William A. Kennington III9c441fd2023-02-24 13:40:01 -080079 AllIntfInfo info{InterfaceInfo{.type = ARPHRD_ETHER,
80 .idx = 2,
William A. Kennington III13d665c2022-11-15 20:34:40 -080081 .flags = IFF_RUNNING,
82 .name = "test1",
83 .mac = mac,
84 .mtu = mtu}};
William A. Kennington III77848562022-10-26 17:32:57 -070085 MockEthernetInterface intf(bus, manager, info,
William A. Kennington IIId298f932022-10-17 14:31:38 -070086 "/xyz/openbmc_test/network"sv, config::Parser());
William A. Kennington III9ecb90e2022-10-14 03:12:43 -070087
88 EXPECT_EQ(mtu, intf.mtu());
William A. Kennington IIIb7d6a1a2023-06-17 02:00:53 -070089 EXPECT_EQ(stdplus::toStr(mac), intf.macAddress());
William A. Kennington III9ecb90e2022-10-14 03:12:43 -070090 EXPECT_TRUE(intf.linkUp());
91}
92
Ratan Gupta47722dc2017-05-26 18:32:23 +053093TEST_F(TestEthernetInterface, NoIPaddress)
94{
William A. Kennington III59e5b912022-11-02 02:49:46 -070095 EXPECT_TRUE(interface.addrs.empty());
Ratan Gupta47722dc2017-05-26 18:32:23 +053096}
97
98TEST_F(TestEthernetInterface, AddIPAddress)
99{
William A. Kennington III30f3ba22023-06-28 15:50:12 -0700100 EXPECT_THROW(createIPObject(IP::Protocol::IPv4, "127.0.0.1", 16),
101 InvalidArgument);
102 EXPECT_THROW(createIPObject(IP::Protocol::IPv4, "127.0.0.1", 32),
103 InvalidArgument);
104 EXPECT_THROW(createIPObject(IP::Protocol::IPv4, "192.168.1.1", 0),
105 InvalidArgument);
106 EXPECT_THROW(createIPObject(IP::Protocol::IPv6, "::1", 64),
107 InvalidArgument);
108 EXPECT_THROW(createIPObject(IP::Protocol::IPv6, "::", 128),
109 InvalidArgument);
110 EXPECT_THROW(createIPObject(IP::Protocol::IPv6, "fe80::1", 0),
111 InvalidArgument);
112
William A. Kennington III59e5b912022-11-02 02:49:46 -0700113 createIPObject(IP::Protocol::IPv4, "10.10.10.10", 16);
William A. Kennington III02d87c12023-06-28 17:59:51 -0700114 EXPECT_THAT(interface.addrs,
115 UnorderedElementsAre(Key("10.10.10.10/16"_sub)));
Ratan Gupta47722dc2017-05-26 18:32:23 +0530116}
117
118TEST_F(TestEthernetInterface, AddMultipleAddress)
119{
William A. Kennington III59e5b912022-11-02 02:49:46 -0700120 createIPObject(IP::Protocol::IPv4, "10.10.10.10", 16);
121 createIPObject(IP::Protocol::IPv4, "20.20.20.20", 16);
William A. Kennington III02d87c12023-06-28 17:59:51 -0700122 EXPECT_THAT(interface.addrs,
123 UnorderedElementsAre(Key("10.10.10.10/16"_sub),
124 Key("20.20.20.20/16"_sub)));
Ratan Gupta47722dc2017-05-26 18:32:23 +0530125}
126
127TEST_F(TestEthernetInterface, DeleteIPAddress)
128{
William A. Kennington III59e5b912022-11-02 02:49:46 -0700129 createIPObject(IP::Protocol::IPv4, "10.10.10.10", 16);
130 createIPObject(IP::Protocol::IPv4, "20.20.20.20", 16);
William A. Kennington III02d87c12023-06-28 17:59:51 -0700131 interface.addrs.at("10.10.10.10/16"_sub)->delete_();
132 EXPECT_THAT(interface.addrs,
133 UnorderedElementsAre(Key("20.20.20.20/16"_sub)));
Ratan Gupta47722dc2017-05-26 18:32:23 +0530134}
135
136TEST_F(TestEthernetInterface, CheckObjectPath)
137{
William A. Kennington III59e5b912022-11-02 02:49:46 -0700138 auto path = createIPObject(IP::Protocol::IPv4, "10.10.10.10", 16);
139 EXPECT_EQ(path.parent_path(), "/xyz/openbmc_test/network/test0");
140 EXPECT_EQ(path.filename(), "10.10.10.10/16");
Ratan Gupta47722dc2017-05-26 18:32:23 +0530141}
142
Manojkiran Edaacd6dd52019-10-15 15:00:51 +0530143TEST_F(TestEthernetInterface, addStaticNameServers)
Ratan Gupta09f61572017-08-23 16:53:52 +0530144{
Gunnar Mills57d9c502018-09-14 14:42:34 -0500145 ServerList servers = {"9.1.1.1", "9.2.2.2", "9.3.3.3"};
William A. Kennington IIIde70ccf2022-11-20 17:18:01 -0800146 EXPECT_CALL(manager.mockReload, schedule());
Manojkiran Edaacd6dd52019-10-15 15:00:51 +0530147 interface.staticNameServers(servers);
William A. Kennington III5b179382022-11-15 15:23:26 -0800148 config::Parser parser((confDir / "00-bmc-test0.network").native());
William A. Kennington III34bb3e22022-08-18 15:17:22 -0700149 EXPECT_EQ(servers, parser.map.getValueStrings("Network", "DNS"));
Ratan Gupta09f61572017-08-23 16:53:52 +0530150}
151
Manojkiran Edaacd6dd52019-10-15 15:00:51 +0530152TEST_F(TestEthernetInterface, getDynamicNameServers)
153{
154 ServerList servers = {"9.1.1.1", "9.2.2.2", "9.3.3.3"};
155 EXPECT_CALL(interface, getNameServerFromResolvd())
156 .WillRepeatedly(testing::Return(servers));
157 EXPECT_EQ(interface.getNameServerFromResolvd(), servers);
158}
159
Asmitha Karunanithi003b8b72022-01-06 04:17:59 -0600160TEST_F(TestEthernetInterface, addStaticNTPServers)
Ratan Guptac9645fe2017-08-23 16:53:52 +0530161{
Gunnar Mills57d9c502018-09-14 14:42:34 -0500162 ServerList servers = {"10.1.1.1", "10.2.2.2", "10.3.3.3"};
William A. Kennington IIIde70ccf2022-11-20 17:18:01 -0800163 EXPECT_CALL(manager.mockReload, schedule());
Asmitha Karunanithi003b8b72022-01-06 04:17:59 -0600164 interface.staticNTPServers(servers);
William A. Kennington III5b179382022-11-15 15:23:26 -0800165 config::Parser parser((confDir / "00-bmc-test0.network").native());
William A. Kennington III34bb3e22022-08-18 15:17:22 -0700166 EXPECT_EQ(servers, parser.map.getValueStrings("Network", "NTP"));
Ratan Guptac9645fe2017-08-23 16:53:52 +0530167}
168
Asmitha Karunanithi003b8b72022-01-06 04:17:59 -0600169TEST_F(TestEthernetInterface, addNTPServers)
170{
171 using namespace sdbusplus::xyz::openbmc_project::Common::Error;
172 ServerList servers = {"10.1.1.1", "10.2.2.2", "10.3.3.3"};
173 EXPECT_THROW(interface.ntpServers(servers), NotAllowed);
174}
175
176TEST_F(TestEthernetInterface, getNTPServers)
177{
178 ServerList servers = {"10.1.1.1", "10.2.2.2", "10.3.3.3"};
179 setNtpServers();
180 EXPECT_EQ(getNtpServers(), servers);
181}
182
Ravi Tejaa5a09442020-07-17 00:57:33 -0500183TEST_F(TestEthernetInterface, addGateway)
184{
185 std::string gateway = "10.3.3.3";
186 interface.defaultGateway(gateway);
187 EXPECT_EQ(interface.defaultGateway(), gateway);
William A. Kennington IIIbbf5e9e2023-02-01 14:58:38 -0800188 EXPECT_THROW(interface.defaultGateway6("127.0.0.10"), InvalidArgument);
189 EXPECT_THROW(interface.defaultGateway6("0.0.0.0"), InvalidArgument);
190 EXPECT_THROW(interface.defaultGateway6("224.1.0.0"), InvalidArgument);
191 EXPECT_EQ(interface.defaultGateway(), gateway);
Jiaqing Zhaoc2e061f2022-04-07 21:55:48 +0800192 interface.defaultGateway("");
193 EXPECT_EQ(interface.defaultGateway(), "");
William A. Kennington III9ca5c8e2022-12-14 14:40:52 -0800194 interface.defaultGateway("0.0.0.0");
195 EXPECT_EQ(interface.defaultGateway(), "");
Ravi Tejaa5a09442020-07-17 00:57:33 -0500196}
197
198TEST_F(TestEthernetInterface, addGateway6)
199{
William A. Kennington IIIbbf5e9e2023-02-01 14:58:38 -0800200 std::string gateway6 = "fe80::1";
Ravi Tejaa5a09442020-07-17 00:57:33 -0500201 interface.defaultGateway6(gateway6);
202 EXPECT_EQ(interface.defaultGateway6(), gateway6);
William A. Kennington IIIbbf5e9e2023-02-01 14:58:38 -0800203 EXPECT_THROW(interface.defaultGateway6("::1"), InvalidArgument);
204 EXPECT_EQ(interface.defaultGateway6(), gateway6);
Jiaqing Zhaoc2e061f2022-04-07 21:55:48 +0800205 interface.defaultGateway6("");
206 EXPECT_EQ(interface.defaultGateway6(), "");
William A. Kennington III9ca5c8e2022-12-14 14:40:52 -0800207 interface.defaultGateway6("::");
208 EXPECT_EQ(interface.defaultGateway6(), "");
Ravi Tejaa5a09442020-07-17 00:57:33 -0500209}
210
William A. Kennington III8060c0d2022-08-18 19:19:34 -0700211TEST_F(TestEthernetInterface, DHCPEnabled)
212{
William A. Kennington IIIde70ccf2022-11-20 17:18:01 -0800213 EXPECT_CALL(manager.mockReload, schedule())
214 .WillRepeatedly(testing::Return());
William A. Kennington III8060c0d2022-08-18 19:19:34 -0700215
216 using DHCPConf = EthernetInterfaceIntf::DHCPConf;
217 auto test = [&](DHCPConf conf, bool dhcp4, bool dhcp6, bool ra) {
218 EXPECT_EQ(conf, interface.dhcpEnabled());
219 EXPECT_EQ(dhcp4, interface.dhcp4());
220 EXPECT_EQ(dhcp6, interface.dhcp6());
221 EXPECT_EQ(ra, interface.ipv6AcceptRA());
222 };
223 test(DHCPConf::both, /*dhcp4=*/true, /*dhcp6=*/true, /*ra=*/true);
224
225 auto set_test = [&](DHCPConf conf, bool dhcp4, bool dhcp6, bool ra) {
226 EXPECT_EQ(conf, interface.dhcpEnabled(conf));
227 test(conf, dhcp4, dhcp6, ra);
228 };
229 set_test(DHCPConf::none, /*dhcp4=*/false, /*dhcp6=*/false, /*ra=*/false);
230 set_test(DHCPConf::v4, /*dhcp4=*/true, /*dhcp6=*/false, /*ra=*/false);
231 set_test(DHCPConf::v6stateless, /*dhcp4=*/false, /*dhcp6=*/false,
232 /*ra=*/true);
233 set_test(DHCPConf::v6, /*dhcp4=*/false, /*dhcp6=*/true, /*ra=*/true);
234 set_test(DHCPConf::v4v6stateless, /*dhcp4=*/true, /*dhcp6=*/false,
235 /*ra=*/true);
236 set_test(DHCPConf::both, /*dhcp4=*/true, /*dhcp6=*/true, /*ra=*/true);
237
238 auto ind_test = [&](DHCPConf conf, bool dhcp4, bool dhcp6, bool ra) {
239 EXPECT_EQ(dhcp4, interface.dhcp4(dhcp4));
240 EXPECT_EQ(dhcp6, interface.dhcp6(dhcp6));
241 EXPECT_EQ(ra, interface.ipv6AcceptRA(ra));
242 test(conf, dhcp4, dhcp6, ra);
243 };
244 ind_test(DHCPConf::none, /*dhcp4=*/false, /*dhcp6=*/false, /*ra=*/false);
245 ind_test(DHCPConf::v4, /*dhcp4=*/true, /*dhcp6=*/false, /*ra=*/false);
246 ind_test(DHCPConf::v6stateless, /*dhcp4=*/false, /*dhcp6=*/false,
247 /*ra=*/true);
248 ind_test(DHCPConf::v6, /*dhcp4=*/false, /*dhcp6=*/true, /*ra=*/false);
249 set_test(DHCPConf::v6, /*dhcp4=*/false, /*dhcp6=*/true, /*ra=*/true);
250 ind_test(DHCPConf::v4v6stateless, /*dhcp4=*/true, /*dhcp6=*/false,
251 /*ra=*/true);
252 ind_test(DHCPConf::both, /*dhcp4=*/true, /*dhcp6=*/true, /*ra=*/false);
253 set_test(DHCPConf::both, /*dhcp4=*/true, /*dhcp6=*/true, /*ra=*/true);
254}
255
Gunnar Mills57d9c502018-09-14 14:42:34 -0500256} // namespace network
257} // namespace phosphor