1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136
|
//
// v6_only.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/ip/v6_only.hpp>
#include <boost/asio/io_service.hpp>
#include <boost/asio/ip/tcp.hpp>
#include <boost/asio/ip/udp.hpp>
#include "../unit_test.hpp"
//------------------------------------------------------------------------------
// ip_v6_only_compile test
// ~~~~~~~~~~~~~~~~~~~~~~~
// The following test checks that the ip::v6_only socket option compiles and
// link correctly. Runtime failures are ignored.
namespace ip_v6_only_compile {
void test()
{
using namespace boost::asio;
namespace ip = boost::asio::ip;
try
{
io_service ios;
ip::udp::socket sock(ios);
// v6_only class.
ip::v6_only v6_only1(true);
sock.set_option(v6_only1);
ip::v6_only v6_only2;
sock.get_option(v6_only2);
v6_only1 = true;
static_cast<bool>(v6_only1);
static_cast<bool>(!v6_only1);
static_cast<bool>(v6_only1.value());
}
catch (std::exception&)
{
}
}
} // namespace ip_v6_only_compile
//------------------------------------------------------------------------------
// ip_v6_only_runtime test
// ~~~~~~~~~~~~~~~~~~~~~~~
// The following test checks the runtime operation of the ip::v6_only socket
// option.
namespace ip_v6_only_runtime {
void test()
{
using namespace boost::asio;
namespace ip = boost::asio::ip;
io_service ios;
boost::system::error_code ec;
ip::tcp::endpoint ep_v6(ip::address_v6::loopback(), 0);
ip::tcp::acceptor acceptor_v6(ios);
acceptor_v6.open(ep_v6.protocol(), ec);
acceptor_v6.bind(ep_v6, ec);
bool have_v6 = !ec;
acceptor_v6.close(ec);
acceptor_v6.open(ep_v6.protocol(), ec);
if (have_v6)
{
ip::v6_only v6_only1;
acceptor_v6.get_option(v6_only1, ec);
BOOST_CHECK(!ec);
bool have_dual_stack = !v6_only1.value();
if (have_dual_stack)
{
ip::v6_only v6_only2(false);
BOOST_CHECK(!v6_only2.value());
BOOST_CHECK(!static_cast<bool>(v6_only2));
BOOST_CHECK(!v6_only2);
acceptor_v6.set_option(v6_only2, ec);
BOOST_CHECK(!ec);
ip::v6_only v6_only3;
acceptor_v6.get_option(v6_only3, ec);
BOOST_CHECK(!ec);
BOOST_CHECK(!v6_only3.value());
BOOST_CHECK(!static_cast<bool>(v6_only3));
BOOST_CHECK(!v6_only3);
ip::v6_only v6_only4(true);
BOOST_CHECK(v6_only4.value());
BOOST_CHECK(static_cast<bool>(v6_only4));
BOOST_CHECK(!!v6_only4);
acceptor_v6.set_option(v6_only4, ec);
BOOST_CHECK(!ec);
ip::v6_only v6_only5;
acceptor_v6.get_option(v6_only5, ec);
BOOST_CHECK(!ec);
BOOST_CHECK(v6_only5.value());
BOOST_CHECK(static_cast<bool>(v6_only5));
BOOST_CHECK(!!v6_only5);
}
}
}
} // namespace ip_v6_only_runtime
//------------------------------------------------------------------------------
test_suite* init_unit_test_suite(int, char*[])
{
test_suite* test = BOOST_TEST_SUITE("ip/v6_only");
test->add(BOOST_TEST_CASE(&ip_v6_only_compile::test));
test->add(BOOST_TEST_CASE(&ip_v6_only_runtime::test));
return test;
}
|