blob: 50249283412d0cab12edc32a3717fb8797f57d2d [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
5#include <gtest/gtest.h>
6
7namespace stdplus
8{
9
10auto addr4Full = In4Addr{255, 255, 255, 255};
11auto addr6Full = In6Addr{255, 255, 255, 255, 255, 255, 255, 255,
12 255, 255, 255, 255, 255, 255, 255, 255};
13
14TEST(Subnet4, Basic)
15{
16 EXPECT_NO_THROW(Subnet4(in_addr{0xffffffff}, 32));
17 EXPECT_NO_THROW(Subnet4(addr4Full, 0));
18 EXPECT_NO_THROW(Subnet4(in_addr{}, 10));
19 EXPECT_THROW(Subnet4(in_addr{0xffffffff}, 33), std::invalid_argument);
20 EXPECT_THROW(Subnet4(in_addr{0xffffffff}, 64), std::invalid_argument);
21
22 EXPECT_NE(Subnet4(in_addr{0xff}, 32), Subnet4(in_addr{}, 32));
23 EXPECT_NE(Subnet4(in_addr{0xff}, 26), Subnet4(in_addr{0xff}, 27));
24 EXPECT_EQ(Subnet4(in_addr{0xff}, 32), Subnet4(in_addr{0xff}, 32));
25 EXPECT_EQ(Subnet4(in_addr{}, 1), Subnet4(in_addr{}, 1));
26}
27
28TEST(Subnet4, Network)
29{
30 EXPECT_EQ((In4Addr{}), Subnet4(In4Addr{}, 32).network());
31 EXPECT_EQ(addr4Full, Subnet4(addr4Full, 32).network());
32 EXPECT_EQ((In4Addr{255, 255, 128, 0}), Subnet4(addr4Full, 17).network());
33 EXPECT_EQ((In4Addr{255, 255, 0, 0}), Subnet4(addr4Full, 16).network());
34 EXPECT_EQ((In4Addr{255, 254, 0, 0}), Subnet4(addr4Full, 15).network());
35 EXPECT_EQ((In4Addr{}), Subnet4(addr4Full, 0).network());
36 EXPECT_EQ((In4Addr{}), Subnet4(In4Addr{}, 0).network());
37}
38
39TEST(Subnet4, Contains)
40{
41 EXPECT_TRUE(Subnet4(addr4Full, 32).contains(addr4Full));
42 EXPECT_FALSE(Subnet4(addr4Full, 32).contains(In4Addr{255, 255, 255, 254}));
43 EXPECT_FALSE(Subnet4(addr4Full, 32).contains(In4Addr{}));
44 EXPECT_TRUE(
45 Subnet4(addr4Full, 17).contains(static_cast<in_addr>(addr4Full)));
46 EXPECT_TRUE(Subnet4(addr4Full, 17).contains(In4Addr{255, 255, 128, 134}));
47 EXPECT_FALSE(Subnet4(addr4Full, 17).contains(In4Addr{255, 255, 127, 132}));
48 EXPECT_TRUE(Subnet4(addr4Full, 14).contains(addr4Full));
49 EXPECT_TRUE(Subnet4(addr4Full, 0).contains(addr4Full));
50 EXPECT_TRUE(Subnet4(In4Addr{}, 0).contains(addr4Full));
51 EXPECT_TRUE(Subnet4(addr4Full, 0).contains(In4Addr{}));
52}
53
William A. Kennington IIId5957f52023-06-16 16:55:01 -070054TEST(Subnet4, ToStr)
55{
56 ToStrHandle<ToStr<Subnet4>> tsh;
57 EXPECT_EQ("0.0.0.0/16", tsh(Subnet4({}, 16)));
58 EXPECT_EQ("255.0.255.255/28", tsh(Subnet4(In4Addr{255, 0, 255, 255}, 28)));
59 EXPECT_EQ("a 1.2.3.4/32 b",
60 fmt::format("a {} b", Subnet4(In4Addr{1, 2, 3, 4}, 32)));
61}
62
William A. Kennington III14dd4eb2023-01-12 10:51:12 -080063TEST(Subnet6, Basic)
64{
65 EXPECT_NO_THROW(Subnet6(in6_addr{0xff}, 128));
66 EXPECT_NO_THROW(Subnet6(addr6Full, 0));
67 EXPECT_NO_THROW(Subnet6(in6_addr{}, 65));
68 EXPECT_THROW(Subnet6(in6_addr{0xff}, 129), std::invalid_argument);
69 EXPECT_THROW(Subnet6(in6_addr{0xff}, 150), std::invalid_argument);
70
71 EXPECT_NE(Subnet6(in6_addr{0xff}, 32), Subnet6(in6_addr{}, 32));
72 EXPECT_NE(Subnet6(in6_addr{0xff}, 26), Subnet6(in6_addr{0xff}, 27));
73 EXPECT_EQ(Subnet6(in6_addr{0xff}, 32), Subnet6(in6_addr{0xff}, 32));
74 EXPECT_EQ(Subnet6(in6_addr{}, 1), Subnet6(in6_addr{}, 1));
75}
76
77TEST(Subnet6, Network)
78{
79 EXPECT_EQ(In6Addr(), Subnet6(In6Addr(), 128).network());
80 EXPECT_EQ(addr6Full, Subnet6(addr6Full, 128).network());
81 EXPECT_EQ((In6Addr{255, 255, 255, 255, 224}),
82 Subnet6(addr6Full, 35).network());
83 EXPECT_EQ((In6Addr{255, 255, 255, 255}), Subnet6(addr6Full, 32).network());
84 EXPECT_EQ((In6Addr{255, 255, 128, 0}), Subnet6(addr6Full, 17).network());
85 EXPECT_EQ((In6Addr{255, 255, 0, 0}), Subnet6(addr6Full, 16).network());
86 EXPECT_EQ((In6Addr{255, 254, 0, 0}), Subnet6(addr6Full, 15).network());
87 EXPECT_EQ((In6Addr{}), Subnet6(addr6Full, 0).network());
88 EXPECT_EQ((In6Addr{}), Subnet6(In6Addr{}, 0).network());
89}
90
91TEST(Subnet6, Contains)
92{
93 auto addr6NFull = addr6Full;
94 addr6NFull.s6_addr[15] = 254;
95 EXPECT_TRUE(Subnet6(addr6Full, 128).contains(addr6Full));
96 EXPECT_FALSE(Subnet6(addr6Full, 128).contains(addr6NFull));
97 EXPECT_FALSE(Subnet6(addr6Full, 128).contains(In6Addr{}));
98 EXPECT_TRUE(
99 Subnet6(addr6Full, 127).contains(static_cast<in6_addr>(addr6Full)));
100 EXPECT_TRUE(Subnet6(addr6Full, 127).contains(addr6NFull));
101 EXPECT_TRUE(
102 Subnet6(addr6Full, 33).contains(In6Addr{255, 255, 255, 255, 128, 255}));
103 EXPECT_FALSE(
104 Subnet6(addr6Full, 33).contains(In6Addr{255, 255, 255, 255, 127}));
105 EXPECT_TRUE(Subnet6(In6Addr{}, 33).contains(In6Addr{0, 0, 0, 0, 127}));
106 EXPECT_TRUE(
107 Subnet6(addr6Full, 14).contains(In6Addr{255, 255, 0, 0, 0, 0, 0, 145}));
108 EXPECT_FALSE(Subnet6(addr6Full, 14).contains(In6Addr{255, 127, 1}));
109 EXPECT_TRUE(Subnet6(addr6Full, 0).contains(addr6Full));
110 EXPECT_TRUE(Subnet6(In6Addr{}, 0).contains(addr6Full));
111 EXPECT_TRUE(Subnet6(addr6Full, 0).contains(In6Addr{}));
112}
113
William A. Kennington IIId5957f52023-06-16 16:55:01 -0700114TEST(Subnet6, ToStr)
115{
116 ToStrHandle<ToStr<Subnet6>> tsh;
117 EXPECT_EQ("::/0", tsh(Subnet6({}, 0)));
118 EXPECT_EQ("ff00::/128", tsh(Subnet6(In6Addr{0xff}, 128)));
119 EXPECT_EQ("a 102:304::/32 b",
120 fmt::format("a {} b", Subnet6(In6Addr{1, 2, 3, 4}, 32)));
121}
122
William A. Kennington III14dd4eb2023-01-12 10:51:12 -0800123TEST(SubnetAny, Basic)
124{
125 EXPECT_NO_THROW(SubnetAny(in_addr{0xffffffff}, 32));
126 EXPECT_NO_THROW(SubnetAny(addr4Full, 0));
127 EXPECT_NO_THROW(SubnetAny(InAnyAddr{addr4Full}, 0));
128 EXPECT_NO_THROW(SubnetAny(in_addr{}, 10));
129 EXPECT_THROW(SubnetAny(in_addr{0xffffffff}, 33), std::invalid_argument);
130 EXPECT_THROW(SubnetAny(InAnyAddr{in_addr{0xffffffff}}, 33),
131 std::invalid_argument);
132 EXPECT_THROW(SubnetAny(in_addr{0xffffffff}, 64), std::invalid_argument);
133 EXPECT_NO_THROW(SubnetAny(in6_addr{0xff}, 128));
134 EXPECT_NO_THROW(SubnetAny(addr6Full, 0));
135 EXPECT_NO_THROW(SubnetAny(InAnyAddr{addr6Full}, 0));
136 EXPECT_NO_THROW(SubnetAny(in6_addr{}, 65));
137 EXPECT_THROW(SubnetAny(in6_addr{0xff}, 129), std::invalid_argument);
138 EXPECT_THROW(SubnetAny(InAnyAddr{in6_addr{0xff}}, 129),
139 std::invalid_argument);
140 EXPECT_THROW(SubnetAny(in6_addr{0xff}, 150), std::invalid_argument);
141
142 EXPECT_NO_THROW(SubnetAny(Subnet4(in_addr{}, 32)));
143 EXPECT_NO_THROW(SubnetAny(Subnet6(in6_addr{0xff}, 128)));
144
145 EXPECT_NE(SubnetAny(in6_addr{0xff}, 32), Subnet6(in6_addr{}, 32));
146 EXPECT_NE(Subnet6(in6_addr{0xff}, 26), SubnetAny(in6_addr{0xff}, 27));
147 EXPECT_EQ(SubnetAny(in6_addr{0xff}, 32), Subnet6(in6_addr{0xff}, 32));
148 EXPECT_EQ(SubnetAny(in6_addr{0xff}, 32), SubnetAny(in6_addr{0xff}, 32));
149 EXPECT_NE(SubnetAny(in6_addr{0xff}, 32), Subnet4(in_addr{0xff}, 32));
150 EXPECT_NE(SubnetAny(in_addr{0xff}, 32), Subnet4(in_addr{}, 32));
151 EXPECT_NE(Subnet4(in_addr{0xff}, 26), SubnetAny(in_addr{0xff}, 27));
152 EXPECT_EQ(SubnetAny(in_addr{0xff}, 32), Subnet4(in_addr{0xff}, 32));
153 EXPECT_EQ(SubnetAny(in_addr{0xff}, 32), SubnetAny(in_addr{0xff}, 32));
154}
155
156TEST(SubnetAny, Network)
157{
158 EXPECT_EQ(In6Addr(), SubnetAny(In6Addr(), 128).network());
159 EXPECT_EQ(addr6Full, SubnetAny(addr6Full, 128).network());
160 EXPECT_EQ(In6Addr(), SubnetAny(addr6Full, 0).network());
161 EXPECT_EQ(In4Addr(), SubnetAny(In4Addr(), 32).network());
162 EXPECT_EQ(addr4Full, SubnetAny(addr4Full, 32).network());
163 EXPECT_EQ(In4Addr(), SubnetAny(addr4Full, 0).network());
164}
165
166TEST(SubnetAny, Contains)
167{
168 EXPECT_TRUE(SubnetAny(addr6Full, 128).contains(addr6Full));
169 EXPECT_TRUE(SubnetAny(addr6Full, 128).contains(InAnyAddr{addr6Full}));
170 EXPECT_FALSE(SubnetAny(addr6Full, 128).contains(in6_addr{}));
171 EXPECT_FALSE(SubnetAny(addr6Full, 128).contains(InAnyAddr(in6_addr{})));
172 EXPECT_TRUE(SubnetAny(addr4Full, 32).contains(addr4Full));
173 EXPECT_TRUE(SubnetAny(addr4Full, 32).contains(InAnyAddr{addr4Full}));
174 EXPECT_FALSE(SubnetAny(addr4Full, 32).contains(in_addr{}));
175 EXPECT_FALSE(SubnetAny(addr4Full, 32).contains(InAnyAddr{In4Addr{}}));
176}
177
William A. Kennington IIId5957f52023-06-16 16:55:01 -0700178TEST(SubnetAny, ToStr)
179{
180 ToStrHandle<ToStr<SubnetAny>> tsh;
181 EXPECT_EQ("0.0.0.0/16", tsh(SubnetAny(In4Addr{}, 16)));
182 EXPECT_EQ("ff00::/128", tsh(SubnetAny(In6Addr{0xff}, 128)));
183 EXPECT_EQ("a 102:304::/32 b",
184 fmt::format("a {} b", SubnetAny(In6Addr{1, 2, 3, 4}, 32)));
185 EXPECT_EQ("a 1.2.3.4/32 b",
186 fmt::format("a {} b", SubnetAny(In4Addr{1, 2, 3, 4}, 32)));
187}
188
William A. Kennington III14dd4eb2023-01-12 10:51:12 -0800189} // namespace stdplus