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