blob: 09a96666492e67291e6b3d5cf7ea32c3e5b90c04 [file] [log] [blame]
William A. Kennington IIIbb0eacc2022-10-21 15:22:06 -07001#include "types.hpp"
2
3#include <arpa/inet.h>
4#include <fmt/chrono.h>
5#include <fmt/format.h>
6
William A. Kennington III71de63a2022-11-08 10:50:54 -08007#include <array>
William A. Kennington IIIbb0eacc2022-10-21 15:22:06 -07008#include <sstream>
9#include <string_view>
10
11#include <gtest/gtest.h>
12
13using std::literals::string_view_literals::operator""sv;
14
15TEST(EqualOperator, EthAddr)
16{
17 EXPECT_EQ((ether_addr{0x11, 0x22, 0x33, 0x44, 0x55, 0x66}),
18 (ether_addr{0x11, 0x22, 0x33, 0x44, 0x55, 0x66}));
19 EXPECT_EQ((ether_addr{}), (ether_addr{}));
20 EXPECT_NE((ether_addr{1}), (ether_addr{}));
21}
22
23TEST(EqualOperator, InAddr)
24{
25 EXPECT_EQ((in_addr{0xff00ff00}), (in_addr{0xff00ff00}));
26 EXPECT_EQ((in_addr{}), (in_addr{}));
27 EXPECT_NE((in_addr{1}), (in_addr{}));
28}
29
30TEST(EqualOperator, In6Addr)
31{
32 EXPECT_EQ((in6_addr{0xff, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0xff}),
33 (in6_addr{0xff, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0xff}));
34 EXPECT_EQ((in6_addr{}), (in6_addr{}));
35 EXPECT_NE((in6_addr{1}), (in6_addr{}));
36}
37
38namespace phosphor::network
39{
40
William A. Kennington III71de63a2022-11-08 10:50:54 -080041TEST(Byteswap, Swap)
42{
43 EXPECT_EQ(38, bswap(uint8_t{38}));
44 EXPECT_EQ(38 << 8, bswap(uint16_t{38}));
45 EXPECT_EQ(0x240082fe, bswap(uint32_t{0xfe820024}));
46 EXPECT_EQ(0x240082fe00000000, bswap(uint64_t{0xfe820024}));
47 struct
48 {
49 std::array<char, 4> a = {1, 2, 3, 4};
50 } s;
51 EXPECT_EQ((std::array<char, 4>{4, 3, 2, 1}), bswap(s).a);
52}
53
William A. Kennington III238ef992022-11-03 12:47:49 -070054TEST(DecodeInt, uint8_10)
55{
56 DecodeInt<uint8_t, 10> d;
57 EXPECT_EQ(42, d("42"));
58 EXPECT_EQ(255, d("255"));
59 EXPECT_THROW(d(""), std::invalid_argument);
60 EXPECT_THROW(d("a0"), std::invalid_argument);
61 EXPECT_THROW(d(".0"), std::invalid_argument);
62 EXPECT_THROW(d("257"), std::overflow_error);
63 EXPECT_THROW(d("300"), std::overflow_error);
64}
65
66TEST(DecodeInt, uint8_16)
67{
68 DecodeInt<uint8_t, 16> d;
69 EXPECT_EQ(0x42, d("42"));
70 EXPECT_EQ(0xff, d("ff"));
71 EXPECT_THROW(d(""), std::invalid_argument);
72 EXPECT_THROW(d("g0"), std::invalid_argument);
73 EXPECT_THROW(d(".0"), std::invalid_argument);
74 EXPECT_THROW(d("100"), std::overflow_error);
75}
76
William A. Kennington IIIbb0eacc2022-10-21 15:22:06 -070077TEST(EqualOperator, InAddrAny)
78{
79 EXPECT_EQ(InAddrAny(in6_addr{0xff, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
80 0xff}),
81 (in6_addr{0xff, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0xff}));
82 EXPECT_NE(InAddrAny(in6_addr{0xff, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
83 0xff}),
84 (in_addr{}));
85 EXPECT_EQ((in6_addr{}), InAddrAny(in6_addr{}));
86 EXPECT_NE((in_addr{}), InAddrAny(in6_addr{}));
87 EXPECT_NE(InAddrAny(in6_addr{1}), InAddrAny(in6_addr{}));
88}
89
William A. Kennington IIIb01d08f2022-11-03 12:50:00 -070090TEST(ToAddr, EtherAddr)
91{
92 EXPECT_THROW(ToAddr<ether_addr>{}("0x:00:00:00:00:00"),
93 std::invalid_argument);
94 EXPECT_THROW(ToAddr<ether_addr>{}("00:00:00:00:00"), std::invalid_argument);
95 EXPECT_THROW(ToAddr<ether_addr>{}("00:00:00:00:00:"),
96 std::invalid_argument);
97 EXPECT_THROW(ToAddr<ether_addr>{}("00:00:00:00::00"),
98 std::invalid_argument);
99 EXPECT_THROW(ToAddr<ether_addr>{}(":00:00:00:00:00"),
100 std::invalid_argument);
101 EXPECT_THROW(ToAddr<ether_addr>{}("00::00:00:00:00"),
102 std::invalid_argument);
103 EXPECT_THROW(ToAddr<ether_addr>{}(":::::"), std::invalid_argument);
104 EXPECT_THROW(ToAddr<ether_addr>{}("00:0:0:0:0"), std::invalid_argument);
105 EXPECT_THROW(ToAddr<ether_addr>{}("00:00:00:00:00:00:00"),
106 std::invalid_argument);
107 EXPECT_THROW(ToAddr<ether_addr>{}(""), std::invalid_argument);
108 EXPECT_THROW(ToAddr<ether_addr>{}("123456789XYZ"), std::invalid_argument);
109 EXPECT_THROW(ToAddr<ether_addr>{}("123456789AB"), std::overflow_error);
110 EXPECT_THROW(ToAddr<ether_addr>{}("123456789ABCD"), std::overflow_error);
111
112 EXPECT_EQ((ether_addr{}), ToAddr<ether_addr>{}("00:00:00:00:00:00"));
113 EXPECT_EQ((ether_addr{0xff, 0xee, 0xdd, 0xcc, 0xbb, 0xaa}),
114 ToAddr<ether_addr>{}("FF:EE:DD:cc:bb:aa"));
115 EXPECT_EQ((ether_addr{0x00, 0x01, 0x02, 0x03, 0x04, 0x05}),
116 ToAddr<ether_addr>{}("0:1:2:3:4:5"));
117 EXPECT_EQ((ether_addr{0x01, 0x23, 0x45, 0x67, 0x89, 0xab}),
118 ToAddr<ether_addr>{}("0123456789AB"));
119 EXPECT_EQ((ether_addr{0xff, 0xee, 0xdd, 0xcc, 0xbb, 0xaa}),
120 ToAddr<ether_addr>{}("FFEEDDccbbaa"));
121}
122
William A. Kennington IIIdf1178e2022-11-03 12:56:33 -0700123TEST(ToAddr, InAddr)
124{
125 EXPECT_THROW(ToAddr<in_addr>{}(""), std::invalid_argument);
126 EXPECT_THROW(ToAddr<in_addr>{}("0"), std::invalid_argument);
127 EXPECT_THROW(ToAddr<in_addr>{}("0.0.0"), std::invalid_argument);
128 EXPECT_THROW(ToAddr<in_addr>{}("0.0.0."), std::invalid_argument);
129 EXPECT_THROW(ToAddr<in_addr>{}(".0.0.0"), std::invalid_argument);
130 EXPECT_THROW(ToAddr<in_addr>{}("0.0.0.0.0"), std::invalid_argument);
131 EXPECT_THROW(ToAddr<in_addr>{}("x.0.0.0"), std::invalid_argument);
132 EXPECT_THROW(ToAddr<in_addr>{}("ff.0.0.0"), std::invalid_argument);
133 EXPECT_THROW(ToAddr<in_addr>{}("256.0.0.0"), std::overflow_error);
134
135 EXPECT_EQ((in_addr{}), ToAddr<in_addr>{}("0.0.0.0"));
136 EXPECT_EQ((in_addr{htonl(0xc0a80101)}), ToAddr<in_addr>{}("192.168.001.1"));
137}
138
William A. Kennington IIIbb0eacc2022-10-21 15:22:06 -0700139namespace detail
140{
141
142TEST(BufMaker, EthAddr)
143{
144 AddrBufMaker<ether_addr> abm;
145 EXPECT_EQ("11:22:33:44:55:66"sv,
146 abm(ether_addr{0x11, 0x22, 0x33, 0x44, 0x55, 0x66}));
147 EXPECT_EQ("01:02:03:04:05:67"sv,
148 abm(ether_addr{0x01, 0x02, 0x03, 0x04, 0x05, 0x67}));
149 EXPECT_EQ("00:00:00:00:00:00"sv,
150 abm(ether_addr{0x00, 0x00, 0x00, 0x00, 0x00, 0x00}));
151}
152
153TEST(BufMaker, InAddr)
154{
155 AddrBufMaker<in_addr> abm;
156 EXPECT_EQ("255.255.255.255"sv, abm(in_addr{0xffffffff}));
157 EXPECT_EQ("1.15.3.4"sv, abm(in_addr{htonl(0x010f0304)}));
158 EXPECT_EQ("0.0.0.0"sv, abm(in_addr{}));
159}
160
161TEST(BufMaker, In6Addr)
162{
163 AddrBufMaker<in6_addr> abm;
164 EXPECT_EQ("::"sv, abm(in6_addr{}));
165 EXPECT_EQ("ff::"sv, abm(in6_addr{0, 0xff}));
166 EXPECT_EQ("::ff"sv,
167 abm(in6_addr{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0xff}));
168 EXPECT_EQ("0:0:ff::ff"sv, abm(in6_addr{0, 0, 0, 0, 0, 0xff, 0, 0, 0, 0, 0,
169 0, 0, 0, 0, 0xff}));
170 EXPECT_EQ("::100:0:ff"sv,
171 abm(in6_addr{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0xff}));
172 EXPECT_EQ("ff00::"sv, abm(in6_addr{0xff}));
173 EXPECT_EQ("1:2:3:4:5:6:7:8"sv,
174 abm(in6_addr{0, 1, 0, 2, 0, 3, 0, 4, 0, 5, 0, 6, 0, 7, 0, 8}));
William A. Kennington III4f077982022-11-04 02:10:48 -0700175 // rfc5952 4.2.2
176 EXPECT_EQ("1:2:3:4:0:6:7:8"sv,
177 abm(in6_addr{0, 1, 0, 2, 0, 3, 0, 4, 0, 0, 0, 6, 0, 7, 0, 8}));
178 // rfc5952 4.2.3
179 EXPECT_EQ("1::4:0:0:7:8"sv,
180 abm(in6_addr{0, 1, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 7, 0, 8}));
181 // rfc5952 5
182 EXPECT_EQ("::ffff:192.168.0.1"sv,
183 abm(in6_addr{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0xff, 0xff, 192, 168,
184 0, 1}));
William A. Kennington IIIbb0eacc2022-10-21 15:22:06 -0700185}
186
187TEST(BasicOps, AllAddrs)
188{
189 EXPECT_NE(InAddrAny{in6_addr{}}, InAddrAny{in_addr{}});
190
191 EXPECT_EQ("a 01:00:00:00:00:00", fmt::format("a {}", ether_addr{1}));
192 EXPECT_EQ("a 0.0.0.1", fmt::format("a {}", in_addr{htonl(1)}));
193 EXPECT_EQ("a 0.0.0.1", fmt::format("a {}", InAddrAny{in_addr{htonl(1)}}));
194 EXPECT_EQ("a 100::", fmt::format("a {}", in6_addr{1}));
195 EXPECT_EQ("a 100::", fmt::format("a {}", InAddrAny{in6_addr{1}}));
William A. Kennington IIIb9d7cba2022-11-08 10:54:11 -0800196 EXPECT_EQ("a 100::/90", fmt::format("a {}", IfAddr{in6_addr{1}, 90}));
William A. Kennington IIIbb0eacc2022-10-21 15:22:06 -0700197
198 EXPECT_EQ("01:00:00:00:00:00", std::to_string(ether_addr{1}));
199 EXPECT_EQ("0.0.0.1", std::to_string(in_addr{htonl(1)}));
200 EXPECT_EQ("0.0.0.1", std::to_string(InAddrAny{in_addr{htonl(1)}}));
201 EXPECT_EQ("100::", std::to_string(in6_addr{1}));
202 EXPECT_EQ("100::", std::to_string(InAddrAny{in6_addr{1}}));
William A. Kennington IIIb9d7cba2022-11-08 10:54:11 -0800203 EXPECT_EQ("100::/22", std::to_string(IfAddr{in6_addr{1}, 22}));
William A. Kennington IIIbb0eacc2022-10-21 15:22:06 -0700204
205 EXPECT_EQ("a01:00:00:00:00:00",
206 (std::stringstream{} << "a" << ether_addr{1}).str());
207 EXPECT_EQ("a0.0.0.1",
208 (std::stringstream{} << "a" << in_addr{htonl(1)}).str());
209 EXPECT_EQ(
210 "a0.0.0.1",
211 (std::stringstream{} << "a" << InAddrAny{in_addr{htonl(1)}}).str());
212 EXPECT_EQ("a100::", (std::stringstream{} << "a" << in6_addr{1}).str());
213 EXPECT_EQ("a100::",
214 (std::stringstream{} << "a" << InAddrAny{in6_addr{1}}).str());
William A. Kennington IIIb9d7cba2022-11-08 10:54:11 -0800215 auto ss = std::stringstream{};
216 constexpr auto addr = IfAddr{in6_addr{1}, 30};
217 ss << "a" << addr;
218 EXPECT_EQ("a100::/30", ss.str());
219
220 EXPECT_NO_THROW(IfAddr(in6_addr{}, 128));
221 EXPECT_NO_THROW(IfAddr(in_addr{}, 32));
222 EXPECT_THROW(IfAddr(in6_addr{}, 129), std::invalid_argument);
223 EXPECT_THROW(IfAddr(in_addr{}, 33), std::invalid_argument);
William A. Kennington IIIbb0eacc2022-10-21 15:22:06 -0700224}
225
226TEST(Perf, In6Addr)
227{
228 GTEST_SKIP();
229 auto start = std::chrono::steady_clock::now();
230 for (size_t i = 0; i < 10000000; ++i)
231 {
232 AddrBufMaker<in6_addr>{}(in6_addr{1});
233 }
234 fmt::print("Duration: {}\n", std::chrono::steady_clock::now() - start);
235 // Make sure this test isn't enabled
236 EXPECT_FALSE(true);
237}
238
239} // namespace detail
240} // namespace phosphor::network