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