v6_only.cpp 3.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135
  1. //
  2. // v6_only.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/v6_only.hpp>
  16. #include <boost/asio/io_context.hpp>
  17. #include <boost/asio/ip/tcp.hpp>
  18. #include <boost/asio/ip/udp.hpp>
  19. #include "../unit_test.hpp"
  20. //------------------------------------------------------------------------------
  21. // ip_v6_only_compile test
  22. // ~~~~~~~~~~~~~~~~~~~~~~~
  23. // The following test checks that the ip::v6_only socket option compiles and
  24. // link correctly. Runtime failures are ignored.
  25. namespace ip_v6_only_compile {
  26. void test()
  27. {
  28. using namespace boost::asio;
  29. namespace ip = boost::asio::ip;
  30. try
  31. {
  32. io_context ioc;
  33. ip::udp::socket sock(ioc);
  34. // v6_only class.
  35. ip::v6_only v6_only1(true);
  36. sock.set_option(v6_only1);
  37. ip::v6_only v6_only2;
  38. sock.get_option(v6_only2);
  39. v6_only1 = true;
  40. (void)static_cast<bool>(v6_only1);
  41. (void)static_cast<bool>(!v6_only1);
  42. (void)static_cast<bool>(v6_only1.value());
  43. }
  44. catch (std::exception&)
  45. {
  46. }
  47. }
  48. } // namespace ip_v6_only_compile
  49. //------------------------------------------------------------------------------
  50. // ip_v6_only_runtime test
  51. // ~~~~~~~~~~~~~~~~~~~~~~~
  52. // The following test checks the runtime operation of the ip::v6_only socket
  53. // option.
  54. namespace ip_v6_only_runtime {
  55. void test()
  56. {
  57. using namespace boost::asio;
  58. namespace ip = boost::asio::ip;
  59. io_context ioc;
  60. boost::system::error_code ec;
  61. ip::tcp::endpoint ep_v6(ip::address_v6::loopback(), 0);
  62. ip::tcp::acceptor acceptor_v6(ioc);
  63. acceptor_v6.open(ep_v6.protocol(), ec);
  64. acceptor_v6.bind(ep_v6, ec);
  65. bool have_v6 = !ec;
  66. acceptor_v6.close(ec);
  67. acceptor_v6.open(ep_v6.protocol(), ec);
  68. if (have_v6)
  69. {
  70. ip::v6_only v6_only1;
  71. acceptor_v6.get_option(v6_only1, ec);
  72. BOOST_ASIO_CHECK(!ec);
  73. bool have_dual_stack = !v6_only1.value();
  74. if (have_dual_stack)
  75. {
  76. ip::v6_only v6_only2(false);
  77. BOOST_ASIO_CHECK(!v6_only2.value());
  78. BOOST_ASIO_CHECK(!static_cast<bool>(v6_only2));
  79. BOOST_ASIO_CHECK(!v6_only2);
  80. acceptor_v6.set_option(v6_only2, ec);
  81. BOOST_ASIO_CHECK(!ec);
  82. ip::v6_only v6_only3;
  83. acceptor_v6.get_option(v6_only3, ec);
  84. BOOST_ASIO_CHECK(!ec);
  85. BOOST_ASIO_CHECK(!v6_only3.value());
  86. BOOST_ASIO_CHECK(!static_cast<bool>(v6_only3));
  87. BOOST_ASIO_CHECK(!v6_only3);
  88. ip::v6_only v6_only4(true);
  89. BOOST_ASIO_CHECK(v6_only4.value());
  90. BOOST_ASIO_CHECK(static_cast<bool>(v6_only4));
  91. BOOST_ASIO_CHECK(!!v6_only4);
  92. acceptor_v6.set_option(v6_only4, ec);
  93. BOOST_ASIO_CHECK(!ec);
  94. ip::v6_only v6_only5;
  95. acceptor_v6.get_option(v6_only5, ec);
  96. BOOST_ASIO_CHECK(!ec);
  97. BOOST_ASIO_CHECK(v6_only5.value());
  98. BOOST_ASIO_CHECK(static_cast<bool>(v6_only5));
  99. BOOST_ASIO_CHECK(!!v6_only5);
  100. }
  101. }
  102. }
  103. } // namespace ip_v6_only_runtime
  104. //------------------------------------------------------------------------------
  105. BOOST_ASIO_TEST_SUITE
  106. (
  107. "ip/v6_only",
  108. BOOST_ASIO_TEST_CASE(ip_v6_only_compile::test)
  109. BOOST_ASIO_TEST_CASE(ip_v6_only_runtime::test)
  110. )