address_v6.cpp 16 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409
  1. //
  2. // address_v6.cpp
  3. // ~~~~~~~~~~~~~~
  4. //
  5. // Copyright (c) 2003-2019 Christopher M. Kohlhoff (chris at kohlhoff dot com)
  6. //
  7. // Distributed under the Boost Software License, Version 1.0. (See accompanying
  8. // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
  9. //
  10. // Disable autolinking for unit tests.
  11. #if !defined(BOOST_ALL_NO_LIB)
  12. #define BOOST_ALL_NO_LIB 1
  13. #endif // !defined(BOOST_ALL_NO_LIB)
  14. // Test that header file is self-contained.
  15. #include <boost/asio/ip/address_v6.hpp>
  16. #include "../unit_test.hpp"
  17. #include <sstream>
  18. //------------------------------------------------------------------------------
  19. // ip_address_v6_compile test
  20. // ~~~~~~~~~~~~~~~~~~~~~~~~~~
  21. // The following test checks that all public member functions on the class
  22. // ip::address_v6 compile and link correctly. Runtime failures are ignored.
  23. namespace ip_address_v6_compile {
  24. void test()
  25. {
  26. using namespace boost::asio;
  27. namespace ip = boost::asio::ip;
  28. try
  29. {
  30. boost::system::error_code ec;
  31. // address_v6 constructors.
  32. ip::address_v6 addr1;
  33. const ip::address_v6::bytes_type const_bytes_value = { { 0 } };
  34. ip::address_v6 addr2(const_bytes_value);
  35. // address_v6 functions.
  36. unsigned long scope_id = addr1.scope_id();
  37. addr1.scope_id(scope_id);
  38. bool b = addr1.is_unspecified();
  39. (void)b;
  40. b = addr1.is_loopback();
  41. (void)b;
  42. b = addr1.is_multicast();
  43. (void)b;
  44. b = addr1.is_link_local();
  45. (void)b;
  46. b = addr1.is_site_local();
  47. (void)b;
  48. b = addr1.is_v4_mapped();
  49. (void)b;
  50. #if !defined(BOOST_ASIO_NO_DEPRECATED)
  51. b = addr1.is_v4_compatible();
  52. (void)b;
  53. #endif // !defined(BOOST_ASIO_NO_DEPRECATED)
  54. b = addr1.is_multicast_node_local();
  55. (void)b;
  56. b = addr1.is_multicast_link_local();
  57. (void)b;
  58. b = addr1.is_multicast_site_local();
  59. (void)b;
  60. b = addr1.is_multicast_org_local();
  61. (void)b;
  62. b = addr1.is_multicast_global();
  63. (void)b;
  64. ip::address_v6::bytes_type bytes_value = addr1.to_bytes();
  65. (void)bytes_value;
  66. std::string string_value = addr1.to_string();
  67. #if !defined(BOOST_ASIO_NO_DEPRECATED)
  68. string_value = addr1.to_string(ec);
  69. #endif // !defined(BOOST_ASIO_NO_DEPRECATED)
  70. #if !defined(BOOST_ASIO_NO_DEPRECATED)
  71. ip::address_v4 addr3 = addr1.to_v4();
  72. #endif // !defined(BOOST_ASIO_NO_DEPRECATED)
  73. // address_v6 static functions.
  74. #if !defined(BOOST_ASIO_NO_DEPRECATED)
  75. addr1 = ip::address_v6::from_string("0::0");
  76. addr1 = ip::address_v6::from_string("0::0", ec);
  77. addr1 = ip::address_v6::from_string(string_value);
  78. addr1 = ip::address_v6::from_string(string_value, ec);
  79. #endif // !defined(BOOST_ASIO_NO_DEPRECATED)
  80. addr1 = ip::address_v6::any();
  81. addr1 = ip::address_v6::loopback();
  82. #if !defined(BOOST_ASIO_NO_DEPRECATED)
  83. addr1 = ip::address_v6::v4_mapped(addr3);
  84. addr1 = ip::address_v6::v4_compatible(addr3);
  85. #endif // !defined(BOOST_ASIO_NO_DEPRECATED)
  86. // address_v6 comparisons.
  87. b = (addr1 == addr2);
  88. (void)b;
  89. b = (addr1 != addr2);
  90. (void)b;
  91. b = (addr1 < addr2);
  92. (void)b;
  93. b = (addr1 > addr2);
  94. (void)b;
  95. b = (addr1 <= addr2);
  96. (void)b;
  97. b = (addr1 >= addr2);
  98. (void)b;
  99. // address_v6 creation functions.
  100. addr1 = ip::make_address_v6(const_bytes_value, scope_id);
  101. addr1 = ip::make_address_v6("0::0");
  102. addr1 = ip::make_address_v6("0::0", ec);
  103. addr1 = ip::make_address_v6(string_value);
  104. addr1 = ip::make_address_v6(string_value, ec);
  105. #if defined(BOOST_ASIO_HAS_STRING_VIEW)
  106. # if defined(BOOST_ASIO_HAS_STD_STRING_VIEW)
  107. std::string_view string_view_value("0::0");
  108. # else // defined(BOOST_ASIO_HAS_STD_EXPERIMENTAL_STRING_VIEW)
  109. std::experimental::string_view string_view_value("0::0");
  110. # endif // defined(BOOST_ASIO_HAS_STD_EXPERIMENTAL_STRING_VIEW)
  111. addr1 = ip::make_address_v6(string_view_value);
  112. addr1 = ip::make_address_v6(string_view_value, ec);
  113. #endif // defined(BOOST_ASIO_HAS_STRING_VIEW)
  114. // address_v6 IPv4-mapped conversion.
  115. #if defined(BOOST_ASIO_NO_DEPRECATED)
  116. ip::address_v4 addr3;
  117. #endif // defined(BOOST_ASIO_NO_DEPRECATED)
  118. addr1 = ip::make_address_v6(ip::v4_mapped, addr3);
  119. addr3 = ip::make_address_v4(ip::v4_mapped, addr1);
  120. // address_v6 I/O.
  121. std::ostringstream os;
  122. os << addr1;
  123. #if !defined(BOOST_NO_STD_WSTREAMBUF)
  124. std::wostringstream wos;
  125. wos << addr1;
  126. #endif // !defined(BOOST_NO_STD_WSTREAMBUF)
  127. }
  128. catch (std::exception&)
  129. {
  130. }
  131. }
  132. } // namespace ip_address_v6_compile
  133. //------------------------------------------------------------------------------
  134. // ip_address_v6_runtime test
  135. // ~~~~~~~~~~~~~~~~~~~~~~~~~~
  136. // The following test checks that the various public member functions meet the
  137. // necessary postconditions.
  138. namespace ip_address_v6_runtime {
  139. void test()
  140. {
  141. using boost::asio::ip::address_v6;
  142. address_v6 a1;
  143. BOOST_ASIO_CHECK(a1.is_unspecified());
  144. BOOST_ASIO_CHECK(a1.scope_id() == 0);
  145. address_v6::bytes_type b1 = {{ 1, 2, 3, 4, 5,
  146. 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16 }};
  147. address_v6 a2(b1, 12345);
  148. BOOST_ASIO_CHECK(a2.to_bytes()[0] == 1);
  149. BOOST_ASIO_CHECK(a2.to_bytes()[1] == 2);
  150. BOOST_ASIO_CHECK(a2.to_bytes()[2] == 3);
  151. BOOST_ASIO_CHECK(a2.to_bytes()[3] == 4);
  152. BOOST_ASIO_CHECK(a2.to_bytes()[4] == 5);
  153. BOOST_ASIO_CHECK(a2.to_bytes()[5] == 6);
  154. BOOST_ASIO_CHECK(a2.to_bytes()[6] == 7);
  155. BOOST_ASIO_CHECK(a2.to_bytes()[7] == 8);
  156. BOOST_ASIO_CHECK(a2.to_bytes()[8] == 9);
  157. BOOST_ASIO_CHECK(a2.to_bytes()[9] == 10);
  158. BOOST_ASIO_CHECK(a2.to_bytes()[10] == 11);
  159. BOOST_ASIO_CHECK(a2.to_bytes()[11] == 12);
  160. BOOST_ASIO_CHECK(a2.to_bytes()[12] == 13);
  161. BOOST_ASIO_CHECK(a2.to_bytes()[13] == 14);
  162. BOOST_ASIO_CHECK(a2.to_bytes()[14] == 15);
  163. BOOST_ASIO_CHECK(a2.to_bytes()[15] == 16);
  164. BOOST_ASIO_CHECK(a2.scope_id() == 12345);
  165. address_v6 a3;
  166. a3.scope_id(12345);
  167. BOOST_ASIO_CHECK(a3.scope_id() == 12345);
  168. address_v6 unspecified_address;
  169. address_v6::bytes_type loopback_bytes = {{ 0 }};
  170. loopback_bytes[15] = 1;
  171. address_v6 loopback_address(loopback_bytes);
  172. address_v6::bytes_type link_local_bytes = {{ 0xFE, 0x80, 1 }};
  173. address_v6 link_local_address(link_local_bytes);
  174. address_v6::bytes_type site_local_bytes = {{ 0xFE, 0xC0, 1 }};
  175. address_v6 site_local_address(site_local_bytes);
  176. address_v6::bytes_type v4_mapped_bytes = {{ 0 }};
  177. v4_mapped_bytes[10] = 0xFF, v4_mapped_bytes[11] = 0xFF;
  178. v4_mapped_bytes[12] = 1, v4_mapped_bytes[13] = 2;
  179. v4_mapped_bytes[14] = 3, v4_mapped_bytes[15] = 4;
  180. address_v6 v4_mapped_address(v4_mapped_bytes);
  181. address_v6::bytes_type v4_compat_bytes = {{ 0 }};
  182. v4_compat_bytes[12] = 1, v4_compat_bytes[13] = 2;
  183. v4_compat_bytes[14] = 3, v4_compat_bytes[15] = 4;
  184. address_v6 v4_compat_address(v4_compat_bytes);
  185. address_v6::bytes_type mcast_global_bytes = {{ 0xFF, 0x0E, 1 }};
  186. address_v6 mcast_global_address(mcast_global_bytes);
  187. address_v6::bytes_type mcast_link_local_bytes = {{ 0xFF, 0x02, 1 }};
  188. address_v6 mcast_link_local_address(mcast_link_local_bytes);
  189. address_v6::bytes_type mcast_node_local_bytes = {{ 0xFF, 0x01, 1 }};
  190. address_v6 mcast_node_local_address(mcast_node_local_bytes);
  191. address_v6::bytes_type mcast_org_local_bytes = {{ 0xFF, 0x08, 1 }};
  192. address_v6 mcast_org_local_address(mcast_org_local_bytes);
  193. address_v6::bytes_type mcast_site_local_bytes = {{ 0xFF, 0x05, 1 }};
  194. address_v6 mcast_site_local_address(mcast_site_local_bytes);
  195. BOOST_ASIO_CHECK(!unspecified_address.is_loopback());
  196. BOOST_ASIO_CHECK(loopback_address.is_loopback());
  197. BOOST_ASIO_CHECK(!link_local_address.is_loopback());
  198. BOOST_ASIO_CHECK(!site_local_address.is_loopback());
  199. BOOST_ASIO_CHECK(!v4_mapped_address.is_loopback());
  200. BOOST_ASIO_CHECK(!v4_compat_address.is_loopback());
  201. BOOST_ASIO_CHECK(!mcast_global_address.is_loopback());
  202. BOOST_ASIO_CHECK(!mcast_link_local_address.is_loopback());
  203. BOOST_ASIO_CHECK(!mcast_node_local_address.is_loopback());
  204. BOOST_ASIO_CHECK(!mcast_org_local_address.is_loopback());
  205. BOOST_ASIO_CHECK(!mcast_site_local_address.is_loopback());
  206. BOOST_ASIO_CHECK(unspecified_address.is_unspecified());
  207. BOOST_ASIO_CHECK(!loopback_address.is_unspecified());
  208. BOOST_ASIO_CHECK(!link_local_address.is_unspecified());
  209. BOOST_ASIO_CHECK(!site_local_address.is_unspecified());
  210. BOOST_ASIO_CHECK(!v4_mapped_address.is_unspecified());
  211. BOOST_ASIO_CHECK(!v4_compat_address.is_unspecified());
  212. BOOST_ASIO_CHECK(!mcast_global_address.is_unspecified());
  213. BOOST_ASIO_CHECK(!mcast_link_local_address.is_unspecified());
  214. BOOST_ASIO_CHECK(!mcast_node_local_address.is_unspecified());
  215. BOOST_ASIO_CHECK(!mcast_org_local_address.is_unspecified());
  216. BOOST_ASIO_CHECK(!mcast_site_local_address.is_unspecified());
  217. BOOST_ASIO_CHECK(!unspecified_address.is_link_local());
  218. BOOST_ASIO_CHECK(!loopback_address.is_link_local());
  219. BOOST_ASIO_CHECK(link_local_address.is_link_local());
  220. BOOST_ASIO_CHECK(!site_local_address.is_link_local());
  221. BOOST_ASIO_CHECK(!v4_mapped_address.is_link_local());
  222. BOOST_ASIO_CHECK(!v4_compat_address.is_link_local());
  223. BOOST_ASIO_CHECK(!mcast_global_address.is_link_local());
  224. BOOST_ASIO_CHECK(!mcast_link_local_address.is_link_local());
  225. BOOST_ASIO_CHECK(!mcast_node_local_address.is_link_local());
  226. BOOST_ASIO_CHECK(!mcast_org_local_address.is_link_local());
  227. BOOST_ASIO_CHECK(!mcast_site_local_address.is_link_local());
  228. BOOST_ASIO_CHECK(!unspecified_address.is_site_local());
  229. BOOST_ASIO_CHECK(!loopback_address.is_site_local());
  230. BOOST_ASIO_CHECK(!link_local_address.is_site_local());
  231. BOOST_ASIO_CHECK(site_local_address.is_site_local());
  232. BOOST_ASIO_CHECK(!v4_mapped_address.is_site_local());
  233. BOOST_ASIO_CHECK(!v4_compat_address.is_site_local());
  234. BOOST_ASIO_CHECK(!mcast_global_address.is_site_local());
  235. BOOST_ASIO_CHECK(!mcast_link_local_address.is_site_local());
  236. BOOST_ASIO_CHECK(!mcast_node_local_address.is_site_local());
  237. BOOST_ASIO_CHECK(!mcast_org_local_address.is_site_local());
  238. BOOST_ASIO_CHECK(!mcast_site_local_address.is_site_local());
  239. BOOST_ASIO_CHECK(!unspecified_address.is_v4_mapped());
  240. BOOST_ASIO_CHECK(!loopback_address.is_v4_mapped());
  241. BOOST_ASIO_CHECK(!link_local_address.is_v4_mapped());
  242. BOOST_ASIO_CHECK(!site_local_address.is_v4_mapped());
  243. BOOST_ASIO_CHECK(v4_mapped_address.is_v4_mapped());
  244. BOOST_ASIO_CHECK(!v4_compat_address.is_v4_mapped());
  245. BOOST_ASIO_CHECK(!mcast_global_address.is_v4_mapped());
  246. BOOST_ASIO_CHECK(!mcast_link_local_address.is_v4_mapped());
  247. BOOST_ASIO_CHECK(!mcast_node_local_address.is_v4_mapped());
  248. BOOST_ASIO_CHECK(!mcast_org_local_address.is_v4_mapped());
  249. BOOST_ASIO_CHECK(!mcast_site_local_address.is_v4_mapped());
  250. #if !defined(BOOST_ASIO_NO_DEPRECATED)
  251. BOOST_ASIO_CHECK(!unspecified_address.is_v4_compatible());
  252. BOOST_ASIO_CHECK(!loopback_address.is_v4_compatible());
  253. BOOST_ASIO_CHECK(!link_local_address.is_v4_compatible());
  254. BOOST_ASIO_CHECK(!site_local_address.is_v4_compatible());
  255. BOOST_ASIO_CHECK(!v4_mapped_address.is_v4_compatible());
  256. BOOST_ASIO_CHECK(v4_compat_address.is_v4_compatible());
  257. BOOST_ASIO_CHECK(!mcast_global_address.is_v4_compatible());
  258. BOOST_ASIO_CHECK(!mcast_link_local_address.is_v4_compatible());
  259. BOOST_ASIO_CHECK(!mcast_node_local_address.is_v4_compatible());
  260. BOOST_ASIO_CHECK(!mcast_org_local_address.is_v4_compatible());
  261. BOOST_ASIO_CHECK(!mcast_site_local_address.is_v4_compatible());
  262. #endif // !defined(BOOST_ASIO_NO_DEPRECATED)
  263. BOOST_ASIO_CHECK(!unspecified_address.is_multicast());
  264. BOOST_ASIO_CHECK(!loopback_address.is_multicast());
  265. BOOST_ASIO_CHECK(!link_local_address.is_multicast());
  266. BOOST_ASIO_CHECK(!site_local_address.is_multicast());
  267. BOOST_ASIO_CHECK(!v4_mapped_address.is_multicast());
  268. BOOST_ASIO_CHECK(!v4_compat_address.is_multicast());
  269. BOOST_ASIO_CHECK(mcast_global_address.is_multicast());
  270. BOOST_ASIO_CHECK(mcast_link_local_address.is_multicast());
  271. BOOST_ASIO_CHECK(mcast_node_local_address.is_multicast());
  272. BOOST_ASIO_CHECK(mcast_org_local_address.is_multicast());
  273. BOOST_ASIO_CHECK(mcast_site_local_address.is_multicast());
  274. BOOST_ASIO_CHECK(!unspecified_address.is_multicast_global());
  275. BOOST_ASIO_CHECK(!loopback_address.is_multicast_global());
  276. BOOST_ASIO_CHECK(!link_local_address.is_multicast_global());
  277. BOOST_ASIO_CHECK(!site_local_address.is_multicast_global());
  278. BOOST_ASIO_CHECK(!v4_mapped_address.is_multicast_global());
  279. BOOST_ASIO_CHECK(!v4_compat_address.is_multicast_global());
  280. BOOST_ASIO_CHECK(mcast_global_address.is_multicast_global());
  281. BOOST_ASIO_CHECK(!mcast_link_local_address.is_multicast_global());
  282. BOOST_ASIO_CHECK(!mcast_node_local_address.is_multicast_global());
  283. BOOST_ASIO_CHECK(!mcast_org_local_address.is_multicast_global());
  284. BOOST_ASIO_CHECK(!mcast_site_local_address.is_multicast_global());
  285. BOOST_ASIO_CHECK(!unspecified_address.is_multicast_link_local());
  286. BOOST_ASIO_CHECK(!loopback_address.is_multicast_link_local());
  287. BOOST_ASIO_CHECK(!link_local_address.is_multicast_link_local());
  288. BOOST_ASIO_CHECK(!site_local_address.is_multicast_link_local());
  289. BOOST_ASIO_CHECK(!v4_mapped_address.is_multicast_link_local());
  290. BOOST_ASIO_CHECK(!v4_compat_address.is_multicast_link_local());
  291. BOOST_ASIO_CHECK(!mcast_global_address.is_multicast_link_local());
  292. BOOST_ASIO_CHECK(mcast_link_local_address.is_multicast_link_local());
  293. BOOST_ASIO_CHECK(!mcast_node_local_address.is_multicast_link_local());
  294. BOOST_ASIO_CHECK(!mcast_org_local_address.is_multicast_link_local());
  295. BOOST_ASIO_CHECK(!mcast_site_local_address.is_multicast_link_local());
  296. BOOST_ASIO_CHECK(!unspecified_address.is_multicast_node_local());
  297. BOOST_ASIO_CHECK(!loopback_address.is_multicast_node_local());
  298. BOOST_ASIO_CHECK(!link_local_address.is_multicast_node_local());
  299. BOOST_ASIO_CHECK(!site_local_address.is_multicast_node_local());
  300. BOOST_ASIO_CHECK(!v4_mapped_address.is_multicast_node_local());
  301. BOOST_ASIO_CHECK(!v4_compat_address.is_multicast_node_local());
  302. BOOST_ASIO_CHECK(!mcast_global_address.is_multicast_node_local());
  303. BOOST_ASIO_CHECK(!mcast_link_local_address.is_multicast_node_local());
  304. BOOST_ASIO_CHECK(mcast_node_local_address.is_multicast_node_local());
  305. BOOST_ASIO_CHECK(!mcast_org_local_address.is_multicast_node_local());
  306. BOOST_ASIO_CHECK(!mcast_site_local_address.is_multicast_node_local());
  307. BOOST_ASIO_CHECK(!unspecified_address.is_multicast_org_local());
  308. BOOST_ASIO_CHECK(!loopback_address.is_multicast_org_local());
  309. BOOST_ASIO_CHECK(!link_local_address.is_multicast_org_local());
  310. BOOST_ASIO_CHECK(!site_local_address.is_multicast_org_local());
  311. BOOST_ASIO_CHECK(!v4_mapped_address.is_multicast_org_local());
  312. BOOST_ASIO_CHECK(!v4_compat_address.is_multicast_org_local());
  313. BOOST_ASIO_CHECK(!mcast_global_address.is_multicast_org_local());
  314. BOOST_ASIO_CHECK(!mcast_link_local_address.is_multicast_org_local());
  315. BOOST_ASIO_CHECK(!mcast_node_local_address.is_multicast_org_local());
  316. BOOST_ASIO_CHECK(mcast_org_local_address.is_multicast_org_local());
  317. BOOST_ASIO_CHECK(!mcast_site_local_address.is_multicast_org_local());
  318. BOOST_ASIO_CHECK(!unspecified_address.is_multicast_site_local());
  319. BOOST_ASIO_CHECK(!loopback_address.is_multicast_site_local());
  320. BOOST_ASIO_CHECK(!link_local_address.is_multicast_site_local());
  321. BOOST_ASIO_CHECK(!site_local_address.is_multicast_site_local());
  322. BOOST_ASIO_CHECK(!v4_mapped_address.is_multicast_site_local());
  323. BOOST_ASIO_CHECK(!v4_compat_address.is_multicast_site_local());
  324. BOOST_ASIO_CHECK(!mcast_global_address.is_multicast_site_local());
  325. BOOST_ASIO_CHECK(!mcast_link_local_address.is_multicast_site_local());
  326. BOOST_ASIO_CHECK(!mcast_node_local_address.is_multicast_site_local());
  327. BOOST_ASIO_CHECK(!mcast_org_local_address.is_multicast_site_local());
  328. BOOST_ASIO_CHECK(mcast_site_local_address.is_multicast_site_local());
  329. BOOST_ASIO_CHECK(address_v6::loopback().is_loopback());
  330. }
  331. } // namespace ip_address_v6_runtime
  332. //------------------------------------------------------------------------------
  333. BOOST_ASIO_TEST_SUITE
  334. (
  335. "ip/address_v6",
  336. BOOST_ASIO_TEST_CASE(ip_address_v6_compile::test)
  337. BOOST_ASIO_TEST_CASE(ip_address_v6_runtime::test)
  338. )