2 // generic/stream_protocol.cpp
3 // ~~~~~~~~~~~~~~~~~~~~~~~~~~~
5 // Copyright (c) 2003-2017 Christopher M. Kohlhoff (chris at kohlhoff dot com)
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)
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)
16 // Test that header file is self-contained.
17 #include <boost/asio/generic/stream_protocol.hpp>
20 #include <boost/asio/io_context.hpp>
21 #include <boost/asio/ip/tcp.hpp>
22 #include "../unit_test.hpp"
24 #if defined(__cplusplus_cli) || defined(__cplusplus_winrt)
25 # define generic cpp_generic
28 //------------------------------------------------------------------------------
30 // generic_stream_protocol_socket_compile test
31 // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
32 // The following test checks that all public member functions on the class
33 // generic::stream_protocol::socket compile and link correctly. Runtime
34 // failures are ignored.
36 namespace generic_stream_protocol_socket_compile
{
38 void connect_handler(const boost::system::error_code
&)
42 void send_handler(const boost::system::error_code
&, std::size_t)
46 void receive_handler(const boost::system::error_code
&, std::size_t)
50 void write_some_handler(const boost::system::error_code
&, std::size_t)
54 void read_some_handler(const boost::system::error_code
&, std::size_t)
60 using namespace boost::asio
;
61 namespace generic
= boost::asio::generic
;
62 typedef generic::stream_protocol sp
;
64 const int af_inet
= BOOST_ASIO_OS_DEF(AF_INET
);
65 const int ipproto_tcp
= BOOST_ASIO_OS_DEF(IPPROTO_TCP
);
66 const int sock_stream
= BOOST_ASIO_OS_DEF(SOCK_STREAM
);
71 char mutable_char_buffer
[128] = "";
72 const char const_char_buffer
[128] = "";
73 socket_base::message_flags in_flags
= 0;
74 socket_base::keep_alive socket_option
;
75 socket_base::bytes_readable io_control_command
;
76 boost::system::error_code ec
;
78 // basic_stream_socket constructors.
80 sp::socket
socket1(ioc
);
81 sp::socket
socket2(ioc
, sp(af_inet
, ipproto_tcp
));
82 sp::socket
socket3(ioc
, sp::endpoint());
83 #if defined(BOOST_ASIO_WINDOWS_RUNTIME)
84 Windows::Networking::Sockets::StreamSocket
^ native_socket1
= nullptr;
85 #else // defined(BOOST_ASIO_WINDOWS_RUNTIME)
86 sp::socket::native_handle_type native_socket1
87 = ::socket(af_inet
, sock_stream
, 0);
88 #endif // defined(BOOST_ASIO_WINDOWS_RUNTIME)
89 sp::socket
socket4(ioc
, sp(af_inet
, ipproto_tcp
), native_socket1
);
91 #if defined(BOOST_ASIO_HAS_MOVE)
92 sp::socket
socket5(std::move(socket4
));
93 boost::asio::ip::tcp::socket
tcp_socket(ioc
);
94 sp::socket
socket6(std::move(tcp_socket
));
95 #endif // defined(BOOST_ASIO_HAS_MOVE)
97 // basic_stream_socket operators.
99 #if defined(BOOST_ASIO_HAS_MOVE)
100 socket1
= sp::socket(ioc
);
101 socket1
= std::move(socket2
);
102 socket1
= boost::asio::ip::tcp::socket(ioc
);
103 #endif // defined(BOOST_ASIO_HAS_MOVE)
105 // basic_io_object functions.
107 sp::socket::executor_type ex
= socket1
.get_executor();
110 #if !defined(BOOST_ASIO_NO_DEPRECATED)
111 io_context
& ioc_ref
= socket1
.get_io_context();
114 io_context
& ioc_ref2
= socket1
.get_io_service();
116 #endif // !defined(BOOST_ASIO_NO_DEPRECATED)
118 // basic_socket functions.
120 sp::socket::lowest_layer_type
& lowest_layer
= socket1
.lowest_layer();
123 socket1
.open(sp(af_inet
, ipproto_tcp
));
124 socket1
.open(sp(af_inet
, ipproto_tcp
), ec
);
126 #if defined(BOOST_ASIO_WINDOWS_RUNTIME)
127 Windows::Networking::Sockets::StreamSocket
^ native_socket2
= nullptr;
128 #else // defined(BOOST_ASIO_WINDOWS_RUNTIME)
129 sp::socket::native_handle_type native_socket2
130 = ::socket(af_inet
, sock_stream
, 0);
131 #endif // defined(BOOST_ASIO_WINDOWS_RUNTIME)
132 socket1
.assign(sp(af_inet
, ipproto_tcp
), native_socket2
);
133 #if defined(BOOST_ASIO_WINDOWS_RUNTIME)
134 Windows::Networking::Sockets::StreamSocket
^ native_socket3
= nullptr;
135 #else // defined(BOOST_ASIO_WINDOWS_RUNTIME)
136 sp::socket::native_handle_type native_socket3
137 = ::socket(af_inet
, sock_stream
, 0);
138 #endif // defined(BOOST_ASIO_WINDOWS_RUNTIME)
139 socket1
.assign(sp(af_inet
, ipproto_tcp
), native_socket3
, ec
);
141 bool is_open
= socket1
.is_open();
147 sp::socket::native_handle_type native_socket4
= socket1
.native_handle();
148 (void)native_socket4
;
153 bool at_mark1
= socket1
.at_mark();
155 bool at_mark2
= socket1
.at_mark(ec
);
158 std::size_t available1
= socket1
.available();
160 std::size_t available2
= socket1
.available(ec
);
163 socket1
.bind(sp::endpoint());
164 socket1
.bind(sp::endpoint(), ec
);
166 socket1
.connect(sp::endpoint());
167 socket1
.connect(sp::endpoint(), ec
);
169 socket1
.async_connect(sp::endpoint(), connect_handler
);
171 socket1
.set_option(socket_option
);
172 socket1
.set_option(socket_option
, ec
);
174 socket1
.get_option(socket_option
);
175 socket1
.get_option(socket_option
, ec
);
177 socket1
.io_control(io_control_command
);
178 socket1
.io_control(io_control_command
, ec
);
180 sp::endpoint endpoint1
= socket1
.local_endpoint();
181 sp::endpoint endpoint2
= socket1
.local_endpoint(ec
);
183 sp::endpoint endpoint3
= socket1
.remote_endpoint();
184 sp::endpoint endpoint4
= socket1
.remote_endpoint(ec
);
186 socket1
.shutdown(socket_base::shutdown_both
);
187 socket1
.shutdown(socket_base::shutdown_both
, ec
);
189 // basic_stream_socket functions.
191 socket1
.send(buffer(mutable_char_buffer
));
192 socket1
.send(buffer(const_char_buffer
));
193 socket1
.send(null_buffers());
194 socket1
.send(buffer(mutable_char_buffer
), in_flags
);
195 socket1
.send(buffer(const_char_buffer
), in_flags
);
196 socket1
.send(null_buffers(), in_flags
);
197 socket1
.send(buffer(mutable_char_buffer
), in_flags
, ec
);
198 socket1
.send(buffer(const_char_buffer
), in_flags
, ec
);
199 socket1
.send(null_buffers(), in_flags
, ec
);
201 socket1
.async_send(buffer(mutable_char_buffer
), send_handler
);
202 socket1
.async_send(buffer(const_char_buffer
), send_handler
);
203 socket1
.async_send(null_buffers(), send_handler
);
204 socket1
.async_send(buffer(mutable_char_buffer
), in_flags
, send_handler
);
205 socket1
.async_send(buffer(const_char_buffer
), in_flags
, send_handler
);
206 socket1
.async_send(null_buffers(), in_flags
, send_handler
);
208 socket1
.receive(buffer(mutable_char_buffer
));
209 socket1
.receive(null_buffers());
210 socket1
.receive(buffer(mutable_char_buffer
), in_flags
);
211 socket1
.receive(null_buffers(), in_flags
);
212 socket1
.receive(buffer(mutable_char_buffer
), in_flags
, ec
);
213 socket1
.receive(null_buffers(), in_flags
, ec
);
215 socket1
.async_receive(buffer(mutable_char_buffer
), receive_handler
);
216 socket1
.async_receive(null_buffers(), receive_handler
);
217 socket1
.async_receive(buffer(mutable_char_buffer
), in_flags
,
219 socket1
.async_receive(null_buffers(), in_flags
, receive_handler
);
221 socket1
.write_some(buffer(mutable_char_buffer
));
222 socket1
.write_some(buffer(const_char_buffer
));
223 socket1
.write_some(null_buffers());
224 socket1
.write_some(buffer(mutable_char_buffer
), ec
);
225 socket1
.write_some(buffer(const_char_buffer
), ec
);
226 socket1
.write_some(null_buffers(), ec
);
228 socket1
.async_write_some(buffer(mutable_char_buffer
), write_some_handler
);
229 socket1
.async_write_some(buffer(const_char_buffer
), write_some_handler
);
230 socket1
.async_write_some(null_buffers(), write_some_handler
);
232 socket1
.read_some(buffer(mutable_char_buffer
));
233 socket1
.read_some(buffer(mutable_char_buffer
), ec
);
234 socket1
.read_some(null_buffers(), ec
);
236 socket1
.async_read_some(buffer(mutable_char_buffer
), read_some_handler
);
237 socket1
.async_read_some(null_buffers(), read_some_handler
);
239 catch (std::exception
&)
244 } // namespace generic_stream_protocol_socket_compile
246 //------------------------------------------------------------------------------
248 BOOST_ASIO_TEST_SUITE
250 "generic/stream_protocol",
251 BOOST_ASIO_TEST_CASE(generic_stream_protocol_socket_compile::test
)