blob: f536bd7909de6d4bd669a53a484e384af1fd1a76 [file] [log] [blame]
Ratan Gupta594123d2017-05-16 22:48:35 +05301#include "util.hpp"
2
Gunnar Mills57d9c502018-09-14 14:42:34 -05003#include <netinet/in.h>
4
William A. Kennington IIId27410f2019-01-30 17:15:43 -08005#include <cstddef>
Ratan Gupta35297172018-11-28 18:40:16 +05306#include <xyz/openbmc_project/Common/error.hpp>
7
Gunnar Mills57d9c502018-09-14 14:42:34 -05008#include <gtest/gtest.h>
9
Ratan Gupta594123d2017-05-16 22:48:35 +053010namespace phosphor
11{
12namespace network
13{
14
Ratan Gupta35297172018-11-28 18:40:16 +053015using InternalFailure =
16 sdbusplus::xyz::openbmc_project::Common::Error::InternalFailure;
Ratan Gupta594123d2017-05-16 22:48:35 +053017class TestUtil : public testing::Test
18{
Gunnar Mills57d9c502018-09-14 14:42:34 -050019 public:
20 TestUtil()
21 {
22 // Empty
23 }
Ratan Gupta594123d2017-05-16 22:48:35 +053024};
25
William A. Kennington IIId27410f2019-01-30 17:15:43 -080026TEST_F(TestUtil, ToHex)
27{
28 EXPECT_EQ('E', mac_address::internal::toHex(std::byte(0xfe)));
29 EXPECT_EQ('A', mac_address::internal::toHex(std::byte(10)));
30 EXPECT_EQ('4', mac_address::internal::toHex(std::byte(4)));
31}
32
33TEST_F(TestUtil, MacToString)
34{
35 MacAddr mac1{
36 std::byte(0x00), std::byte(0xDE), std::byte(0xAD),
37 std::byte(0x00), std::byte(0xBE), std::byte(0xEF),
38 };
39 EXPECT_EQ("00:DE:AD:00:BE:EF", mac_address::toString(mac1));
40 MacAddr mac2{
41 std::byte(0x70), std::byte(0xFF), std::byte(0x84),
42 std::byte(0x09), std::byte(0x35), std::byte(0x09),
43 };
44 EXPECT_EQ("70:FF:84:09:35:09", mac_address::toString(mac2));
45}
46
Nagaraju Goruganti067ca2d2018-01-17 01:12:00 -060047TEST_F(TestUtil, IpValidation)
48{
49 std::string ipaddress = "0.0.0.0";
50 EXPECT_EQ(true, isValidIP(AF_INET, ipaddress));
51
52 ipaddress = "9.3.185.83";
53 EXPECT_EQ(true, isValidIP(AF_INET, ipaddress));
54
55 ipaddress = "9.3.185.a";
56 EXPECT_EQ(false, isValidIP(AF_INET, ipaddress));
57
58 ipaddress = "9.3.a.83";
59 EXPECT_EQ(false, isValidIP(AF_INET, ipaddress));
60
61 ipaddress = "x.x.x.x";
62 EXPECT_EQ(false, isValidIP(AF_INET, ipaddress));
63
64 ipaddress = "0:0:0:0:0:0:0:0";
65 EXPECT_EQ(true, isValidIP(AF_INET6, ipaddress));
66
67 ipaddress = "1:0:0:0:0:0:0:8";
68 EXPECT_EQ(true, isValidIP(AF_INET6, ipaddress));
69
70 ipaddress = "1::8";
71 EXPECT_EQ(true, isValidIP(AF_INET6, ipaddress));
72
73 ipaddress = "0:0:0:0:0:FFFF:204.152.189.116";
74 EXPECT_EQ(true, isValidIP(AF_INET6, ipaddress));
75
76 ipaddress = "::ffff:204.152.189.116";
77 EXPECT_EQ(true, isValidIP(AF_INET6, ipaddress));
78
79 ipaddress = "a:0:0:0:0:FFFF:204.152.189.116";
80 EXPECT_EQ(true, isValidIP(AF_INET6, ipaddress));
81
82 ipaddress = "1::8";
83 EXPECT_EQ(true, isValidIP(AF_INET6, ipaddress));
Nagaraju Goruganti067ca2d2018-01-17 01:12:00 -060084}
85
86TEST_F(TestUtil, PrefixValidation)
87{
88 uint8_t prefixLength = 1;
89 EXPECT_EQ(true, isValidPrefix(AF_INET, prefixLength));
90
91 prefixLength = 32;
92 EXPECT_EQ(true, isValidPrefix(AF_INET, prefixLength));
93
94 prefixLength = 0;
95 EXPECT_EQ(false, isValidPrefix(AF_INET, prefixLength));
96
97 prefixLength = 33;
98 EXPECT_EQ(false, isValidPrefix(AF_INET, prefixLength));
99
100 prefixLength = 33;
101 EXPECT_EQ(true, isValidPrefix(AF_INET6, prefixLength));
102
103 prefixLength = 65;
104 EXPECT_EQ(false, isValidPrefix(AF_INET, prefixLength));
Nagaraju Goruganti067ca2d2018-01-17 01:12:00 -0600105}
106
Nagaraju Goruganti067ca2d2018-01-17 01:12:00 -0600107TEST_F(TestUtil, MacValidation)
108{
109 std::string macaddress = "00:00:00:00:00:00";
110 EXPECT_EQ(false, phosphor::network::mac_address::validate(macaddress));
111
112 macaddress = "F6:C6:E6:6:B0:D3";
113 EXPECT_EQ(false, phosphor::network::mac_address::validate(macaddress));
114
115 macaddress = "F6:C6:E6:06:B0:D3";
116 EXPECT_EQ(true, phosphor::network::mac_address::validate(macaddress));
117
118 macaddress = "hh:HH:HH:hh:HH:yy";
119 EXPECT_EQ(false, phosphor::network::mac_address::validate(macaddress));
120
121 macaddress = "hhh:GGG:iii:jjj:kkk:lll";
122 EXPECT_EQ(false, phosphor::network::mac_address::validate(macaddress));
Nagaraju Goruganti067ca2d2018-01-17 01:12:00 -0600123}
124
Ratan Gupta594123d2017-05-16 22:48:35 +0530125TEST_F(TestUtil, ConvertV4MasktoPrefix)
126{
127 std::string mask = "255.255.255.0";
128 uint8_t prefix = toCidr(AF_INET, mask);
129 EXPECT_EQ(prefix, 24);
130
131 mask = "255.255.0.0";
132 prefix = toCidr(AF_INET, mask);
133 EXPECT_EQ(prefix, 16);
134
135 mask = "255.0.0.0";
136 prefix = toCidr(AF_INET, mask);
137 EXPECT_EQ(prefix, 8);
138
139 mask = "255.224.0.0";
140 prefix = toCidr(AF_INET, mask);
141 EXPECT_EQ(prefix, 11);
142
Gunnar Mills57d9c502018-09-14 14:42:34 -0500143 // Invalid Mask
Ratan Gupta594123d2017-05-16 22:48:35 +0530144 mask = "255.0.255.0";
145 prefix = toCidr(AF_INET, mask);
146 EXPECT_EQ(prefix, 0);
147}
148
149TEST_F(TestUtil, convertV6MasktoPrefix)
150{
151 std::string mask = "ffff:ffff::";
152 uint8_t prefix = toCidr(AF_INET6, mask);
153 EXPECT_EQ(prefix, 32);
154
155 mask = "ffff:ffff:ffff::";
156 prefix = toCidr(AF_INET6, mask);
157 EXPECT_EQ(prefix, 48);
158
159 mask = "ffff:ffff:fc00::";
160 prefix = toCidr(AF_INET6, mask);
161 EXPECT_EQ(prefix, 38);
162
Gunnar Mills57d9c502018-09-14 14:42:34 -0500163 // Invalid Mask
Ratan Gupta594123d2017-05-16 22:48:35 +0530164 mask = "ffff:0fff::";
165 prefix = toCidr(AF_INET6, mask);
166 EXPECT_EQ(prefix, 0);
167}
168
Ratan Gupta11cef802017-05-29 08:41:48 +0530169TEST_F(TestUtil, isLinkLocaladdress)
Ratan Gupta594123d2017-05-16 22:48:35 +0530170{
171 std::string ipaddress = "fe80:fec0::";
Nagaraju Goruganti66b974d2017-10-03 08:43:08 -0500172 EXPECT_TRUE(isLinkLocalIP(ipaddress));
Ratan Gupta594123d2017-05-16 22:48:35 +0530173
Nagaraju Goruganti66b974d2017-10-03 08:43:08 -0500174 ipaddress = "2000:fe80:789::";
175 EXPECT_FALSE(isLinkLocalIP(ipaddress));
Ratan Gupta594123d2017-05-16 22:48:35 +0530176
177 ipaddress = "2000:fe80::";
Nagaraju Goruganti66b974d2017-10-03 08:43:08 -0500178 EXPECT_FALSE(isLinkLocalIP(ipaddress));
179
180 ipaddress = "169.254.3.3";
181 EXPECT_TRUE(isLinkLocalIP(ipaddress));
182
183 ipaddress = "3.169.254.3";
184 EXPECT_FALSE(isLinkLocalIP(ipaddress));
185
186 ipaddress = "3.3.169.254";
187 EXPECT_FALSE(isLinkLocalIP(ipaddress));
Ratan Gupta594123d2017-05-16 22:48:35 +0530188}
189
190TEST_F(TestUtil, convertPrefixToMask)
191{
192 std::string mask = toMask(AF_INET, 24);
193 EXPECT_EQ(mask, "255.255.255.0");
194
195 mask = toMask(AF_INET, 8);
196 EXPECT_EQ(mask, "255.0.0.0");
197
198 mask = toMask(AF_INET, 27);
199 EXPECT_EQ(mask, "255.255.255.224");
200}
201
Ratan Gupta11cef802017-05-29 08:41:48 +0530202TEST_F(TestUtil, getNetworkAddress)
203{
Gunnar Mills57d9c502018-09-14 14:42:34 -0500204 std::string address = getNetworkID(AF_INET, "9.3.23.251", 24);
205 EXPECT_EQ("9.3.23.0", address);
Ratan Gupta11cef802017-05-29 08:41:48 +0530206
Gunnar Mills57d9c502018-09-14 14:42:34 -0500207 address = getNetworkID(AF_INET, "9.3.23.251", 25);
208 EXPECT_EQ("9.3.23.128", address);
Ratan Gupta11cef802017-05-29 08:41:48 +0530209
Gunnar Mills57d9c502018-09-14 14:42:34 -0500210 address = getNetworkID(AF_INET6, "2001:db8:abcd:dd12::0", 64);
211 EXPECT_EQ("2001:db8:abcd:dd12::", address);
Ratan Gupta11cef802017-05-29 08:41:48 +0530212
Ratan Gupta35297172018-11-28 18:40:16 +0530213 EXPECT_THROW(getNetworkID(AF_INET, "a.b.c.d", 25), InternalFailure);
Ratan Gupta11cef802017-05-29 08:41:48 +0530214
Ratan Gupta35297172018-11-28 18:40:16 +0530215 EXPECT_THROW(getNetworkID(AF_INET6, "2001:db8:gghh:dd12::0", 64),
216 InternalFailure);
Ratan Gupta11cef802017-05-29 08:41:48 +0530217
Gunnar Mills57d9c502018-09-14 14:42:34 -0500218 address = getNetworkID(AF_INET6, "fe80::201:6cff:fe80:228", 64);
219 EXPECT_EQ("fe80::", address);
Ratan Gupta11cef802017-05-29 08:41:48 +0530220}
221
Gunnar Mills57d9c502018-09-14 14:42:34 -0500222} // namespace network
223} // namespace phosphor