network_v6.cpp 8.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238
  1. //
  2. // network_v6.cpp
  3. // ~~~~~~~~~~~~~~
  4. //
  5. // Copyright (c) 2003-2019 Christopher M. Kohlhoff (chris at kohlhoff dot com)
  6. // Copyright (c) 2014 Oliver Kowalke (oliver dot kowalke at gmail dot com)
  7. //
  8. // Distributed under the Boost Software License, Version 1.0. (See accompanying
  9. // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
  10. //
  11. // Disable autolinking for unit tests.
  12. #if !defined(BOOST_ALL_NO_LIB)
  13. #define BOOST_ALL_NO_LIB 1
  14. #endif // !defined(BOOST_ALL_NO_LIB)
  15. // Test that header file is self-contained.
  16. #include <boost/asio/ip/network_v6.hpp>
  17. #include "../unit_test.hpp"
  18. #include <sstream>
  19. //------------------------------------------------------------------------------
  20. // ip_network_v6_compile test
  21. // ~~~~~~~~~~~~~~~~~~~~~~~~~~
  22. // The following test checks that all public member functions on the class
  23. // ip::network_v6 compile and link correctly. Runtime failures are ignored.
  24. namespace ip_network_v6_compile {
  25. void test()
  26. {
  27. using namespace boost::asio;
  28. namespace ip = boost::asio::ip;
  29. try
  30. {
  31. boost::system::error_code ec;
  32. // network_v6 constructors.
  33. ip::network_v6 net1(ip::make_address_v6("2001:370::10:7344"), 64);
  34. ip::network_v6 net2(ip::make_address_v6("2001:370::10:7345"), 96);
  35. // network_v6 functions.
  36. ip::address_v6 addr1 = net1.address();
  37. (void)addr1;
  38. unsigned short prefix_len = net1.prefix_length();
  39. (void)prefix_len;
  40. ip::address_v6 addr3 = net1.network();
  41. (void)addr3;
  42. ip::address_v6_range hosts = net1.hosts();
  43. (void)hosts;
  44. ip::network_v6 net3 = net1.canonical();
  45. (void)net3;
  46. bool b1 = net1.is_host();
  47. (void)b1;
  48. bool b2 = net1.is_subnet_of(net2);
  49. (void)b2;
  50. std::string s1 = net1.to_string();
  51. (void)s1;
  52. std::string s2 = net1.to_string(ec);
  53. (void)s2;
  54. // network_v6 comparisons.
  55. bool b3 = (net1 == net2);
  56. (void)b3;
  57. bool b4 = (net1 != net2);
  58. (void)b4;
  59. // network_v6 creation functions.
  60. net1 = ip::make_network_v6(ip::address_v6(), 24);
  61. net1 = ip::make_network_v6("10.0.0.0/8");
  62. net1 = ip::make_network_v6("10.0.0.0/8", ec);
  63. net1 = ip::make_network_v6(s1);
  64. net1 = ip::make_network_v6(s1, ec);
  65. #if defined(BOOST_ASIO_HAS_STRING_VIEW)
  66. # if defined(BOOST_ASIO_HAS_STD_STRING_VIEW)
  67. std::string_view string_view_value("0::0/8");
  68. # elif defined(BOOST_ASIO_HAS_STD_EXPERIMENTAL_STRING_VIEW)
  69. std::experimental::string_view string_view_value("0::0/8");
  70. # endif // defined(BOOST_ASIO_HAS_STD_EXPERIMENTAL_STRING_VIEW)
  71. net1 = ip::make_network_v6(string_view_value);
  72. net1 = ip::make_network_v6(string_view_value, ec);
  73. #endif // defined(BOOST_ASIO_STD_STRING_VIEW)
  74. // network_v6 I/O.
  75. std::ostringstream os;
  76. os << net1;
  77. #if !defined(BOOST_NO_STD_WSTREAMBUF)
  78. std::wostringstream wos;
  79. wos << net1;
  80. #endif // !defined(BOOST_NO_STD_WSTREAMBUF)
  81. }
  82. catch (std::exception&)
  83. {
  84. }
  85. }
  86. } // namespace ip_network_v6_compile
  87. //------------------------------------------------------------------------------
  88. // ip_network_v6_runtime test
  89. // ~~~~~~~~~~~~~~~~~~~~~~~~~~
  90. // The following test checks that the various public member functions meet the
  91. // necessary postconditions.
  92. namespace ip_network_v6_runtime {
  93. void test()
  94. {
  95. using boost::asio::ip::address_v6;
  96. using boost::asio::ip::make_address_v6;
  97. using boost::asio::ip::network_v6;
  98. using boost::asio::ip::make_network_v6;
  99. address_v6 addr = make_address_v6("2001:370::10:7344");
  100. std::string msg;
  101. try
  102. {
  103. make_network_v6(addr, 129);
  104. }
  105. catch(std::out_of_range& ex)
  106. {
  107. msg = ex.what();
  108. }
  109. BOOST_ASIO_CHECK(msg == std::string("prefix length too large"));
  110. // construct address range from address and prefix length
  111. BOOST_ASIO_CHECK(network_v6(make_address_v6("2001:370::10:7344"), 128).network() == make_address_v6("2001:370::10:7344"));
  112. BOOST_ASIO_CHECK(network_v6(make_address_v6("2001:370::10:7344"), 64).network() == make_address_v6("2001:370::"));
  113. BOOST_ASIO_CHECK(network_v6(make_address_v6("2001:370::10:7344"), 27).network() == make_address_v6("2001:360::"));
  114. // construct address range from string in CIDR notation
  115. BOOST_ASIO_CHECK(make_network_v6("2001:370::10:7344/128").network() == make_address_v6("2001:370::10:7344"));
  116. BOOST_ASIO_CHECK(make_network_v6("2001:370::10:7344/64").network() == make_address_v6("2001:370::"));
  117. BOOST_ASIO_CHECK(make_network_v6("2001:370::10:7344/27").network() == make_address_v6("2001:360::"));
  118. // construct network from invalid string
  119. boost::system::error_code ec;
  120. make_network_v6("a:b/24", ec);
  121. BOOST_ASIO_CHECK(!!ec);
  122. make_network_v6("2001:370::10:7344/129", ec);
  123. BOOST_ASIO_CHECK(!!ec);
  124. make_network_v6("2001:370::10:7344/-1", ec);
  125. BOOST_ASIO_CHECK(!!ec);
  126. make_network_v6("2001:370::10:7344/", ec);
  127. BOOST_ASIO_CHECK(!!ec);
  128. make_network_v6("2001:370::10:7344", ec);
  129. BOOST_ASIO_CHECK(!!ec);
  130. // prefix length
  131. BOOST_ASIO_CHECK(make_network_v6("2001:370::10:7344/128").prefix_length() == 128);
  132. BOOST_ASIO_CHECK(network_v6(make_address_v6("2001:370::10:7344"), 27).prefix_length() == 27);
  133. // to string
  134. std::string a("2001:370::10:7344/64");
  135. BOOST_ASIO_CHECK(make_network_v6(a.c_str()).to_string() == a);
  136. BOOST_ASIO_CHECK(network_v6(make_address_v6("2001:370::10:7344"), 27).to_string() == std::string("2001:370::10:7344/27"));
  137. // return host part
  138. BOOST_ASIO_CHECK(make_network_v6("2001:370::10:7344/64").address() == make_address_v6("2001:370::10:7344"));
  139. BOOST_ASIO_CHECK(make_network_v6("2001:370::10:7344/27").address().to_string() == "2001:370::10:7344");
  140. // return network in CIDR notation
  141. BOOST_ASIO_CHECK(make_network_v6("2001:370::10:7344/27").canonical().to_string() == "2001:360::/27");
  142. // is host
  143. BOOST_ASIO_CHECK(make_network_v6("2001:370::10:7344/128").is_host());
  144. BOOST_ASIO_CHECK(!make_network_v6("2001:370::10:7344/127").is_host());
  145. // is real subnet of
  146. BOOST_ASIO_CHECK(make_network_v6("2001:370::10:3744/64").is_subnet_of(make_network_v6("2001:370::/16")));
  147. BOOST_ASIO_CHECK(make_network_v6("2001:370::/64").is_subnet_of(make_network_v6("2001:370::/16")));
  148. BOOST_ASIO_CHECK(make_network_v6("2001:0db8:85a3::/64").is_subnet_of(make_network_v6("2001:0d00::/24")));
  149. BOOST_ASIO_CHECK(!make_network_v6("2001:370::10:3744/128").is_subnet_of(make_network_v6("2001:370::10:3744/128")));
  150. BOOST_ASIO_CHECK(make_network_v6("2001:0db8:85a3::/64").is_subnet_of(make_network_v6("2001:0dc0::/24")));
  151. network_v6 r(make_network_v6("2001:370::/64"));
  152. BOOST_ASIO_CHECK(!r.is_subnet_of(r));
  153. network_v6 net12(make_network_v6("2001:370::10:7344/64"));
  154. network_v6 net13(make_network_v6("2001:0db8::/127"));
  155. network_v6 net14(make_network_v6("2001:0db8::/125"));
  156. network_v6 net15(make_network_v6("2001:0db8::/119"));
  157. // network
  158. BOOST_ASIO_CHECK(net12.network() == make_address_v6("2001:370::"));
  159. BOOST_ASIO_CHECK(net13.network() == make_address_v6("2001:0db8::"));
  160. BOOST_ASIO_CHECK(net14.network() == make_address_v6("2001:0db8::"));
  161. BOOST_ASIO_CHECK(net15.network() == make_address_v6("2001:0db8::"));
  162. // iterator
  163. //BOOST_ASIO_CHECK(std::distance(net12.hosts().begin(),net12.hosts().end()) == 18446744073709552000);
  164. BOOST_ASIO_CHECK(std::distance(net13.hosts().begin(),net13.hosts().end()) == 2);
  165. BOOST_ASIO_CHECK(std::distance(net14.hosts().begin(),net14.hosts().end()) == 8);
  166. BOOST_ASIO_CHECK(std::distance(net15.hosts().begin(),net15.hosts().end()) == 512);
  167. BOOST_ASIO_CHECK(*net12.hosts().begin() == make_address_v6("2001:0370::"));
  168. BOOST_ASIO_CHECK(net12.hosts().end() != net12.hosts().find(make_address_v6("2001:0370::ffff:ffff:ffff:ffff")));
  169. BOOST_ASIO_CHECK(*net13.hosts().begin() == make_address_v6("2001:0db8::"));
  170. BOOST_ASIO_CHECK(net13.hosts().end() != net13.hosts().find(make_address_v6("2001:0db8::1")));
  171. BOOST_ASIO_CHECK(net13.hosts().end() == net13.hosts().find(make_address_v6("2001:0db8::2")));
  172. BOOST_ASIO_CHECK(*net14.hosts().begin() == make_address_v6("2001:0db8::"));
  173. BOOST_ASIO_CHECK(net14.hosts().end() != net14.hosts().find(make_address_v6("2001:0db8::7")));
  174. BOOST_ASIO_CHECK(net14.hosts().end() == net14.hosts().find(make_address_v6("2001:0db8::8")));
  175. BOOST_ASIO_CHECK(*net15.hosts().begin() == make_address_v6("2001:0db8::"));
  176. BOOST_ASIO_CHECK(net15.hosts().end() != net15.hosts().find(make_address_v6("2001:0db8::01ff")));
  177. BOOST_ASIO_CHECK(net15.hosts().end() == net15.hosts().find(make_address_v6("2001:0db8::0200")));
  178. }
  179. } // namespace ip_network_v6_runtime
  180. //------------------------------------------------------------------------------
  181. BOOST_ASIO_TEST_SUITE
  182. (
  183. "ip/network_v6",
  184. BOOST_ASIO_TEST_CASE(ip_network_v6_compile::test)
  185. BOOST_ASIO_TEST_CASE(ip_network_v6_runtime::test)
  186. )