blob: 884224b73df51a63d576148af39879ad458f3967 [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>
Ratan Gupta255d5142017-08-10 09:02:08 +05307
Gunnar Mills57d9c502018-09-14 14:42:34 -05008#include <sdbusplus/bus.hpp>
William A. Kennington III84bfe672022-07-13 14:15:30 -07009#include <stdplus/gtest/tmp.hpp>
William A. Kennington III991a8e82022-10-11 15:02:47 -070010#include <string_view>
Asmitha Karunanithi003b8b72022-01-06 04:17:59 -060011#include <xyz/openbmc_project/Common/error.hpp>
Gunnar Mills57d9c502018-09-14 14:42:34 -050012
13#include <gtest/gtest.h>
Ratan Gupta47722dc2017-05-26 18:32:23 +053014
15namespace phosphor
16{
17namespace network
18{
19
William A. Kennington III991a8e82022-10-11 15:02:47 -070020using std::literals::string_view_literals::operator""sv;
William A. Kennington III59e5b912022-11-02 02:49:46 -070021using testing::Key;
22using testing::UnorderedElementsAre;
William A. Kennington III991a8e82022-10-11 15:02:47 -070023
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:
William A. Kennington III9ede1b72022-11-21 01:59:28 -080027 stdplus::Pinned<sdbusplus::bus_t> bus;
William A. Kennington III5b179382022-11-15 15:23:26 -080028 std::filesystem::path confDir;
William A. Kennington IIIde70ccf2022-11-20 17:18:01 -080029 TestManager 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 III9ede1b72022-11-21 01:59:28 -080039 static MockEthernetInterface
40 makeInterface(stdplus::PinnedRef<sdbusplus::bus_t> bus,
41 TestManager& manager)
William A. Kennington IIIebb1ad02019-04-21 18:02:49 -070042 {
William A. Kennington III13d665c2022-11-15 20:34:40 -080043 AllIntfInfo info{InterfaceInfo{.idx = 1, .flags = 0, .name = "test0"}};
William A. Kennington III77848562022-10-26 17:32:57 -070044 return {bus, manager, info, "/xyz/openbmc_test/network"sv,
45 config::Parser()};
William A. Kennington IIIebb1ad02019-04-21 18:02:49 -070046 }
47
William A. Kennington III59e5b912022-11-02 02:49:46 -070048 auto createIPObject(IP::Protocol addressType, const std::string& ipaddress,
William A. Kennington IIIe25f8b42022-10-11 14:43:28 -070049 uint8_t subnetMask)
Gunnar Mills57d9c502018-09-14 14:42:34 -050050 {
William A. Kennington III59e5b912022-11-02 02:49:46 -070051 return interface.ip(addressType, ipaddress, subnetMask, "");
Gunnar Mills57d9c502018-09-14 14:42:34 -050052 }
Asmitha Karunanithi003b8b72022-01-06 04:17:59 -060053
54 void setNtpServers()
55 {
56 ServerList ntpServers = {"10.1.1.1", "10.2.2.2", "10.3.3.3"};
57 interface.EthernetInterfaceIntf::ntpServers(ntpServers);
58 }
59
60 ServerList getNtpServers()
61 {
62 return interface.EthernetInterfaceIntf::ntpServers();
63 }
Ratan Gupta47722dc2017-05-26 18:32:23 +053064};
65
William A. Kennington III9ecb90e2022-10-14 03:12:43 -070066TEST_F(TestEthernetInterface, Fields)
67{
68 EXPECT_EQ(0, interface.mtu());
69 EXPECT_EQ("", interface.macAddress());
70 EXPECT_FALSE(interface.linkUp());
71
William A. Kennington III9ecb90e2022-10-14 03:12:43 -070072 constexpr ether_addr mac{0x11, 0x22, 0x33, 0x44, 0x55, 0x66};
73 constexpr unsigned mtu = 150;
74
William A. Kennington III13d665c2022-11-15 20:34:40 -080075 AllIntfInfo info{InterfaceInfo{.idx = 2,
76 .flags = IFF_RUNNING,
77 .name = "test1",
78 .mac = mac,
79 .mtu = mtu}};
William A. Kennington III77848562022-10-26 17:32:57 -070080 MockEthernetInterface intf(bus, manager, info,
William A. Kennington IIId298f932022-10-17 14:31:38 -070081 "/xyz/openbmc_test/network"sv, config::Parser());
William A. Kennington III9ecb90e2022-10-14 03:12:43 -070082
83 EXPECT_EQ(mtu, intf.mtu());
William A. Kennington IIIbb0eacc2022-10-21 15:22:06 -070084 EXPECT_EQ(std::to_string(mac), intf.macAddress());
William A. Kennington III9ecb90e2022-10-14 03:12:43 -070085 EXPECT_TRUE(intf.linkUp());
86}
87
Ratan Gupta47722dc2017-05-26 18:32:23 +053088TEST_F(TestEthernetInterface, NoIPaddress)
89{
William A. Kennington III59e5b912022-11-02 02:49:46 -070090 EXPECT_TRUE(interface.addrs.empty());
Ratan Gupta47722dc2017-05-26 18:32:23 +053091}
92
93TEST_F(TestEthernetInterface, AddIPAddress)
94{
William A. Kennington III59e5b912022-11-02 02:49:46 -070095 createIPObject(IP::Protocol::IPv4, "10.10.10.10", 16);
96 EXPECT_THAT(interface.addrs, UnorderedElementsAre(Key(
97 IfAddr(in_addr{htonl(0x0a0a0a0a)}, 16))));
Ratan Gupta47722dc2017-05-26 18:32:23 +053098}
99
100TEST_F(TestEthernetInterface, AddMultipleAddress)
101{
William A. Kennington III59e5b912022-11-02 02:49:46 -0700102 createIPObject(IP::Protocol::IPv4, "10.10.10.10", 16);
103 createIPObject(IP::Protocol::IPv4, "20.20.20.20", 16);
104 EXPECT_THAT(
105 interface.addrs,
106 UnorderedElementsAre(Key(IfAddr(in_addr{htonl(0x0a0a0a0a)}, 16)),
107 Key(IfAddr(in_addr{htonl(0x14141414)}, 16))));
Ratan Gupta47722dc2017-05-26 18:32:23 +0530108}
109
110TEST_F(TestEthernetInterface, DeleteIPAddress)
111{
William A. Kennington III59e5b912022-11-02 02:49:46 -0700112 createIPObject(IP::Protocol::IPv4, "10.10.10.10", 16);
113 createIPObject(IP::Protocol::IPv4, "20.20.20.20", 16);
114 interface.addrs.at(IfAddr(in_addr{htonl(0x0a0a0a0a)}, 16))->delete_();
115 EXPECT_THAT(interface.addrs, UnorderedElementsAre(Key(
116 IfAddr(in_addr{htonl(0x14141414)}, 16))));
Ratan Gupta47722dc2017-05-26 18:32:23 +0530117}
118
119TEST_F(TestEthernetInterface, CheckObjectPath)
120{
William A. Kennington III59e5b912022-11-02 02:49:46 -0700121 auto path = createIPObject(IP::Protocol::IPv4, "10.10.10.10", 16);
122 EXPECT_EQ(path.parent_path(), "/xyz/openbmc_test/network/test0");
123 EXPECT_EQ(path.filename(), "10.10.10.10/16");
Ratan Gupta47722dc2017-05-26 18:32:23 +0530124}
125
Manojkiran Edaacd6dd52019-10-15 15:00:51 +0530126TEST_F(TestEthernetInterface, addStaticNameServers)
Ratan Gupta09f61572017-08-23 16:53:52 +0530127{
Gunnar Mills57d9c502018-09-14 14:42:34 -0500128 ServerList servers = {"9.1.1.1", "9.2.2.2", "9.3.3.3"};
William A. Kennington IIIde70ccf2022-11-20 17:18:01 -0800129 EXPECT_CALL(manager.mockReload, schedule());
Manojkiran Edaacd6dd52019-10-15 15:00:51 +0530130 interface.staticNameServers(servers);
William A. Kennington III5b179382022-11-15 15:23:26 -0800131 config::Parser parser((confDir / "00-bmc-test0.network").native());
William A. Kennington III34bb3e22022-08-18 15:17:22 -0700132 EXPECT_EQ(servers, parser.map.getValueStrings("Network", "DNS"));
Ratan Gupta09f61572017-08-23 16:53:52 +0530133}
134
Manojkiran Edaacd6dd52019-10-15 15:00:51 +0530135TEST_F(TestEthernetInterface, getDynamicNameServers)
136{
137 ServerList servers = {"9.1.1.1", "9.2.2.2", "9.3.3.3"};
138 EXPECT_CALL(interface, getNameServerFromResolvd())
139 .WillRepeatedly(testing::Return(servers));
140 EXPECT_EQ(interface.getNameServerFromResolvd(), servers);
141}
142
Asmitha Karunanithi003b8b72022-01-06 04:17:59 -0600143TEST_F(TestEthernetInterface, addStaticNTPServers)
Ratan Guptac9645fe2017-08-23 16:53:52 +0530144{
Gunnar Mills57d9c502018-09-14 14:42:34 -0500145 ServerList servers = {"10.1.1.1", "10.2.2.2", "10.3.3.3"};
William A. Kennington IIIde70ccf2022-11-20 17:18:01 -0800146 EXPECT_CALL(manager.mockReload, schedule());
Asmitha Karunanithi003b8b72022-01-06 04:17:59 -0600147 interface.staticNTPServers(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", "NTP"));
Ratan Guptac9645fe2017-08-23 16:53:52 +0530150}
151
Asmitha Karunanithi003b8b72022-01-06 04:17:59 -0600152TEST_F(TestEthernetInterface, addNTPServers)
153{
154 using namespace sdbusplus::xyz::openbmc_project::Common::Error;
155 ServerList servers = {"10.1.1.1", "10.2.2.2", "10.3.3.3"};
156 EXPECT_THROW(interface.ntpServers(servers), NotAllowed);
157}
158
159TEST_F(TestEthernetInterface, getNTPServers)
160{
161 ServerList servers = {"10.1.1.1", "10.2.2.2", "10.3.3.3"};
162 setNtpServers();
163 EXPECT_EQ(getNtpServers(), servers);
164}
165
Ravi Tejaa5a09442020-07-17 00:57:33 -0500166TEST_F(TestEthernetInterface, addGateway)
167{
168 std::string gateway = "10.3.3.3";
169 interface.defaultGateway(gateway);
170 EXPECT_EQ(interface.defaultGateway(), gateway);
Jiaqing Zhaoc2e061f2022-04-07 21:55:48 +0800171 interface.defaultGateway("");
172 EXPECT_EQ(interface.defaultGateway(), "");
Ravi Tejaa5a09442020-07-17 00:57:33 -0500173}
174
175TEST_F(TestEthernetInterface, addGateway6)
176{
177 std::string gateway6 = "ffff:ffff:ffff:fe80::1";
178 interface.defaultGateway6(gateway6);
179 EXPECT_EQ(interface.defaultGateway6(), gateway6);
Jiaqing Zhaoc2e061f2022-04-07 21:55:48 +0800180 interface.defaultGateway6("");
181 EXPECT_EQ(interface.defaultGateway6(), "");
Ravi Tejaa5a09442020-07-17 00:57:33 -0500182}
183
William A. Kennington III8060c0d2022-08-18 19:19:34 -0700184TEST_F(TestEthernetInterface, DHCPEnabled)
185{
William A. Kennington IIIde70ccf2022-11-20 17:18:01 -0800186 EXPECT_CALL(manager.mockReload, schedule())
187 .WillRepeatedly(testing::Return());
William A. Kennington III8060c0d2022-08-18 19:19:34 -0700188
189 using DHCPConf = EthernetInterfaceIntf::DHCPConf;
190 auto test = [&](DHCPConf conf, bool dhcp4, bool dhcp6, bool ra) {
191 EXPECT_EQ(conf, interface.dhcpEnabled());
192 EXPECT_EQ(dhcp4, interface.dhcp4());
193 EXPECT_EQ(dhcp6, interface.dhcp6());
194 EXPECT_EQ(ra, interface.ipv6AcceptRA());
195 };
196 test(DHCPConf::both, /*dhcp4=*/true, /*dhcp6=*/true, /*ra=*/true);
197
198 auto set_test = [&](DHCPConf conf, bool dhcp4, bool dhcp6, bool ra) {
199 EXPECT_EQ(conf, interface.dhcpEnabled(conf));
200 test(conf, dhcp4, dhcp6, ra);
201 };
202 set_test(DHCPConf::none, /*dhcp4=*/false, /*dhcp6=*/false, /*ra=*/false);
203 set_test(DHCPConf::v4, /*dhcp4=*/true, /*dhcp6=*/false, /*ra=*/false);
204 set_test(DHCPConf::v6stateless, /*dhcp4=*/false, /*dhcp6=*/false,
205 /*ra=*/true);
206 set_test(DHCPConf::v6, /*dhcp4=*/false, /*dhcp6=*/true, /*ra=*/true);
207 set_test(DHCPConf::v4v6stateless, /*dhcp4=*/true, /*dhcp6=*/false,
208 /*ra=*/true);
209 set_test(DHCPConf::both, /*dhcp4=*/true, /*dhcp6=*/true, /*ra=*/true);
210
211 auto ind_test = [&](DHCPConf conf, bool dhcp4, bool dhcp6, bool ra) {
212 EXPECT_EQ(dhcp4, interface.dhcp4(dhcp4));
213 EXPECT_EQ(dhcp6, interface.dhcp6(dhcp6));
214 EXPECT_EQ(ra, interface.ipv6AcceptRA(ra));
215 test(conf, dhcp4, dhcp6, ra);
216 };
217 ind_test(DHCPConf::none, /*dhcp4=*/false, /*dhcp6=*/false, /*ra=*/false);
218 ind_test(DHCPConf::v4, /*dhcp4=*/true, /*dhcp6=*/false, /*ra=*/false);
219 ind_test(DHCPConf::v6stateless, /*dhcp4=*/false, /*dhcp6=*/false,
220 /*ra=*/true);
221 ind_test(DHCPConf::v6, /*dhcp4=*/false, /*dhcp6=*/true, /*ra=*/false);
222 set_test(DHCPConf::v6, /*dhcp4=*/false, /*dhcp6=*/true, /*ra=*/true);
223 ind_test(DHCPConf::v4v6stateless, /*dhcp4=*/true, /*dhcp6=*/false,
224 /*ra=*/true);
225 ind_test(DHCPConf::both, /*dhcp4=*/true, /*dhcp6=*/true, /*ra=*/false);
226 set_test(DHCPConf::both, /*dhcp4=*/true, /*dhcp6=*/true, /*ra=*/true);
227}
228
Gunnar Mills57d9c502018-09-14 14:42:34 -0500229} // namespace network
230} // namespace phosphor