blob: 712fe989242a8c9a89c9b006cc1672e04ab41463 [file] [log] [blame]
Ratan Gupta594123d2017-05-16 22:48:35 +05301#include "util.hpp"
2
William A. Kennington III5058f572019-01-30 17:18:14 -08003#include <arpa/inet.h>
Gunnar Mills57d9c502018-09-14 14:42:34 -05004#include <netinet/in.h>
5
William A. Kennington IIId27410f2019-01-30 17:15:43 -08006#include <cstddef>
William A. Kennington IIIc920bdb2019-04-19 14:23:06 -07007#include <cstring>
William A. Kennington IIIe5a48ab2019-04-22 03:55:23 -07008#include <stdexcept>
William A. Kennington III12beaad2020-06-13 19:30:41 -07009#include <stdplus/raw.hpp>
William A. Kennington IIIc920bdb2019-04-19 14:23:06 -070010#include <string>
11#include <string_view>
Ratan Gupta35297172018-11-28 18:40:16 +053012#include <xyz/openbmc_project/Common/error.hpp>
13
Lei YU307554e2021-03-18 14:56:50 +080014#include <gmock/gmock.h>
Gunnar Mills57d9c502018-09-14 14:42:34 -050015#include <gtest/gtest.h>
16
Ratan Gupta594123d2017-05-16 22:48:35 +053017namespace phosphor
18{
19namespace network
20{
21
William A. Kennington IIIc920bdb2019-04-19 14:23:06 -070022using namespace std::literals;
Ratan Gupta35297172018-11-28 18:40:16 +053023using InternalFailure =
24 sdbusplus::xyz::openbmc_project::Common::Error::InternalFailure;
Ratan Gupta594123d2017-05-16 22:48:35 +053025class TestUtil : public testing::Test
26{
Gunnar Mills57d9c502018-09-14 14:42:34 -050027 public:
28 TestUtil()
29 {
30 // Empty
31 }
Ratan Gupta594123d2017-05-16 22:48:35 +053032};
33
William A. Kennington IIIa00b1c32019-02-01 18:57:17 -080034TEST_F(TestUtil, AddrFromBuf)
35{
36 std::string tooSmall(1, 'a');
37 std::string tooLarge(24, 'a');
38
39 struct in_addr ip1;
40 EXPECT_EQ(1, inet_pton(AF_INET, "192.168.10.1", &ip1));
41 std::string_view buf1(reinterpret_cast<char*>(&ip1), sizeof(ip1));
42 InAddrAny res1 = addrFromBuf(AF_INET, buf1);
43 EXPECT_EQ(0, memcmp(&ip1, &std::get<struct in_addr>(res1), sizeof(ip1)));
44 EXPECT_THROW(addrFromBuf(AF_INET, tooSmall), std::runtime_error);
45 EXPECT_THROW(addrFromBuf(AF_INET, tooLarge), std::runtime_error);
William A. Kennington III97b5dc62022-10-07 14:01:29 -070046 EXPECT_THROW(addrFromBuf(AF_UNSPEC, buf1), std::invalid_argument);
William A. Kennington IIIa00b1c32019-02-01 18:57:17 -080047
48 struct in6_addr ip2;
49 EXPECT_EQ(1, inet_pton(AF_INET6, "fdd8:b5ad:9d93:94ee::2:1", &ip2));
50 std::string_view buf2(reinterpret_cast<char*>(&ip2), sizeof(ip2));
51 InAddrAny res2 = addrFromBuf(AF_INET6, buf2);
52 EXPECT_EQ(0, memcmp(&ip2, &std::get<struct in6_addr>(res2), sizeof(ip2)));
53 EXPECT_THROW(addrFromBuf(AF_INET6, tooSmall), std::runtime_error);
54 EXPECT_THROW(addrFromBuf(AF_INET6, tooLarge), std::runtime_error);
William A. Kennington III97b5dc62022-10-07 14:01:29 -070055 EXPECT_THROW(addrFromBuf(AF_UNSPEC, buf2), std::invalid_argument);
William A. Kennington IIIa00b1c32019-02-01 18:57:17 -080056}
57
William A. Kennington III5058f572019-01-30 17:18:14 -080058TEST_F(TestUtil, IpToString)
59{
60 struct in_addr ip1;
61 EXPECT_EQ(1, inet_pton(AF_INET, "192.168.10.1", &ip1));
Alexander Filippov983da552021-02-08 15:26:54 +030062 EXPECT_EQ("192.168.10.1", toString(ip1));
William A. Kennington III5058f572019-01-30 17:18:14 -080063 EXPECT_EQ("192.168.10.1", toString(InAddrAny(ip1)));
64
65 struct in6_addr ip2;
66 EXPECT_EQ(1, inet_pton(AF_INET6, "fdd8:b5ad:9d93:94ee::2:1", &ip2));
Alexander Filippov983da552021-02-08 15:26:54 +030067 EXPECT_EQ("fdd8:b5ad:9d93:94ee::2:1", toString(ip2));
William A. Kennington III5058f572019-01-30 17:18:14 -080068 EXPECT_EQ("fdd8:b5ad:9d93:94ee::2:1", toString(InAddrAny(ip2)));
William A. Kennington III5058f572019-01-30 17:18:14 -080069}
70
Nagaraju Goruganti067ca2d2018-01-17 01:12:00 -060071TEST_F(TestUtil, IpValidation)
72{
73 std::string ipaddress = "0.0.0.0";
74 EXPECT_EQ(true, isValidIP(AF_INET, ipaddress));
75
76 ipaddress = "9.3.185.83";
77 EXPECT_EQ(true, isValidIP(AF_INET, ipaddress));
78
79 ipaddress = "9.3.185.a";
80 EXPECT_EQ(false, isValidIP(AF_INET, ipaddress));
81
82 ipaddress = "9.3.a.83";
83 EXPECT_EQ(false, isValidIP(AF_INET, ipaddress));
84
85 ipaddress = "x.x.x.x";
86 EXPECT_EQ(false, isValidIP(AF_INET, ipaddress));
87
88 ipaddress = "0:0:0:0:0:0:0:0";
89 EXPECT_EQ(true, isValidIP(AF_INET6, ipaddress));
90
91 ipaddress = "1:0:0:0:0:0:0:8";
92 EXPECT_EQ(true, isValidIP(AF_INET6, ipaddress));
93
94 ipaddress = "1::8";
95 EXPECT_EQ(true, isValidIP(AF_INET6, ipaddress));
96
97 ipaddress = "0:0:0:0:0:FFFF:204.152.189.116";
98 EXPECT_EQ(true, isValidIP(AF_INET6, ipaddress));
99
100 ipaddress = "::ffff:204.152.189.116";
101 EXPECT_EQ(true, isValidIP(AF_INET6, ipaddress));
102
103 ipaddress = "a:0:0:0:0:FFFF:204.152.189.116";
104 EXPECT_EQ(true, isValidIP(AF_INET6, ipaddress));
105
106 ipaddress = "1::8";
107 EXPECT_EQ(true, isValidIP(AF_INET6, ipaddress));
Nagaraju Goruganti067ca2d2018-01-17 01:12:00 -0600108}
109
110TEST_F(TestUtil, PrefixValidation)
111{
William A. Kennington IIIe5a48ab2019-04-22 03:55:23 -0700112 EXPECT_TRUE(isValidPrefix(AF_INET, 0));
113 EXPECT_TRUE(isValidPrefix(AF_INET, 1));
114 EXPECT_TRUE(isValidPrefix(AF_INET, 32));
115 EXPECT_FALSE(isValidPrefix(AF_INET, 33));
116 EXPECT_FALSE(isValidPrefix(AF_INET, 64));
Nagaraju Goruganti067ca2d2018-01-17 01:12:00 -0600117
William A. Kennington IIIe5a48ab2019-04-22 03:55:23 -0700118 EXPECT_TRUE(isValidPrefix(AF_INET6, 0));
119 EXPECT_TRUE(isValidPrefix(AF_INET6, 1));
120 EXPECT_TRUE(isValidPrefix(AF_INET6, 53));
121 EXPECT_TRUE(isValidPrefix(AF_INET6, 64));
122 EXPECT_TRUE(isValidPrefix(AF_INET6, 128));
123 EXPECT_FALSE(isValidPrefix(AF_INET6, 129));
124 EXPECT_FALSE(isValidPrefix(AF_INET6, 177));
Nagaraju Goruganti067ca2d2018-01-17 01:12:00 -0600125
William A. Kennington IIIe5a48ab2019-04-22 03:55:23 -0700126 EXPECT_THROW(isValidPrefix(AF_UNSPEC, 1), std::invalid_argument);
Nagaraju Goruganti067ca2d2018-01-17 01:12:00 -0600127}
128
William A. Kennington III7b9e8bd2019-04-23 19:31:31 -0700129TEST_F(TestUtil, InterfaceToUbootEthAddr)
130{
131 EXPECT_EQ(std::nullopt, interfaceToUbootEthAddr("et"));
132 EXPECT_EQ(std::nullopt, interfaceToUbootEthAddr("eth"));
133 EXPECT_EQ(std::nullopt, interfaceToUbootEthAddr("sit0"));
134 EXPECT_EQ(std::nullopt, interfaceToUbootEthAddr("ethh0"));
135 EXPECT_EQ(std::nullopt, interfaceToUbootEthAddr("eth0h"));
136 EXPECT_EQ("ethaddr", interfaceToUbootEthAddr("eth0"));
137 EXPECT_EQ("eth1addr", interfaceToUbootEthAddr("eth1"));
138 EXPECT_EQ("eth5addr", interfaceToUbootEthAddr("eth5"));
139 EXPECT_EQ("eth28addr", interfaceToUbootEthAddr("eth28"));
140}
141
William A. Kennington III1137a972019-04-20 20:49:58 -0700142namespace mac_address
143{
144
145TEST(MacFromString, Bad)
146{
Asmitha Karunanithi86f659e2021-01-05 00:16:03 -0600147 EXPECT_THROW(fromString("0x:00:00:00:00:00"), std::invalid_argument);
148 EXPECT_THROW(fromString("00:00:00:00:00"), std::invalid_argument);
William A. Kennington IIIfeb7aab2022-10-03 17:21:44 -0700149 EXPECT_THROW(fromString("00:00:00:00:00:"), std::invalid_argument);
150 EXPECT_THROW(fromString("00:00:00:00::00"), std::invalid_argument);
151 EXPECT_THROW(fromString(":00:00:00:00:00"), std::invalid_argument);
152 EXPECT_THROW(fromString("00::00:00:00:00"), std::invalid_argument);
153 EXPECT_THROW(fromString(":::::"), std::invalid_argument);
154 EXPECT_THROW(fromString("00:0:0:0:0"), std::invalid_argument);
155 EXPECT_THROW(fromString("00:00:00:00:00:00:00"), std::invalid_argument);
Asmitha Karunanithi86f659e2021-01-05 00:16:03 -0600156 EXPECT_THROW(fromString(""), std::invalid_argument);
Potin Laida0b1d42021-12-26 20:08:20 +0800157 EXPECT_THROW(fromString("123456789XYZ"), std::invalid_argument);
158 EXPECT_THROW(fromString("123456789AB"), std::invalid_argument);
159 EXPECT_THROW(fromString("123456789ABCD"), std::invalid_argument);
William A. Kennington III1137a972019-04-20 20:49:58 -0700160}
161
162TEST(MacFromString, Valid)
163{
William A. Kennington III12beaad2020-06-13 19:30:41 -0700164 EXPECT_TRUE(
165 stdplus::raw::equal(ether_addr{}, fromString("00:00:00:00:00:00")));
166 EXPECT_TRUE(
167 stdplus::raw::equal(ether_addr{0xff, 0xee, 0xdd, 0xcc, 0xbb, 0xaa},
168 fromString("FF:EE:DD:cc:bb:aa")));
169 EXPECT_TRUE(
170 stdplus::raw::equal(ether_addr{0x00, 0x01, 0x02, 0x03, 0x04, 0x05},
171 fromString("0:1:2:3:4:5")));
Potin Laida0b1d42021-12-26 20:08:20 +0800172 EXPECT_TRUE(
173 stdplus::raw::equal(ether_addr{0x01, 0x23, 0x45, 0x67, 0x89, 0xab},
174 fromString("0123456789AB")));
175 EXPECT_TRUE(
176 stdplus::raw::equal(ether_addr{0xff, 0xee, 0xdd, 0xcc, 0xbb, 0xaa},
177 fromString("FFEEDDccbbaa")));
William A. Kennington III1137a972019-04-20 20:49:58 -0700178}
179
180TEST(MacToString, Valid)
181{
182 EXPECT_EQ("11:22:33:44:55:66",
183 toString({0x11, 0x22, 0x33, 0x44, 0x55, 0x66}));
Karthick Sundarrajandbd328d2019-11-20 15:19:08 -0800184 EXPECT_EQ("01:02:03:04:05:67",
185 toString({0x01, 0x02, 0x03, 0x04, 0x05, 0x67}));
186 EXPECT_EQ("00:00:00:00:00:00",
187 toString({0x00, 0x00, 0x00, 0x00, 0x00, 0x00}));
William A. Kennington III1137a972019-04-20 20:49:58 -0700188}
189
190TEST(MacIsEmpty, True)
191{
192 EXPECT_TRUE(isEmpty({}));
193}
194
195TEST(MacIsEmpty, False)
196{
197 EXPECT_FALSE(isEmpty(fromString("01:00:00:00:00:00")));
198 EXPECT_FALSE(isEmpty(fromString("00:00:00:10:00:00")));
199 EXPECT_FALSE(isEmpty(fromString("00:00:00:00:00:01")));
200}
201
202TEST(MacIsMulticast, True)
203{
204 EXPECT_TRUE(isMulticast(fromString("ff:ff:ff:ff:ff:ff")));
205 EXPECT_TRUE(isMulticast(fromString("01:00:00:00:00:00")));
206}
207
208TEST(MacIsMulticast, False)
209{
210 EXPECT_FALSE(isMulticast(fromString("00:11:22:33:44:55")));
211 EXPECT_FALSE(isMulticast(fromString("FE:11:22:33:44:55")));
212}
213
214TEST(MacIsUnicast, True)
215{
216 EXPECT_TRUE(isUnicast(fromString("00:11:22:33:44:55")));
217 EXPECT_TRUE(isUnicast(fromString("FE:11:22:33:44:55")));
218}
219
220TEST(MacIsUnicast, False)
221{
222 EXPECT_FALSE(isUnicast(fromString("00:00:00:00:00:00")));
223 EXPECT_FALSE(isUnicast(fromString("01:00:00:00:00:00")));
224 EXPECT_FALSE(isUnicast(fromString("ff:ff:ff:ff:ff:ff")));
225}
226
Lei YU307554e2021-03-18 14:56:50 +0800227TEST(IgnoredInterfaces, Empty)
228{
229 auto ret = internal::parseInterfaces({});
230 EXPECT_TRUE(ret.empty());
231
232 ret = internal::parseInterfaces(" , ,, ");
233 EXPECT_TRUE(ret.empty());
234}
235
236TEST(IgnoredInterfaces, NotEmpty)
237{
238 using ::testing::ContainerEq;
William A. Kennington III95530ec2022-08-19 01:44:39 -0700239 std::unordered_set<std::string_view> expected = {"eth0"};
Lei YU307554e2021-03-18 14:56:50 +0800240 auto ret = internal::parseInterfaces("eth0");
241 EXPECT_THAT(ret, ContainerEq(expected));
242
243 expected = {"eth0", "eth1", "bond1", "usb0"};
244 ret = internal::parseInterfaces(" ,eth0, eth1 ,bond1, usb0,,");
245 EXPECT_THAT(ret, ContainerEq(expected));
246}
247
William A. Kennington III1137a972019-04-20 20:49:58 -0700248} // namespace mac_address
Gunnar Mills57d9c502018-09-14 14:42:34 -0500249} // namespace network
250} // namespace phosphor