LCOV - code coverage report
Current view: top level - src/test - netbase_tests.cpp (source / functions) Hit Total Coverage
Test: total_coverage.info Lines: 208 208 100.0 %
Date: 2015-10-12 22:39:14 Functions: 18 32 56.2 %
Legend: Lines: hit not hit

          Line data    Source code
       1             : // Copyright (c) 2012-2013 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 "netbase.h"
       6             : #include "test/test_bitcoin.h"
       7             : 
       8             : #include <string>
       9             : 
      10             : #include <boost/assign/list_of.hpp>
      11             : #include <boost/test/unit_test.hpp>
      12             : 
      13             : using namespace std;
      14             : 
      15           1 : BOOST_FIXTURE_TEST_SUITE(netbase_tests, BasicTestingSetup)
      16             : 
      17           6 : BOOST_AUTO_TEST_CASE(netbase_networks)
      18             : {
      19           8 :     BOOST_CHECK(CNetAddr("127.0.0.1").GetNetwork()                              == NET_UNROUTABLE);
      20           8 :     BOOST_CHECK(CNetAddr("::1").GetNetwork()                                    == NET_UNROUTABLE);
      21           8 :     BOOST_CHECK(CNetAddr("8.8.8.8").GetNetwork()                                == NET_IPV4);
      22           8 :     BOOST_CHECK(CNetAddr("2001::8888").GetNetwork()                             == NET_IPV6);
      23           8 :     BOOST_CHECK(CNetAddr("FD87:D87E:EB43:edb1:8e4:3588:e546:35ca").GetNetwork() == NET_TOR);
      24           1 : }
      25             : 
      26           6 : BOOST_AUTO_TEST_CASE(netbase_properties)
      27             : {
      28           8 :     BOOST_CHECK(CNetAddr("127.0.0.1").IsIPv4());
      29           8 :     BOOST_CHECK(CNetAddr("::FFFF:192.168.1.1").IsIPv4());
      30           8 :     BOOST_CHECK(CNetAddr("::1").IsIPv6());
      31           8 :     BOOST_CHECK(CNetAddr("10.0.0.1").IsRFC1918());
      32           8 :     BOOST_CHECK(CNetAddr("192.168.1.1").IsRFC1918());
      33           8 :     BOOST_CHECK(CNetAddr("172.31.255.255").IsRFC1918());
      34           8 :     BOOST_CHECK(CNetAddr("2001:0DB8::").IsRFC3849());
      35           8 :     BOOST_CHECK(CNetAddr("169.254.1.1").IsRFC3927());
      36           8 :     BOOST_CHECK(CNetAddr("2002::1").IsRFC3964());
      37           8 :     BOOST_CHECK(CNetAddr("FC00::").IsRFC4193());
      38           8 :     BOOST_CHECK(CNetAddr("2001::2").IsRFC4380());
      39           8 :     BOOST_CHECK(CNetAddr("2001:10::").IsRFC4843());
      40           8 :     BOOST_CHECK(CNetAddr("FE80::").IsRFC4862());
      41           8 :     BOOST_CHECK(CNetAddr("64:FF9B::").IsRFC6052());
      42           7 :     BOOST_CHECK(CNetAddr("FD87:D87E:EB43:edb1:8e4:3588:e546:35ca").IsTor());
      43           8 :     BOOST_CHECK(CNetAddr("127.0.0.1").IsLocal());
      44           8 :     BOOST_CHECK(CNetAddr("::1").IsLocal());
      45           8 :     BOOST_CHECK(CNetAddr("8.8.8.8").IsRoutable());
      46           8 :     BOOST_CHECK(CNetAddr("2001::1").IsRoutable());
      47           8 :     BOOST_CHECK(CNetAddr("127.0.0.1").IsValid());
      48           1 : }
      49             : 
      50          15 : bool static TestSplitHost(string test, string host, int port)
      51             : {
      52             :     string hostOut;
      53          15 :     int portOut = -1;
      54          30 :     SplitHostPort(test, portOut, hostOut);
      55          30 :     return hostOut == host && port == portOut;
      56             : }
      57             : 
      58           6 : BOOST_AUTO_TEST_CASE(netbase_splithost)
      59             : {
      60          12 :     BOOST_CHECK(TestSplitHost("www.bitcoin.org", "www.bitcoin.org", -1));
      61          12 :     BOOST_CHECK(TestSplitHost("[www.bitcoin.org]", "www.bitcoin.org", -1));
      62          12 :     BOOST_CHECK(TestSplitHost("www.bitcoin.org:80", "www.bitcoin.org", 80));
      63          12 :     BOOST_CHECK(TestSplitHost("[www.bitcoin.org]:80", "www.bitcoin.org", 80));
      64          11 :     BOOST_CHECK(TestSplitHost("127.0.0.1", "127.0.0.1", -1));
      65          12 :     BOOST_CHECK(TestSplitHost("127.0.0.1:8333", "127.0.0.1", 8333));
      66          12 :     BOOST_CHECK(TestSplitHost("[127.0.0.1]", "127.0.0.1", -1));
      67          12 :     BOOST_CHECK(TestSplitHost("[127.0.0.1]:8333", "127.0.0.1", 8333));
      68          12 :     BOOST_CHECK(TestSplitHost("::ffff:127.0.0.1", "::ffff:127.0.0.1", -1));
      69          11 :     BOOST_CHECK(TestSplitHost("[::ffff:127.0.0.1]:8333", "::ffff:127.0.0.1", 8333));
      70          12 :     BOOST_CHECK(TestSplitHost("[::]:8333", "::", 8333));
      71          12 :     BOOST_CHECK(TestSplitHost("::8333", "::8333", -1));
      72          12 :     BOOST_CHECK(TestSplitHost(":8333", "", 8333));
      73          12 :     BOOST_CHECK(TestSplitHost("[]:8333", "", 8333));
      74          12 :     BOOST_CHECK(TestSplitHost("", "", -1));
      75           1 : }
      76             : 
      77           7 : bool static TestParse(string src, string canon)
      78             : {
      79           7 :     CService addr;
      80           7 :     if (!LookupNumeric(src.c_str(), addr, 65535))
      81           1 :         return canon == "";
      82          12 :     return canon == addr.ToString();
      83             : }
      84             : 
      85           6 : BOOST_AUTO_TEST_CASE(netbase_lookupnumeric)
      86             : {
      87          12 :     BOOST_CHECK(TestParse("127.0.0.1", "127.0.0.1:65535"));
      88          12 :     BOOST_CHECK(TestParse("127.0.0.1:8333", "127.0.0.1:8333"));
      89          12 :     BOOST_CHECK(TestParse("::ffff:127.0.0.1", "127.0.0.1:65535"));
      90          12 :     BOOST_CHECK(TestParse("::", "[::]:65535"));
      91          12 :     BOOST_CHECK(TestParse("[::]:8333", "[::]:8333"));
      92          12 :     BOOST_CHECK(TestParse("[127.0.0.1]", "127.0.0.1:65535"));
      93          12 :     BOOST_CHECK(TestParse(":::", ""));
      94           1 : }
      95             : 
      96           6 : BOOST_AUTO_TEST_CASE(onioncat_test)
      97             : {
      98             :     // values from https://web.archive.org/web/20121122003543/http://www.cypherpunk.at/onioncat/wiki/OnionCat
      99           1 :     CNetAddr addr1("5wyqrzbvrdsumnok.onion");
     100           1 :     CNetAddr addr2("FD87:D87E:EB43:edb1:8e4:3588:e546:35ca");
     101           8 :     BOOST_CHECK(addr1 == addr2);
     102           8 :     BOOST_CHECK(addr1.IsTor());
     103          10 :     BOOST_CHECK(addr1.ToStringIP() == "5wyqrzbvrdsumnok.onion");
     104           8 :     BOOST_CHECK(addr1.IsRoutable());
     105           1 : }
     106             : 
     107           6 : BOOST_AUTO_TEST_CASE(subnet_test)
     108             : {
     109          12 :     BOOST_CHECK(CSubNet("1.2.3.0/24") == CSubNet("1.2.3.0/255.255.255.0"));
     110          12 :     BOOST_CHECK(CSubNet("1.2.3.0/24") != CSubNet("1.2.4.0/255.255.255.0"));
     111          10 :     BOOST_CHECK(CSubNet("1.2.3.0/24").Match(CNetAddr("1.2.3.4")));
     112          10 :     BOOST_CHECK(!CSubNet("1.2.2.0/24").Match(CNetAddr("1.2.3.4")));
     113          10 :     BOOST_CHECK(CSubNet("1.2.3.4").Match(CNetAddr("1.2.3.4")));
     114           9 :     BOOST_CHECK(CSubNet("1.2.3.4/32").Match(CNetAddr("1.2.3.4")));
     115          10 :     BOOST_CHECK(!CSubNet("1.2.3.4").Match(CNetAddr("5.6.7.8")));
     116          10 :     BOOST_CHECK(!CSubNet("1.2.3.4/32").Match(CNetAddr("5.6.7.8")));
     117          10 :     BOOST_CHECK(CSubNet("::ffff:127.0.0.1").Match(CNetAddr("127.0.0.1")));
     118          10 :     BOOST_CHECK(CSubNet("1:2:3:4:5:6:7:8").Match(CNetAddr("1:2:3:4:5:6:7:8")));
     119          10 :     BOOST_CHECK(!CSubNet("1:2:3:4:5:6:7:8").Match(CNetAddr("1:2:3:4:5:6:7:9")));
     120          10 :     BOOST_CHECK(CSubNet("1:2:3:4:5:6:7:0/112").Match(CNetAddr("1:2:3:4:5:6:7:1234")));
     121           9 :     BOOST_CHECK(CSubNet("192.168.0.1/24").Match(CNetAddr("192.168.0.2")));
     122          10 :     BOOST_CHECK(CSubNet("192.168.0.20/29").Match(CNetAddr("192.168.0.18")));
     123          10 :     BOOST_CHECK(CSubNet("1.2.2.1/24").Match(CNetAddr("1.2.2.4")));
     124          10 :     BOOST_CHECK(CSubNet("1.2.2.110/31").Match(CNetAddr("1.2.2.111")));
     125          10 :     BOOST_CHECK(CSubNet("1.2.2.20/26").Match(CNetAddr("1.2.2.63")));
     126             :     // All-Matching IPv6 Matches arbitrary IPv4 and IPv6
     127          10 :     BOOST_CHECK(CSubNet("::/0").Match(CNetAddr("1:2:3:4:5:6:7:1234")));
     128          10 :     BOOST_CHECK(CSubNet("::/0").Match(CNetAddr("1.2.3.4")));
     129             :     // All-Matching IPv4 does not Match IPv6
     130          10 :     BOOST_CHECK(!CSubNet("0.0.0.0/0").Match(CNetAddr("1:2:3:4:5:6:7:1234")));
     131             :     // Invalid subnets Match nothing (not even invalid addresses)
     132           8 :     BOOST_CHECK(!CSubNet().Match(CNetAddr("1.2.3.4")));
     133          10 :     BOOST_CHECK(!CSubNet("").Match(CNetAddr("4.5.6.7")));
     134          10 :     BOOST_CHECK(!CSubNet("bloop").Match(CNetAddr("0.0.0.0")));
     135          10 :     BOOST_CHECK(!CSubNet("bloop").Match(CNetAddr("hab")));
     136             :     // Check valid/invalid
     137          10 :     BOOST_CHECK(CSubNet("1.2.3.0/0").IsValid());
     138          10 :     BOOST_CHECK(!CSubNet("1.2.3.0/-1").IsValid());
     139          10 :     BOOST_CHECK(CSubNet("1.2.3.0/32").IsValid());
     140          10 :     BOOST_CHECK(!CSubNet("1.2.3.0/33").IsValid());
     141          10 :     BOOST_CHECK(CSubNet("1:2:3:4:5:6:7:8/0").IsValid());
     142          10 :     BOOST_CHECK(CSubNet("1:2:3:4:5:6:7:8/33").IsValid());
     143          10 :     BOOST_CHECK(!CSubNet("1:2:3:4:5:6:7:8/-1").IsValid());
     144          10 :     BOOST_CHECK(CSubNet("1:2:3:4:5:6:7:8/128").IsValid());
     145          10 :     BOOST_CHECK(!CSubNet("1:2:3:4:5:6:7:8/129").IsValid());
     146          10 :     BOOST_CHECK(!CSubNet("fuzzy").IsValid());
     147             : 
     148             :     //CNetAddr constructor test
     149           8 :     BOOST_CHECK(CSubNet(CNetAddr("127.0.0.1")).IsValid());
     150           8 :     BOOST_CHECK(CSubNet(CNetAddr("127.0.0.1")).Match(CNetAddr("127.0.0.1")));
     151           8 :     BOOST_CHECK(!CSubNet(CNetAddr("127.0.0.1")).Match(CNetAddr("127.0.0.2")));
     152          10 :     BOOST_CHECK(CSubNet(CNetAddr("127.0.0.1")).ToString() == "127.0.0.1/32");
     153             : 
     154           8 :     BOOST_CHECK(CSubNet(CNetAddr("1:2:3:4:5:6:7:8")).IsValid());
     155           8 :     BOOST_CHECK(CSubNet(CNetAddr("1:2:3:4:5:6:7:8")).Match(CNetAddr("1:2:3:4:5:6:7:8")));
     156           8 :     BOOST_CHECK(!CSubNet(CNetAddr("1:2:3:4:5:6:7:8")).Match(CNetAddr("1:2:3:4:5:6:7:9")));
     157          10 :     BOOST_CHECK(CSubNet(CNetAddr("1:2:3:4:5:6:7:8")).ToString() == "1:2:3:4:5:6:7:8/128");
     158             : 
     159           3 :     CSubNet subnet = CSubNet("1.2.3.4/255.255.255.255");
     160           6 :     BOOST_CHECK_EQUAL(subnet.ToString(), "1.2.3.4/32");
     161           3 :     subnet = CSubNet("1.2.3.4/255.255.255.254");
     162           5 :     BOOST_CHECK_EQUAL(subnet.ToString(), "1.2.3.4/31");
     163           3 :     subnet = CSubNet("1.2.3.4/255.255.255.252");
     164           6 :     BOOST_CHECK_EQUAL(subnet.ToString(), "1.2.3.4/30");
     165           3 :     subnet = CSubNet("1.2.3.4/255.255.255.248");
     166           6 :     BOOST_CHECK_EQUAL(subnet.ToString(), "1.2.3.0/29");
     167           3 :     subnet = CSubNet("1.2.3.4/255.255.255.240");
     168           6 :     BOOST_CHECK_EQUAL(subnet.ToString(), "1.2.3.0/28");
     169           3 :     subnet = CSubNet("1.2.3.4/255.255.255.224");
     170           6 :     BOOST_CHECK_EQUAL(subnet.ToString(), "1.2.3.0/27");
     171           3 :     subnet = CSubNet("1.2.3.4/255.255.255.192");
     172           6 :     BOOST_CHECK_EQUAL(subnet.ToString(), "1.2.3.0/26");
     173           3 :     subnet = CSubNet("1.2.3.4/255.255.255.128");
     174           6 :     BOOST_CHECK_EQUAL(subnet.ToString(), "1.2.3.0/25");
     175           3 :     subnet = CSubNet("1.2.3.4/255.255.255.0");
     176           6 :     BOOST_CHECK_EQUAL(subnet.ToString(), "1.2.3.0/24");
     177           3 :     subnet = CSubNet("1.2.3.4/255.255.254.0");
     178           6 :     BOOST_CHECK_EQUAL(subnet.ToString(), "1.2.2.0/23");
     179           3 :     subnet = CSubNet("1.2.3.4/255.255.252.0");
     180           6 :     BOOST_CHECK_EQUAL(subnet.ToString(), "1.2.0.0/22");
     181           3 :     subnet = CSubNet("1.2.3.4/255.255.248.0");
     182           6 :     BOOST_CHECK_EQUAL(subnet.ToString(), "1.2.0.0/21");
     183           3 :     subnet = CSubNet("1.2.3.4/255.255.240.0");
     184           6 :     BOOST_CHECK_EQUAL(subnet.ToString(), "1.2.0.0/20");
     185           3 :     subnet = CSubNet("1.2.3.4/255.255.224.0");
     186           6 :     BOOST_CHECK_EQUAL(subnet.ToString(), "1.2.0.0/19");
     187           3 :     subnet = CSubNet("1.2.3.4/255.255.192.0");
     188           6 :     BOOST_CHECK_EQUAL(subnet.ToString(), "1.2.0.0/18");
     189           3 :     subnet = CSubNet("1.2.3.4/255.255.128.0");
     190           6 :     BOOST_CHECK_EQUAL(subnet.ToString(), "1.2.0.0/17");
     191           3 :     subnet = CSubNet("1.2.3.4/255.255.0.0");
     192           6 :     BOOST_CHECK_EQUAL(subnet.ToString(), "1.2.0.0/16");
     193           3 :     subnet = CSubNet("1.2.3.4/255.254.0.0");
     194           6 :     BOOST_CHECK_EQUAL(subnet.ToString(), "1.2.0.0/15");
     195           3 :     subnet = CSubNet("1.2.3.4/255.252.0.0");
     196           6 :     BOOST_CHECK_EQUAL(subnet.ToString(), "1.0.0.0/14");
     197           3 :     subnet = CSubNet("1.2.3.4/255.248.0.0");
     198           6 :     BOOST_CHECK_EQUAL(subnet.ToString(), "1.0.0.0/13");
     199           3 :     subnet = CSubNet("1.2.3.4/255.240.0.0");
     200           6 :     BOOST_CHECK_EQUAL(subnet.ToString(), "1.0.0.0/12");
     201           3 :     subnet = CSubNet("1.2.3.4/255.224.0.0");
     202           6 :     BOOST_CHECK_EQUAL(subnet.ToString(), "1.0.0.0/11");
     203           3 :     subnet = CSubNet("1.2.3.4/255.192.0.0");
     204           6 :     BOOST_CHECK_EQUAL(subnet.ToString(), "1.0.0.0/10");
     205           3 :     subnet = CSubNet("1.2.3.4/255.128.0.0");
     206           6 :     BOOST_CHECK_EQUAL(subnet.ToString(), "1.0.0.0/9");
     207           3 :     subnet = CSubNet("1.2.3.4/255.0.0.0");
     208           6 :     BOOST_CHECK_EQUAL(subnet.ToString(), "1.0.0.0/8");
     209           3 :     subnet = CSubNet("1.2.3.4/254.0.0.0");
     210           6 :     BOOST_CHECK_EQUAL(subnet.ToString(), "0.0.0.0/7");
     211           3 :     subnet = CSubNet("1.2.3.4/252.0.0.0");
     212           6 :     BOOST_CHECK_EQUAL(subnet.ToString(), "0.0.0.0/6");
     213           3 :     subnet = CSubNet("1.2.3.4/248.0.0.0");
     214           6 :     BOOST_CHECK_EQUAL(subnet.ToString(), "0.0.0.0/5");
     215           3 :     subnet = CSubNet("1.2.3.4/240.0.0.0");
     216           6 :     BOOST_CHECK_EQUAL(subnet.ToString(), "0.0.0.0/4");
     217           3 :     subnet = CSubNet("1.2.3.4/224.0.0.0");
     218           6 :     BOOST_CHECK_EQUAL(subnet.ToString(), "0.0.0.0/3");
     219           3 :     subnet = CSubNet("1.2.3.4/192.0.0.0");
     220           6 :     BOOST_CHECK_EQUAL(subnet.ToString(), "0.0.0.0/2");
     221           3 :     subnet = CSubNet("1.2.3.4/128.0.0.0");
     222           6 :     BOOST_CHECK_EQUAL(subnet.ToString(), "0.0.0.0/1");
     223           3 :     subnet = CSubNet("1.2.3.4/0.0.0.0");
     224           6 :     BOOST_CHECK_EQUAL(subnet.ToString(), "0.0.0.0/0");
     225             : 
     226           3 :     subnet = CSubNet("1:2:3:4:5:6:7:8/ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff");
     227           6 :     BOOST_CHECK_EQUAL(subnet.ToString(), "1:2:3:4:5:6:7:8/128");
     228           3 :     subnet = CSubNet("1:2:3:4:5:6:7:8/ffff:0000:0000:0000:0000:0000:0000:0000");
     229           6 :     BOOST_CHECK_EQUAL(subnet.ToString(), "1::/16");
     230           3 :     subnet = CSubNet("1:2:3:4:5:6:7:8/0000:0000:0000:0000:0000:0000:0000:0000");
     231           6 :     BOOST_CHECK_EQUAL(subnet.ToString(), "::/0");
     232           3 :     subnet = CSubNet("1.2.3.4/255.255.232.0");
     233           6 :     BOOST_CHECK_EQUAL(subnet.ToString(), "1.2.0.0/255.255.232.0");
     234           3 :     subnet = CSubNet("1:2:3:4:5:6:7:8/ffff:ffff:ffff:fffe:ffff:ffff:ffff:ff0f");
     235           6 :     BOOST_CHECK_EQUAL(subnet.ToString(), "1:2:3:4:5:6:7:8/ffff:ffff:ffff:fffe:ffff:ffff:ffff:ff0f");
     236           1 : }
     237             : 
     238           6 : BOOST_AUTO_TEST_CASE(netbase_getgroup)
     239             : {
     240          11 :     BOOST_CHECK(CNetAddr("127.0.0.1").GetGroup() == boost::assign::list_of(0)); // Local -> !Routable()
     241          11 :     BOOST_CHECK(CNetAddr("257.0.0.1").GetGroup() == boost::assign::list_of(0)); // !Valid -> !Routable()
     242          11 :     BOOST_CHECK(CNetAddr("10.0.0.1").GetGroup() == boost::assign::list_of(0)); // RFC1918 -> !Routable()
     243          11 :     BOOST_CHECK(CNetAddr("169.254.1.1").GetGroup() == boost::assign::list_of(0)); // RFC3927 -> !Routable()
     244          13 :     BOOST_CHECK(CNetAddr("1.2.3.4").GetGroup() == boost::assign::list_of((unsigned char)NET_IPV4)(1)(2)); // IPv4
     245          13 :     BOOST_CHECK(CNetAddr("::FFFF:0:102:304").GetGroup() == boost::assign::list_of((unsigned char)NET_IPV4)(1)(2)); // RFC6145
     246          13 :     BOOST_CHECK(CNetAddr("64:FF9B::102:304").GetGroup() == boost::assign::list_of((unsigned char)NET_IPV4)(1)(2)); // RFC6052
     247          13 :     BOOST_CHECK(CNetAddr("2002:102:304:9999:9999:9999:9999:9999").GetGroup() == boost::assign::list_of((unsigned char)NET_IPV4)(1)(2)); // RFC3964
     248          13 :     BOOST_CHECK(CNetAddr("2001:0:9999:9999:9999:9999:FEFD:FCFB").GetGroup() == boost::assign::list_of((unsigned char)NET_IPV4)(1)(2)); // RFC4380
     249          12 :     BOOST_CHECK(CNetAddr("FD87:D87E:EB43:edb1:8e4:3588:e546:35ca").GetGroup() == boost::assign::list_of((unsigned char)NET_TOR)(239)); // Tor
     250          16 :     BOOST_CHECK(CNetAddr("2001:470:abcd:9999:9999:9999:9999:9999").GetGroup() == boost::assign::list_of((unsigned char)NET_IPV6)(32)(1)(4)(112)(175)); //he.net
     251          15 :     BOOST_CHECK(CNetAddr("2001:2001:9999:9999:9999:9999:9999:9999").GetGroup() == boost::assign::list_of((unsigned char)NET_IPV6)(32)(1)(32)(1)); //IPv6
     252           1 : }
     253             : 
     254           3 : BOOST_AUTO_TEST_SUITE_END()

Generated by: LCOV version 1.11