PageRenderTime 49ms CodeModel.GetById 26ms RepoModel.GetById 1ms app.codeStats 0ms

/src/test/netbase_tests.cpp

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