18 #include <boost/test/unit_test.hpp>
23 static CNetAddr ResolveIP(
const std::string&
ip)
30 static CSubNet ResolveSubNet(
const std::string& subnet)
37 static CNetAddr CreateInternal(
const std::string& host)
57 BOOST_CHECK(ResolveIP(
"::FFFF:192.168.1.1").IsIPv4());
61 BOOST_CHECK(ResolveIP(
"172.31.255.255").IsRFC1918());
63 BOOST_CHECK(ResolveIP(
"198.19.255.255").IsRFC2544());
73 BOOST_CHECK(ResolveIP(
"FD87:D87E:EB43:edb1:8e4:3588:e546:35ca").IsTor());
79 BOOST_CHECK(CreateInternal(
"FD6B:88C0:8724:edb1:8e4:3588:e546:35ca").IsInternal());
80 BOOST_CHECK(CreateInternal(
"bar.com").IsInternal());
83 bool static TestSplitHost(std::string test, std::string host,
int port)
88 return hostOut == host && port == portOut;
93 BOOST_CHECK(TestSplitHost(
"www.bitcoin.org",
"www.bitcoin.org", -1));
94 BOOST_CHECK(TestSplitHost(
"[www.bitcoin.org]",
"www.bitcoin.org", -1));
95 BOOST_CHECK(TestSplitHost(
"www.bitcoin.org:80",
"www.bitcoin.org", 80));
96 BOOST_CHECK(TestSplitHost(
"[www.bitcoin.org]:80",
"www.bitcoin.org", 80));
97 BOOST_CHECK(TestSplitHost(
"127.0.0.1",
"127.0.0.1", -1));
98 BOOST_CHECK(TestSplitHost(
"127.0.0.1:51472",
"127.0.0.1", 51472));
99 BOOST_CHECK(TestSplitHost(
"[127.0.0.1]",
"127.0.0.1", -1));
100 BOOST_CHECK(TestSplitHost(
"[127.0.0.1]:51472",
"127.0.0.1", 51472));
101 BOOST_CHECK(TestSplitHost(
"::ffff:127.0.0.1",
"::ffff:127.0.0.1", -1));
102 BOOST_CHECK(TestSplitHost(
"[::ffff:127.0.0.1]:51472",
"::ffff:127.0.0.1", 51472));
103 BOOST_CHECK(TestSplitHost(
"[::]:51472",
"::", 51472));
104 BOOST_CHECK(TestSplitHost(
"::51472",
"::51472", -1));
110 bool static TestParse(std::string src, std::string canon)
118 BOOST_CHECK(TestParse(
"127.0.0.1",
"127.0.0.1:65535"));
119 BOOST_CHECK(TestParse(
"127.0.0.1:51472",
"127.0.0.1:51472"));
120 BOOST_CHECK(TestParse(
"::ffff:127.0.0.1",
"127.0.0.1:65535"));
122 BOOST_CHECK(TestParse(
"[::]:51472",
"[::]:51472"));
123 BOOST_CHECK(TestParse(
"[127.0.0.1]",
"127.0.0.1:65535"));
127 BOOST_CHECK(TestParse(
"[fd6b:88c0:8724:1:2:3:4:5]",
"[::]:0"));
129 BOOST_CHECK(TestParse(
"[fd6c:88c0:8724:1:2:3:4:5]",
"[fd6c:88c0:8724:1:2:3:4:5]:65535"));
135 CNetAddr addr1(ResolveIP(
"5wyqrzbvrdsumnok.onion"));
136 CNetAddr addr2(ResolveIP(
"FD87:D87E:EB43:edb1:8e4:3588:e546:35ca"));
145 CNetAddr addr1(ResolveIP(
"1.2.3.4"));
146 CNetAddr addr2(ResolveIP(
"::FFFF:0102:0304"));
154 BOOST_CHECK(ResolveSubNet(
"1.2.3.0/24") == ResolveSubNet(
"1.2.3.0/255.255.255.0"));
155 BOOST_CHECK(ResolveSubNet(
"1.2.3.0/24") != ResolveSubNet(
"1.2.4.0/255.255.255.0"));
156 BOOST_CHECK(ResolveSubNet(
"1.2.3.0/24").Match(ResolveIP(
"1.2.3.4")));
157 BOOST_CHECK(!ResolveSubNet(
"1.2.2.0/24").Match(ResolveIP(
"1.2.3.4")));
158 BOOST_CHECK(ResolveSubNet(
"1.2.3.4").Match(ResolveIP(
"1.2.3.4")));
159 BOOST_CHECK(ResolveSubNet(
"1.2.3.4/32").Match(ResolveIP(
"1.2.3.4")));
160 BOOST_CHECK(!ResolveSubNet(
"1.2.3.4").Match(ResolveIP(
"5.6.7.8")));
161 BOOST_CHECK(!ResolveSubNet(
"1.2.3.4/32").Match(ResolveIP(
"5.6.7.8")));
162 BOOST_CHECK(ResolveSubNet(
"::ffff:127.0.0.1").Match(ResolveIP(
"127.0.0.1")));
163 BOOST_CHECK(ResolveSubNet(
"1:2:3:4:5:6:7:8").Match(ResolveIP(
"1:2:3:4:5:6:7:8")));
164 BOOST_CHECK(!ResolveSubNet(
"1:2:3:4:5:6:7:8").Match(ResolveIP(
"1:2:3:4:5:6:7:9")));
165 BOOST_CHECK(ResolveSubNet(
"1:2:3:4:5:6:7:0/112").Match(ResolveIP(
"1:2:3:4:5:6:7:1234")));
166 BOOST_CHECK(ResolveSubNet(
"192.168.0.1/24").Match(ResolveIP(
"192.168.0.2")));
167 BOOST_CHECK(ResolveSubNet(
"192.168.0.20/29").Match(ResolveIP(
"192.168.0.18")));
168 BOOST_CHECK(ResolveSubNet(
"1.2.2.1/24").Match(ResolveIP(
"1.2.2.4")));
169 BOOST_CHECK(ResolveSubNet(
"1.2.2.110/31").Match(ResolveIP(
"1.2.2.111")));
170 BOOST_CHECK(ResolveSubNet(
"1.2.2.20/26").Match(ResolveIP(
"1.2.2.63")));
172 BOOST_CHECK(ResolveSubNet(
"::/0").Match(ResolveIP(
"1:2:3:4:5:6:7:1234")));
174 BOOST_CHECK(!ResolveSubNet(
"::/0").Match(ResolveIP(
"::")));
175 BOOST_CHECK(!ResolveSubNet(
"::/0").Match(ResolveIP(
"0.0.0.0")));
177 BOOST_CHECK(!ResolveSubNet(
"::/0").Match(ResolveIP(
"1.2.3.4")));
179 BOOST_CHECK(!ResolveSubNet(
"0.0.0.0/0").Match(ResolveIP(
"1:2:3:4:5:6:7:1234")));
182 BOOST_CHECK(!ResolveSubNet(
"").Match(ResolveIP(
"4.5.6.7")));
183 BOOST_CHECK(!ResolveSubNet(
"bloop").Match(ResolveIP(
"0.0.0.0")));
184 BOOST_CHECK(!ResolveSubNet(
"bloop").Match(ResolveIP(
"hab")));
187 BOOST_CHECK(!ResolveSubNet(
"1.2.3.0/-1").IsValid());
188 BOOST_CHECK(ResolveSubNet(
"1.2.3.0/32").IsValid());
189 BOOST_CHECK(!ResolveSubNet(
"1.2.3.0/33").IsValid());
190 BOOST_CHECK(!ResolveSubNet(
"1.2.3.0/300").IsValid());
191 BOOST_CHECK(ResolveSubNet(
"1:2:3:4:5:6:7:8/0").IsValid());
192 BOOST_CHECK(ResolveSubNet(
"1:2:3:4:5:6:7:8/33").IsValid());
193 BOOST_CHECK(!ResolveSubNet(
"1:2:3:4:5:6:7:8/-1").IsValid());
194 BOOST_CHECK(ResolveSubNet(
"1:2:3:4:5:6:7:8/128").IsValid());
195 BOOST_CHECK(!ResolveSubNet(
"1:2:3:4:5:6:7:8/129").IsValid());
206 subnet =
CSubNet(ResolveIP(
"1.2.3.4"), 8);
208 subnet =
CSubNet(ResolveIP(
"1.2.3.4"), 0);
211 subnet =
CSubNet(ResolveIP(
"1.2.3.4"), ResolveIP(
"255.255.255.255"));
213 subnet =
CSubNet(ResolveIP(
"1.2.3.4"), ResolveIP(
"255.0.0.0"));
215 subnet =
CSubNet(ResolveIP(
"1.2.3.4"), ResolveIP(
"0.0.0.0"));
219 BOOST_CHECK(
CSubNet(ResolveIP(
"1:2:3:4:5:6:7:8")).Match(ResolveIP(
"1:2:3:4:5:6:7:8")));
220 BOOST_CHECK(!
CSubNet(ResolveIP(
"1:2:3:4:5:6:7:8")).Match(ResolveIP(
"1:2:3:4:5:6:7:9")));
221 BOOST_CHECK(
CSubNet(ResolveIP(
"1:2:3:4:5:6:7:8")).ToString() ==
"1:2:3:4:5:6:7:8/128");
226 BOOST_CHECK(!
CSubNet(ResolveIP(
"5wyqrzbvrdsumnok.onion"), ResolveIP(
"255.0.0.0")).IsValid());
228 subnet = ResolveSubNet(
"1.2.3.4/255.255.255.255");
230 subnet = ResolveSubNet(
"1.2.3.4/255.255.255.254");
232 subnet = ResolveSubNet(
"1.2.3.4/255.255.255.252");
234 subnet = ResolveSubNet(
"1.2.3.4/255.255.255.248");
236 subnet = ResolveSubNet(
"1.2.3.4/255.255.255.240");
238 subnet = ResolveSubNet(
"1.2.3.4/255.255.255.224");
240 subnet = ResolveSubNet(
"1.2.3.4/255.255.255.192");
242 subnet = ResolveSubNet(
"1.2.3.4/255.255.255.128");
244 subnet = ResolveSubNet(
"1.2.3.4/255.255.255.0");
246 subnet = ResolveSubNet(
"1.2.3.4/255.255.254.0");
248 subnet = ResolveSubNet(
"1.2.3.4/255.255.252.0");
250 subnet = ResolveSubNet(
"1.2.3.4/255.255.248.0");
252 subnet = ResolveSubNet(
"1.2.3.4/255.255.240.0");
254 subnet = ResolveSubNet(
"1.2.3.4/255.255.224.0");
256 subnet = ResolveSubNet(
"1.2.3.4/255.255.192.0");
258 subnet = ResolveSubNet(
"1.2.3.4/255.255.128.0");
260 subnet = ResolveSubNet(
"1.2.3.4/255.255.0.0");
262 subnet = ResolveSubNet(
"1.2.3.4/255.254.0.0");
264 subnet = ResolveSubNet(
"1.2.3.4/255.252.0.0");
266 subnet = ResolveSubNet(
"1.2.3.4/255.248.0.0");
268 subnet = ResolveSubNet(
"1.2.3.4/255.240.0.0");
270 subnet = ResolveSubNet(
"1.2.3.4/255.224.0.0");
272 subnet = ResolveSubNet(
"1.2.3.4/255.192.0.0");
274 subnet = ResolveSubNet(
"1.2.3.4/255.128.0.0");
276 subnet = ResolveSubNet(
"1.2.3.4/255.0.0.0");
278 subnet = ResolveSubNet(
"1.2.3.4/254.0.0.0");
280 subnet = ResolveSubNet(
"1.2.3.4/252.0.0.0");
282 subnet = ResolveSubNet(
"1.2.3.4/248.0.0.0");
284 subnet = ResolveSubNet(
"1.2.3.4/240.0.0.0");
286 subnet = ResolveSubNet(
"1.2.3.4/224.0.0.0");
288 subnet = ResolveSubNet(
"1.2.3.4/192.0.0.0");
290 subnet = ResolveSubNet(
"1.2.3.4/128.0.0.0");
292 subnet = ResolveSubNet(
"1.2.3.4/0.0.0.0");
295 subnet = ResolveSubNet(
"1:2:3:4:5:6:7:8/ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff");
297 subnet = ResolveSubNet(
"1:2:3:4:5:6:7:8/ffff:0000:0000:0000:0000:0000:0000:0000");
299 subnet = ResolveSubNet(
"1:2:3:4:5:6:7:8/0000:0000:0000:0000:0000:0000:0000:0000");
302 subnet = ResolveSubNet(
"1.2.3.4/255.255.232.0");
304 subnet = ResolveSubNet(
"1.2.3.4/255.0.255.255");
306 subnet = ResolveSubNet(
"1:2:3:4:5:6:7:8/ffff:ffff:ffff:fffe:ffff:ffff:ffff:ff0f");
312 std::list<std::string> validIPv4 = {
"11.12.13.14",
"50.168.168.150",
"72.31.250.250"};
313 std::list<std::string> validIPv6 = {
"1111:2222:3333:4444:5555:6666::8888",
"2001:0002:6c::430",
"2002:cb0a:3cdd:1::1"};
314 std::list<std::string> validTor = {
"5wyqrzbvrdsumnok.onion",
"FD87:D87E:EB43:edb1:8e4:3588:e546:35ca"};
316 for (
const std::string& ipStr : validIPv4)
318 for (
const std::string& ipStr : validIPv6)
320 for (
const std::string& ipStr : validTor)
323 std::list<std::string> invalidIPv4 = {
"11.12.13.14.15",
"11.12.13.330",
"30.168.1.255.1",
"192.168.1.1",
"255.255.255.255"};
324 std::list<std::string> invalidIPv6 = {
"1111:2222:3333:4444:5555:6666:7777:8888:9999",
"2002:cb0a:3cdd::1::1",
"1111:2222:3333:::5555:6666:7777:8888"};
325 std::list<std::string> invalidTor = {
"5wyqrzbvrdsumnok.noonion"};
327 for (
const std::string& ipStr : invalidIPv4)
329 for (
const std::string& ipStr : invalidIPv6)
331 for (
const std::string& ipStr : invalidTor)
337 std::vector<bool> asmap;
338 BOOST_CHECK(ResolveIP(
"127.0.0.1").GetGroup(asmap) == std::vector<unsigned char>({0}));
339 BOOST_CHECK(ResolveIP(
"257.0.0.1").GetGroup(asmap) == std::vector<unsigned char>({0}));
340 BOOST_CHECK(ResolveIP(
"10.0.0.1").GetGroup(asmap) == std::vector<unsigned char>({0}));
341 BOOST_CHECK(ResolveIP(
"169.254.1.1").GetGroup(asmap) == std::vector<unsigned char>({0}));
342 BOOST_CHECK(ResolveIP(
"1.2.3.4").GetGroup(asmap) == std::vector<unsigned char>({(
unsigned char)
NET_IPV4, 1, 2}));
343 BOOST_CHECK(ResolveIP(
"::FFFF:0:102:304").GetGroup(asmap) == std::vector<unsigned char>({(
unsigned char)
NET_IPV4, 1, 2}));
344 BOOST_CHECK(ResolveIP(
"64:FF9B::102:304").GetGroup(asmap) == std::vector<unsigned char>({(
unsigned char)
NET_IPV4, 1, 2}));
345 BOOST_CHECK(ResolveIP(
"2002:102:304:9999:9999:9999:9999:9999").GetGroup(asmap) == std::vector<unsigned char>({(
unsigned char)
NET_IPV4, 1, 2}));
346 BOOST_CHECK(ResolveIP(
"2001:0:9999:9999:9999:9999:FEFD:FCFB").GetGroup(asmap) == std::vector<unsigned char>({(
unsigned char)
NET_IPV4, 1, 2}));
347 BOOST_CHECK(ResolveIP(
"FD87:D87E:EB43:edb1:8e4:3588:e546:35ca").GetGroup(asmap) == std::vector<unsigned char>({(
unsigned char)
NET_ONION, 239}));
348 BOOST_CHECK(ResolveIP(
"2001:470:abcd:9999:9999:9999:9999:9999").GetGroup(asmap) == std::vector<unsigned char>({(
unsigned char)
NET_IPV6, 32, 1, 4, 112, 175}));
349 BOOST_CHECK(ResolveIP(
"2001:2001:9999:9999:9999:9999:9999:9999").GetGroup(asmap) == std::vector<unsigned char>({(
unsigned char)
NET_IPV6, 32, 1, 32, 1}));
352 std::vector<unsigned char> internal_group = {
NET_INTERNAL, 0x12, 0x92, 0x94, 0x00, 0xeb, 0x46, 0x07, 0xc4, 0xac, 0x07};
353 BOOST_CHECK(CreateInternal(
"baz.net").GetGroup(asmap) == internal_group);
396 static const std::vector<CAddress> fixture_addresses({
416 static constexpr
const char* stream_addrv1_hex =
421 "00000000000000000000000000000001"
426 "00000000000000000000000000000001"
431 "00000000000000000000000000000001"
436 static constexpr
const char* stream_addrv2_hex =
443 "00000000000000000000000000000001"
450 "00000000000000000000000000000001"
457 "00000000000000000000000000000001"
464 s << fixture_addresses;
471 std::vector<CAddress> addresses_unserialized;
473 s >> addresses_unserialized;
474 BOOST_CHECK(fixture_addresses == addresses_unserialized);
481 s << fixture_addresses;
488 std::vector<CAddress> addresses_unserialized;
490 s >> addresses_unserialized;
491 BOOST_CHECK(fixture_addresses == addresses_unserialized);
A CService with information about it as peer.
std::string ToStringIP() const
std::string ToString() const
bool IsTor() const
Check whether this object represents a TOR address.
bool SetInternal(const std::string &name)
Transform an arbitrary string into a non-routable ipv6 address.
A combination of a network address (CNetAddr) and a (TCP) port.
std::string ToString() const
BOOST_AUTO_TEST_SUITE_END()
bool IsLocal(const CService &addr)
check whether a given address is potentially local
bool validateMasternodeIP(const std::string &addrStr)
@ NET_ONION
TOR (v2 or v3)
@ NET_UNROUTABLE
Addresses from these networks are not publicly routable on the global Internet.
@ NET_INTERNAL
A set of addresses that represent the hash of a string or FQDN.
void SplitHostPort(std::string in, int &portOut, std::string &hostOut)
enum Network ParseNetwork(std::string net)
CService LookupNumeric(const std::string &name, int portDefault)
bool LookupHost(const std::string &name, std::vector< CNetAddr > &vIP, unsigned int nMaxSolutions, bool fAllowLookup)
bool LookupSubNet(const std::string &strSubnet, CSubNet &ret)
BOOST_AUTO_TEST_CASE(netbase_networks)
#define BOOST_FIXTURE_TEST_SUITE(a, b)
#define BOOST_CHECK_EQUAL(v1, v2)
#define BOOST_CHECK(expr)
ServiceFlags
nServices flags
std::string HexStr(const Span< const uint8_t > s)
Convert a span of bytes to a lower-case hexadecimal string.
std::vector< unsigned char > ParseHex(const char *psz)