Branch data Line data Source code
# 1 : : // Copyright (c) 2012-2021 The Bitcoin Core developers
# 2 : : // Distributed under the MIT software license, see the accompanying
# 3 : : // file COPYING or http://www.opensource.org/licenses/mit-license.php.
# 4 : :
# 5 : : #include <net_permissions.h>
# 6 : : #include <netaddress.h>
# 7 : : #include <netbase.h>
# 8 : : #include <protocol.h>
# 9 : : #include <serialize.h>
# 10 : : #include <streams.h>
# 11 : : #include <test/util/setup_common.h>
# 12 : : #include <util/strencodings.h>
# 13 : : #include <util/translation.h>
# 14 : : #include <version.h>
# 15 : :
# 16 : : #include <string>
# 17 : :
# 18 : : #include <boost/test/unit_test.hpp>
# 19 : :
# 20 : : using namespace std::literals;
# 21 : :
# 22 : : BOOST_FIXTURE_TEST_SUITE(netbase_tests, BasicTestingSetup)
# 23 : :
# 24 : : static CNetAddr ResolveIP(const std::string& ip)
# 25 : 188 : {
# 26 : 188 : CNetAddr addr;
# 27 : 188 : LookupHost(ip, addr, false);
# 28 : 188 : return addr;
# 29 : 188 : }
# 30 : :
# 31 : : static CSubNet ResolveSubNet(const std::string& subnet)
# 32 : 154 : {
# 33 : 154 : CSubNet ret;
# 34 : 154 : LookupSubNet(subnet, ret);
# 35 : 154 : return ret;
# 36 : 154 : }
# 37 : :
# 38 : : static CNetAddr CreateInternal(const std::string& host)
# 39 : 8 : {
# 40 : 8 : CNetAddr addr;
# 41 : 8 : addr.SetInternal(host);
# 42 : 8 : return addr;
# 43 : 8 : }
# 44 : :
# 45 : : BOOST_AUTO_TEST_CASE(netbase_networks)
# 46 : 2 : {
# 47 : 2 : BOOST_CHECK(ResolveIP("127.0.0.1").GetNetwork() == NET_UNROUTABLE);
# 48 : 2 : BOOST_CHECK(ResolveIP("::1").GetNetwork() == NET_UNROUTABLE);
# 49 : 2 : BOOST_CHECK(ResolveIP("8.8.8.8").GetNetwork() == NET_IPV4);
# 50 : 2 : BOOST_CHECK(ResolveIP("2001::8888").GetNetwork() == NET_IPV6);
# 51 : 2 : BOOST_CHECK(ResolveIP("pg6mmjiyjmcrsslvykfwnntlaru7p5svn6y2ymmju6nubxndf4pscryd.onion").GetNetwork() == NET_ONION);
# 52 : 2 : BOOST_CHECK(CreateInternal("foo.com").GetNetwork() == NET_INTERNAL);
# 53 : 2 : }
# 54 : :
# 55 : : BOOST_AUTO_TEST_CASE(netbase_properties)
# 56 : 2 : {
# 57 : :
# 58 : 2 : BOOST_CHECK(ResolveIP("127.0.0.1").IsIPv4());
# 59 : 2 : BOOST_CHECK(ResolveIP("::FFFF:192.168.1.1").IsIPv4());
# 60 : 2 : BOOST_CHECK(ResolveIP("::1").IsIPv6());
# 61 : 2 : BOOST_CHECK(ResolveIP("10.0.0.1").IsRFC1918());
# 62 : 2 : BOOST_CHECK(ResolveIP("192.168.1.1").IsRFC1918());
# 63 : 2 : BOOST_CHECK(ResolveIP("172.31.255.255").IsRFC1918());
# 64 : 2 : BOOST_CHECK(ResolveIP("198.18.0.0").IsRFC2544());
# 65 : 2 : BOOST_CHECK(ResolveIP("198.19.255.255").IsRFC2544());
# 66 : 2 : BOOST_CHECK(ResolveIP("2001:0DB8::").IsRFC3849());
# 67 : 2 : BOOST_CHECK(ResolveIP("169.254.1.1").IsRFC3927());
# 68 : 2 : BOOST_CHECK(ResolveIP("2002::1").IsRFC3964());
# 69 : 2 : BOOST_CHECK(ResolveIP("FC00::").IsRFC4193());
# 70 : 2 : BOOST_CHECK(ResolveIP("2001::2").IsRFC4380());
# 71 : 2 : BOOST_CHECK(ResolveIP("2001:10::").IsRFC4843());
# 72 : 2 : BOOST_CHECK(ResolveIP("2001:20::").IsRFC7343());
# 73 : 2 : BOOST_CHECK(ResolveIP("FE80::").IsRFC4862());
# 74 : 2 : BOOST_CHECK(ResolveIP("64:FF9B::").IsRFC6052());
# 75 : 2 : BOOST_CHECK(ResolveIP("pg6mmjiyjmcrsslvykfwnntlaru7p5svn6y2ymmju6nubxndf4pscryd.onion").IsTor());
# 76 : 2 : BOOST_CHECK(ResolveIP("127.0.0.1").IsLocal());
# 77 : 2 : BOOST_CHECK(ResolveIP("::1").IsLocal());
# 78 : 2 : BOOST_CHECK(ResolveIP("8.8.8.8").IsRoutable());
# 79 : 2 : BOOST_CHECK(ResolveIP("2001::1").IsRoutable());
# 80 : 2 : BOOST_CHECK(ResolveIP("127.0.0.1").IsValid());
# 81 : 2 : BOOST_CHECK(CreateInternal("FD6B:88C0:8724:edb1:8e4:3588:e546:35ca").IsInternal());
# 82 : 2 : BOOST_CHECK(CreateInternal("bar.com").IsInternal());
# 83 : :
# 84 : 2 : }
# 85 : :
# 86 : : bool static TestSplitHost(const std::string& test, const std::string& host, uint16_t port)
# 87 : 30 : {
# 88 : 30 : std::string hostOut;
# 89 : 30 : uint16_t portOut{0};
# 90 : 30 : SplitHostPort(test, portOut, hostOut);
# 91 [ + - ][ + - ]: 30 : return hostOut == host && port == portOut;
# 92 : 30 : }
# 93 : :
# 94 : : BOOST_AUTO_TEST_CASE(netbase_splithost)
# 95 : 2 : {
# 96 : 2 : BOOST_CHECK(TestSplitHost("www.bitcoincore.org", "www.bitcoincore.org", 0));
# 97 : 2 : BOOST_CHECK(TestSplitHost("[www.bitcoincore.org]", "www.bitcoincore.org", 0));
# 98 : 2 : BOOST_CHECK(TestSplitHost("www.bitcoincore.org:80", "www.bitcoincore.org", 80));
# 99 : 2 : BOOST_CHECK(TestSplitHost("[www.bitcoincore.org]:80", "www.bitcoincore.org", 80));
# 100 : 2 : BOOST_CHECK(TestSplitHost("127.0.0.1", "127.0.0.1", 0));
# 101 : 2 : BOOST_CHECK(TestSplitHost("127.0.0.1:8333", "127.0.0.1", 8333));
# 102 : 2 : BOOST_CHECK(TestSplitHost("[127.0.0.1]", "127.0.0.1", 0));
# 103 : 2 : BOOST_CHECK(TestSplitHost("[127.0.0.1]:8333", "127.0.0.1", 8333));
# 104 : 2 : BOOST_CHECK(TestSplitHost("::ffff:127.0.0.1", "::ffff:127.0.0.1", 0));
# 105 : 2 : BOOST_CHECK(TestSplitHost("[::ffff:127.0.0.1]:8333", "::ffff:127.0.0.1", 8333));
# 106 : 2 : BOOST_CHECK(TestSplitHost("[::]:8333", "::", 8333));
# 107 : 2 : BOOST_CHECK(TestSplitHost("::8333", "::8333", 0));
# 108 : 2 : BOOST_CHECK(TestSplitHost(":8333", "", 8333));
# 109 : 2 : BOOST_CHECK(TestSplitHost("[]:8333", "", 8333));
# 110 : 2 : BOOST_CHECK(TestSplitHost("", "", 0));
# 111 : 2 : }
# 112 : :
# 113 : : bool static TestParse(std::string src, std::string canon)
# 114 : 18 : {
# 115 : 18 : CService addr(LookupNumeric(src, 65535));
# 116 : 18 : return canon == addr.ToString();
# 117 : 18 : }
# 118 : :
# 119 : : BOOST_AUTO_TEST_CASE(netbase_lookupnumeric)
# 120 : 2 : {
# 121 : 2 : BOOST_CHECK(TestParse("127.0.0.1", "127.0.0.1:65535"));
# 122 : 2 : BOOST_CHECK(TestParse("127.0.0.1:8333", "127.0.0.1:8333"));
# 123 : 2 : BOOST_CHECK(TestParse("::ffff:127.0.0.1", "127.0.0.1:65535"));
# 124 : 2 : BOOST_CHECK(TestParse("::", "[::]:65535"));
# 125 : 2 : BOOST_CHECK(TestParse("[::]:8333", "[::]:8333"));
# 126 : 2 : BOOST_CHECK(TestParse("[127.0.0.1]", "127.0.0.1:65535"));
# 127 : 2 : BOOST_CHECK(TestParse(":::", "[::]:0"));
# 128 : :
# 129 : : // verify that an internal address fails to resolve
# 130 : 2 : BOOST_CHECK(TestParse("[fd6b:88c0:8724:1:2:3:4:5]", "[::]:0"));
# 131 : : // and that a one-off resolves correctly
# 132 : 2 : BOOST_CHECK(TestParse("[fd6c:88c0:8724:1:2:3:4:5]", "[fd6c:88c0:8724:1:2:3:4:5]:65535"));
# 133 : 2 : }
# 134 : :
# 135 : : BOOST_AUTO_TEST_CASE(embedded_test)
# 136 : 2 : {
# 137 : 2 : CNetAddr addr1(ResolveIP("1.2.3.4"));
# 138 : 2 : CNetAddr addr2(ResolveIP("::FFFF:0102:0304"));
# 139 : 2 : BOOST_CHECK(addr2.IsIPv4());
# 140 : 2 : BOOST_CHECK_EQUAL(addr1.ToString(), addr2.ToString());
# 141 : 2 : }
# 142 : :
# 143 : : BOOST_AUTO_TEST_CASE(subnet_test)
# 144 : 2 : {
# 145 : :
# 146 : 2 : BOOST_CHECK(ResolveSubNet("1.2.3.0/24") == ResolveSubNet("1.2.3.0/255.255.255.0"));
# 147 : 2 : BOOST_CHECK(ResolveSubNet("1.2.3.0/24") != ResolveSubNet("1.2.4.0/255.255.255.0"));
# 148 : 2 : BOOST_CHECK(ResolveSubNet("1.2.3.0/24").Match(ResolveIP("1.2.3.4")));
# 149 : 2 : BOOST_CHECK(!ResolveSubNet("1.2.2.0/24").Match(ResolveIP("1.2.3.4")));
# 150 : 2 : BOOST_CHECK(ResolveSubNet("1.2.3.4").Match(ResolveIP("1.2.3.4")));
# 151 : 2 : BOOST_CHECK(ResolveSubNet("1.2.3.4/32").Match(ResolveIP("1.2.3.4")));
# 152 : 2 : BOOST_CHECK(!ResolveSubNet("1.2.3.4").Match(ResolveIP("5.6.7.8")));
# 153 : 2 : BOOST_CHECK(!ResolveSubNet("1.2.3.4/32").Match(ResolveIP("5.6.7.8")));
# 154 : 2 : BOOST_CHECK(ResolveSubNet("::ffff:127.0.0.1").Match(ResolveIP("127.0.0.1")));
# 155 : 2 : BOOST_CHECK(ResolveSubNet("1:2:3:4:5:6:7:8").Match(ResolveIP("1:2:3:4:5:6:7:8")));
# 156 : 2 : BOOST_CHECK(!ResolveSubNet("1:2:3:4:5:6:7:8").Match(ResolveIP("1:2:3:4:5:6:7:9")));
# 157 : 2 : BOOST_CHECK(ResolveSubNet("1:2:3:4:5:6:7:0/112").Match(ResolveIP("1:2:3:4:5:6:7:1234")));
# 158 : 2 : BOOST_CHECK(ResolveSubNet("192.168.0.1/24").Match(ResolveIP("192.168.0.2")));
# 159 : 2 : BOOST_CHECK(ResolveSubNet("192.168.0.20/29").Match(ResolveIP("192.168.0.18")));
# 160 : 2 : BOOST_CHECK(ResolveSubNet("1.2.2.1/24").Match(ResolveIP("1.2.2.4")));
# 161 : 2 : BOOST_CHECK(ResolveSubNet("1.2.2.110/31").Match(ResolveIP("1.2.2.111")));
# 162 : 2 : BOOST_CHECK(ResolveSubNet("1.2.2.20/26").Match(ResolveIP("1.2.2.63")));
# 163 : : // All-Matching IPv6 Matches arbitrary IPv6
# 164 : 2 : BOOST_CHECK(ResolveSubNet("::/0").Match(ResolveIP("1:2:3:4:5:6:7:1234")));
# 165 : : // But not `::` or `0.0.0.0` because they are considered invalid addresses
# 166 : 2 : BOOST_CHECK(!ResolveSubNet("::/0").Match(ResolveIP("::")));
# 167 : 2 : BOOST_CHECK(!ResolveSubNet("::/0").Match(ResolveIP("0.0.0.0")));
# 168 : : // Addresses from one network (IPv4) don't belong to subnets of another network (IPv6)
# 169 : 2 : BOOST_CHECK(!ResolveSubNet("::/0").Match(ResolveIP("1.2.3.4")));
# 170 : : // All-Matching IPv4 does not Match IPv6
# 171 : 2 : BOOST_CHECK(!ResolveSubNet("0.0.0.0/0").Match(ResolveIP("1:2:3:4:5:6:7:1234")));
# 172 : : // Invalid subnets Match nothing (not even invalid addresses)
# 173 : 2 : BOOST_CHECK(!CSubNet().Match(ResolveIP("1.2.3.4")));
# 174 : 2 : BOOST_CHECK(!ResolveSubNet("").Match(ResolveIP("4.5.6.7")));
# 175 : 2 : BOOST_CHECK(!ResolveSubNet("bloop").Match(ResolveIP("0.0.0.0")));
# 176 : 2 : BOOST_CHECK(!ResolveSubNet("bloop").Match(ResolveIP("hab")));
# 177 : : // Check valid/invalid
# 178 : 2 : BOOST_CHECK(ResolveSubNet("1.2.3.0/0").IsValid());
# 179 : 2 : BOOST_CHECK(!ResolveSubNet("1.2.3.0/-1").IsValid());
# 180 : 2 : BOOST_CHECK(ResolveSubNet("1.2.3.0/32").IsValid());
# 181 : 2 : BOOST_CHECK(!ResolveSubNet("1.2.3.0/33").IsValid());
# 182 : 2 : BOOST_CHECK(!ResolveSubNet("1.2.3.0/300").IsValid());
# 183 : 2 : BOOST_CHECK(ResolveSubNet("1:2:3:4:5:6:7:8/0").IsValid());
# 184 : 2 : BOOST_CHECK(ResolveSubNet("1:2:3:4:5:6:7:8/33").IsValid());
# 185 : 2 : BOOST_CHECK(!ResolveSubNet("1:2:3:4:5:6:7:8/-1").IsValid());
# 186 : 2 : BOOST_CHECK(ResolveSubNet("1:2:3:4:5:6:7:8/128").IsValid());
# 187 : 2 : BOOST_CHECK(!ResolveSubNet("1:2:3:4:5:6:7:8/129").IsValid());
# 188 : 2 : BOOST_CHECK(!ResolveSubNet("fuzzy").IsValid());
# 189 : :
# 190 : : //CNetAddr constructor test
# 191 : 2 : BOOST_CHECK(CSubNet(ResolveIP("127.0.0.1")).IsValid());
# 192 : 2 : BOOST_CHECK(CSubNet(ResolveIP("127.0.0.1")).Match(ResolveIP("127.0.0.1")));
# 193 : 2 : BOOST_CHECK(!CSubNet(ResolveIP("127.0.0.1")).Match(ResolveIP("127.0.0.2")));
# 194 : 2 : BOOST_CHECK(CSubNet(ResolveIP("127.0.0.1")).ToString() == "127.0.0.1/32");
# 195 : :
# 196 : 2 : CSubNet subnet = CSubNet(ResolveIP("1.2.3.4"), 32);
# 197 : 2 : BOOST_CHECK_EQUAL(subnet.ToString(), "1.2.3.4/32");
# 198 : 2 : subnet = CSubNet(ResolveIP("1.2.3.4"), 8);
# 199 : 2 : BOOST_CHECK_EQUAL(subnet.ToString(), "1.0.0.0/8");
# 200 : 2 : subnet = CSubNet(ResolveIP("1.2.3.4"), 0);
# 201 : 2 : BOOST_CHECK_EQUAL(subnet.ToString(), "0.0.0.0/0");
# 202 : :
# 203 : 2 : subnet = CSubNet(ResolveIP("1.2.3.4"), ResolveIP("255.255.255.255"));
# 204 : 2 : BOOST_CHECK_EQUAL(subnet.ToString(), "1.2.3.4/32");
# 205 : 2 : subnet = CSubNet(ResolveIP("1.2.3.4"), ResolveIP("255.0.0.0"));
# 206 : 2 : BOOST_CHECK_EQUAL(subnet.ToString(), "1.0.0.0/8");
# 207 : 2 : subnet = CSubNet(ResolveIP("1.2.3.4"), ResolveIP("0.0.0.0"));
# 208 : 2 : BOOST_CHECK_EQUAL(subnet.ToString(), "0.0.0.0/0");
# 209 : :
# 210 : 2 : BOOST_CHECK(CSubNet(ResolveIP("1:2:3:4:5:6:7:8")).IsValid());
# 211 : 2 : BOOST_CHECK(CSubNet(ResolveIP("1:2:3:4:5:6:7:8")).Match(ResolveIP("1:2:3:4:5:6:7:8")));
# 212 : 2 : BOOST_CHECK(!CSubNet(ResolveIP("1:2:3:4:5:6:7:8")).Match(ResolveIP("1:2:3:4:5:6:7:9")));
# 213 : 2 : BOOST_CHECK(CSubNet(ResolveIP("1:2:3:4:5:6:7:8")).ToString() == "1:2:3:4:5:6:7:8/128");
# 214 : : // IPv4 address with IPv6 netmask or the other way around.
# 215 : 2 : BOOST_CHECK(!CSubNet(ResolveIP("1.1.1.1"), ResolveIP("ffff::")).IsValid());
# 216 : 2 : BOOST_CHECK(!CSubNet(ResolveIP("::1"), ResolveIP("255.0.0.0")).IsValid());
# 217 : :
# 218 : : // Create Non-IP subnets.
# 219 : :
# 220 : 2 : const CNetAddr tor_addr{
# 221 : 2 : ResolveIP("pg6mmjiyjmcrsslvykfwnntlaru7p5svn6y2ymmju6nubxndf4pscryd.onion")};
# 222 : :
# 223 : 2 : subnet = CSubNet(tor_addr);
# 224 : 2 : BOOST_CHECK(subnet.IsValid());
# 225 : 2 : BOOST_CHECK_EQUAL(subnet.ToString(), tor_addr.ToString());
# 226 : 2 : BOOST_CHECK(subnet.Match(tor_addr));
# 227 : 2 : BOOST_CHECK(
# 228 : 2 : !subnet.Match(ResolveIP("kpgvmscirrdqpekbqjsvw5teanhatztpp2gl6eee4zkowvwfxwenqaid.onion")));
# 229 : 2 : BOOST_CHECK(!subnet.Match(ResolveIP("1.2.3.4")));
# 230 : :
# 231 : 2 : BOOST_CHECK(!CSubNet(tor_addr, 200).IsValid());
# 232 : 2 : BOOST_CHECK(!CSubNet(tor_addr, ResolveIP("255.0.0.0")).IsValid());
# 233 : :
# 234 : 2 : subnet = ResolveSubNet("1.2.3.4/255.255.255.255");
# 235 : 2 : BOOST_CHECK_EQUAL(subnet.ToString(), "1.2.3.4/32");
# 236 : 2 : subnet = ResolveSubNet("1.2.3.4/255.255.255.254");
# 237 : 2 : BOOST_CHECK_EQUAL(subnet.ToString(), "1.2.3.4/31");
# 238 : 2 : subnet = ResolveSubNet("1.2.3.4/255.255.255.252");
# 239 : 2 : BOOST_CHECK_EQUAL(subnet.ToString(), "1.2.3.4/30");
# 240 : 2 : subnet = ResolveSubNet("1.2.3.4/255.255.255.248");
# 241 : 2 : BOOST_CHECK_EQUAL(subnet.ToString(), "1.2.3.0/29");
# 242 : 2 : subnet = ResolveSubNet("1.2.3.4/255.255.255.240");
# 243 : 2 : BOOST_CHECK_EQUAL(subnet.ToString(), "1.2.3.0/28");
# 244 : 2 : subnet = ResolveSubNet("1.2.3.4/255.255.255.224");
# 245 : 2 : BOOST_CHECK_EQUAL(subnet.ToString(), "1.2.3.0/27");
# 246 : 2 : subnet = ResolveSubNet("1.2.3.4/255.255.255.192");
# 247 : 2 : BOOST_CHECK_EQUAL(subnet.ToString(), "1.2.3.0/26");
# 248 : 2 : subnet = ResolveSubNet("1.2.3.4/255.255.255.128");
# 249 : 2 : BOOST_CHECK_EQUAL(subnet.ToString(), "1.2.3.0/25");
# 250 : 2 : subnet = ResolveSubNet("1.2.3.4/255.255.255.0");
# 251 : 2 : BOOST_CHECK_EQUAL(subnet.ToString(), "1.2.3.0/24");
# 252 : 2 : subnet = ResolveSubNet("1.2.3.4/255.255.254.0");
# 253 : 2 : BOOST_CHECK_EQUAL(subnet.ToString(), "1.2.2.0/23");
# 254 : 2 : subnet = ResolveSubNet("1.2.3.4/255.255.252.0");
# 255 : 2 : BOOST_CHECK_EQUAL(subnet.ToString(), "1.2.0.0/22");
# 256 : 2 : subnet = ResolveSubNet("1.2.3.4/255.255.248.0");
# 257 : 2 : BOOST_CHECK_EQUAL(subnet.ToString(), "1.2.0.0/21");
# 258 : 2 : subnet = ResolveSubNet("1.2.3.4/255.255.240.0");
# 259 : 2 : BOOST_CHECK_EQUAL(subnet.ToString(), "1.2.0.0/20");
# 260 : 2 : subnet = ResolveSubNet("1.2.3.4/255.255.224.0");
# 261 : 2 : BOOST_CHECK_EQUAL(subnet.ToString(), "1.2.0.0/19");
# 262 : 2 : subnet = ResolveSubNet("1.2.3.4/255.255.192.0");
# 263 : 2 : BOOST_CHECK_EQUAL(subnet.ToString(), "1.2.0.0/18");
# 264 : 2 : subnet = ResolveSubNet("1.2.3.4/255.255.128.0");
# 265 : 2 : BOOST_CHECK_EQUAL(subnet.ToString(), "1.2.0.0/17");
# 266 : 2 : subnet = ResolveSubNet("1.2.3.4/255.255.0.0");
# 267 : 2 : BOOST_CHECK_EQUAL(subnet.ToString(), "1.2.0.0/16");
# 268 : 2 : subnet = ResolveSubNet("1.2.3.4/255.254.0.0");
# 269 : 2 : BOOST_CHECK_EQUAL(subnet.ToString(), "1.2.0.0/15");
# 270 : 2 : subnet = ResolveSubNet("1.2.3.4/255.252.0.0");
# 271 : 2 : BOOST_CHECK_EQUAL(subnet.ToString(), "1.0.0.0/14");
# 272 : 2 : subnet = ResolveSubNet("1.2.3.4/255.248.0.0");
# 273 : 2 : BOOST_CHECK_EQUAL(subnet.ToString(), "1.0.0.0/13");
# 274 : 2 : subnet = ResolveSubNet("1.2.3.4/255.240.0.0");
# 275 : 2 : BOOST_CHECK_EQUAL(subnet.ToString(), "1.0.0.0/12");
# 276 : 2 : subnet = ResolveSubNet("1.2.3.4/255.224.0.0");
# 277 : 2 : BOOST_CHECK_EQUAL(subnet.ToString(), "1.0.0.0/11");
# 278 : 2 : subnet = ResolveSubNet("1.2.3.4/255.192.0.0");
# 279 : 2 : BOOST_CHECK_EQUAL(subnet.ToString(), "1.0.0.0/10");
# 280 : 2 : subnet = ResolveSubNet("1.2.3.4/255.128.0.0");
# 281 : 2 : BOOST_CHECK_EQUAL(subnet.ToString(), "1.0.0.0/9");
# 282 : 2 : subnet = ResolveSubNet("1.2.3.4/255.0.0.0");
# 283 : 2 : BOOST_CHECK_EQUAL(subnet.ToString(), "1.0.0.0/8");
# 284 : 2 : subnet = ResolveSubNet("1.2.3.4/254.0.0.0");
# 285 : 2 : BOOST_CHECK_EQUAL(subnet.ToString(), "0.0.0.0/7");
# 286 : 2 : subnet = ResolveSubNet("1.2.3.4/252.0.0.0");
# 287 : 2 : BOOST_CHECK_EQUAL(subnet.ToString(), "0.0.0.0/6");
# 288 : 2 : subnet = ResolveSubNet("1.2.3.4/248.0.0.0");
# 289 : 2 : BOOST_CHECK_EQUAL(subnet.ToString(), "0.0.0.0/5");
# 290 : 2 : subnet = ResolveSubNet("1.2.3.4/240.0.0.0");
# 291 : 2 : BOOST_CHECK_EQUAL(subnet.ToString(), "0.0.0.0/4");
# 292 : 2 : subnet = ResolveSubNet("1.2.3.4/224.0.0.0");
# 293 : 2 : BOOST_CHECK_EQUAL(subnet.ToString(), "0.0.0.0/3");
# 294 : 2 : subnet = ResolveSubNet("1.2.3.4/192.0.0.0");
# 295 : 2 : BOOST_CHECK_EQUAL(subnet.ToString(), "0.0.0.0/2");
# 296 : 2 : subnet = ResolveSubNet("1.2.3.4/128.0.0.0");
# 297 : 2 : BOOST_CHECK_EQUAL(subnet.ToString(), "0.0.0.0/1");
# 298 : 2 : subnet = ResolveSubNet("1.2.3.4/0.0.0.0");
# 299 : 2 : BOOST_CHECK_EQUAL(subnet.ToString(), "0.0.0.0/0");
# 300 : :
# 301 : 2 : subnet = ResolveSubNet("1:2:3:4:5:6:7:8/ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff");
# 302 : 2 : BOOST_CHECK_EQUAL(subnet.ToString(), "1:2:3:4:5:6:7:8/128");
# 303 : 2 : subnet = ResolveSubNet("1:2:3:4:5:6:7:8/ffff:0000:0000:0000:0000:0000:0000:0000");
# 304 : 2 : BOOST_CHECK_EQUAL(subnet.ToString(), "1::/16");
# 305 : 2 : subnet = ResolveSubNet("1:2:3:4:5:6:7:8/0000:0000:0000:0000:0000:0000:0000:0000");
# 306 : 2 : BOOST_CHECK_EQUAL(subnet.ToString(), "::/0");
# 307 : : // Invalid netmasks (with 1-bits after 0-bits)
# 308 : 2 : subnet = ResolveSubNet("1.2.3.4/255.255.232.0");
# 309 : 2 : BOOST_CHECK(!subnet.IsValid());
# 310 : 2 : subnet = ResolveSubNet("1.2.3.4/255.0.255.255");
# 311 : 2 : BOOST_CHECK(!subnet.IsValid());
# 312 : 2 : subnet = ResolveSubNet("1:2:3:4:5:6:7:8/ffff:ffff:ffff:fffe:ffff:ffff:ffff:ff0f");
# 313 : 2 : BOOST_CHECK(!subnet.IsValid());
# 314 : 2 : }
# 315 : :
# 316 : : BOOST_AUTO_TEST_CASE(netbase_getgroup)
# 317 : 2 : {
# 318 : 2 : std::vector<bool> asmap; // use /16
# 319 : 2 : BOOST_CHECK(ResolveIP("127.0.0.1").GetGroup(asmap) == std::vector<unsigned char>({0})); // Local -> !Routable()
# 320 : 2 : BOOST_CHECK(ResolveIP("257.0.0.1").GetGroup(asmap) == std::vector<unsigned char>({0})); // !Valid -> !Routable()
# 321 : 2 : BOOST_CHECK(ResolveIP("10.0.0.1").GetGroup(asmap) == std::vector<unsigned char>({0})); // RFC1918 -> !Routable()
# 322 : 2 : BOOST_CHECK(ResolveIP("169.254.1.1").GetGroup(asmap) == std::vector<unsigned char>({0})); // RFC3927 -> !Routable()
# 323 : 2 : BOOST_CHECK(ResolveIP("1.2.3.4").GetGroup(asmap) == std::vector<unsigned char>({(unsigned char)NET_IPV4, 1, 2})); // IPv4
# 324 : 2 : BOOST_CHECK(ResolveIP("::FFFF:0:102:304").GetGroup(asmap) == std::vector<unsigned char>({(unsigned char)NET_IPV4, 1, 2})); // RFC6145
# 325 : 2 : BOOST_CHECK(ResolveIP("64:FF9B::102:304").GetGroup(asmap) == std::vector<unsigned char>({(unsigned char)NET_IPV4, 1, 2})); // RFC6052
# 326 : 2 : BOOST_CHECK(ResolveIP("2002:102:304:9999:9999:9999:9999:9999").GetGroup(asmap) == std::vector<unsigned char>({(unsigned char)NET_IPV4, 1, 2})); // RFC3964
# 327 : 2 : BOOST_CHECK(ResolveIP("2001:0:9999:9999:9999:9999:FEFD:FCFB").GetGroup(asmap) == std::vector<unsigned char>({(unsigned char)NET_IPV4, 1, 2})); // RFC4380
# 328 : 2 : 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})); //he.net
# 329 : 2 : 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})); //IPv6
# 330 : :
# 331 : : // baz.net sha256 hash: 12929400eb4607c4ac075f087167e75286b179c693eb059a01774b864e8fe505
# 332 : 2 : std::vector<unsigned char> internal_group = {NET_INTERNAL, 0x12, 0x92, 0x94, 0x00, 0xeb, 0x46, 0x07, 0xc4, 0xac, 0x07};
# 333 : 2 : BOOST_CHECK(CreateInternal("baz.net").GetGroup(asmap) == internal_group);
# 334 : 2 : }
# 335 : :
# 336 : : BOOST_AUTO_TEST_CASE(netbase_parsenetwork)
# 337 : 2 : {
# 338 : 2 : BOOST_CHECK_EQUAL(ParseNetwork("ipv4"), NET_IPV4);
# 339 : 2 : BOOST_CHECK_EQUAL(ParseNetwork("ipv6"), NET_IPV6);
# 340 : 2 : BOOST_CHECK_EQUAL(ParseNetwork("onion"), NET_ONION);
# 341 : 2 : BOOST_CHECK_EQUAL(ParseNetwork("tor"), NET_ONION);
# 342 : 2 : BOOST_CHECK_EQUAL(ParseNetwork("cjdns"), NET_CJDNS);
# 343 : :
# 344 : 2 : BOOST_CHECK_EQUAL(ParseNetwork("IPv4"), NET_IPV4);
# 345 : 2 : BOOST_CHECK_EQUAL(ParseNetwork("IPv6"), NET_IPV6);
# 346 : 2 : BOOST_CHECK_EQUAL(ParseNetwork("ONION"), NET_ONION);
# 347 : 2 : BOOST_CHECK_EQUAL(ParseNetwork("TOR"), NET_ONION);
# 348 : 2 : BOOST_CHECK_EQUAL(ParseNetwork("CJDNS"), NET_CJDNS);
# 349 : :
# 350 : 2 : BOOST_CHECK_EQUAL(ParseNetwork(":)"), NET_UNROUTABLE);
# 351 : 2 : BOOST_CHECK_EQUAL(ParseNetwork("tÖr"), NET_UNROUTABLE);
# 352 : 2 : BOOST_CHECK_EQUAL(ParseNetwork("\xfe\xff"), NET_UNROUTABLE);
# 353 : 2 : BOOST_CHECK_EQUAL(ParseNetwork(""), NET_UNROUTABLE);
# 354 : 2 : }
# 355 : :
# 356 : : BOOST_AUTO_TEST_CASE(netpermissions_test)
# 357 : 2 : {
# 358 : 2 : bilingual_str error;
# 359 : 2 : NetWhitebindPermissions whitebindPermissions;
# 360 : 2 : NetWhitelistPermissions whitelistPermissions;
# 361 : :
# 362 : : // Detect invalid white bind
# 363 : 2 : BOOST_CHECK(!NetWhitebindPermissions::TryParse("", whitebindPermissions, error));
# 364 : 2 : BOOST_CHECK(error.original.find("Cannot resolve -whitebind address") != std::string::npos);
# 365 : 2 : BOOST_CHECK(!NetWhitebindPermissions::TryParse("127.0.0.1", whitebindPermissions, error));
# 366 : 2 : BOOST_CHECK(error.original.find("Need to specify a port with -whitebind") != std::string::npos);
# 367 : 2 : BOOST_CHECK(!NetWhitebindPermissions::TryParse("", whitebindPermissions, error));
# 368 : :
# 369 : : // If no permission flags, assume backward compatibility
# 370 : 2 : BOOST_CHECK(NetWhitebindPermissions::TryParse("1.2.3.4:32", whitebindPermissions, error));
# 371 : 2 : BOOST_CHECK(error.empty());
# 372 : 2 : BOOST_CHECK_EQUAL(whitebindPermissions.m_flags, NetPermissionFlags::Implicit);
# 373 : 2 : BOOST_CHECK(NetPermissions::HasFlag(whitebindPermissions.m_flags, NetPermissionFlags::Implicit));
# 374 : 2 : NetPermissions::ClearFlag(whitebindPermissions.m_flags, NetPermissionFlags::Implicit);
# 375 : 2 : BOOST_CHECK(!NetPermissions::HasFlag(whitebindPermissions.m_flags, NetPermissionFlags::Implicit));
# 376 : 2 : BOOST_CHECK_EQUAL(whitebindPermissions.m_flags, NetPermissionFlags::None);
# 377 : 2 : NetPermissions::AddFlag(whitebindPermissions.m_flags, NetPermissionFlags::Implicit);
# 378 : 2 : BOOST_CHECK(NetPermissions::HasFlag(whitebindPermissions.m_flags, NetPermissionFlags::Implicit));
# 379 : :
# 380 : : // Can set one permission
# 381 : 2 : BOOST_CHECK(NetWhitebindPermissions::TryParse("bloom@1.2.3.4:32", whitebindPermissions, error));
# 382 : 2 : BOOST_CHECK_EQUAL(whitebindPermissions.m_flags, NetPermissionFlags::BloomFilter);
# 383 : 2 : BOOST_CHECK(NetWhitebindPermissions::TryParse("@1.2.3.4:32", whitebindPermissions, error));
# 384 : 2 : BOOST_CHECK_EQUAL(whitebindPermissions.m_flags, NetPermissionFlags::None);
# 385 : :
# 386 : 2 : NetWhitebindPermissions noban, noban_download, download_noban, download;
# 387 : :
# 388 : : // "noban" implies "download"
# 389 : 2 : BOOST_REQUIRE(NetWhitebindPermissions::TryParse("noban@1.2.3.4:32", noban, error));
# 390 : 2 : BOOST_CHECK_EQUAL(noban.m_flags, NetPermissionFlags::NoBan);
# 391 : 2 : BOOST_CHECK(NetPermissions::HasFlag(noban.m_flags, NetPermissionFlags::Download));
# 392 : 2 : BOOST_CHECK(NetPermissions::HasFlag(noban.m_flags, NetPermissionFlags::NoBan));
# 393 : :
# 394 : : // "noban,download" is equivalent to "noban"
# 395 : 2 : BOOST_REQUIRE(NetWhitebindPermissions::TryParse("noban,download@1.2.3.4:32", noban_download, error));
# 396 : 2 : BOOST_CHECK_EQUAL(noban_download.m_flags, noban.m_flags);
# 397 : :
# 398 : : // "download,noban" is equivalent to "noban"
# 399 : 2 : BOOST_REQUIRE(NetWhitebindPermissions::TryParse("download,noban@1.2.3.4:32", download_noban, error));
# 400 : 2 : BOOST_CHECK_EQUAL(download_noban.m_flags, noban.m_flags);
# 401 : :
# 402 : : // "download" excludes (does not imply) "noban"
# 403 : 2 : BOOST_REQUIRE(NetWhitebindPermissions::TryParse("download@1.2.3.4:32", download, error));
# 404 : 2 : BOOST_CHECK_EQUAL(download.m_flags, NetPermissionFlags::Download);
# 405 : 2 : BOOST_CHECK(NetPermissions::HasFlag(download.m_flags, NetPermissionFlags::Download));
# 406 : 2 : BOOST_CHECK(!NetPermissions::HasFlag(download.m_flags, NetPermissionFlags::NoBan));
# 407 : :
# 408 : : // Happy path, can parse flags
# 409 : 2 : BOOST_CHECK(NetWhitebindPermissions::TryParse("bloom,forcerelay@1.2.3.4:32", whitebindPermissions, error));
# 410 : : // forcerelay should also activate the relay permission
# 411 : 2 : BOOST_CHECK_EQUAL(whitebindPermissions.m_flags, NetPermissionFlags::BloomFilter | NetPermissionFlags::ForceRelay | NetPermissionFlags::Relay);
# 412 : 2 : BOOST_CHECK(NetWhitebindPermissions::TryParse("bloom,relay,noban@1.2.3.4:32", whitebindPermissions, error));
# 413 : 2 : BOOST_CHECK_EQUAL(whitebindPermissions.m_flags, NetPermissionFlags::BloomFilter | NetPermissionFlags::Relay | NetPermissionFlags::NoBan);
# 414 : 2 : BOOST_CHECK(NetWhitebindPermissions::TryParse("bloom,forcerelay,noban@1.2.3.4:32", whitebindPermissions, error));
# 415 : 2 : BOOST_CHECK(NetWhitebindPermissions::TryParse("all@1.2.3.4:32", whitebindPermissions, error));
# 416 : 2 : BOOST_CHECK_EQUAL(whitebindPermissions.m_flags, NetPermissionFlags::All);
# 417 : :
# 418 : : // Allow dups
# 419 : 2 : BOOST_CHECK(NetWhitebindPermissions::TryParse("bloom,relay,noban,noban@1.2.3.4:32", whitebindPermissions, error));
# 420 : 2 : BOOST_CHECK_EQUAL(whitebindPermissions.m_flags, NetPermissionFlags::BloomFilter | NetPermissionFlags::Relay | NetPermissionFlags::NoBan | NetPermissionFlags::Download); // "noban" implies "download"
# 421 : :
# 422 : : // Allow empty
# 423 : 2 : BOOST_CHECK(NetWhitebindPermissions::TryParse("bloom,relay,,noban@1.2.3.4:32", whitebindPermissions, error));
# 424 : 2 : BOOST_CHECK_EQUAL(whitebindPermissions.m_flags, NetPermissionFlags::BloomFilter | NetPermissionFlags::Relay | NetPermissionFlags::NoBan);
# 425 : 2 : BOOST_CHECK(NetWhitebindPermissions::TryParse(",@1.2.3.4:32", whitebindPermissions, error));
# 426 : 2 : BOOST_CHECK_EQUAL(whitebindPermissions.m_flags, NetPermissionFlags::None);
# 427 : 2 : BOOST_CHECK(NetWhitebindPermissions::TryParse(",,@1.2.3.4:32", whitebindPermissions, error));
# 428 : 2 : BOOST_CHECK_EQUAL(whitebindPermissions.m_flags, NetPermissionFlags::None);
# 429 : :
# 430 : : // Detect invalid flag
# 431 : 2 : BOOST_CHECK(!NetWhitebindPermissions::TryParse("bloom,forcerelay,oopsie@1.2.3.4:32", whitebindPermissions, error));
# 432 : 2 : BOOST_CHECK(error.original.find("Invalid P2P permission") != std::string::npos);
# 433 : :
# 434 : : // Check netmask error
# 435 : 2 : BOOST_CHECK(!NetWhitelistPermissions::TryParse("bloom,forcerelay,noban@1.2.3.4:32", whitelistPermissions, error));
# 436 : 2 : BOOST_CHECK(error.original.find("Invalid netmask specified in -whitelist") != std::string::npos);
# 437 : :
# 438 : : // Happy path for whitelist parsing
# 439 : 2 : BOOST_CHECK(NetWhitelistPermissions::TryParse("noban@1.2.3.4", whitelistPermissions, error));
# 440 : 2 : BOOST_CHECK_EQUAL(whitelistPermissions.m_flags, NetPermissionFlags::NoBan);
# 441 : 2 : BOOST_CHECK(NetPermissions::HasFlag(whitelistPermissions.m_flags, NetPermissionFlags::NoBan));
# 442 : :
# 443 : 2 : BOOST_CHECK(NetWhitelistPermissions::TryParse("bloom,forcerelay,noban,relay@1.2.3.4/32", whitelistPermissions, error));
# 444 : 2 : BOOST_CHECK_EQUAL(whitelistPermissions.m_flags, NetPermissionFlags::BloomFilter | NetPermissionFlags::ForceRelay | NetPermissionFlags::NoBan | NetPermissionFlags::Relay);
# 445 : 2 : BOOST_CHECK(error.empty());
# 446 : 2 : BOOST_CHECK_EQUAL(whitelistPermissions.m_subnet.ToString(), "1.2.3.4/32");
# 447 : 2 : BOOST_CHECK(NetWhitelistPermissions::TryParse("bloom,forcerelay,noban,relay,mempool@1.2.3.4/32", whitelistPermissions, error));
# 448 : :
# 449 : 2 : const auto strings = NetPermissions::ToStrings(NetPermissionFlags::All);
# 450 : 2 : BOOST_CHECK_EQUAL(strings.size(), 7U);
# 451 : 2 : BOOST_CHECK(std::find(strings.begin(), strings.end(), "bloomfilter") != strings.end());
# 452 : 2 : BOOST_CHECK(std::find(strings.begin(), strings.end(), "forcerelay") != strings.end());
# 453 : 2 : BOOST_CHECK(std::find(strings.begin(), strings.end(), "relay") != strings.end());
# 454 : 2 : BOOST_CHECK(std::find(strings.begin(), strings.end(), "noban") != strings.end());
# 455 : 2 : BOOST_CHECK(std::find(strings.begin(), strings.end(), "mempool") != strings.end());
# 456 : 2 : BOOST_CHECK(std::find(strings.begin(), strings.end(), "download") != strings.end());
# 457 : 2 : BOOST_CHECK(std::find(strings.begin(), strings.end(), "addr") != strings.end());
# 458 : 2 : }
# 459 : :
# 460 : : BOOST_AUTO_TEST_CASE(netbase_dont_resolve_strings_with_embedded_nul_characters)
# 461 : 2 : {
# 462 : 2 : CNetAddr addr;
# 463 : 2 : BOOST_CHECK(LookupHost("127.0.0.1"s, addr, false));
# 464 : 2 : BOOST_CHECK(!LookupHost("127.0.0.1\0"s, addr, false));
# 465 : 2 : BOOST_CHECK(!LookupHost("127.0.0.1\0example.com"s, addr, false));
# 466 : 2 : BOOST_CHECK(!LookupHost("127.0.0.1\0example.com\0"s, addr, false));
# 467 : 2 : CSubNet ret;
# 468 : 2 : BOOST_CHECK(LookupSubNet("1.2.3.0/24"s, ret));
# 469 : 2 : BOOST_CHECK(!LookupSubNet("1.2.3.0/24\0"s, ret));
# 470 : 2 : BOOST_CHECK(!LookupSubNet("1.2.3.0/24\0example.com"s, ret));
# 471 : 2 : BOOST_CHECK(!LookupSubNet("1.2.3.0/24\0example.com\0"s, ret));
# 472 : 2 : BOOST_CHECK(LookupSubNet("pg6mmjiyjmcrsslvykfwnntlaru7p5svn6y2ymmju6nubxndf4pscryd.onion"s, ret));
# 473 : 2 : BOOST_CHECK(!LookupSubNet("pg6mmjiyjmcrsslvykfwnntlaru7p5svn6y2ymmju6nubxndf4pscryd.onion\0"s, ret));
# 474 : 2 : BOOST_CHECK(!LookupSubNet("pg6mmjiyjmcrsslvykfwnntlaru7p5svn6y2ymmju6nubxndf4pscryd.onion\0example.com"s, ret));
# 475 : 2 : BOOST_CHECK(!LookupSubNet("pg6mmjiyjmcrsslvykfwnntlaru7p5svn6y2ymmju6nubxndf4pscryd.onion\0example.com\0"s, ret));
# 476 : 2 : }
# 477 : :
# 478 : : // Since CNetAddr (un)ser is tested separately in net_tests.cpp here we only
# 479 : : // try a few edge cases for port, service flags and time.
# 480 : :
# 481 : : static const std::vector<CAddress> fixture_addresses({
# 482 : : CAddress(
# 483 : : CService(CNetAddr(in6_addr(IN6ADDR_LOOPBACK_INIT)), 0 /* port */),
# 484 : : NODE_NONE,
# 485 : : 0x4966bc61U /* Fri Jan 9 02:54:25 UTC 2009 */
# 486 : : ),
# 487 : : CAddress(
# 488 : : CService(CNetAddr(in6_addr(IN6ADDR_LOOPBACK_INIT)), 0x00f1 /* port */),
# 489 : : NODE_NETWORK,
# 490 : : 0x83766279U /* Tue Nov 22 11:22:33 UTC 2039 */
# 491 : : ),
# 492 : : CAddress(
# 493 : : CService(CNetAddr(in6_addr(IN6ADDR_LOOPBACK_INIT)), 0xf1f2 /* port */),
# 494 : : static_cast<ServiceFlags>(NODE_WITNESS | NODE_COMPACT_FILTERS | NODE_NETWORK_LIMITED),
# 495 : : 0xffffffffU /* Sun Feb 7 06:28:15 UTC 2106 */
# 496 : : )
# 497 : : });
# 498 : :
# 499 : : // fixture_addresses should equal to this when serialized in V1 format.
# 500 : : // When this is unserialized from V1 format it should equal to fixture_addresses.
# 501 : : static constexpr const char* stream_addrv1_hex =
# 502 : : "03" // number of entries
# 503 : :
# 504 : : "61bc6649" // time, Fri Jan 9 02:54:25 UTC 2009
# 505 : : "0000000000000000" // service flags, NODE_NONE
# 506 : : "00000000000000000000000000000001" // address, fixed 16 bytes (IPv4 embedded in IPv6)
# 507 : : "0000" // port
# 508 : :
# 509 : : "79627683" // time, Tue Nov 22 11:22:33 UTC 2039
# 510 : : "0100000000000000" // service flags, NODE_NETWORK
# 511 : : "00000000000000000000000000000001" // address, fixed 16 bytes (IPv6)
# 512 : : "00f1" // port
# 513 : :
# 514 : : "ffffffff" // time, Sun Feb 7 06:28:15 UTC 2106
# 515 : : "4804000000000000" // service flags, NODE_WITNESS | NODE_COMPACT_FILTERS | NODE_NETWORK_LIMITED
# 516 : : "00000000000000000000000000000001" // address, fixed 16 bytes (IPv6)
# 517 : : "f1f2"; // port
# 518 : :
# 519 : : // fixture_addresses should equal to this when serialized in V2 format.
# 520 : : // When this is unserialized from V2 format it should equal to fixture_addresses.
# 521 : : static constexpr const char* stream_addrv2_hex =
# 522 : : "03" // number of entries
# 523 : :
# 524 : : "61bc6649" // time, Fri Jan 9 02:54:25 UTC 2009
# 525 : : "00" // service flags, COMPACTSIZE(NODE_NONE)
# 526 : : "02" // network id, IPv6
# 527 : : "10" // address length, COMPACTSIZE(16)
# 528 : : "00000000000000000000000000000001" // address
# 529 : : "0000" // port
# 530 : :
# 531 : : "79627683" // time, Tue Nov 22 11:22:33 UTC 2039
# 532 : : "01" // service flags, COMPACTSIZE(NODE_NETWORK)
# 533 : : "02" // network id, IPv6
# 534 : : "10" // address length, COMPACTSIZE(16)
# 535 : : "00000000000000000000000000000001" // address
# 536 : : "00f1" // port
# 537 : :
# 538 : : "ffffffff" // time, Sun Feb 7 06:28:15 UTC 2106
# 539 : : "fd4804" // service flags, COMPACTSIZE(NODE_WITNESS | NODE_COMPACT_FILTERS | NODE_NETWORK_LIMITED)
# 540 : : "02" // network id, IPv6
# 541 : : "10" // address length, COMPACTSIZE(16)
# 542 : : "00000000000000000000000000000001" // address
# 543 : : "f1f2"; // port
# 544 : :
# 545 : : BOOST_AUTO_TEST_CASE(caddress_serialize_v1)
# 546 : 2 : {
# 547 : 2 : CDataStream s(SER_NETWORK, PROTOCOL_VERSION);
# 548 : :
# 549 : 2 : s << fixture_addresses;
# 550 : 2 : BOOST_CHECK_EQUAL(HexStr(s), stream_addrv1_hex);
# 551 : 2 : }
# 552 : :
# 553 : : BOOST_AUTO_TEST_CASE(caddress_unserialize_v1)
# 554 : 2 : {
# 555 : 2 : CDataStream s(ParseHex(stream_addrv1_hex), SER_NETWORK, PROTOCOL_VERSION);
# 556 : 2 : std::vector<CAddress> addresses_unserialized;
# 557 : :
# 558 : 2 : s >> addresses_unserialized;
# 559 : 2 : BOOST_CHECK(fixture_addresses == addresses_unserialized);
# 560 : 2 : }
# 561 : :
# 562 : : BOOST_AUTO_TEST_CASE(caddress_serialize_v2)
# 563 : 2 : {
# 564 : 2 : CDataStream s(SER_NETWORK, PROTOCOL_VERSION | ADDRV2_FORMAT);
# 565 : :
# 566 : 2 : s << fixture_addresses;
# 567 : 2 : BOOST_CHECK_EQUAL(HexStr(s), stream_addrv2_hex);
# 568 : 2 : }
# 569 : :
# 570 : : BOOST_AUTO_TEST_CASE(caddress_unserialize_v2)
# 571 : 2 : {
# 572 : 2 : CDataStream s(ParseHex(stream_addrv2_hex), SER_NETWORK, PROTOCOL_VERSION | ADDRV2_FORMAT);
# 573 : 2 : std::vector<CAddress> addresses_unserialized;
# 574 : :
# 575 : 2 : s >> addresses_unserialized;
# 576 : 2 : BOOST_CHECK(fixture_addresses == addresses_unserialized);
# 577 : 2 : }
# 578 : :
# 579 : : BOOST_AUTO_TEST_CASE(isbadport)
# 580 : 2 : {
# 581 : 2 : BOOST_CHECK(IsBadPort(1));
# 582 : 2 : BOOST_CHECK(IsBadPort(22));
# 583 : 2 : BOOST_CHECK(IsBadPort(6000));
# 584 : :
# 585 : 2 : BOOST_CHECK(!IsBadPort(80));
# 586 : 2 : BOOST_CHECK(!IsBadPort(443));
# 587 : 2 : BOOST_CHECK(!IsBadPort(8333));
# 588 : :
# 589 : : // Check all ports, there must be 80 bad ports in total.
# 590 : 2 : size_t total_bad_ports{0};
# 591 [ + + ]: 131072 : for (uint16_t port = std::numeric_limits<uint16_t>::max(); port > 0; --port) {
# 592 [ + + ]: 131070 : if (IsBadPort(port)) {
# 593 : 160 : ++total_bad_ports;
# 594 : 160 : }
# 595 : 131070 : }
# 596 : 2 : BOOST_CHECK_EQUAL(total_bad_ports, 80);
# 597 : 2 : }
# 598 : :
# 599 : : BOOST_AUTO_TEST_SUITE_END()
|