LCOV - code coverage report
Current view: top level - src/test - netbase_tests.cpp (source / functions) Hit Total Coverage
Test: total_coverage.info Lines: 326 326 100.0 %
Date: 2025-02-23 09:33:43 Functions: 35 35 100.0 %

          Line data    Source code
       1             : // Copyright (c) 2012-2015 The Bitcoin Core developers
       2             : // Copyright (c) 2014-2015 The Dash Core developers
       3             : // Copyright (c) 2015-2021 The PIVX Core developers
       4             : // Distributed under the MIT/X11 software license, see the accompanying
       5             : // file COPYING or http://www.opensource.org/licenses/mit-license.php.
       6             : 
       7             : #include "test/test_pivx.h"
       8             : 
       9             : #include "net.h"    // validateMasternodeIP
      10             : #include "netbase.h"
      11             : #include "protocol.h"
      12             : #include "serialize.h"
      13             : #include "streams.h"
      14             : #include "version.h"
      15             : 
      16             : #include <string>
      17             : 
      18             : #include <boost/test/unit_test.hpp>
      19             : 
      20             : 
      21             : BOOST_FIXTURE_TEST_SUITE(netbase_tests, BasicTestingSetup)
      22             : 
      23          95 : static CNetAddr ResolveIP(const std::string& ip)
      24             : {
      25          95 :     CNetAddr addr;
      26          95 :     LookupHost(ip, addr, false);
      27          95 :     return addr;
      28             : }
      29             : 
      30          77 : static CSubNet ResolveSubNet(const std::string& subnet)
      31             : {
      32          77 :     CSubNet ret;
      33          77 :     LookupSubNet(subnet, ret);
      34          77 :     return ret;
      35             : }
      36             : 
      37           4 : static CNetAddr CreateInternal(const std::string& host)
      38             : {
      39           4 :     CNetAddr addr;
      40           4 :     addr.SetInternal(host);
      41           4 :     return addr;
      42             : }
      43             : 
      44           2 : BOOST_AUTO_TEST_CASE(netbase_networks)
      45             : {
      46           2 :     BOOST_CHECK(ResolveIP("127.0.0.1").GetNetwork()                              == NET_UNROUTABLE);
      47           2 :     BOOST_CHECK(ResolveIP("::1").GetNetwork()                                    == NET_UNROUTABLE);
      48           2 :     BOOST_CHECK(ResolveIP("8.8.8.8").GetNetwork()                                == NET_IPV4);
      49           2 :     BOOST_CHECK(ResolveIP("2001::8888").GetNetwork()                             == NET_IPV6);
      50           3 :     BOOST_CHECK(ResolveIP("FD87:D87E:EB43:edb1:8e4:3588:e546:35ca").GetNetwork() == NET_ONION);
      51           2 :     BOOST_CHECK(CreateInternal("foo.com").GetNetwork()                           == NET_INTERNAL);
      52           1 : }
      53             : 
      54           2 : BOOST_AUTO_TEST_CASE(netbase_properties)
      55             : {
      56           2 :     BOOST_CHECK(ResolveIP("127.0.0.1").IsIPv4());
      57           3 :     BOOST_CHECK(ResolveIP("::FFFF:192.168.1.1").IsIPv4());
      58           2 :     BOOST_CHECK(ResolveIP("::1").IsIPv6());
      59           2 :     BOOST_CHECK(ResolveIP("10.0.0.1").IsRFC1918());
      60           2 :     BOOST_CHECK(ResolveIP("192.168.1.1").IsRFC1918());
      61           2 :     BOOST_CHECK(ResolveIP("172.31.255.255").IsRFC1918());
      62           2 :     BOOST_CHECK(ResolveIP("198.18.0.0").IsRFC2544());
      63           2 :     BOOST_CHECK(ResolveIP("198.19.255.255").IsRFC2544());
      64           2 :     BOOST_CHECK(ResolveIP("2001:0DB8::").IsRFC3849());
      65           2 :     BOOST_CHECK(ResolveIP("169.254.1.1").IsRFC3927());
      66           2 :     BOOST_CHECK(ResolveIP("2002::1").IsRFC3964());
      67           2 :     BOOST_CHECK(ResolveIP("FC00::").IsRFC4193());
      68           2 :     BOOST_CHECK(ResolveIP("2001::2").IsRFC4380());
      69           2 :     BOOST_CHECK(ResolveIP("2001:10::").IsRFC4843());
      70           2 :     BOOST_CHECK(ResolveIP("2001:20::").IsRFC7343());
      71           2 :     BOOST_CHECK(ResolveIP("FE80::").IsRFC4862());
      72           2 :     BOOST_CHECK(ResolveIP("64:FF9B::").IsRFC6052());
      73           3 :     BOOST_CHECK(ResolveIP("FD87:D87E:EB43:edb1:8e4:3588:e546:35ca").IsTor());
      74           2 :     BOOST_CHECK(ResolveIP("127.0.0.1").IsLocal());
      75           2 :     BOOST_CHECK(ResolveIP("::1").IsLocal());
      76           2 :     BOOST_CHECK(ResolveIP("8.8.8.8").IsRoutable());
      77           2 :     BOOST_CHECK(ResolveIP("2001::1").IsRoutable());
      78           2 :     BOOST_CHECK(ResolveIP("127.0.0.1").IsValid());
      79           3 :     BOOST_CHECK(CreateInternal("FD6B:88C0:8724:edb1:8e4:3588:e546:35ca").IsInternal());
      80           2 :     BOOST_CHECK(CreateInternal("bar.com").IsInternal());
      81           1 : }
      82             : 
      83          15 : bool static TestSplitHost(std::string test, std::string host, int port)
      84             : {
      85          15 :     std::string hostOut;
      86          15 :     int portOut = -1;
      87          30 :     SplitHostPort(test, portOut, hostOut);
      88          17 :     return hostOut == host && port == portOut;
      89             : }
      90             : 
      91           2 : BOOST_AUTO_TEST_CASE(netbase_splithost)
      92             : {
      93           2 :     BOOST_CHECK(TestSplitHost("www.bitcoin.org", "www.bitcoin.org", -1));
      94           3 :     BOOST_CHECK(TestSplitHost("[www.bitcoin.org]", "www.bitcoin.org", -1));
      95           3 :     BOOST_CHECK(TestSplitHost("www.bitcoin.org:80", "www.bitcoin.org", 80));
      96           3 :     BOOST_CHECK(TestSplitHost("[www.bitcoin.org]:80", "www.bitcoin.org", 80));
      97           2 :     BOOST_CHECK(TestSplitHost("127.0.0.1", "127.0.0.1", -1));
      98           2 :     BOOST_CHECK(TestSplitHost("127.0.0.1:51472", "127.0.0.1", 51472));
      99           2 :     BOOST_CHECK(TestSplitHost("[127.0.0.1]", "127.0.0.1", -1));
     100           3 :     BOOST_CHECK(TestSplitHost("[127.0.0.1]:51472", "127.0.0.1", 51472));
     101           4 :     BOOST_CHECK(TestSplitHost("::ffff:127.0.0.1", "::ffff:127.0.0.1", -1));
     102           4 :     BOOST_CHECK(TestSplitHost("[::ffff:127.0.0.1]:51472", "::ffff:127.0.0.1", 51472));
     103           2 :     BOOST_CHECK(TestSplitHost("[::]:51472", "::", 51472));
     104           2 :     BOOST_CHECK(TestSplitHost("::51472", "::51472", -1));
     105           2 :     BOOST_CHECK(TestSplitHost(":51472", "", 51472));
     106           2 :     BOOST_CHECK(TestSplitHost("[]:51472", "", 51472));
     107           2 :     BOOST_CHECK(TestSplitHost("", "", -1));
     108           1 : }
     109             : 
     110           9 : bool static TestParse(std::string src, std::string canon)
     111             : {
     112           9 :     CService addr(LookupNumeric(src, 65535));
     113          10 :     return canon == addr.ToString();
     114             : }
     115             : 
     116           2 : BOOST_AUTO_TEST_CASE(netbase_lookupnumeric)
     117             : {
     118           2 :     BOOST_CHECK(TestParse("127.0.0.1", "127.0.0.1:65535"));
     119           2 :     BOOST_CHECK(TestParse("127.0.0.1:51472", "127.0.0.1:51472"));
     120           3 :     BOOST_CHECK(TestParse("::ffff:127.0.0.1", "127.0.0.1:65535"));
     121           2 :     BOOST_CHECK(TestParse("::", "[::]:65535"));
     122           2 :     BOOST_CHECK(TestParse("[::]:51472", "[::]:51472"));
     123           2 :     BOOST_CHECK(TestParse("[127.0.0.1]", "127.0.0.1:65535"));
     124           2 :     BOOST_CHECK(TestParse(":::", "[::]:0"));
     125             : 
     126             :     // verify that an internal address fails to resolve
     127           3 :     BOOST_CHECK(TestParse("[fd6b:88c0:8724:1:2:3:4:5]", "[::]:0"));
     128             :     // and that a one-off resolves correctly
     129           4 :     BOOST_CHECK(TestParse("[fd6c:88c0:8724:1:2:3:4:5]", "[fd6c:88c0:8724:1:2:3:4:5]:65535"));
     130           1 : }
     131             : 
     132           2 : BOOST_AUTO_TEST_CASE(onioncat_test)
     133             : {
     134             :     // values from https://web.archive.org/web/20121122003543/http://www.cypherpunk.at/onioncat/wiki/OnionCat
     135           1 :     CNetAddr addr1(ResolveIP("5wyqrzbvrdsumnok.onion"));
     136           2 :     CNetAddr addr2(ResolveIP("FD87:D87E:EB43:edb1:8e4:3588:e546:35ca"));
     137           2 :     BOOST_CHECK(addr1 == addr2);
     138           2 :     BOOST_CHECK(addr1.IsTor());
     139           4 :     BOOST_CHECK(addr1.ToStringIP() == "5wyqrzbvrdsumnok.onion");
     140           2 :     BOOST_CHECK(addr1.IsRoutable());
     141           1 : }
     142             : 
     143           2 : BOOST_AUTO_TEST_CASE(embedded_test)
     144             : {
     145           1 :     CNetAddr addr1(ResolveIP("1.2.3.4"));
     146           2 :     CNetAddr addr2(ResolveIP("::FFFF:0102:0304"));
     147           2 :     BOOST_CHECK(addr2.IsIPv4());
     148           1 :     BOOST_CHECK_EQUAL(addr1.ToString(), addr2.ToString());
     149           1 : }
     150             : 
     151           2 : BOOST_AUTO_TEST_CASE(subnet_test)
     152             : {
     153             : 
     154           3 :     BOOST_CHECK(ResolveSubNet("1.2.3.0/24") == ResolveSubNet("1.2.3.0/255.255.255.0"));
     155           3 :     BOOST_CHECK(ResolveSubNet("1.2.3.0/24") != ResolveSubNet("1.2.4.0/255.255.255.0"));
     156           2 :     BOOST_CHECK(ResolveSubNet("1.2.3.0/24").Match(ResolveIP("1.2.3.4")));
     157           2 :     BOOST_CHECK(!ResolveSubNet("1.2.2.0/24").Match(ResolveIP("1.2.3.4")));
     158           2 :     BOOST_CHECK(ResolveSubNet("1.2.3.4").Match(ResolveIP("1.2.3.4")));
     159           2 :     BOOST_CHECK(ResolveSubNet("1.2.3.4/32").Match(ResolveIP("1.2.3.4")));
     160           2 :     BOOST_CHECK(!ResolveSubNet("1.2.3.4").Match(ResolveIP("5.6.7.8")));
     161           2 :     BOOST_CHECK(!ResolveSubNet("1.2.3.4/32").Match(ResolveIP("5.6.7.8")));
     162           3 :     BOOST_CHECK(ResolveSubNet("::ffff:127.0.0.1").Match(ResolveIP("127.0.0.1")));
     163           2 :     BOOST_CHECK(ResolveSubNet("1:2:3:4:5:6:7:8").Match(ResolveIP("1:2:3:4:5:6:7:8")));
     164           2 :     BOOST_CHECK(!ResolveSubNet("1:2:3:4:5:6:7:8").Match(ResolveIP("1:2:3:4:5:6:7:9")));
     165           4 :     BOOST_CHECK(ResolveSubNet("1:2:3:4:5:6:7:0/112").Match(ResolveIP("1:2:3:4:5:6:7:1234")));
     166           2 :     BOOST_CHECK(ResolveSubNet("192.168.0.1/24").Match(ResolveIP("192.168.0.2")));
     167           2 :     BOOST_CHECK(ResolveSubNet("192.168.0.20/29").Match(ResolveIP("192.168.0.18")));
     168           2 :     BOOST_CHECK(ResolveSubNet("1.2.2.1/24").Match(ResolveIP("1.2.2.4")));
     169           2 :     BOOST_CHECK(ResolveSubNet("1.2.2.110/31").Match(ResolveIP("1.2.2.111")));
     170           2 :     BOOST_CHECK(ResolveSubNet("1.2.2.20/26").Match(ResolveIP("1.2.2.63")));
     171             :     // All-Matching IPv6 Matches arbitrary IPv6
     172           3 :     BOOST_CHECK(ResolveSubNet("::/0").Match(ResolveIP("1:2:3:4:5:6:7:1234")));
     173             :     // But not `::` or `0.0.0.0` because they are considered invalid addresses
     174           2 :     BOOST_CHECK(!ResolveSubNet("::/0").Match(ResolveIP("::")));
     175           2 :     BOOST_CHECK(!ResolveSubNet("::/0").Match(ResolveIP("0.0.0.0")));
     176             :     // Addresses from one network (IPv4) don't belong to subnets of another network (IPv6)
     177           2 :     BOOST_CHECK(!ResolveSubNet("::/0").Match(ResolveIP("1.2.3.4")));
     178             :     // All-Matching IPv4 does not Match IPv6
     179           3 :     BOOST_CHECK(!ResolveSubNet("0.0.0.0/0").Match(ResolveIP("1:2:3:4:5:6:7:1234")));
     180             :     // Invalid subnets Match nothing (not even invalid addresses)
     181           2 :     BOOST_CHECK(!CSubNet().Match(ResolveIP("1.2.3.4")));
     182           2 :     BOOST_CHECK(!ResolveSubNet("").Match(ResolveIP("4.5.6.7")));
     183           2 :     BOOST_CHECK(!ResolveSubNet("bloop").Match(ResolveIP("0.0.0.0")));
     184           2 :     BOOST_CHECK(!ResolveSubNet("bloop").Match(ResolveIP("hab")));
     185             :     // Check valid/invalid
     186           2 :     BOOST_CHECK(ResolveSubNet("1.2.3.0/0").IsValid());
     187           2 :     BOOST_CHECK(!ResolveSubNet("1.2.3.0/-1").IsValid());
     188           2 :     BOOST_CHECK(ResolveSubNet("1.2.3.0/32").IsValid());
     189           2 :     BOOST_CHECK(!ResolveSubNet("1.2.3.0/33").IsValid());
     190           2 :     BOOST_CHECK(!ResolveSubNet("1.2.3.0/300").IsValid());
     191           3 :     BOOST_CHECK(ResolveSubNet("1:2:3:4:5:6:7:8/0").IsValid());
     192           3 :     BOOST_CHECK(ResolveSubNet("1:2:3:4:5:6:7:8/33").IsValid());
     193           3 :     BOOST_CHECK(!ResolveSubNet("1:2:3:4:5:6:7:8/-1").IsValid());
     194           3 :     BOOST_CHECK(ResolveSubNet("1:2:3:4:5:6:7:8/128").IsValid());
     195           3 :     BOOST_CHECK(!ResolveSubNet("1:2:3:4:5:6:7:8/129").IsValid());
     196           2 :     BOOST_CHECK(!ResolveSubNet("fuzzy").IsValid());
     197             : 
     198             :     //CNetAddr constructor test
     199           2 :     BOOST_CHECK(CSubNet(ResolveIP("127.0.0.1")).IsValid());
     200           2 :     BOOST_CHECK(CSubNet(ResolveIP("127.0.0.1")).Match(ResolveIP("127.0.0.1")));
     201           2 :     BOOST_CHECK(!CSubNet(ResolveIP("127.0.0.1")).Match(ResolveIP("127.0.0.2")));
     202           3 :     BOOST_CHECK(CSubNet(ResolveIP("127.0.0.1")).ToString() == "127.0.0.1/32");
     203             : 
     204           2 :     CSubNet subnet = CSubNet(ResolveIP("1.2.3.4"), 32);
     205           1 :     BOOST_CHECK_EQUAL(subnet.ToString(), "1.2.3.4/32");
     206           2 :     subnet = CSubNet(ResolveIP("1.2.3.4"), 8);
     207           1 :     BOOST_CHECK_EQUAL(subnet.ToString(), "1.0.0.0/8");
     208           2 :     subnet = CSubNet(ResolveIP("1.2.3.4"), 0);
     209           1 :     BOOST_CHECK_EQUAL(subnet.ToString(), "0.0.0.0/0");
     210             : 
     211           2 :     subnet = CSubNet(ResolveIP("1.2.3.4"), ResolveIP("255.255.255.255"));
     212           1 :     BOOST_CHECK_EQUAL(subnet.ToString(), "1.2.3.4/32");
     213           2 :     subnet = CSubNet(ResolveIP("1.2.3.4"), ResolveIP("255.0.0.0"));
     214           1 :     BOOST_CHECK_EQUAL(subnet.ToString(), "1.0.0.0/8");
     215           2 :     subnet = CSubNet(ResolveIP("1.2.3.4"), ResolveIP("0.0.0.0"));
     216           1 :     BOOST_CHECK_EQUAL(subnet.ToString(), "0.0.0.0/0");
     217             : 
     218           2 :     BOOST_CHECK(CSubNet(ResolveIP("1:2:3:4:5:6:7:8")).IsValid());
     219           2 :     BOOST_CHECK(CSubNet(ResolveIP("1:2:3:4:5:6:7:8")).Match(ResolveIP("1:2:3:4:5:6:7:8")));
     220           2 :     BOOST_CHECK(!CSubNet(ResolveIP("1:2:3:4:5:6:7:8")).Match(ResolveIP("1:2:3:4:5:6:7:9")));
     221           4 :     BOOST_CHECK(CSubNet(ResolveIP("1:2:3:4:5:6:7:8")).ToString() == "1:2:3:4:5:6:7:8/128");
     222             :     // IPv4 address with IPv6 netmask or the other way around.
     223           2 :     BOOST_CHECK(!CSubNet(ResolveIP("1.1.1.1"), ResolveIP("ffff::")).IsValid());
     224           2 :     BOOST_CHECK(!CSubNet(ResolveIP("::1"), ResolveIP("255.0.0.0")).IsValid());
     225             :     // Can't subnet TOR (or any other non-IPv4 and non-IPv6 network).
     226           3 :     BOOST_CHECK(!CSubNet(ResolveIP("5wyqrzbvrdsumnok.onion"), ResolveIP("255.0.0.0")).IsValid());
     227             : 
     228           2 :     subnet = ResolveSubNet("1.2.3.4/255.255.255.255");
     229           1 :     BOOST_CHECK_EQUAL(subnet.ToString(), "1.2.3.4/32");
     230           2 :     subnet = ResolveSubNet("1.2.3.4/255.255.255.254");
     231           1 :     BOOST_CHECK_EQUAL(subnet.ToString(), "1.2.3.4/31");
     232           2 :     subnet = ResolveSubNet("1.2.3.4/255.255.255.252");
     233           1 :     BOOST_CHECK_EQUAL(subnet.ToString(), "1.2.3.4/30");
     234           2 :     subnet = ResolveSubNet("1.2.3.4/255.255.255.248");
     235           1 :     BOOST_CHECK_EQUAL(subnet.ToString(), "1.2.3.0/29");
     236           2 :     subnet = ResolveSubNet("1.2.3.4/255.255.255.240");
     237           1 :     BOOST_CHECK_EQUAL(subnet.ToString(), "1.2.3.0/28");
     238           2 :     subnet = ResolveSubNet("1.2.3.4/255.255.255.224");
     239           1 :     BOOST_CHECK_EQUAL(subnet.ToString(), "1.2.3.0/27");
     240           2 :     subnet = ResolveSubNet("1.2.3.4/255.255.255.192");
     241           1 :     BOOST_CHECK_EQUAL(subnet.ToString(), "1.2.3.0/26");
     242           2 :     subnet = ResolveSubNet("1.2.3.4/255.255.255.128");
     243           1 :     BOOST_CHECK_EQUAL(subnet.ToString(), "1.2.3.0/25");
     244           2 :     subnet = ResolveSubNet("1.2.3.4/255.255.255.0");
     245           1 :     BOOST_CHECK_EQUAL(subnet.ToString(), "1.2.3.0/24");
     246           2 :     subnet = ResolveSubNet("1.2.3.4/255.255.254.0");
     247           1 :     BOOST_CHECK_EQUAL(subnet.ToString(), "1.2.2.0/23");
     248           2 :     subnet = ResolveSubNet("1.2.3.4/255.255.252.0");
     249           1 :     BOOST_CHECK_EQUAL(subnet.ToString(), "1.2.0.0/22");
     250           2 :     subnet = ResolveSubNet("1.2.3.4/255.255.248.0");
     251           1 :     BOOST_CHECK_EQUAL(subnet.ToString(), "1.2.0.0/21");
     252           2 :     subnet = ResolveSubNet("1.2.3.4/255.255.240.0");
     253           1 :     BOOST_CHECK_EQUAL(subnet.ToString(), "1.2.0.0/20");
     254           2 :     subnet = ResolveSubNet("1.2.3.4/255.255.224.0");
     255           1 :     BOOST_CHECK_EQUAL(subnet.ToString(), "1.2.0.0/19");
     256           2 :     subnet = ResolveSubNet("1.2.3.4/255.255.192.0");
     257           1 :     BOOST_CHECK_EQUAL(subnet.ToString(), "1.2.0.0/18");
     258           2 :     subnet = ResolveSubNet("1.2.3.4/255.255.128.0");
     259           1 :     BOOST_CHECK_EQUAL(subnet.ToString(), "1.2.0.0/17");
     260           2 :     subnet = ResolveSubNet("1.2.3.4/255.255.0.0");
     261           1 :     BOOST_CHECK_EQUAL(subnet.ToString(), "1.2.0.0/16");
     262           2 :     subnet = ResolveSubNet("1.2.3.4/255.254.0.0");
     263           1 :     BOOST_CHECK_EQUAL(subnet.ToString(), "1.2.0.0/15");
     264           2 :     subnet = ResolveSubNet("1.2.3.4/255.252.0.0");
     265           1 :     BOOST_CHECK_EQUAL(subnet.ToString(), "1.0.0.0/14");
     266           2 :     subnet = ResolveSubNet("1.2.3.4/255.248.0.0");
     267           1 :     BOOST_CHECK_EQUAL(subnet.ToString(), "1.0.0.0/13");
     268           2 :     subnet = ResolveSubNet("1.2.3.4/255.240.0.0");
     269           1 :     BOOST_CHECK_EQUAL(subnet.ToString(), "1.0.0.0/12");
     270           2 :     subnet = ResolveSubNet("1.2.3.4/255.224.0.0");
     271           1 :     BOOST_CHECK_EQUAL(subnet.ToString(), "1.0.0.0/11");
     272           2 :     subnet = ResolveSubNet("1.2.3.4/255.192.0.0");
     273           1 :     BOOST_CHECK_EQUAL(subnet.ToString(), "1.0.0.0/10");
     274           2 :     subnet = ResolveSubNet("1.2.3.4/255.128.0.0");
     275           1 :     BOOST_CHECK_EQUAL(subnet.ToString(), "1.0.0.0/9");
     276           2 :     subnet = ResolveSubNet("1.2.3.4/255.0.0.0");
     277           1 :     BOOST_CHECK_EQUAL(subnet.ToString(), "1.0.0.0/8");
     278           2 :     subnet = ResolveSubNet("1.2.3.4/254.0.0.0");
     279           1 :     BOOST_CHECK_EQUAL(subnet.ToString(), "0.0.0.0/7");
     280           2 :     subnet = ResolveSubNet("1.2.3.4/252.0.0.0");
     281           1 :     BOOST_CHECK_EQUAL(subnet.ToString(), "0.0.0.0/6");
     282           2 :     subnet = ResolveSubNet("1.2.3.4/248.0.0.0");
     283           1 :     BOOST_CHECK_EQUAL(subnet.ToString(), "0.0.0.0/5");
     284           2 :     subnet = ResolveSubNet("1.2.3.4/240.0.0.0");
     285           1 :     BOOST_CHECK_EQUAL(subnet.ToString(), "0.0.0.0/4");
     286           2 :     subnet = ResolveSubNet("1.2.3.4/224.0.0.0");
     287           1 :     BOOST_CHECK_EQUAL(subnet.ToString(), "0.0.0.0/3");
     288           2 :     subnet = ResolveSubNet("1.2.3.4/192.0.0.0");
     289           1 :     BOOST_CHECK_EQUAL(subnet.ToString(), "0.0.0.0/2");
     290           2 :     subnet = ResolveSubNet("1.2.3.4/128.0.0.0");
     291           1 :     BOOST_CHECK_EQUAL(subnet.ToString(), "0.0.0.0/1");
     292           2 :     subnet = ResolveSubNet("1.2.3.4/0.0.0.0");
     293           1 :     BOOST_CHECK_EQUAL(subnet.ToString(), "0.0.0.0/0");
     294             : 
     295           2 :     subnet = ResolveSubNet("1:2:3:4:5:6:7:8/ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff");
     296           2 :     BOOST_CHECK_EQUAL(subnet.ToString(), "1:2:3:4:5:6:7:8/128");
     297           2 :     subnet = ResolveSubNet("1:2:3:4:5:6:7:8/ffff:0000:0000:0000:0000:0000:0000:0000");
     298           1 :     BOOST_CHECK_EQUAL(subnet.ToString(), "1::/16");
     299           2 :     subnet = ResolveSubNet("1:2:3:4:5:6:7:8/0000:0000:0000:0000:0000:0000:0000:0000");
     300           1 :     BOOST_CHECK_EQUAL(subnet.ToString(), "::/0");
     301             :     // Invalid netmasks (with 1-bits after 0-bits)
     302           2 :     subnet = ResolveSubNet("1.2.3.4/255.255.232.0");
     303           2 :     BOOST_CHECK(!subnet.IsValid());
     304           2 :     subnet = ResolveSubNet("1.2.3.4/255.0.255.255");
     305           2 :     BOOST_CHECK(!subnet.IsValid());
     306           2 :     subnet = ResolveSubNet("1:2:3:4:5:6:7:8/ffff:ffff:ffff:fffe:ffff:ffff:ffff:ff0f");
     307           2 :     BOOST_CHECK(!subnet.IsValid());
     308           1 : }
     309             : 
     310           2 : BOOST_AUTO_TEST_CASE(validate_test)
     311             : {
     312           4 :     std::list<std::string> validIPv4 = {"11.12.13.14", "50.168.168.150", "72.31.250.250"};
     313           5 :     std::list<std::string> validIPv6 = {"1111:2222:3333:4444:5555:6666::8888", "2001:0002:6c::430", "2002:cb0a:3cdd:1::1"};
     314           4 :     std::list<std::string> validTor = {"5wyqrzbvrdsumnok.onion", "FD87:D87E:EB43:edb1:8e4:3588:e546:35ca"};
     315             : 
     316           4 :     for (const std::string& ipStr : validIPv4)
     317           6 :         BOOST_CHECK_MESSAGE(validateMasternodeIP(ipStr), ipStr);
     318           4 :     for (const std::string& ipStr : validIPv6)
     319           6 :         BOOST_CHECK_MESSAGE(validateMasternodeIP(ipStr), ipStr);
     320           3 :     for (const std::string& ipStr : validTor)
     321           4 :         BOOST_CHECK_MESSAGE(validateMasternodeIP(ipStr), ipStr);
     322             : 
     323           7 :     std::list<std::string> invalidIPv4 = {"11.12.13.14.15", "11.12.13.330", "30.168.1.255.1", "192.168.1.1", "255.255.255.255"};
     324           5 :     std::list<std::string> invalidIPv6 = {"1111:2222:3333:4444:5555:6666:7777:8888:9999", "2002:cb0a:3cdd::1::1", "1111:2222:3333:::5555:6666:7777:8888"};
     325           3 :     std::list<std::string> invalidTor = {"5wyqrzbvrdsumnok.noonion"};
     326             : 
     327           6 :     for (const std::string& ipStr : invalidIPv4)
     328          10 :         BOOST_CHECK_MESSAGE(!validateMasternodeIP(ipStr), ipStr);
     329           4 :     for (const std::string& ipStr : invalidIPv6)
     330           6 :         BOOST_CHECK_MESSAGE(!validateMasternodeIP(ipStr), ipStr);
     331           2 :     for (const std::string& ipStr : invalidTor)
     332           2 :         BOOST_CHECK_MESSAGE(!validateMasternodeIP(ipStr), ipStr);
     333           1 : }
     334             : 
     335           2 : BOOST_AUTO_TEST_CASE(netbase_getgroup)
     336             : {
     337           1 :     std::vector<bool> asmap; // use /16
     338           4 :     BOOST_CHECK(ResolveIP("127.0.0.1").GetGroup(asmap) == std::vector<unsigned char>({0})); // Local -> !Routable()
     339           4 :     BOOST_CHECK(ResolveIP("257.0.0.1").GetGroup(asmap) == std::vector<unsigned char>({0})); // !Valid -> !Routable()
     340           4 :     BOOST_CHECK(ResolveIP("10.0.0.1").GetGroup(asmap) == std::vector<unsigned char>({0})); // RFC1918 -> !Routable()
     341           4 :     BOOST_CHECK(ResolveIP("169.254.1.1").GetGroup(asmap) == std::vector<unsigned char>({0})); // RFC3927 -> !Routable()
     342           4 :     BOOST_CHECK(ResolveIP("1.2.3.4").GetGroup(asmap) == std::vector<unsigned char>({(unsigned char)NET_IPV4, 1, 2})); // IPv4
     343           5 :     BOOST_CHECK(ResolveIP("::FFFF:0:102:304").GetGroup(asmap) == std::vector<unsigned char>({(unsigned char)NET_IPV4, 1, 2})); // RFC6145
     344           5 :     BOOST_CHECK(ResolveIP("64:FF9B::102:304").GetGroup(asmap) == std::vector<unsigned char>({(unsigned char)NET_IPV4, 1, 2})); // RFC6052
     345           5 :     BOOST_CHECK(ResolveIP("2002:102:304:9999:9999:9999:9999:9999").GetGroup(asmap) == std::vector<unsigned char>({(unsigned char)NET_IPV4, 1, 2})); // RFC3964
     346           5 :     BOOST_CHECK(ResolveIP("2001:0:9999:9999:9999:9999:FEFD:FCFB").GetGroup(asmap) == std::vector<unsigned char>({(unsigned char)NET_IPV4, 1, 2})); // RFC4380
     347           5 :     BOOST_CHECK(ResolveIP("FD87:D87E:EB43:edb1:8e4:3588:e546:35ca").GetGroup(asmap) == std::vector<unsigned char>({(unsigned char)NET_ONION, 239})); // Tor
     348           5 :     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
     349           5 :     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
     350             : 
     351             :     // baz.net sha256 hash: 12929400eb4607c4ac075f087167e75286b179c693eb059a01774b864e8fe505
     352           2 :     std::vector<unsigned char> internal_group = {NET_INTERNAL, 0x12, 0x92, 0x94, 0x00, 0xeb, 0x46, 0x07, 0xc4, 0xac, 0x07};
     353           3 :     BOOST_CHECK(CreateInternal("baz.net").GetGroup(asmap) == internal_group);
     354           1 : }
     355             : 
     356           2 : BOOST_AUTO_TEST_CASE(netbase_parsenetwork)
     357             : {
     358           1 :     BOOST_CHECK_EQUAL(ParseNetwork("ipv4"), NET_IPV4);
     359           1 :     BOOST_CHECK_EQUAL(ParseNetwork("ipv6"), NET_IPV6);
     360           1 :     BOOST_CHECK_EQUAL(ParseNetwork("onion"), NET_ONION);
     361           1 :     BOOST_CHECK_EQUAL(ParseNetwork("tor"), NET_ONION);
     362             : 
     363           1 :     BOOST_CHECK_EQUAL(ParseNetwork("IPv4"), NET_IPV4);
     364           1 :     BOOST_CHECK_EQUAL(ParseNetwork("IPv6"), NET_IPV6);
     365           1 :     BOOST_CHECK_EQUAL(ParseNetwork("ONION"), NET_ONION);
     366           1 :     BOOST_CHECK_EQUAL(ParseNetwork("TOR"), NET_ONION);
     367             : 
     368           1 :     BOOST_CHECK_EQUAL(ParseNetwork(":)"), NET_UNROUTABLE);
     369           1 :     BOOST_CHECK_EQUAL(ParseNetwork("tÖr"), NET_UNROUTABLE);
     370           1 :     BOOST_CHECK_EQUAL(ParseNetwork("\xfe\xff"), NET_UNROUTABLE);
     371           1 :     BOOST_CHECK_EQUAL(ParseNetwork(""), NET_UNROUTABLE);
     372           1 : }
     373             : 
     374           2 : BOOST_AUTO_TEST_CASE(netbase_dont_resolve_strings_with_embedded_nul_characters)
     375             : {
     376           1 :     CNetAddr addr;
     377           3 :     BOOST_CHECK(LookupHost(std::string("127.0.0.1", 9), addr, false));
     378           3 :     BOOST_CHECK(!LookupHost(std::string("127.0.0.1\0", 10), addr, false));
     379           4 :     BOOST_CHECK(!LookupHost(std::string("127.0.0.1\0example.com", 21), addr, false));
     380           4 :     BOOST_CHECK(!LookupHost(std::string("127.0.0.1\0example.com\0", 22), addr, false));
     381           2 :     CSubNet ret;
     382           3 :     BOOST_CHECK(LookupSubNet(std::string("1.2.3.0/24", 10), ret));
     383           3 :     BOOST_CHECK(!LookupSubNet(std::string("1.2.3.0/24\0", 11), ret));
     384           4 :     BOOST_CHECK(!LookupSubNet(std::string("1.2.3.0/24\0example.com", 22), ret));
     385           4 :     BOOST_CHECK(!LookupSubNet(std::string("1.2.3.0/24\0example.com\0", 23), ret));
     386             :     // We only do subnetting for IPv4 and IPv6
     387           4 :     BOOST_CHECK(!LookupSubNet(std::string("5wyqrzbvrdsumnok.onion", 22), ret));
     388           4 :     BOOST_CHECK(!LookupSubNet(std::string("5wyqrzbvrdsumnok.onion\0", 23), ret));
     389           4 :     BOOST_CHECK(!LookupSubNet(std::string("5wyqrzbvrdsumnok.onion\0example.com", 34), ret));
     390           4 :     BOOST_CHECK(!LookupSubNet(std::string("5wyqrzbvrdsumnok.onion\0example.com\0", 35), ret));
     391           1 : }
     392             : 
     393             : // Since CNetAddr (un)ser is tested separately in net_tests.cpp here we only
     394             : // try a few edge cases for port, service flags and time.
     395             : 
     396             : static const std::vector<CAddress> fixture_addresses({
     397             :     CAddress(
     398             :         CService(CNetAddr(in6_addr(IN6ADDR_LOOPBACK_INIT)), 0 /* port */),
     399             :         NODE_NONE,
     400             :         0x4966bc61U /* Fri Jan  9 02:54:25 UTC 2009 */
     401             :     ),
     402             :     CAddress(
     403             :         CService(CNetAddr(in6_addr(IN6ADDR_LOOPBACK_INIT)), 0x00f1 /* port */),
     404             :         NODE_NETWORK,
     405             :         0x83766279U /* Tue Nov 22 11:22:33 UTC 2039 */
     406             :     ),
     407             :     CAddress(
     408             :         CService(CNetAddr(in6_addr(IN6ADDR_LOOPBACK_INIT)), 0xf1f2 /* port */),
     409             :         static_cast<ServiceFlags>(NODE_BLOOM),
     410             :         0xffffffffU /* Sun Feb  7 06:28:15 UTC 2106 */
     411             :     )
     412             : });
     413             : 
     414             : // fixture_addresses should equal to this when serialized in V1 format.
     415             : // When this is unserialized from V1 format it should equal to fixture_addresses.
     416             : static constexpr const char* stream_addrv1_hex =
     417             :     "03" // number of entries
     418             : 
     419             :     "61bc6649"                         // time, Fri Jan  9 02:54:25 UTC 2009
     420             :     "0000000000000000"                 // service flags, NODE_NONE
     421             :     "00000000000000000000000000000001" // address, fixed 16 bytes (IPv4 embedded in IPv6)
     422             :     "0000"                             // port
     423             : 
     424             :     "79627683"                         // time, Tue Nov 22 11:22:33 UTC 2039
     425             :     "0100000000000000"                 // service flags, NODE_NETWORK
     426             :     "00000000000000000000000000000001" // address, fixed 16 bytes (IPv6)
     427             :     "00f1"                             // port
     428             : 
     429             :     "ffffffff"                         // time, Sun Feb  7 06:28:15 UTC 2106
     430             :     "0400000000000000"                 // service flags, NODE_BLOOM
     431             :     "00000000000000000000000000000001" // address, fixed 16 bytes (IPv6)
     432             :     "f1f2";                            // port
     433             : 
     434             : // fixture_addresses should equal to this when serialized in V2 format.
     435             : // When this is unserialized from V2 format it should equal to fixture_addresses.
     436             : static constexpr const char* stream_addrv2_hex =
     437             :     "03" // number of entries
     438             : 
     439             :     "61bc6649"                         // time, Fri Jan  9 02:54:25 UTC 2009
     440             :     "00"                               // service flags, COMPACTSIZE(NODE_NONE)
     441             :     "02"                               // network id, IPv6
     442             :     "10"                               // address length, COMPACTSIZE(16)
     443             :     "00000000000000000000000000000001" // address
     444             :     "0000"                             // port
     445             : 
     446             :     "79627683"                         // time, Tue Nov 22 11:22:33 UTC 2039
     447             :     "01"                               // service flags, COMPACTSIZE(NODE_NETWORK)
     448             :     "02"                               // network id, IPv6
     449             :     "10"                               // address length, COMPACTSIZE(16)
     450             :     "00000000000000000000000000000001" // address
     451             :     "00f1"                             // port
     452             : 
     453             :     "ffffffff"                         // time, Sun Feb  7 06:28:15 UTC 2106
     454             :     "04"                               // service flags, COMPACTSIZE(NODE_BLOOM)
     455             :     "02"                               // network id, IPv6
     456             :     "10"                               // address length, COMPACTSIZE(16)
     457             :     "00000000000000000000000000000001" // address
     458             :     "f1f2";                            // port
     459             : 
     460           2 : BOOST_AUTO_TEST_CASE(caddress_serialize_v1)
     461             : {
     462           1 :     CDataStream s(SER_NETWORK, PROTOCOL_VERSION);
     463             : 
     464           1 :     s << fixture_addresses;
     465           2 :     BOOST_CHECK_EQUAL(HexStr(s), stream_addrv1_hex);
     466           1 : }
     467             : 
     468           2 : BOOST_AUTO_TEST_CASE(caddress_unserialize_v1)
     469             : {
     470           2 :     CDataStream s(ParseHex(stream_addrv1_hex), SER_NETWORK, PROTOCOL_VERSION);
     471           2 :     std::vector<CAddress> addresses_unserialized;
     472             : 
     473           1 :     s >> addresses_unserialized;
     474           2 :     BOOST_CHECK(fixture_addresses == addresses_unserialized);
     475           1 : }
     476             : 
     477           2 : BOOST_AUTO_TEST_CASE(caddress_serialize_v2)
     478             : {
     479           1 :     CDataStream s(SER_NETWORK, PROTOCOL_VERSION | ADDRV2_FORMAT);
     480             : 
     481           1 :     s << fixture_addresses;
     482           2 :     BOOST_CHECK_EQUAL(HexStr(s), stream_addrv2_hex);
     483           1 : }
     484             : 
     485           2 : BOOST_AUTO_TEST_CASE(caddress_unserialize_v2)
     486             : {
     487           2 :     CDataStream s(ParseHex(stream_addrv2_hex), SER_NETWORK, PROTOCOL_VERSION | ADDRV2_FORMAT);
     488           2 :     std::vector<CAddress> addresses_unserialized;
     489             : 
     490           1 :     s >> addresses_unserialized;
     491           2 :     BOOST_CHECK(fixture_addresses == addresses_unserialized);
     492           1 : }
     493             : 
     494             : BOOST_AUTO_TEST_SUITE_END()

Generated by: LCOV version 1.14