LCOV - code coverage report
Current view: top level - src/test - netbase_tests.cpp (source / functions) Hit Total Coverage
Test: coverage.lcov Lines: 401 401 100.0 %
Date: 2022-04-21 14:51:19 Functions: 20 20 100.0 %
Legend: Modified by patch:
Lines: hit not hit | Branches: + taken - not taken # not executed

Not modified by patch:
Lines: hit not hit | Branches: + taken - not taken # not executed
Branches: 6 8 75.0 %

           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()

Generated by: LCOV version 0-eol-96201-ge66f56f4af6a