blob: 561507c3b098169c98bc46dae1fb95121e67ce46 [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
54TEST(Subnet6, Basic)
55{
56 EXPECT_NO_THROW(Subnet6(in6_addr{0xff}, 128));
57 EXPECT_NO_THROW(Subnet6(addr6Full, 0));
58 EXPECT_NO_THROW(Subnet6(in6_addr{}, 65));
59 EXPECT_THROW(Subnet6(in6_addr{0xff}, 129), std::invalid_argument);
60 EXPECT_THROW(Subnet6(in6_addr{0xff}, 150), std::invalid_argument);
61
62 EXPECT_NE(Subnet6(in6_addr{0xff}, 32), Subnet6(in6_addr{}, 32));
63 EXPECT_NE(Subnet6(in6_addr{0xff}, 26), Subnet6(in6_addr{0xff}, 27));
64 EXPECT_EQ(Subnet6(in6_addr{0xff}, 32), Subnet6(in6_addr{0xff}, 32));
65 EXPECT_EQ(Subnet6(in6_addr{}, 1), Subnet6(in6_addr{}, 1));
66}
67
68TEST(Subnet6, Network)
69{
70 EXPECT_EQ(In6Addr(), Subnet6(In6Addr(), 128).network());
71 EXPECT_EQ(addr6Full, Subnet6(addr6Full, 128).network());
72 EXPECT_EQ((In6Addr{255, 255, 255, 255, 224}),
73 Subnet6(addr6Full, 35).network());
74 EXPECT_EQ((In6Addr{255, 255, 255, 255}), Subnet6(addr6Full, 32).network());
75 EXPECT_EQ((In6Addr{255, 255, 128, 0}), Subnet6(addr6Full, 17).network());
76 EXPECT_EQ((In6Addr{255, 255, 0, 0}), Subnet6(addr6Full, 16).network());
77 EXPECT_EQ((In6Addr{255, 254, 0, 0}), Subnet6(addr6Full, 15).network());
78 EXPECT_EQ((In6Addr{}), Subnet6(addr6Full, 0).network());
79 EXPECT_EQ((In6Addr{}), Subnet6(In6Addr{}, 0).network());
80}
81
82TEST(Subnet6, Contains)
83{
84 auto addr6NFull = addr6Full;
85 addr6NFull.s6_addr[15] = 254;
86 EXPECT_TRUE(Subnet6(addr6Full, 128).contains(addr6Full));
87 EXPECT_FALSE(Subnet6(addr6Full, 128).contains(addr6NFull));
88 EXPECT_FALSE(Subnet6(addr6Full, 128).contains(In6Addr{}));
89 EXPECT_TRUE(
90 Subnet6(addr6Full, 127).contains(static_cast<in6_addr>(addr6Full)));
91 EXPECT_TRUE(Subnet6(addr6Full, 127).contains(addr6NFull));
92 EXPECT_TRUE(
93 Subnet6(addr6Full, 33).contains(In6Addr{255, 255, 255, 255, 128, 255}));
94 EXPECT_FALSE(
95 Subnet6(addr6Full, 33).contains(In6Addr{255, 255, 255, 255, 127}));
96 EXPECT_TRUE(Subnet6(In6Addr{}, 33).contains(In6Addr{0, 0, 0, 0, 127}));
97 EXPECT_TRUE(
98 Subnet6(addr6Full, 14).contains(In6Addr{255, 255, 0, 0, 0, 0, 0, 145}));
99 EXPECT_FALSE(Subnet6(addr6Full, 14).contains(In6Addr{255, 127, 1}));
100 EXPECT_TRUE(Subnet6(addr6Full, 0).contains(addr6Full));
101 EXPECT_TRUE(Subnet6(In6Addr{}, 0).contains(addr6Full));
102 EXPECT_TRUE(Subnet6(addr6Full, 0).contains(In6Addr{}));
103}
104
105TEST(SubnetAny, Basic)
106{
107 EXPECT_NO_THROW(SubnetAny(in_addr{0xffffffff}, 32));
108 EXPECT_NO_THROW(SubnetAny(addr4Full, 0));
109 EXPECT_NO_THROW(SubnetAny(InAnyAddr{addr4Full}, 0));
110 EXPECT_NO_THROW(SubnetAny(in_addr{}, 10));
111 EXPECT_THROW(SubnetAny(in_addr{0xffffffff}, 33), std::invalid_argument);
112 EXPECT_THROW(SubnetAny(InAnyAddr{in_addr{0xffffffff}}, 33),
113 std::invalid_argument);
114 EXPECT_THROW(SubnetAny(in_addr{0xffffffff}, 64), std::invalid_argument);
115 EXPECT_NO_THROW(SubnetAny(in6_addr{0xff}, 128));
116 EXPECT_NO_THROW(SubnetAny(addr6Full, 0));
117 EXPECT_NO_THROW(SubnetAny(InAnyAddr{addr6Full}, 0));
118 EXPECT_NO_THROW(SubnetAny(in6_addr{}, 65));
119 EXPECT_THROW(SubnetAny(in6_addr{0xff}, 129), std::invalid_argument);
120 EXPECT_THROW(SubnetAny(InAnyAddr{in6_addr{0xff}}, 129),
121 std::invalid_argument);
122 EXPECT_THROW(SubnetAny(in6_addr{0xff}, 150), std::invalid_argument);
123
124 EXPECT_NO_THROW(SubnetAny(Subnet4(in_addr{}, 32)));
125 EXPECT_NO_THROW(SubnetAny(Subnet6(in6_addr{0xff}, 128)));
126
127 EXPECT_NE(SubnetAny(in6_addr{0xff}, 32), Subnet6(in6_addr{}, 32));
128 EXPECT_NE(Subnet6(in6_addr{0xff}, 26), SubnetAny(in6_addr{0xff}, 27));
129 EXPECT_EQ(SubnetAny(in6_addr{0xff}, 32), Subnet6(in6_addr{0xff}, 32));
130 EXPECT_EQ(SubnetAny(in6_addr{0xff}, 32), SubnetAny(in6_addr{0xff}, 32));
131 EXPECT_NE(SubnetAny(in6_addr{0xff}, 32), Subnet4(in_addr{0xff}, 32));
132 EXPECT_NE(SubnetAny(in_addr{0xff}, 32), Subnet4(in_addr{}, 32));
133 EXPECT_NE(Subnet4(in_addr{0xff}, 26), SubnetAny(in_addr{0xff}, 27));
134 EXPECT_EQ(SubnetAny(in_addr{0xff}, 32), Subnet4(in_addr{0xff}, 32));
135 EXPECT_EQ(SubnetAny(in_addr{0xff}, 32), SubnetAny(in_addr{0xff}, 32));
136}
137
138TEST(SubnetAny, Network)
139{
140 EXPECT_EQ(In6Addr(), SubnetAny(In6Addr(), 128).network());
141 EXPECT_EQ(addr6Full, SubnetAny(addr6Full, 128).network());
142 EXPECT_EQ(In6Addr(), SubnetAny(addr6Full, 0).network());
143 EXPECT_EQ(In4Addr(), SubnetAny(In4Addr(), 32).network());
144 EXPECT_EQ(addr4Full, SubnetAny(addr4Full, 32).network());
145 EXPECT_EQ(In4Addr(), SubnetAny(addr4Full, 0).network());
146}
147
148TEST(SubnetAny, Contains)
149{
150 EXPECT_TRUE(SubnetAny(addr6Full, 128).contains(addr6Full));
151 EXPECT_TRUE(SubnetAny(addr6Full, 128).contains(InAnyAddr{addr6Full}));
152 EXPECT_FALSE(SubnetAny(addr6Full, 128).contains(in6_addr{}));
153 EXPECT_FALSE(SubnetAny(addr6Full, 128).contains(InAnyAddr(in6_addr{})));
154 EXPECT_TRUE(SubnetAny(addr4Full, 32).contains(addr4Full));
155 EXPECT_TRUE(SubnetAny(addr4Full, 32).contains(InAnyAddr{addr4Full}));
156 EXPECT_FALSE(SubnetAny(addr4Full, 32).contains(in_addr{}));
157 EXPECT_FALSE(SubnetAny(addr4Full, 32).contains(InAnyAddr{In4Addr{}}));
158}
159
160} // namespace stdplus