| // |
| // socket_base.cpp |
| // ~~~~~~~~~~~~~~~ |
| // |
| // Copyright (c) 2003-2010 Christopher M. Kohlhoff (chris at kohlhoff dot com) |
| // |
| // Distributed under the Boost Software License, Version 1.0. (See accompanying |
| // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) |
| // |
| |
| // Disable autolinking for unit tests. |
| #if !defined(BOOST_ALL_NO_LIB) |
| #define BOOST_ALL_NO_LIB 1 |
| #endif // !defined(BOOST_ALL_NO_LIB) |
| |
| // Test that header file is self-contained. |
| #include <boost/asio/socket_base.hpp> |
| |
| #include <boost/asio/io_service.hpp> |
| #include <boost/asio/ip/tcp.hpp> |
| #include <boost/asio/ip/udp.hpp> |
| #include "unit_test.hpp" |
| |
| //------------------------------------------------------------------------------ |
| |
| // socket_base_compile test |
| // ~~~~~~~~~~~~~~~~~~~~~~~~ |
| // The following test checks that all nested classes, enums and constants in |
| // socket_base compile and link correctly. Runtime failures are ignored. |
| |
| namespace socket_base_compile { |
| |
| void test() |
| { |
| using namespace boost::asio; |
| namespace ip = boost::asio::ip; |
| |
| try |
| { |
| io_service ios; |
| ip::tcp::socket sock(ios); |
| char buf[1024]; |
| |
| // shutdown_type enumeration. |
| |
| sock.shutdown(socket_base::shutdown_receive); |
| sock.shutdown(socket_base::shutdown_send); |
| sock.shutdown(socket_base::shutdown_both); |
| |
| // message_flags constants. |
| |
| sock.receive(buffer(buf), socket_base::message_peek); |
| sock.receive(buffer(buf), socket_base::message_out_of_band); |
| sock.send(buffer(buf), socket_base::message_do_not_route); |
| |
| // broadcast class. |
| |
| socket_base::broadcast broadcast1(true); |
| sock.set_option(broadcast1); |
| socket_base::broadcast broadcast2; |
| sock.get_option(broadcast2); |
| broadcast1 = true; |
| (void)static_cast<bool>(broadcast1); |
| (void)static_cast<bool>(!broadcast1); |
| (void)static_cast<bool>(broadcast1.value()); |
| |
| // debug class. |
| |
| socket_base::debug debug1(true); |
| sock.set_option(debug1); |
| socket_base::debug debug2; |
| sock.get_option(debug2); |
| debug1 = true; |
| (void)static_cast<bool>(debug1); |
| (void)static_cast<bool>(!debug1); |
| (void)static_cast<bool>(debug1.value()); |
| |
| // do_not_route class. |
| |
| socket_base::do_not_route do_not_route1(true); |
| sock.set_option(do_not_route1); |
| socket_base::do_not_route do_not_route2; |
| sock.get_option(do_not_route2); |
| do_not_route1 = true; |
| (void)static_cast<bool>(do_not_route1); |
| (void)static_cast<bool>(!do_not_route1); |
| (void)static_cast<bool>(do_not_route1.value()); |
| |
| // keep_alive class. |
| |
| socket_base::keep_alive keep_alive1(true); |
| sock.set_option(keep_alive1); |
| socket_base::keep_alive keep_alive2; |
| sock.get_option(keep_alive2); |
| keep_alive1 = true; |
| (void)static_cast<bool>(keep_alive1); |
| (void)static_cast<bool>(!keep_alive1); |
| (void)static_cast<bool>(keep_alive1.value()); |
| |
| // send_buffer_size class. |
| |
| socket_base::send_buffer_size send_buffer_size1(1024); |
| sock.set_option(send_buffer_size1); |
| socket_base::send_buffer_size send_buffer_size2; |
| sock.get_option(send_buffer_size2); |
| send_buffer_size1 = 1; |
| (void)static_cast<int>(send_buffer_size1.value()); |
| |
| // send_low_watermark class. |
| |
| socket_base::send_low_watermark send_low_watermark1(128); |
| sock.set_option(send_low_watermark1); |
| socket_base::send_low_watermark send_low_watermark2; |
| sock.get_option(send_low_watermark2); |
| send_low_watermark1 = 1; |
| (void)static_cast<int>(send_low_watermark1.value()); |
| |
| // receive_buffer_size class. |
| |
| socket_base::receive_buffer_size receive_buffer_size1(1024); |
| sock.set_option(receive_buffer_size1); |
| socket_base::receive_buffer_size receive_buffer_size2; |
| sock.get_option(receive_buffer_size2); |
| receive_buffer_size1 = 1; |
| (void)static_cast<int>(receive_buffer_size1.value()); |
| |
| // receive_low_watermark class. |
| |
| socket_base::receive_low_watermark receive_low_watermark1(128); |
| sock.set_option(receive_low_watermark1); |
| socket_base::receive_low_watermark receive_low_watermark2; |
| sock.get_option(receive_low_watermark2); |
| receive_low_watermark1 = 1; |
| (void)static_cast<int>(receive_low_watermark1.value()); |
| |
| // reuse_address class. |
| |
| socket_base::reuse_address reuse_address1(true); |
| sock.set_option(reuse_address1); |
| socket_base::reuse_address reuse_address2; |
| sock.get_option(reuse_address2); |
| reuse_address1 = true; |
| (void)static_cast<bool>(reuse_address1); |
| (void)static_cast<bool>(!reuse_address1); |
| (void)static_cast<bool>(reuse_address1.value()); |
| |
| // linger class. |
| |
| socket_base::linger linger1(true, 30); |
| sock.set_option(linger1); |
| socket_base::linger linger2; |
| sock.get_option(linger2); |
| linger1.enabled(true); |
| (void)static_cast<bool>(linger1.enabled()); |
| linger1.timeout(1); |
| (void)static_cast<int>(linger1.timeout()); |
| |
| // enable_connection_aborted class. |
| |
| socket_base::enable_connection_aborted enable_connection_aborted1(true); |
| sock.set_option(enable_connection_aborted1); |
| socket_base::enable_connection_aborted enable_connection_aborted2; |
| sock.get_option(enable_connection_aborted2); |
| enable_connection_aborted1 = true; |
| (void)static_cast<bool>(enable_connection_aborted1); |
| (void)static_cast<bool>(!enable_connection_aborted1); |
| (void)static_cast<bool>(enable_connection_aborted1.value()); |
| |
| // non_blocking_io class. |
| |
| socket_base::non_blocking_io non_blocking_io(true); |
| sock.io_control(non_blocking_io); |
| |
| // bytes_readable class. |
| |
| socket_base::bytes_readable bytes_readable; |
| sock.io_control(bytes_readable); |
| std::size_t bytes = bytes_readable.get(); |
| (void)bytes; |
| } |
| catch (std::exception&) |
| { |
| } |
| } |
| |
| } // namespace socket_base_compile |
| |
| //------------------------------------------------------------------------------ |
| |
| // socket_base_runtime test |
| // ~~~~~~~~~~~~~~~~~~~~~~~~ |
| // The following test checks the runtime operation of the socket options and I/O |
| // control commands defined in socket_base. |
| |
| namespace socket_base_runtime { |
| |
| void test() |
| { |
| using namespace boost::asio; |
| namespace ip = boost::asio::ip; |
| |
| io_service ios; |
| ip::udp::socket udp_sock(ios, ip::udp::v4()); |
| ip::tcp::socket tcp_sock(ios, ip::tcp::v4()); |
| ip::tcp::acceptor tcp_acceptor(ios, ip::tcp::v4()); |
| boost::system::error_code ec; |
| |
| // broadcast class. |
| |
| socket_base::broadcast broadcast1(true); |
| BOOST_CHECK(broadcast1.value()); |
| BOOST_CHECK(static_cast<bool>(broadcast1)); |
| BOOST_CHECK(!!broadcast1); |
| udp_sock.set_option(broadcast1, ec); |
| BOOST_CHECK_MESSAGE(!ec, ec.value() << ", " << ec.message()); |
| |
| socket_base::broadcast broadcast2; |
| udp_sock.get_option(broadcast2, ec); |
| BOOST_CHECK_MESSAGE(!ec, ec.value() << ", " << ec.message()); |
| BOOST_CHECK(broadcast2.value()); |
| BOOST_CHECK(static_cast<bool>(broadcast2)); |
| BOOST_CHECK(!!broadcast2); |
| |
| socket_base::broadcast broadcast3(false); |
| BOOST_CHECK(!broadcast3.value()); |
| BOOST_CHECK(!static_cast<bool>(broadcast3)); |
| BOOST_CHECK(!broadcast3); |
| udp_sock.set_option(broadcast3, ec); |
| BOOST_CHECK_MESSAGE(!ec, ec.value() << ", " << ec.message()); |
| |
| socket_base::broadcast broadcast4; |
| udp_sock.get_option(broadcast4, ec); |
| BOOST_CHECK_MESSAGE(!ec, ec.value() << ", " << ec.message()); |
| BOOST_CHECK(!broadcast4.value()); |
| BOOST_CHECK(!static_cast<bool>(broadcast4)); |
| BOOST_CHECK(!broadcast4); |
| |
| // debug class. |
| |
| socket_base::debug debug1(true); |
| BOOST_CHECK(debug1.value()); |
| BOOST_CHECK(static_cast<bool>(debug1)); |
| BOOST_CHECK(!!debug1); |
| udp_sock.set_option(debug1, ec); |
| #if defined(__linux__) |
| // On Linux, only root can set SO_DEBUG. |
| bool not_root = (ec == boost::asio::error::access_denied); |
| BOOST_CHECK(!ec || not_root); |
| BOOST_WARN_MESSAGE(!ec, "Must be root to set debug socket option"); |
| #else // defined(__linux__) |
| # if defined(BOOST_WINDOWS) && defined(UNDER_CE) |
| // Option is not supported under Windows CE. |
| BOOST_CHECK_MESSAGE(ec == boost::asio::error::no_protocol_option, |
| ec.value() << ", " << ec.message()); |
| # else // defined(BOOST_WINDOWS) && defined(UNDER_CE) |
| BOOST_CHECK_MESSAGE(!ec, ec.value() << ", " << ec.message()); |
| # endif // defined(BOOST_WINDOWS) && defined(UNDER_CE) |
| #endif // defined(__linux__) |
| |
| socket_base::debug debug2; |
| udp_sock.get_option(debug2, ec); |
| #if defined(BOOST_WINDOWS) && defined(UNDER_CE) |
| // Option is not supported under Windows CE. |
| BOOST_CHECK_MESSAGE(ec == boost::asio::error::no_protocol_option, |
| ec.value() << ", " << ec.message()); |
| #else // defined(BOOST_WINDOWS) && defined(UNDER_CE) |
| BOOST_CHECK_MESSAGE(!ec, ec.value() << ", " << ec.message()); |
| # if defined(__linux__) |
| BOOST_CHECK(debug2.value() || not_root); |
| BOOST_CHECK(static_cast<bool>(debug2) || not_root); |
| BOOST_CHECK(!!debug2 || not_root); |
| # else // defined(__linux__) |
| BOOST_CHECK(debug2.value()); |
| BOOST_CHECK(static_cast<bool>(debug2)); |
| BOOST_CHECK(!!debug2); |
| # endif // defined(__linux__) |
| #endif // defined(BOOST_WINDOWS) && defined(UNDER_CE) |
| |
| socket_base::debug debug3(false); |
| BOOST_CHECK(!debug3.value()); |
| BOOST_CHECK(!static_cast<bool>(debug3)); |
| BOOST_CHECK(!debug3); |
| udp_sock.set_option(debug3, ec); |
| #if defined(__linux__) |
| BOOST_CHECK(!ec || not_root); |
| #else // defined(__linux__) |
| # if defined(BOOST_WINDOWS) && defined(UNDER_CE) |
| // Option is not supported under Windows CE. |
| BOOST_CHECK_MESSAGE(ec == boost::asio::error::no_protocol_option, |
| ec.value() << ", " << ec.message()); |
| # else // defined(BOOST_WINDOWS) && defined(UNDER_CE) |
| BOOST_CHECK_MESSAGE(!ec, ec.value() << ", " << ec.message()); |
| # endif // defined(BOOST_WINDOWS) && defined(UNDER_CE) |
| #endif // defined(__linux__) |
| |
| socket_base::debug debug4; |
| udp_sock.get_option(debug4, ec); |
| #if defined(BOOST_WINDOWS) && defined(UNDER_CE) |
| // Option is not supported under Windows CE. |
| BOOST_CHECK_MESSAGE(ec == boost::asio::error::no_protocol_option, |
| ec.value() << ", " << ec.message()); |
| #else // defined(BOOST_WINDOWS) && defined(UNDER_CE) |
| BOOST_CHECK_MESSAGE(!ec, ec.value() << ", " << ec.message()); |
| # if defined(__linux__) |
| BOOST_CHECK(!debug4.value() || not_root); |
| BOOST_CHECK(!static_cast<bool>(debug4) || not_root); |
| BOOST_CHECK(!debug4 || not_root); |
| # else // defined(__linux__) |
| BOOST_CHECK(!debug4.value()); |
| BOOST_CHECK(!static_cast<bool>(debug4)); |
| BOOST_CHECK(!debug4); |
| # endif // defined(__linux__) |
| #endif // defined(BOOST_WINDOWS) && defined(UNDER_CE) |
| |
| // do_not_route class. |
| |
| socket_base::do_not_route do_not_route1(true); |
| BOOST_CHECK(do_not_route1.value()); |
| BOOST_CHECK(static_cast<bool>(do_not_route1)); |
| BOOST_CHECK(!!do_not_route1); |
| udp_sock.set_option(do_not_route1, ec); |
| #if defined(BOOST_WINDOWS) && defined(UNDER_CE) |
| // Option is not supported under Windows CE. |
| BOOST_CHECK_MESSAGE(ec == boost::asio::error::no_protocol_option, |
| ec.value() << ", " << ec.message()); |
| #else // defined(BOOST_WINDOWS) && defined(UNDER_CE) |
| BOOST_CHECK_MESSAGE(!ec, ec.value() << ", " << ec.message()); |
| #endif // defined(BOOST_WINDOWS) && defined(UNDER_CE) |
| |
| socket_base::do_not_route do_not_route2; |
| udp_sock.get_option(do_not_route2, ec); |
| #if defined(BOOST_WINDOWS) && defined(UNDER_CE) |
| // Option is not supported under Windows CE. |
| BOOST_CHECK_MESSAGE(ec == boost::asio::error::no_protocol_option, |
| ec.value() << ", " << ec.message()); |
| #else // defined(BOOST_WINDOWS) && defined(UNDER_CE) |
| BOOST_CHECK_MESSAGE(!ec, ec.value() << ", " << ec.message()); |
| BOOST_CHECK(do_not_route2.value()); |
| BOOST_CHECK(static_cast<bool>(do_not_route2)); |
| BOOST_CHECK(!!do_not_route2); |
| #endif // defined(BOOST_WINDOWS) && defined(UNDER_CE) |
| |
| socket_base::do_not_route do_not_route3(false); |
| BOOST_CHECK(!do_not_route3.value()); |
| BOOST_CHECK(!static_cast<bool>(do_not_route3)); |
| BOOST_CHECK(!do_not_route3); |
| udp_sock.set_option(do_not_route3, ec); |
| #if defined(BOOST_WINDOWS) && defined(UNDER_CE) |
| // Option is not supported under Windows CE. |
| BOOST_CHECK_MESSAGE(ec == boost::asio::error::no_protocol_option, |
| ec.value() << ", " << ec.message()); |
| #else // defined(BOOST_WINDOWS) && defined(UNDER_CE) |
| BOOST_CHECK_MESSAGE(!ec, ec.value() << ", " << ec.message()); |
| #endif // defined(BOOST_WINDOWS) && defined(UNDER_CE) |
| |
| socket_base::do_not_route do_not_route4; |
| udp_sock.get_option(do_not_route4, ec); |
| #if defined(BOOST_WINDOWS) && defined(UNDER_CE) |
| // Option is not supported under Windows CE. |
| BOOST_CHECK_MESSAGE(ec == boost::asio::error::no_protocol_option, |
| ec.value() << ", " << ec.message()); |
| #else // defined(BOOST_WINDOWS) && defined(UNDER_CE) |
| BOOST_CHECK_MESSAGE(!ec, ec.value() << ", " << ec.message()); |
| BOOST_CHECK(!do_not_route4.value()); |
| BOOST_CHECK(!static_cast<bool>(do_not_route4)); |
| BOOST_CHECK(!do_not_route4); |
| #endif // defined(BOOST_WINDOWS) && defined(UNDER_CE) |
| |
| // keep_alive class. |
| |
| socket_base::keep_alive keep_alive1(true); |
| BOOST_CHECK(keep_alive1.value()); |
| BOOST_CHECK(static_cast<bool>(keep_alive1)); |
| BOOST_CHECK(!!keep_alive1); |
| tcp_sock.set_option(keep_alive1, ec); |
| BOOST_CHECK_MESSAGE(!ec, ec.value() << ", " << ec.message()); |
| |
| socket_base::keep_alive keep_alive2; |
| tcp_sock.get_option(keep_alive2, ec); |
| BOOST_CHECK_MESSAGE(!ec, ec.value() << ", " << ec.message()); |
| BOOST_CHECK(keep_alive2.value()); |
| BOOST_CHECK(static_cast<bool>(keep_alive2)); |
| BOOST_CHECK(!!keep_alive2); |
| |
| socket_base::keep_alive keep_alive3(false); |
| BOOST_CHECK(!keep_alive3.value()); |
| BOOST_CHECK(!static_cast<bool>(keep_alive3)); |
| BOOST_CHECK(!keep_alive3); |
| tcp_sock.set_option(keep_alive3, ec); |
| BOOST_CHECK_MESSAGE(!ec, ec.value() << ", " << ec.message()); |
| |
| socket_base::keep_alive keep_alive4; |
| tcp_sock.get_option(keep_alive4, ec); |
| BOOST_CHECK_MESSAGE(!ec, ec.value() << ", " << ec.message()); |
| BOOST_CHECK(!keep_alive4.value()); |
| BOOST_CHECK(!static_cast<bool>(keep_alive4)); |
| BOOST_CHECK(!keep_alive4); |
| |
| // send_buffer_size class. |
| |
| socket_base::send_buffer_size send_buffer_size1(4096); |
| BOOST_CHECK(send_buffer_size1.value() == 4096); |
| tcp_sock.set_option(send_buffer_size1, ec); |
| BOOST_CHECK_MESSAGE(!ec, ec.value() << ", " << ec.message()); |
| |
| socket_base::send_buffer_size send_buffer_size2; |
| tcp_sock.get_option(send_buffer_size2, ec); |
| BOOST_CHECK_MESSAGE(!ec, ec.value() << ", " << ec.message()); |
| BOOST_CHECK(send_buffer_size2.value() == 4096); |
| |
| socket_base::send_buffer_size send_buffer_size3(16384); |
| BOOST_CHECK(send_buffer_size3.value() == 16384); |
| tcp_sock.set_option(send_buffer_size3, ec); |
| BOOST_CHECK_MESSAGE(!ec, ec.value() << ", " << ec.message()); |
| |
| socket_base::send_buffer_size send_buffer_size4; |
| tcp_sock.get_option(send_buffer_size4, ec); |
| BOOST_CHECK_MESSAGE(!ec, ec.value() << ", " << ec.message()); |
| BOOST_CHECK(send_buffer_size4.value() == 16384); |
| |
| // send_low_watermark class. |
| |
| socket_base::send_low_watermark send_low_watermark1(4096); |
| BOOST_CHECK(send_low_watermark1.value() == 4096); |
| tcp_sock.set_option(send_low_watermark1, ec); |
| #if defined(WIN32) || defined(__linux__) || defined(__sun) |
| BOOST_CHECK(!!ec); // Not supported on Windows, Linux or Solaris. |
| #else |
| BOOST_CHECK_MESSAGE(!ec, ec.value() << ", " << ec.message()); |
| #endif |
| |
| socket_base::send_low_watermark send_low_watermark2; |
| tcp_sock.get_option(send_low_watermark2, ec); |
| #if defined(WIN32) || defined(__sun) |
| BOOST_CHECK(!!ec); // Not supported on Windows or Solaris. |
| #elif defined(__linux__) |
| BOOST_CHECK(!ec); // Not supported on Linux but can get value. |
| #else |
| BOOST_CHECK_MESSAGE(!ec, ec.value() << ", " << ec.message()); |
| BOOST_CHECK(send_low_watermark2.value() == 4096); |
| #endif |
| |
| socket_base::send_low_watermark send_low_watermark3(8192); |
| BOOST_CHECK(send_low_watermark3.value() == 8192); |
| tcp_sock.set_option(send_low_watermark3, ec); |
| #if defined(WIN32) || defined(__linux__) || defined(__sun) |
| BOOST_CHECK(!!ec); // Not supported on Windows, Linux or Solaris. |
| #else |
| BOOST_CHECK_MESSAGE(!ec, ec.value() << ", " << ec.message()); |
| #endif |
| |
| socket_base::send_low_watermark send_low_watermark4; |
| tcp_sock.get_option(send_low_watermark4, ec); |
| #if defined(WIN32) || defined(__sun) |
| BOOST_CHECK(!!ec); // Not supported on Windows or Solaris. |
| #elif defined(__linux__) |
| BOOST_CHECK(!ec); // Not supported on Linux but can get value. |
| #else |
| BOOST_CHECK_MESSAGE(!ec, ec.value() << ", " << ec.message()); |
| BOOST_CHECK(send_low_watermark4.value() == 8192); |
| #endif |
| |
| // receive_buffer_size class. |
| |
| socket_base::receive_buffer_size receive_buffer_size1(4096); |
| BOOST_CHECK(receive_buffer_size1.value() == 4096); |
| tcp_sock.set_option(receive_buffer_size1, ec); |
| #if defined(BOOST_WINDOWS) && defined(UNDER_CE) |
| // Option is not supported under Windows CE. |
| BOOST_CHECK_MESSAGE(ec == boost::asio::error::no_protocol_option, |
| ec.value() << ", " << ec.message()); |
| #else // defined(BOOST_WINDOWS) && defined(UNDER_CE) |
| BOOST_CHECK_MESSAGE(!ec, ec.value() << ", " << ec.message()); |
| #endif // defined(BOOST_WINDOWS) && defined(UNDER_CE) |
| |
| socket_base::receive_buffer_size receive_buffer_size2; |
| tcp_sock.get_option(receive_buffer_size2, ec); |
| #if defined(BOOST_WINDOWS) && defined(UNDER_CE) |
| BOOST_CHECK(!ec); // Not supported under Windows CE but can get value. |
| #else // defined(BOOST_WINDOWS) && defined(UNDER_CE) |
| BOOST_CHECK_MESSAGE(!ec, ec.value() << ", " << ec.message()); |
| BOOST_CHECK(receive_buffer_size2.value() == 4096); |
| #endif // defined(BOOST_WINDOWS) && defined(UNDER_CE) |
| |
| socket_base::receive_buffer_size receive_buffer_size3(16384); |
| BOOST_CHECK(receive_buffer_size3.value() == 16384); |
| tcp_sock.set_option(receive_buffer_size3, ec); |
| #if defined(BOOST_WINDOWS) && defined(UNDER_CE) |
| // Option is not supported under Windows CE. |
| BOOST_CHECK_MESSAGE(ec == boost::asio::error::no_protocol_option, |
| ec.value() << ", " << ec.message()); |
| #else // defined(BOOST_WINDOWS) && defined(UNDER_CE) |
| BOOST_CHECK_MESSAGE(!ec, ec.value() << ", " << ec.message()); |
| #endif // defined(BOOST_WINDOWS) && defined(UNDER_CE) |
| |
| socket_base::receive_buffer_size receive_buffer_size4; |
| tcp_sock.get_option(receive_buffer_size4, ec); |
| #if defined(BOOST_WINDOWS) && defined(UNDER_CE) |
| BOOST_CHECK(!ec); // Not supported under Windows CE but can get value. |
| #else // defined(BOOST_WINDOWS) && defined(UNDER_CE) |
| BOOST_CHECK_MESSAGE(!ec, ec.value() << ", " << ec.message()); |
| BOOST_CHECK(receive_buffer_size4.value() == 16384); |
| #endif // defined(BOOST_WINDOWS) && defined(UNDER_CE) |
| |
| // receive_low_watermark class. |
| |
| socket_base::receive_low_watermark receive_low_watermark1(4096); |
| BOOST_CHECK(receive_low_watermark1.value() == 4096); |
| tcp_sock.set_option(receive_low_watermark1, ec); |
| #if defined(WIN32) || defined(__sun) |
| BOOST_CHECK(!!ec); // Not supported on Windows or Solaris. |
| #else |
| BOOST_CHECK_MESSAGE(!ec, ec.value() << ", " << ec.message()); |
| #endif |
| |
| socket_base::receive_low_watermark receive_low_watermark2; |
| tcp_sock.get_option(receive_low_watermark2, ec); |
| #if defined(WIN32) || defined(__sun) |
| BOOST_CHECK(!!ec); // Not supported on Windows or Solaris. |
| #else |
| BOOST_CHECK_MESSAGE(!ec, ec.value() << ", " << ec.message()); |
| BOOST_CHECK(receive_low_watermark2.value() == 4096); |
| #endif |
| |
| socket_base::receive_low_watermark receive_low_watermark3(8192); |
| BOOST_CHECK(receive_low_watermark3.value() == 8192); |
| tcp_sock.set_option(receive_low_watermark3, ec); |
| #if defined(WIN32) || defined(__sun) |
| BOOST_CHECK(!!ec); // Not supported on Windows or Solaris. |
| #else |
| BOOST_CHECK_MESSAGE(!ec, ec.value() << ", " << ec.message()); |
| #endif |
| |
| socket_base::receive_low_watermark receive_low_watermark4; |
| tcp_sock.get_option(receive_low_watermark4, ec); |
| #if defined(WIN32) || defined(__sun) |
| BOOST_CHECK(!!ec); // Not supported on Windows or Solaris. |
| #else |
| BOOST_CHECK_MESSAGE(!ec, ec.value() << ", " << ec.message()); |
| BOOST_CHECK(receive_low_watermark4.value() == 8192); |
| #endif |
| |
| // reuse_address class. |
| |
| socket_base::reuse_address reuse_address1(true); |
| BOOST_CHECK(reuse_address1.value()); |
| BOOST_CHECK(static_cast<bool>(reuse_address1)); |
| BOOST_CHECK(!!reuse_address1); |
| udp_sock.set_option(reuse_address1, ec); |
| BOOST_CHECK_MESSAGE(!ec, ec.value() << ", " << ec.message()); |
| |
| socket_base::reuse_address reuse_address2; |
| udp_sock.get_option(reuse_address2, ec); |
| BOOST_CHECK_MESSAGE(!ec, ec.value() << ", " << ec.message()); |
| BOOST_CHECK(reuse_address2.value()); |
| BOOST_CHECK(static_cast<bool>(reuse_address2)); |
| BOOST_CHECK(!!reuse_address2); |
| |
| socket_base::reuse_address reuse_address3(false); |
| BOOST_CHECK(!reuse_address3.value()); |
| BOOST_CHECK(!static_cast<bool>(reuse_address3)); |
| BOOST_CHECK(!reuse_address3); |
| udp_sock.set_option(reuse_address3, ec); |
| BOOST_CHECK_MESSAGE(!ec, ec.value() << ", " << ec.message()); |
| |
| socket_base::reuse_address reuse_address4; |
| udp_sock.get_option(reuse_address4, ec); |
| BOOST_CHECK_MESSAGE(!ec, ec.value() << ", " << ec.message()); |
| BOOST_CHECK(!reuse_address4.value()); |
| BOOST_CHECK(!static_cast<bool>(reuse_address4)); |
| BOOST_CHECK(!reuse_address4); |
| |
| // linger class. |
| |
| socket_base::linger linger1(true, 60); |
| BOOST_CHECK(linger1.enabled()); |
| BOOST_CHECK(linger1.timeout() == 60); |
| tcp_sock.set_option(linger1, ec); |
| BOOST_CHECK_MESSAGE(!ec, ec.value() << ", " << ec.message()); |
| |
| socket_base::linger linger2; |
| tcp_sock.get_option(linger2, ec); |
| BOOST_CHECK_MESSAGE(!ec, ec.value() << ", " << ec.message()); |
| BOOST_CHECK(linger2.enabled()); |
| BOOST_CHECK(linger2.timeout() == 60); |
| |
| socket_base::linger linger3(false, 0); |
| BOOST_CHECK(!linger3.enabled()); |
| BOOST_CHECK(linger3.timeout() == 0); |
| tcp_sock.set_option(linger3, ec); |
| BOOST_CHECK_MESSAGE(!ec, ec.value() << ", " << ec.message()); |
| |
| socket_base::linger linger4; |
| tcp_sock.get_option(linger4, ec); |
| BOOST_CHECK_MESSAGE(!ec, ec.value() << ", " << ec.message()); |
| BOOST_CHECK(!linger4.enabled()); |
| |
| // enable_connection_aborted class. |
| |
| socket_base::enable_connection_aborted enable_connection_aborted1(true); |
| BOOST_CHECK(enable_connection_aborted1.value()); |
| BOOST_CHECK(static_cast<bool>(enable_connection_aborted1)); |
| BOOST_CHECK(!!enable_connection_aborted1); |
| tcp_acceptor.set_option(enable_connection_aborted1, ec); |
| BOOST_CHECK_MESSAGE(!ec, ec.value() << ", " << ec.message()); |
| |
| socket_base::enable_connection_aborted enable_connection_aborted2; |
| tcp_acceptor.get_option(enable_connection_aborted2, ec); |
| BOOST_CHECK_MESSAGE(!ec, ec.value() << ", " << ec.message()); |
| BOOST_CHECK(enable_connection_aborted2.value()); |
| BOOST_CHECK(static_cast<bool>(enable_connection_aborted2)); |
| BOOST_CHECK(!!enable_connection_aborted2); |
| |
| socket_base::enable_connection_aborted enable_connection_aborted3(false); |
| BOOST_CHECK(!enable_connection_aborted3.value()); |
| BOOST_CHECK(!static_cast<bool>(enable_connection_aborted3)); |
| BOOST_CHECK(!enable_connection_aborted3); |
| tcp_acceptor.set_option(enable_connection_aborted3, ec); |
| BOOST_CHECK_MESSAGE(!ec, ec.value() << ", " << ec.message()); |
| |
| socket_base::enable_connection_aborted enable_connection_aborted4; |
| tcp_acceptor.get_option(enable_connection_aborted4, ec); |
| BOOST_CHECK_MESSAGE(!ec, ec.value() << ", " << ec.message()); |
| BOOST_CHECK(!enable_connection_aborted4.value()); |
| BOOST_CHECK(!static_cast<bool>(enable_connection_aborted4)); |
| BOOST_CHECK(!enable_connection_aborted4); |
| |
| // non_blocking_io class. |
| |
| socket_base::non_blocking_io non_blocking_io1(true); |
| tcp_sock.io_control(non_blocking_io1, ec); |
| BOOST_CHECK_MESSAGE(!ec, ec.value() << ", " << ec.message()); |
| |
| socket_base::non_blocking_io non_blocking_io2(false); |
| tcp_sock.io_control(non_blocking_io2, ec); |
| BOOST_CHECK_MESSAGE(!ec, ec.value() << ", " << ec.message()); |
| |
| // bytes_readable class. |
| |
| socket_base::bytes_readable bytes_readable; |
| udp_sock.io_control(bytes_readable, ec); |
| BOOST_CHECK_MESSAGE(!ec, ec.value() << ", " << ec.message()); |
| } |
| |
| } // namespace socket_base_runtime |
| |
| //------------------------------------------------------------------------------ |
| |
| test_suite* init_unit_test_suite(int, char*[]) |
| { |
| test_suite* test = BOOST_TEST_SUITE("socket_base"); |
| test->add(BOOST_TEST_CASE(&socket_base_compile::test)); |
| test->add(BOOST_TEST_CASE(&socket_base_runtime::test)); |
| return test; |
| } |