blob: 319a514731ccc612245458775801175a2b3fdf9e [file] [log] [blame]
William A. Kennington III14dd4eb2023-01-12 10:51:12 -08001#include <fmt/format.h>
2
3#include <stdplus/net/addr/subnet.hpp>
4
William A. Kennington III160e3822023-06-16 17:09:43 -07005#include <string_view>
6
William A. Kennington III14dd4eb2023-01-12 10:51:12 -08007#include <gtest/gtest.h>
8
William A. Kennington III160e3822023-06-16 17:09:43 -07009using std::literals::string_view_literals::operator""sv;
10
William A. Kennington III14dd4eb2023-01-12 10:51:12 -080011namespace stdplus
12{
13
14auto addr4Full = In4Addr{255, 255, 255, 255};
15auto addr6Full = In6Addr{255, 255, 255, 255, 255, 255, 255, 255,
16 255, 255, 255, 255, 255, 255, 255, 255};
17
18TEST(Subnet4, Basic)
19{
20 EXPECT_NO_THROW(Subnet4(in_addr{0xffffffff}, 32));
21 EXPECT_NO_THROW(Subnet4(addr4Full, 0));
22 EXPECT_NO_THROW(Subnet4(in_addr{}, 10));
23 EXPECT_THROW(Subnet4(in_addr{0xffffffff}, 33), std::invalid_argument);
24 EXPECT_THROW(Subnet4(in_addr{0xffffffff}, 64), std::invalid_argument);
25
26 EXPECT_NE(Subnet4(in_addr{0xff}, 32), Subnet4(in_addr{}, 32));
27 EXPECT_NE(Subnet4(in_addr{0xff}, 26), Subnet4(in_addr{0xff}, 27));
28 EXPECT_EQ(Subnet4(in_addr{0xff}, 32), Subnet4(in_addr{0xff}, 32));
29 EXPECT_EQ(Subnet4(in_addr{}, 1), Subnet4(in_addr{}, 1));
30}
31
32TEST(Subnet4, Network)
33{
34 EXPECT_EQ((In4Addr{}), Subnet4(In4Addr{}, 32).network());
35 EXPECT_EQ(addr4Full, Subnet4(addr4Full, 32).network());
36 EXPECT_EQ((In4Addr{255, 255, 128, 0}), Subnet4(addr4Full, 17).network());
37 EXPECT_EQ((In4Addr{255, 255, 0, 0}), Subnet4(addr4Full, 16).network());
38 EXPECT_EQ((In4Addr{255, 254, 0, 0}), Subnet4(addr4Full, 15).network());
39 EXPECT_EQ((In4Addr{}), Subnet4(addr4Full, 0).network());
40 EXPECT_EQ((In4Addr{}), Subnet4(In4Addr{}, 0).network());
41}
42
43TEST(Subnet4, Contains)
44{
45 EXPECT_TRUE(Subnet4(addr4Full, 32).contains(addr4Full));
46 EXPECT_FALSE(Subnet4(addr4Full, 32).contains(In4Addr{255, 255, 255, 254}));
47 EXPECT_FALSE(Subnet4(addr4Full, 32).contains(In4Addr{}));
48 EXPECT_TRUE(
49 Subnet4(addr4Full, 17).contains(static_cast<in_addr>(addr4Full)));
50 EXPECT_TRUE(Subnet4(addr4Full, 17).contains(In4Addr{255, 255, 128, 134}));
51 EXPECT_FALSE(Subnet4(addr4Full, 17).contains(In4Addr{255, 255, 127, 132}));
52 EXPECT_TRUE(Subnet4(addr4Full, 14).contains(addr4Full));
53 EXPECT_TRUE(Subnet4(addr4Full, 0).contains(addr4Full));
54 EXPECT_TRUE(Subnet4(In4Addr{}, 0).contains(addr4Full));
55 EXPECT_TRUE(Subnet4(addr4Full, 0).contains(In4Addr{}));
56}
57
William A. Kennington III160e3822023-06-16 17:09:43 -070058TEST(Subnet4, FromStr)
59{
60 constexpr FromStr<Subnet4> fs;
61 EXPECT_THROW(fs("10"sv), std::invalid_argument);
62 EXPECT_THROW(fs("/10"sv), std::invalid_argument);
63 EXPECT_THROW(fs("0.0.0.0"sv), std::invalid_argument);
64 EXPECT_THROW(fs("0.0.0.0/"sv), std::invalid_argument);
65 EXPECT_THROW(fs("::/80"sv), std::invalid_argument);
66 EXPECT_EQ((SubnetAny{in_addr{}, 30}), fs("0.0.0.0/30"sv));
67}
68
William A. Kennington IIId5957f52023-06-16 16:55:01 -070069TEST(Subnet4, ToStr)
70{
71 ToStrHandle<ToStr<Subnet4>> tsh;
72 EXPECT_EQ("0.0.0.0/16", tsh(Subnet4({}, 16)));
73 EXPECT_EQ("255.0.255.255/28", tsh(Subnet4(In4Addr{255, 0, 255, 255}, 28)));
74 EXPECT_EQ("a 1.2.3.4/32 b",
75 fmt::format("a {} b", Subnet4(In4Addr{1, 2, 3, 4}, 32)));
76}
77
William A. Kennington III14dd4eb2023-01-12 10:51:12 -080078TEST(Subnet6, Basic)
79{
80 EXPECT_NO_THROW(Subnet6(in6_addr{0xff}, 128));
81 EXPECT_NO_THROW(Subnet6(addr6Full, 0));
82 EXPECT_NO_THROW(Subnet6(in6_addr{}, 65));
83 EXPECT_THROW(Subnet6(in6_addr{0xff}, 129), std::invalid_argument);
84 EXPECT_THROW(Subnet6(in6_addr{0xff}, 150), std::invalid_argument);
85
86 EXPECT_NE(Subnet6(in6_addr{0xff}, 32), Subnet6(in6_addr{}, 32));
87 EXPECT_NE(Subnet6(in6_addr{0xff}, 26), Subnet6(in6_addr{0xff}, 27));
88 EXPECT_EQ(Subnet6(in6_addr{0xff}, 32), Subnet6(in6_addr{0xff}, 32));
89 EXPECT_EQ(Subnet6(in6_addr{}, 1), Subnet6(in6_addr{}, 1));
90}
91
92TEST(Subnet6, Network)
93{
94 EXPECT_EQ(In6Addr(), Subnet6(In6Addr(), 128).network());
95 EXPECT_EQ(addr6Full, Subnet6(addr6Full, 128).network());
96 EXPECT_EQ((In6Addr{255, 255, 255, 255, 224}),
97 Subnet6(addr6Full, 35).network());
98 EXPECT_EQ((In6Addr{255, 255, 255, 255}), Subnet6(addr6Full, 32).network());
99 EXPECT_EQ((In6Addr{255, 255, 128, 0}), Subnet6(addr6Full, 17).network());
100 EXPECT_EQ((In6Addr{255, 255, 0, 0}), Subnet6(addr6Full, 16).network());
101 EXPECT_EQ((In6Addr{255, 254, 0, 0}), Subnet6(addr6Full, 15).network());
102 EXPECT_EQ((In6Addr{}), Subnet6(addr6Full, 0).network());
103 EXPECT_EQ((In6Addr{}), Subnet6(In6Addr{}, 0).network());
104}
105
106TEST(Subnet6, Contains)
107{
108 auto addr6NFull = addr6Full;
109 addr6NFull.s6_addr[15] = 254;
110 EXPECT_TRUE(Subnet6(addr6Full, 128).contains(addr6Full));
111 EXPECT_FALSE(Subnet6(addr6Full, 128).contains(addr6NFull));
112 EXPECT_FALSE(Subnet6(addr6Full, 128).contains(In6Addr{}));
113 EXPECT_TRUE(
114 Subnet6(addr6Full, 127).contains(static_cast<in6_addr>(addr6Full)));
115 EXPECT_TRUE(Subnet6(addr6Full, 127).contains(addr6NFull));
116 EXPECT_TRUE(
117 Subnet6(addr6Full, 33).contains(In6Addr{255, 255, 255, 255, 128, 255}));
118 EXPECT_FALSE(
119 Subnet6(addr6Full, 33).contains(In6Addr{255, 255, 255, 255, 127}));
120 EXPECT_TRUE(Subnet6(In6Addr{}, 33).contains(In6Addr{0, 0, 0, 0, 127}));
121 EXPECT_TRUE(
122 Subnet6(addr6Full, 14).contains(In6Addr{255, 255, 0, 0, 0, 0, 0, 145}));
123 EXPECT_FALSE(Subnet6(addr6Full, 14).contains(In6Addr{255, 127, 1}));
124 EXPECT_TRUE(Subnet6(addr6Full, 0).contains(addr6Full));
125 EXPECT_TRUE(Subnet6(In6Addr{}, 0).contains(addr6Full));
126 EXPECT_TRUE(Subnet6(addr6Full, 0).contains(In6Addr{}));
127}
128
William A. Kennington III160e3822023-06-16 17:09:43 -0700129TEST(Subnet6, FromStr)
130{
131 constexpr FromStr<Subnet6> fs;
132 EXPECT_THROW(fs("10"sv), std::invalid_argument);
133 EXPECT_THROW(fs("/10"sv), std::invalid_argument);
134 EXPECT_THROW(fs("ff::"sv), std::invalid_argument);
135 EXPECT_THROW(fs("::/"sv), std::invalid_argument);
136 EXPECT_THROW(fs("0.0.0.0/0"sv), std::invalid_argument);
137 EXPECT_EQ((Subnet6{in6_addr{}, 80}), fs("::/80"sv));
138}
139
William A. Kennington IIId5957f52023-06-16 16:55:01 -0700140TEST(Subnet6, ToStr)
141{
142 ToStrHandle<ToStr<Subnet6>> tsh;
143 EXPECT_EQ("::/0", tsh(Subnet6({}, 0)));
144 EXPECT_EQ("ff00::/128", tsh(Subnet6(In6Addr{0xff}, 128)));
145 EXPECT_EQ("a 102:304::/32 b",
146 fmt::format("a {} b", Subnet6(In6Addr{1, 2, 3, 4}, 32)));
147}
148
William A. Kennington III14dd4eb2023-01-12 10:51:12 -0800149TEST(SubnetAny, Basic)
150{
151 EXPECT_NO_THROW(SubnetAny(in_addr{0xffffffff}, 32));
152 EXPECT_NO_THROW(SubnetAny(addr4Full, 0));
153 EXPECT_NO_THROW(SubnetAny(InAnyAddr{addr4Full}, 0));
154 EXPECT_NO_THROW(SubnetAny(in_addr{}, 10));
155 EXPECT_THROW(SubnetAny(in_addr{0xffffffff}, 33), std::invalid_argument);
156 EXPECT_THROW(SubnetAny(InAnyAddr{in_addr{0xffffffff}}, 33),
157 std::invalid_argument);
158 EXPECT_THROW(SubnetAny(in_addr{0xffffffff}, 64), std::invalid_argument);
159 EXPECT_NO_THROW(SubnetAny(in6_addr{0xff}, 128));
160 EXPECT_NO_THROW(SubnetAny(addr6Full, 0));
161 EXPECT_NO_THROW(SubnetAny(InAnyAddr{addr6Full}, 0));
162 EXPECT_NO_THROW(SubnetAny(in6_addr{}, 65));
163 EXPECT_THROW(SubnetAny(in6_addr{0xff}, 129), std::invalid_argument);
164 EXPECT_THROW(SubnetAny(InAnyAddr{in6_addr{0xff}}, 129),
165 std::invalid_argument);
166 EXPECT_THROW(SubnetAny(in6_addr{0xff}, 150), std::invalid_argument);
167
168 EXPECT_NO_THROW(SubnetAny(Subnet4(in_addr{}, 32)));
169 EXPECT_NO_THROW(SubnetAny(Subnet6(in6_addr{0xff}, 128)));
170
171 EXPECT_NE(SubnetAny(in6_addr{0xff}, 32), Subnet6(in6_addr{}, 32));
172 EXPECT_NE(Subnet6(in6_addr{0xff}, 26), SubnetAny(in6_addr{0xff}, 27));
173 EXPECT_EQ(SubnetAny(in6_addr{0xff}, 32), Subnet6(in6_addr{0xff}, 32));
174 EXPECT_EQ(SubnetAny(in6_addr{0xff}, 32), SubnetAny(in6_addr{0xff}, 32));
175 EXPECT_NE(SubnetAny(in6_addr{0xff}, 32), Subnet4(in_addr{0xff}, 32));
176 EXPECT_NE(SubnetAny(in_addr{0xff}, 32), Subnet4(in_addr{}, 32));
177 EXPECT_NE(Subnet4(in_addr{0xff}, 26), SubnetAny(in_addr{0xff}, 27));
178 EXPECT_EQ(SubnetAny(in_addr{0xff}, 32), Subnet4(in_addr{0xff}, 32));
179 EXPECT_EQ(SubnetAny(in_addr{0xff}, 32), SubnetAny(in_addr{0xff}, 32));
180}
181
182TEST(SubnetAny, Network)
183{
184 EXPECT_EQ(In6Addr(), SubnetAny(In6Addr(), 128).network());
185 EXPECT_EQ(addr6Full, SubnetAny(addr6Full, 128).network());
186 EXPECT_EQ(In6Addr(), SubnetAny(addr6Full, 0).network());
187 EXPECT_EQ(In4Addr(), SubnetAny(In4Addr(), 32).network());
188 EXPECT_EQ(addr4Full, SubnetAny(addr4Full, 32).network());
189 EXPECT_EQ(In4Addr(), SubnetAny(addr4Full, 0).network());
190}
191
192TEST(SubnetAny, Contains)
193{
194 EXPECT_TRUE(SubnetAny(addr6Full, 128).contains(addr6Full));
195 EXPECT_TRUE(SubnetAny(addr6Full, 128).contains(InAnyAddr{addr6Full}));
196 EXPECT_FALSE(SubnetAny(addr6Full, 128).contains(in6_addr{}));
197 EXPECT_FALSE(SubnetAny(addr6Full, 128).contains(InAnyAddr(in6_addr{})));
198 EXPECT_TRUE(SubnetAny(addr4Full, 32).contains(addr4Full));
199 EXPECT_TRUE(SubnetAny(addr4Full, 32).contains(InAnyAddr{addr4Full}));
200 EXPECT_FALSE(SubnetAny(addr4Full, 32).contains(in_addr{}));
201 EXPECT_FALSE(SubnetAny(addr4Full, 32).contains(InAnyAddr{In4Addr{}}));
202}
203
William A. Kennington III160e3822023-06-16 17:09:43 -0700204TEST(SubnetAny, FromStr)
205{
206 constexpr FromStr<SubnetAny> fs;
207 EXPECT_THROW(fs("10"sv), std::invalid_argument);
208 EXPECT_THROW(fs("/10"sv), std::invalid_argument);
209 EXPECT_THROW(fs("0.0.0.0"sv), std::invalid_argument);
210 EXPECT_THROW(fs("0.0.0.0/"sv), std::invalid_argument);
211 EXPECT_EQ((SubnetAny{in_addr{}, 0}), fs("0.0.0.0/0"sv));
212 EXPECT_EQ((SubnetAny{in_addr{}, 30}), fs("0.0.0.0/30"sv));
213 EXPECT_EQ((SubnetAny{in6_addr{}, 80}), fs("::/80"sv));
214}
215
William A. Kennington IIId5957f52023-06-16 16:55:01 -0700216TEST(SubnetAny, ToStr)
217{
218 ToStrHandle<ToStr<SubnetAny>> tsh;
219 EXPECT_EQ("0.0.0.0/16", tsh(SubnetAny(In4Addr{}, 16)));
220 EXPECT_EQ("ff00::/128", tsh(SubnetAny(In6Addr{0xff}, 128)));
221 EXPECT_EQ("a 102:304::/32 b",
222 fmt::format("a {} b", SubnetAny(In6Addr{1, 2, 3, 4}, 32)));
223 EXPECT_EQ("a 1.2.3.4/32 b",
224 fmt::format("a {} b", SubnetAny(In4Addr{1, 2, 3, 4}, 32)));
225}
226
William A. Kennington III14dd4eb2023-01-12 10:51:12 -0800227} // namespace stdplus