5 // Copyright (c) 2003-2020 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 // Enable cancel() support on Windows.
17 #define BOOST_ASIO_ENABLE_CANCELIO 1
19 // Test that header file is self-contained.
20 #include <boost/asio/ip/tcp.hpp>
23 #include <boost/asio/io_context.hpp>
24 #include <boost/asio/read.hpp>
25 #include <boost/asio/write.hpp>
26 #include "../unit_test.hpp"
27 #include "../archetypes/async_result.hpp"
28 #include "../archetypes/gettable_socket_option.hpp"
29 #include "../archetypes/io_control_command.hpp"
30 #include "../archetypes/settable_socket_option.hpp"
32 #if defined(BOOST_ASIO_HAS_BOOST_ARRAY)
33 # include <boost/array.hpp>
34 #else // defined(BOOST_ASIO_HAS_BOOST_ARRAY)
36 #endif // defined(BOOST_ASIO_HAS_BOOST_ARRAY)
38 #if defined(BOOST_ASIO_HAS_BOOST_BIND)
39 # include <boost/bind/bind.hpp>
40 #else // defined(BOOST_ASIO_HAS_BOOST_BIND)
41 # include <functional>
42 #endif // defined(BOOST_ASIO_HAS_BOOST_BIND)
44 //------------------------------------------------------------------------------
46 // ip_tcp_compile test
47 // ~~~~~~~~~~~~~~~~~~~
48 // The following test checks that all nested classes, enums and constants in
49 // ip::tcp compile and link correctly. Runtime failures are ignored.
51 namespace ip_tcp_compile
{
55 using namespace boost::asio
;
56 namespace ip
= boost::asio::ip
;
61 ip::tcp::socket
sock(ioc
);
65 ip::tcp::no_delay
no_delay1(true);
66 sock
.set_option(no_delay1
);
67 ip::tcp::no_delay no_delay2
;
68 sock
.get_option(no_delay2
);
70 (void)static_cast<bool>(no_delay1
);
71 (void)static_cast<bool>(!no_delay1
);
72 (void)static_cast<bool>(no_delay1
.value());
74 catch (std::exception
&)
79 } // namespace ip_tcp_compile
81 //------------------------------------------------------------------------------
83 // ip_tcp_runtime test
84 // ~~~~~~~~~~~~~~~~~~~
85 // The following test checks the runtime operation of the ip::tcp class.
87 namespace ip_tcp_runtime
{
91 using namespace boost::asio
;
92 namespace ip
= boost::asio::ip
;
95 ip::tcp::socket
sock(ioc
, ip::tcp::v4());
96 boost::system::error_code ec
;
100 ip::tcp::no_delay
no_delay1(true);
101 BOOST_ASIO_CHECK(no_delay1
.value());
102 BOOST_ASIO_CHECK(static_cast<bool>(no_delay1
));
103 BOOST_ASIO_CHECK(!!no_delay1
);
104 sock
.set_option(no_delay1
, ec
);
105 BOOST_ASIO_CHECK(!ec
);
107 ip::tcp::no_delay no_delay2
;
108 sock
.get_option(no_delay2
, ec
);
109 BOOST_ASIO_CHECK(!ec
);
110 BOOST_ASIO_CHECK(no_delay2
.value());
111 BOOST_ASIO_CHECK(static_cast<bool>(no_delay2
));
112 BOOST_ASIO_CHECK(!!no_delay2
);
114 ip::tcp::no_delay
no_delay3(false);
115 BOOST_ASIO_CHECK(!no_delay3
.value());
116 BOOST_ASIO_CHECK(!static_cast<bool>(no_delay3
));
117 BOOST_ASIO_CHECK(!no_delay3
);
118 sock
.set_option(no_delay3
, ec
);
119 BOOST_ASIO_CHECK(!ec
);
121 ip::tcp::no_delay no_delay4
;
122 sock
.get_option(no_delay4
, ec
);
123 BOOST_ASIO_CHECK(!ec
);
124 BOOST_ASIO_CHECK(!no_delay4
.value());
125 BOOST_ASIO_CHECK(!static_cast<bool>(no_delay4
));
126 BOOST_ASIO_CHECK(!no_delay4
);
129 } // namespace ip_tcp_runtime
131 //------------------------------------------------------------------------------
133 // ip_tcp_socket_compile test
134 // ~~~~~~~~~~~~~~~~~~~~~~~~~~
135 // The following test checks that all public member functions on the class
136 // ip::tcp::socket compile and link correctly. Runtime failures are ignored.
138 namespace ip_tcp_socket_compile
{
140 struct connect_handler
143 void operator()(const boost::system::error_code
&) {}
144 #if defined(BOOST_ASIO_HAS_MOVE)
145 connect_handler(connect_handler
&&) {}
147 connect_handler(const connect_handler
&);
148 #endif // defined(BOOST_ASIO_HAS_MOVE)
154 void operator()(const boost::system::error_code
&) {}
155 #if defined(BOOST_ASIO_HAS_MOVE)
156 wait_handler(wait_handler
&&) {}
158 wait_handler(const wait_handler
&);
159 #endif // defined(BOOST_ASIO_HAS_MOVE)
165 void operator()(const boost::system::error_code
&, std::size_t) {}
166 #if defined(BOOST_ASIO_HAS_MOVE)
167 send_handler(send_handler
&&) {}
169 send_handler(const send_handler
&);
170 #endif // defined(BOOST_ASIO_HAS_MOVE)
173 struct receive_handler
176 void operator()(const boost::system::error_code
&, std::size_t) {}
177 #if defined(BOOST_ASIO_HAS_MOVE)
178 receive_handler(receive_handler
&&) {}
180 receive_handler(const receive_handler
&);
181 #endif // defined(BOOST_ASIO_HAS_MOVE)
184 struct write_some_handler
186 write_some_handler() {}
187 void operator()(const boost::system::error_code
&, std::size_t) {}
188 #if defined(BOOST_ASIO_HAS_MOVE)
189 write_some_handler(write_some_handler
&&) {}
191 write_some_handler(const write_some_handler
&);
192 #endif // defined(BOOST_ASIO_HAS_MOVE)
195 struct read_some_handler
197 read_some_handler() {}
198 void operator()(const boost::system::error_code
&, std::size_t) {}
199 #if defined(BOOST_ASIO_HAS_MOVE)
200 read_some_handler(read_some_handler
&&) {}
202 read_some_handler(const read_some_handler
&);
203 #endif // defined(BOOST_ASIO_HAS_MOVE)
208 #if defined(BOOST_ASIO_HAS_BOOST_ARRAY)
210 #else // defined(BOOST_ASIO_HAS_BOOST_ARRAY)
212 #endif // defined(BOOST_ASIO_HAS_BOOST_ARRAY)
214 using namespace boost::asio
;
215 namespace ip
= boost::asio::ip
;
220 const io_context::executor_type ioc_ex
= ioc
.get_executor();
221 char mutable_char_buffer
[128] = "";
222 const char const_char_buffer
[128] = "";
223 array
<boost::asio::mutable_buffer
, 2> mutable_buffers
= {{
224 boost::asio::buffer(mutable_char_buffer
, 10),
225 boost::asio::buffer(mutable_char_buffer
+ 10, 10) }};
226 array
<boost::asio::const_buffer
, 2> const_buffers
= {{
227 boost::asio::buffer(const_char_buffer
, 10),
228 boost::asio::buffer(const_char_buffer
+ 10, 10) }};
229 socket_base::message_flags in_flags
= 0;
230 archetypes::settable_socket_option
<void> settable_socket_option1
;
231 archetypes::settable_socket_option
<int> settable_socket_option2
;
232 archetypes::settable_socket_option
<double> settable_socket_option3
;
233 archetypes::gettable_socket_option
<void> gettable_socket_option1
;
234 archetypes::gettable_socket_option
<int> gettable_socket_option2
;
235 archetypes::gettable_socket_option
<double> gettable_socket_option3
;
236 archetypes::io_control_command io_control_command
;
237 archetypes::lazy_handler lazy
;
238 boost::system::error_code ec
;
240 // basic_stream_socket constructors.
242 ip::tcp::socket
socket1(ioc
);
243 ip::tcp::socket
socket2(ioc
, ip::tcp::v4());
244 ip::tcp::socket
socket3(ioc
, ip::tcp::v6());
245 ip::tcp::socket
socket4(ioc
, ip::tcp::endpoint(ip::tcp::v4(), 0));
246 ip::tcp::socket
socket5(ioc
, ip::tcp::endpoint(ip::tcp::v6(), 0));
247 #if !defined(BOOST_ASIO_WINDOWS_RUNTIME)
248 ip::tcp::socket::native_handle_type native_socket1
249 = ::socket(AF_INET
, SOCK_STREAM
, IPPROTO_TCP
);
250 ip::tcp::socket
socket6(ioc
, ip::tcp::v4(), native_socket1
);
251 #endif // !defined(BOOST_ASIO_WINDOWS_RUNTIME)
253 ip::tcp::socket
socket7(ioc_ex
);
254 ip::tcp::socket
socket8(ioc_ex
, ip::tcp::v4());
255 ip::tcp::socket
socket9(ioc_ex
, ip::tcp::v6());
256 ip::tcp::socket
socket10(ioc_ex
, ip::tcp::endpoint(ip::tcp::v4(), 0));
257 ip::tcp::socket
socket11(ioc_ex
, ip::tcp::endpoint(ip::tcp::v6(), 0));
258 #if !defined(BOOST_ASIO_WINDOWS_RUNTIME)
259 ip::tcp::socket::native_handle_type native_socket2
260 = ::socket(AF_INET
, SOCK_STREAM
, IPPROTO_TCP
);
261 ip::tcp::socket
socket12(ioc_ex
, ip::tcp::v4(), native_socket2
);
262 #endif // !defined(BOOST_ASIO_WINDOWS_RUNTIME)
264 #if defined(BOOST_ASIO_HAS_MOVE)
265 ip::tcp::socket
socket13(std::move(socket5
));
266 #endif // defined(BOOST_ASIO_HAS_MOVE)
268 // basic_stream_socket operators.
270 #if defined(BOOST_ASIO_HAS_MOVE)
271 socket1
= ip::tcp::socket(ioc
);
272 socket1
= std::move(socket2
);
273 #endif // defined(BOOST_ASIO_HAS_MOVE)
275 // basic_io_object functions.
277 ip::tcp::socket::executor_type ex
= socket1
.get_executor();
280 // basic_socket functions.
282 ip::tcp::socket::lowest_layer_type
& lowest_layer
= socket1
.lowest_layer();
285 const ip::tcp::socket
& socket14
= socket1
;
286 const ip::tcp::socket::lowest_layer_type
& lowest_layer2
287 = socket14
.lowest_layer();
290 socket1
.open(ip::tcp::v4());
291 socket1
.open(ip::tcp::v6());
292 socket1
.open(ip::tcp::v4(), ec
);
293 socket1
.open(ip::tcp::v6(), ec
);
295 #if !defined(BOOST_ASIO_WINDOWS_RUNTIME)
296 ip::tcp::socket::native_handle_type native_socket3
297 = ::socket(AF_INET
, SOCK_STREAM
, IPPROTO_TCP
);
298 socket1
.assign(ip::tcp::v4(), native_socket3
);
299 ip::tcp::socket::native_handle_type native_socket4
300 = ::socket(AF_INET
, SOCK_STREAM
, IPPROTO_TCP
);
301 socket1
.assign(ip::tcp::v4(), native_socket4
, ec
);
302 #endif // !defined(BOOST_ASIO_WINDOWS_RUNTIME)
304 bool is_open
= socket1
.is_open();
313 ip::tcp::socket::native_handle_type native_socket5
314 = socket1
.native_handle();
315 (void)native_socket5
;
320 bool at_mark1
= socket1
.at_mark();
322 bool at_mark2
= socket1
.at_mark(ec
);
325 std::size_t available1
= socket1
.available();
327 std::size_t available2
= socket1
.available(ec
);
330 socket1
.bind(ip::tcp::endpoint(ip::tcp::v4(), 0));
331 socket1
.bind(ip::tcp::endpoint(ip::tcp::v6(), 0));
332 socket1
.bind(ip::tcp::endpoint(ip::tcp::v4(), 0), ec
);
333 socket1
.bind(ip::tcp::endpoint(ip::tcp::v6(), 0), ec
);
335 socket1
.connect(ip::tcp::endpoint(ip::tcp::v4(), 0));
336 socket1
.connect(ip::tcp::endpoint(ip::tcp::v6(), 0));
337 socket1
.connect(ip::tcp::endpoint(ip::tcp::v4(), 0), ec
);
338 socket1
.connect(ip::tcp::endpoint(ip::tcp::v6(), 0), ec
);
340 socket1
.async_connect(ip::tcp::endpoint(ip::tcp::v4(), 0),
342 socket1
.async_connect(ip::tcp::endpoint(ip::tcp::v6(), 0),
344 int i1
= socket1
.async_connect(ip::tcp::endpoint(ip::tcp::v4(), 0), lazy
);
346 int i2
= socket1
.async_connect(ip::tcp::endpoint(ip::tcp::v6(), 0), lazy
);
349 socket1
.set_option(settable_socket_option1
);
350 socket1
.set_option(settable_socket_option1
, ec
);
351 socket1
.set_option(settable_socket_option2
);
352 socket1
.set_option(settable_socket_option2
, ec
);
353 socket1
.set_option(settable_socket_option3
);
354 socket1
.set_option(settable_socket_option3
, ec
);
356 socket1
.get_option(gettable_socket_option1
);
357 socket1
.get_option(gettable_socket_option1
, ec
);
358 socket1
.get_option(gettable_socket_option2
);
359 socket1
.get_option(gettable_socket_option2
, ec
);
360 socket1
.get_option(gettable_socket_option3
);
361 socket1
.get_option(gettable_socket_option3
, ec
);
363 socket1
.io_control(io_control_command
);
364 socket1
.io_control(io_control_command
, ec
);
366 bool non_blocking1
= socket1
.non_blocking();
368 socket1
.non_blocking(true);
369 socket1
.non_blocking(false, ec
);
371 bool non_blocking2
= socket1
.native_non_blocking();
373 socket1
.native_non_blocking(true);
374 socket1
.native_non_blocking(false, ec
);
376 ip::tcp::endpoint endpoint1
= socket1
.local_endpoint();
378 ip::tcp::endpoint endpoint2
= socket1
.local_endpoint(ec
);
381 ip::tcp::endpoint endpoint3
= socket1
.remote_endpoint();
383 ip::tcp::endpoint endpoint4
= socket1
.remote_endpoint(ec
);
386 socket1
.shutdown(socket_base::shutdown_both
);
387 socket1
.shutdown(socket_base::shutdown_both
, ec
);
389 socket1
.wait(socket_base::wait_read
);
390 socket1
.wait(socket_base::wait_write
, ec
);
392 socket1
.async_wait(socket_base::wait_read
, wait_handler());
393 int i3
= socket1
.async_wait(socket_base::wait_write
, lazy
);
396 // basic_stream_socket functions.
398 socket1
.send(buffer(mutable_char_buffer
));
399 socket1
.send(buffer(const_char_buffer
));
400 socket1
.send(mutable_buffers
);
401 socket1
.send(const_buffers
);
402 socket1
.send(null_buffers());
403 socket1
.send(buffer(mutable_char_buffer
), in_flags
);
404 socket1
.send(buffer(const_char_buffer
), in_flags
);
405 socket1
.send(mutable_buffers
, in_flags
);
406 socket1
.send(const_buffers
, in_flags
);
407 socket1
.send(null_buffers(), in_flags
);
408 socket1
.send(buffer(mutable_char_buffer
), in_flags
, ec
);
409 socket1
.send(buffer(const_char_buffer
), in_flags
, ec
);
410 socket1
.send(mutable_buffers
, in_flags
, ec
);
411 socket1
.send(const_buffers
, in_flags
, ec
);
412 socket1
.send(null_buffers(), in_flags
, ec
);
414 socket1
.async_send(buffer(mutable_char_buffer
), send_handler());
415 socket1
.async_send(buffer(const_char_buffer
), send_handler());
416 socket1
.async_send(mutable_buffers
, send_handler());
417 socket1
.async_send(const_buffers
, send_handler());
418 socket1
.async_send(null_buffers(), send_handler());
419 socket1
.async_send(buffer(mutable_char_buffer
), in_flags
, send_handler());
420 socket1
.async_send(buffer(const_char_buffer
), in_flags
, send_handler());
421 socket1
.async_send(mutable_buffers
, in_flags
, send_handler());
422 socket1
.async_send(const_buffers
, in_flags
, send_handler());
423 socket1
.async_send(null_buffers(), in_flags
, send_handler());
424 int i4
= socket1
.async_send(buffer(mutable_char_buffer
), lazy
);
426 int i5
= socket1
.async_send(buffer(const_char_buffer
), lazy
);
428 int i6
= socket1
.async_send(mutable_buffers
, lazy
);
430 int i7
= socket1
.async_send(const_buffers
, lazy
);
432 int i8
= socket1
.async_send(null_buffers(), lazy
);
434 int i9
= socket1
.async_send(buffer(mutable_char_buffer
), in_flags
, lazy
);
436 int i10
= socket1
.async_send(buffer(const_char_buffer
), in_flags
, lazy
);
438 int i11
= socket1
.async_send(mutable_buffers
, in_flags
, lazy
);
440 int i12
= socket1
.async_send(const_buffers
, in_flags
, lazy
);
442 int i13
= socket1
.async_send(null_buffers(), in_flags
, lazy
);
445 socket1
.receive(buffer(mutable_char_buffer
));
446 socket1
.receive(mutable_buffers
);
447 socket1
.receive(null_buffers());
448 socket1
.receive(buffer(mutable_char_buffer
), in_flags
);
449 socket1
.receive(mutable_buffers
, in_flags
);
450 socket1
.receive(null_buffers(), in_flags
);
451 socket1
.receive(buffer(mutable_char_buffer
), in_flags
, ec
);
452 socket1
.receive(mutable_buffers
, in_flags
, ec
);
453 socket1
.receive(null_buffers(), in_flags
, ec
);
455 socket1
.async_receive(buffer(mutable_char_buffer
), receive_handler());
456 socket1
.async_receive(mutable_buffers
, receive_handler());
457 socket1
.async_receive(null_buffers(), receive_handler());
458 socket1
.async_receive(buffer(mutable_char_buffer
), in_flags
,
460 socket1
.async_receive(mutable_buffers
, in_flags
, receive_handler());
461 socket1
.async_receive(null_buffers(), in_flags
, receive_handler());
462 int i14
= socket1
.async_receive(buffer(mutable_char_buffer
), lazy
);
464 int i15
= socket1
.async_receive(mutable_buffers
, lazy
);
466 int i16
= socket1
.async_receive(null_buffers(), lazy
);
468 int i17
= socket1
.async_receive(buffer(mutable_char_buffer
), in_flags
,
471 int i18
= socket1
.async_receive(mutable_buffers
, in_flags
, lazy
);
473 int i19
= socket1
.async_receive(null_buffers(), in_flags
, lazy
);
476 socket1
.write_some(buffer(mutable_char_buffer
));
477 socket1
.write_some(buffer(const_char_buffer
));
478 socket1
.write_some(mutable_buffers
);
479 socket1
.write_some(const_buffers
);
480 socket1
.write_some(null_buffers());
481 socket1
.write_some(buffer(mutable_char_buffer
), ec
);
482 socket1
.write_some(buffer(const_char_buffer
), ec
);
483 socket1
.write_some(mutable_buffers
, ec
);
484 socket1
.write_some(const_buffers
, ec
);
485 socket1
.write_some(null_buffers(), ec
);
487 socket1
.async_write_some(buffer(mutable_char_buffer
), write_some_handler());
488 socket1
.async_write_some(buffer(const_char_buffer
), write_some_handler());
489 socket1
.async_write_some(mutable_buffers
, write_some_handler());
490 socket1
.async_write_some(const_buffers
, write_some_handler());
491 socket1
.async_write_some(null_buffers(), write_some_handler());
492 int i20
= socket1
.async_write_some(buffer(mutable_char_buffer
), lazy
);
494 int i21
= socket1
.async_write_some(buffer(const_char_buffer
), lazy
);
496 int i22
= socket1
.async_write_some(mutable_buffers
, lazy
);
498 int i23
= socket1
.async_write_some(const_buffers
, lazy
);
500 int i24
= socket1
.async_write_some(null_buffers(), lazy
);
503 socket1
.read_some(buffer(mutable_char_buffer
));
504 socket1
.read_some(mutable_buffers
);
505 socket1
.read_some(null_buffers());
506 socket1
.read_some(buffer(mutable_char_buffer
), ec
);
507 socket1
.read_some(mutable_buffers
, ec
);
508 socket1
.read_some(null_buffers(), ec
);
510 socket1
.async_read_some(buffer(mutable_char_buffer
), read_some_handler());
511 socket1
.async_read_some(mutable_buffers
, read_some_handler());
512 socket1
.async_read_some(null_buffers(), read_some_handler());
513 int i25
= socket1
.async_read_some(buffer(mutable_char_buffer
), lazy
);
515 int i26
= socket1
.async_read_some(mutable_buffers
, lazy
);
517 int i27
= socket1
.async_read_some(null_buffers(), lazy
);
520 catch (std::exception
&)
525 } // namespace ip_tcp_socket_compile
527 //------------------------------------------------------------------------------
529 // ip_tcp_socket_runtime test
530 // ~~~~~~~~~~~~~~~~~~~~~~~~~~
531 // The following test checks the runtime operation of the ip::tcp::socket class.
533 namespace ip_tcp_socket_runtime
{
535 static const char write_data
[]
536 = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz";
538 void handle_read_noop(const boost::system::error_code
& err
,
539 size_t bytes_transferred
, bool* called
)
542 BOOST_ASIO_CHECK(!err
);
543 BOOST_ASIO_CHECK(bytes_transferred
== 0);
546 void handle_write_noop(const boost::system::error_code
& err
,
547 size_t bytes_transferred
, bool* called
)
550 BOOST_ASIO_CHECK(!err
);
551 BOOST_ASIO_CHECK(bytes_transferred
== 0);
554 void handle_read(const boost::system::error_code
& err
,
555 size_t bytes_transferred
, bool* called
)
558 BOOST_ASIO_CHECK(!err
);
559 BOOST_ASIO_CHECK(bytes_transferred
== sizeof(write_data
));
562 void handle_write(const boost::system::error_code
& err
,
563 size_t bytes_transferred
, bool* called
)
566 BOOST_ASIO_CHECK(!err
);
567 BOOST_ASIO_CHECK(bytes_transferred
== sizeof(write_data
));
570 void handle_read_cancel(const boost::system::error_code
& err
,
571 size_t bytes_transferred
, bool* called
)
574 BOOST_ASIO_CHECK(err
== boost::asio::error::operation_aborted
);
575 BOOST_ASIO_CHECK(bytes_transferred
== 0);
578 void handle_read_eof(const boost::system::error_code
& err
,
579 size_t bytes_transferred
, bool* called
)
582 BOOST_ASIO_CHECK(err
== boost::asio::error::eof
);
583 BOOST_ASIO_CHECK(bytes_transferred
== 0);
588 using namespace std
; // For memcmp.
589 using namespace boost::asio
;
590 namespace ip
= boost::asio::ip
;
592 #if defined(BOOST_ASIO_HAS_BOOST_BIND)
593 namespace bindns
= boost
;
594 #else // defined(BOOST_ASIO_HAS_BOOST_BIND)
595 namespace bindns
= std
;
596 #endif // defined(BOOST_ASIO_HAS_BOOST_BIND)
597 using bindns::placeholders::_1
;
598 using bindns::placeholders::_2
;
602 ip::tcp::acceptor
acceptor(ioc
, ip::tcp::endpoint(ip::tcp::v4(), 0));
603 ip::tcp::endpoint server_endpoint
= acceptor
.local_endpoint();
604 server_endpoint
.address(ip::address_v4::loopback());
606 ip::tcp::socket
client_side_socket(ioc
);
607 ip::tcp::socket
server_side_socket(ioc
);
609 client_side_socket
.connect(server_endpoint
);
610 acceptor
.accept(server_side_socket
);
614 bool read_noop_completed
= false;
615 client_side_socket
.async_read_some(
616 boost::asio::mutable_buffer(0, 0),
617 bindns::bind(handle_read_noop
,
618 _1
, _2
, &read_noop_completed
));
621 BOOST_ASIO_CHECK(read_noop_completed
);
625 bool write_noop_completed
= false;
626 client_side_socket
.async_write_some(
627 boost::asio::const_buffer(0, 0),
628 bindns::bind(handle_write_noop
,
629 _1
, _2
, &write_noop_completed
));
633 BOOST_ASIO_CHECK(write_noop_completed
);
635 // Read and write to transfer data.
637 char read_buffer
[sizeof(write_data
)];
638 bool read_completed
= false;
639 boost::asio::async_read(client_side_socket
,
640 boost::asio::buffer(read_buffer
),
641 bindns::bind(handle_read
,
642 _1
, _2
, &read_completed
));
644 bool write_completed
= false;
645 boost::asio::async_write(server_side_socket
,
646 boost::asio::buffer(write_data
),
647 bindns::bind(handle_write
,
648 _1
, _2
, &write_completed
));
652 BOOST_ASIO_CHECK(read_completed
);
653 BOOST_ASIO_CHECK(write_completed
);
654 BOOST_ASIO_CHECK(memcmp(read_buffer
, write_data
, sizeof(write_data
)) == 0);
658 bool read_cancel_completed
= false;
659 boost::asio::async_read(server_side_socket
,
660 boost::asio::buffer(read_buffer
),
661 bindns::bind(handle_read_cancel
,
662 _1
, _2
, &read_cancel_completed
));
666 BOOST_ASIO_CHECK(!read_cancel_completed
);
668 server_side_socket
.cancel();
672 BOOST_ASIO_CHECK(read_cancel_completed
);
674 // A read when the peer closes socket should fail with eof.
676 bool read_eof_completed
= false;
677 boost::asio::async_read(client_side_socket
,
678 boost::asio::buffer(read_buffer
),
679 bindns::bind(handle_read_eof
,
680 _1
, _2
, &read_eof_completed
));
682 server_side_socket
.close();
686 BOOST_ASIO_CHECK(read_eof_completed
);
689 } // namespace ip_tcp_socket_runtime
691 //------------------------------------------------------------------------------
693 // ip_tcp_acceptor_compile test
694 // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~
695 // The following test checks that all public member functions on the class
696 // ip::tcp::acceptor compile and link correctly. Runtime failures are ignored.
698 namespace ip_tcp_acceptor_compile
{
703 void operator()(const boost::system::error_code
&) {}
704 #if defined(BOOST_ASIO_HAS_MOVE)
705 wait_handler(wait_handler
&&) {}
707 wait_handler(const wait_handler
&);
708 #endif // defined(BOOST_ASIO_HAS_MOVE)
711 struct accept_handler
714 void operator()(const boost::system::error_code
&) {}
715 #if defined(BOOST_ASIO_HAS_MOVE)
716 accept_handler(accept_handler
&&) {}
718 accept_handler(const accept_handler
&);
719 #endif // defined(BOOST_ASIO_HAS_MOVE)
722 #if defined(BOOST_ASIO_HAS_MOVE)
723 struct move_accept_handler
725 move_accept_handler() {}
727 const boost::system::error_code
&, boost::asio::ip::tcp::socket
) {}
728 move_accept_handler(move_accept_handler
&&) {}
730 move_accept_handler(const move_accept_handler
&) {}
733 struct move_accept_ioc_handler
735 move_accept_ioc_handler() {}
736 void operator()(const boost::system::error_code
&,
737 boost::asio::basic_stream_socket
<boost::asio::ip::tcp
,
738 boost::asio::io_context::executor_type
>) {}
739 move_accept_ioc_handler(move_accept_handler
&&) {}
741 move_accept_ioc_handler(const move_accept_handler
&) {}
743 #endif // defined(BOOST_ASIO_HAS_MOVE)
747 using namespace boost::asio
;
748 namespace ip
= boost::asio::ip
;
753 const io_context::executor_type ioc_ex
= ioc
.get_executor();
754 ip::tcp::socket
peer_socket1(ioc
);
755 boost::asio::basic_stream_socket
<ip::tcp
,
756 io_context::executor_type
> peer_socket2(ioc
);
757 ip::tcp::endpoint peer_endpoint
;
758 archetypes::settable_socket_option
<void> settable_socket_option1
;
759 archetypes::settable_socket_option
<int> settable_socket_option2
;
760 archetypes::settable_socket_option
<double> settable_socket_option3
;
761 archetypes::gettable_socket_option
<void> gettable_socket_option1
;
762 archetypes::gettable_socket_option
<int> gettable_socket_option2
;
763 archetypes::gettable_socket_option
<double> gettable_socket_option3
;
764 archetypes::io_control_command io_control_command
;
765 archetypes::lazy_handler lazy
;
766 boost::system::error_code ec
;
768 // basic_socket_acceptor constructors.
770 ip::tcp::acceptor
acceptor1(ioc
);
771 ip::tcp::acceptor
acceptor2(ioc
, ip::tcp::v4());
772 ip::tcp::acceptor
acceptor3(ioc
, ip::tcp::v6());
773 ip::tcp::acceptor
acceptor4(ioc
, ip::tcp::endpoint(ip::tcp::v4(), 0));
774 ip::tcp::acceptor
acceptor5(ioc
, ip::tcp::endpoint(ip::tcp::v6(), 0));
775 #if !defined(BOOST_ASIO_WINDOWS_RUNTIME)
776 ip::tcp::acceptor::native_handle_type native_acceptor1
777 = ::socket(AF_INET
, SOCK_STREAM
, IPPROTO_TCP
);
778 ip::tcp::acceptor
acceptor6(ioc
, ip::tcp::v4(), native_acceptor1
);
779 #endif // !defined(BOOST_ASIO_WINDOWS_RUNTIME)
781 ip::tcp::acceptor
acceptor7(ioc_ex
);
782 ip::tcp::acceptor
acceptor8(ioc_ex
, ip::tcp::v4());
783 ip::tcp::acceptor
acceptor9(ioc_ex
, ip::tcp::v6());
784 ip::tcp::acceptor
acceptor10(ioc_ex
, ip::tcp::endpoint(ip::tcp::v4(), 0));
785 ip::tcp::acceptor
acceptor11(ioc_ex
, ip::tcp::endpoint(ip::tcp::v6(), 0));
786 #if !defined(BOOST_ASIO_WINDOWS_RUNTIME)
787 ip::tcp::acceptor::native_handle_type native_acceptor2
788 = ::socket(AF_INET
, SOCK_STREAM
, IPPROTO_TCP
);
789 ip::tcp::acceptor
acceptor12(ioc_ex
, ip::tcp::v4(), native_acceptor2
);
790 #endif // !defined(BOOST_ASIO_WINDOWS_RUNTIME)
792 #if defined(BOOST_ASIO_HAS_MOVE)
793 ip::tcp::acceptor
acceptor13(std::move(acceptor5
));
794 #endif // defined(BOOST_ASIO_HAS_MOVE)
796 // basic_socket_acceptor operators.
798 #if defined(BOOST_ASIO_HAS_MOVE)
799 acceptor1
= ip::tcp::acceptor(ioc
);
800 acceptor1
= std::move(acceptor2
);
801 #endif // defined(BOOST_ASIO_HAS_MOVE)
803 // basic_io_object functions.
805 ip::tcp::acceptor::executor_type ex
= acceptor1
.get_executor();
808 // basic_socket_acceptor functions.
810 acceptor1
.open(ip::tcp::v4());
811 acceptor1
.open(ip::tcp::v6());
812 acceptor1
.open(ip::tcp::v4(), ec
);
813 acceptor1
.open(ip::tcp::v6(), ec
);
815 #if !defined(BOOST_ASIO_WINDOWS_RUNTIME)
816 ip::tcp::acceptor::native_handle_type native_acceptor3
817 = ::socket(AF_INET
, SOCK_STREAM
, IPPROTO_TCP
);
818 acceptor1
.assign(ip::tcp::v4(), native_acceptor3
);
819 ip::tcp::acceptor::native_handle_type native_acceptor4
820 = ::socket(AF_INET
, SOCK_STREAM
, IPPROTO_TCP
);
821 acceptor1
.assign(ip::tcp::v4(), native_acceptor4
, ec
);
822 #endif // !defined(BOOST_ASIO_WINDOWS_RUNTIME)
824 bool is_open
= acceptor1
.is_open();
831 acceptor1
.release(ec
);
833 ip::tcp::acceptor::native_handle_type native_acceptor5
834 = acceptor1
.native_handle();
835 (void)native_acceptor5
;
838 acceptor1
.cancel(ec
);
840 acceptor1
.bind(ip::tcp::endpoint(ip::tcp::v4(), 0));
841 acceptor1
.bind(ip::tcp::endpoint(ip::tcp::v6(), 0));
842 acceptor1
.bind(ip::tcp::endpoint(ip::tcp::v4(), 0), ec
);
843 acceptor1
.bind(ip::tcp::endpoint(ip::tcp::v6(), 0), ec
);
845 acceptor1
.set_option(settable_socket_option1
);
846 acceptor1
.set_option(settable_socket_option1
, ec
);
847 acceptor1
.set_option(settable_socket_option2
);
848 acceptor1
.set_option(settable_socket_option2
, ec
);
849 acceptor1
.set_option(settable_socket_option3
);
850 acceptor1
.set_option(settable_socket_option3
, ec
);
852 acceptor1
.get_option(gettable_socket_option1
);
853 acceptor1
.get_option(gettable_socket_option1
, ec
);
854 acceptor1
.get_option(gettable_socket_option2
);
855 acceptor1
.get_option(gettable_socket_option2
, ec
);
856 acceptor1
.get_option(gettable_socket_option3
);
857 acceptor1
.get_option(gettable_socket_option3
, ec
);
859 acceptor1
.io_control(io_control_command
);
860 acceptor1
.io_control(io_control_command
, ec
);
862 bool non_blocking1
= acceptor1
.non_blocking();
864 acceptor1
.non_blocking(true);
865 acceptor1
.non_blocking(false, ec
);
867 bool non_blocking2
= acceptor1
.native_non_blocking();
869 acceptor1
.native_non_blocking(true);
870 acceptor1
.native_non_blocking(false, ec
);
872 ip::tcp::endpoint endpoint1
= acceptor1
.local_endpoint();
874 ip::tcp::endpoint endpoint2
= acceptor1
.local_endpoint(ec
);
877 acceptor1
.wait(socket_base::wait_read
);
878 acceptor1
.wait(socket_base::wait_write
, ec
);
880 acceptor1
.async_wait(socket_base::wait_read
, wait_handler());
881 int i1
= acceptor1
.async_wait(socket_base::wait_write
, lazy
);
884 acceptor1
.accept(peer_socket1
);
885 acceptor1
.accept(peer_socket1
, ec
);
886 acceptor1
.accept(peer_socket1
, peer_endpoint
);
887 acceptor1
.accept(peer_socket1
, peer_endpoint
, ec
);
889 acceptor1
.accept(peer_socket2
);
890 acceptor1
.accept(peer_socket2
, ec
);
891 acceptor1
.accept(peer_socket2
, peer_endpoint
);
892 acceptor1
.accept(peer_socket2
, peer_endpoint
, ec
);
894 #if defined(BOOST_ASIO_HAS_MOVE)
895 peer_socket1
= acceptor1
.accept();
896 peer_socket1
= acceptor1
.accept(ioc
);
897 peer_socket1
= acceptor1
.accept(ioc_ex
);
898 peer_socket1
= acceptor1
.accept(peer_endpoint
);
899 peer_socket1
= acceptor1
.accept(ioc
, peer_endpoint
);
900 peer_socket1
= acceptor1
.accept(ioc_ex
, peer_endpoint
);
903 peer_socket2
= acceptor1
.accept(ioc
);
904 peer_socket2
= acceptor1
.accept(ioc_ex
);
905 peer_socket2
= acceptor1
.accept(ioc
, peer_endpoint
);
906 peer_socket2
= acceptor1
.accept(ioc_ex
, peer_endpoint
);
908 #endif // defined(BOOST_ASIO_HAS_MOVE)
910 acceptor1
.async_accept(peer_socket1
, accept_handler());
911 acceptor1
.async_accept(peer_socket1
, peer_endpoint
, accept_handler());
912 int i2
= acceptor1
.async_accept(peer_socket1
, lazy
);
914 int i3
= acceptor1
.async_accept(peer_socket1
, peer_endpoint
, lazy
);
917 acceptor1
.async_accept(peer_socket2
, accept_handler());
918 acceptor1
.async_accept(peer_socket2
, peer_endpoint
, accept_handler());
919 int i4
= acceptor1
.async_accept(peer_socket2
, lazy
);
921 int i5
= acceptor1
.async_accept(peer_socket2
, peer_endpoint
, lazy
);
924 #if defined(BOOST_ASIO_HAS_MOVE)
925 acceptor1
.async_accept(move_accept_handler());
926 acceptor1
.async_accept(ioc
, move_accept_handler());
927 acceptor1
.async_accept(ioc_ex
, move_accept_handler());
928 acceptor1
.async_accept(ioc_ex
, move_accept_ioc_handler());
929 acceptor1
.async_accept(peer_endpoint
, move_accept_handler());
930 acceptor1
.async_accept(ioc
, peer_endpoint
, move_accept_handler());
931 acceptor1
.async_accept(ioc_ex
, peer_endpoint
, move_accept_handler());
932 acceptor1
.async_accept(ioc_ex
, peer_endpoint
, move_accept_ioc_handler());
933 #endif // defined(BOOST_ASIO_HAS_MOVE)
935 catch (std::exception
&)
940 } // namespace ip_tcp_acceptor_compile
942 //------------------------------------------------------------------------------
944 // ip_tcp_acceptor_runtime test
945 // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~
946 // The following test checks the runtime operation of the ip::tcp::acceptor
949 namespace ip_tcp_acceptor_runtime
{
951 void handle_accept(const boost::system::error_code
& err
)
953 BOOST_ASIO_CHECK(!err
);
956 void handle_connect(const boost::system::error_code
& err
)
958 BOOST_ASIO_CHECK(!err
);
963 using namespace boost::asio
;
964 namespace ip
= boost::asio::ip
;
968 ip::tcp::acceptor
acceptor(ioc
, ip::tcp::endpoint(ip::tcp::v4(), 0));
969 ip::tcp::endpoint server_endpoint
= acceptor
.local_endpoint();
970 server_endpoint
.address(ip::address_v4::loopback());
972 ip::tcp::socket
client_side_socket(ioc
);
973 ip::tcp::socket
server_side_socket(ioc
);
975 client_side_socket
.connect(server_endpoint
);
976 acceptor
.accept(server_side_socket
);
978 client_side_socket
.close();
979 server_side_socket
.close();
981 client_side_socket
.connect(server_endpoint
);
982 ip::tcp::endpoint client_endpoint
;
983 acceptor
.accept(server_side_socket
, client_endpoint
);
985 ip::tcp::endpoint client_side_local_endpoint
986 = client_side_socket
.local_endpoint();
987 BOOST_ASIO_CHECK(client_side_local_endpoint
.port() == client_endpoint
.port());
989 ip::tcp::endpoint server_side_remote_endpoint
990 = server_side_socket
.remote_endpoint();
991 BOOST_ASIO_CHECK(server_side_remote_endpoint
.port()
992 == client_endpoint
.port());
994 client_side_socket
.close();
995 server_side_socket
.close();
997 acceptor
.async_accept(server_side_socket
, &handle_accept
);
998 client_side_socket
.async_connect(server_endpoint
, &handle_connect
);
1002 client_side_socket
.close();
1003 server_side_socket
.close();
1005 acceptor
.async_accept(server_side_socket
, client_endpoint
, &handle_accept
);
1006 client_side_socket
.async_connect(server_endpoint
, &handle_connect
);
1011 client_side_local_endpoint
= client_side_socket
.local_endpoint();
1012 BOOST_ASIO_CHECK(client_side_local_endpoint
.port() == client_endpoint
.port());
1014 server_side_remote_endpoint
= server_side_socket
.remote_endpoint();
1015 BOOST_ASIO_CHECK(server_side_remote_endpoint
.port()
1016 == client_endpoint
.port());
1019 } // namespace ip_tcp_acceptor_runtime
1021 //------------------------------------------------------------------------------
1023 // ip_tcp_resolver_compile test
1024 // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~
1025 // The following test checks that all public member functions on the class
1026 // ip::tcp::resolver compile and link correctly. Runtime failures are ignored.
1028 namespace ip_tcp_resolver_compile
{
1030 struct resolve_handler
1032 resolve_handler() {}
1033 void operator()(const boost::system::error_code
&,
1034 boost::asio::ip::tcp::resolver::results_type
) {}
1035 #if defined(BOOST_ASIO_HAS_MOVE)
1036 resolve_handler(resolve_handler
&&) {}
1038 resolve_handler(const resolve_handler
&);
1039 #endif // defined(BOOST_ASIO_HAS_MOVE)
1042 #if !defined(BOOST_ASIO_NO_DEPRECATED)
1043 struct legacy_resolve_handler
1045 legacy_resolve_handler() {}
1046 void operator()(const boost::system::error_code
&,
1047 boost::asio::ip::tcp::resolver::iterator
) {}
1048 #if defined(BOOST_ASIO_HAS_MOVE)
1049 legacy_resolve_handler(legacy_resolve_handler
&&) {}
1051 legacy_resolve_handler(const legacy_resolve_handler
&);
1052 #endif // defined(BOOST_ASIO_HAS_MOVE)
1054 #endif // !defined(BOOST_ASIO_NO_DEPRECATED)
1058 using namespace boost::asio
;
1059 namespace ip
= boost::asio::ip
;
1064 const io_context::executor_type ioc_ex
= ioc
.get_executor();
1065 archetypes::lazy_handler lazy
;
1066 boost::system::error_code ec
;
1067 #if !defined(BOOST_ASIO_NO_DEPRECATED)
1068 ip::tcp::resolver::query
q(ip::tcp::v4(), "localhost", "0");
1069 #endif // !defined(BOOST_ASIO_NO_DEPRECATED)
1070 ip::tcp::endpoint
e(ip::address_v4::loopback(), 0);
1072 // basic_resolver constructors.
1074 ip::tcp::resolver
resolver(ioc
);
1075 ip::tcp::resolver
resolver2(ioc_ex
);
1077 #if defined(BOOST_ASIO_HAS_MOVE)
1078 ip::tcp::resolver
resolver3(std::move(resolver
));
1079 #endif // defined(BOOST_ASIO_HAS_MOVE)
1081 // basic_resolver operators.
1083 #if defined(BOOST_ASIO_HAS_MOVE)
1084 resolver
= ip::tcp::resolver(ioc
);
1085 resolver
= std::move(resolver3
);
1086 #endif // defined(BOOST_ASIO_HAS_MOVE)
1088 // basic_io_object functions.
1090 ip::tcp::resolver::executor_type ex
= resolver
.get_executor();
1093 // basic_resolver functions.
1097 #if !defined(BOOST_ASIO_NO_DEPRECATED)
1098 ip::tcp::resolver::results_type results1
= resolver
.resolve(q
);
1101 ip::tcp::resolver::results_type results2
= resolver
.resolve(q
, ec
);
1103 #endif // !defined(BOOST_ASIO_NO_DEPRECATED)
1105 ip::tcp::resolver::results_type results3
= resolver
.resolve("", "");
1108 ip::tcp::resolver::results_type results4
= resolver
.resolve("", "", ec
);
1111 ip::tcp::resolver::results_type results5
=
1112 resolver
.resolve("", "", ip::tcp::resolver::flags());
1115 ip::tcp::resolver::results_type results6
=
1116 resolver
.resolve("", "", ip::tcp::resolver::flags(), ec
);
1119 ip::tcp::resolver::results_type results7
=
1120 resolver
.resolve(ip::tcp::v4(), "", "");
1123 ip::tcp::resolver::results_type results8
=
1124 resolver
.resolve(ip::tcp::v4(), "", "", ec
);
1127 ip::tcp::resolver::results_type results9
=
1128 resolver
.resolve(ip::tcp::v4(), "", "", ip::tcp::resolver::flags());
1131 ip::tcp::resolver::results_type results10
=
1132 resolver
.resolve(ip::tcp::v4(), "", "", ip::tcp::resolver::flags(), ec
);
1135 ip::tcp::resolver::results_type results11
= resolver
.resolve(e
);
1138 ip::tcp::resolver::results_type results12
= resolver
.resolve(e
, ec
);
1141 #if !defined(BOOST_ASIO_NO_DEPRECATED)
1142 resolver
.async_resolve(q
, resolve_handler());
1143 resolver
.async_resolve(q
, legacy_resolve_handler());
1144 int i1
= resolver
.async_resolve(q
, lazy
);
1146 #endif // !defined(BOOST_ASIO_NO_DEPRECATED)
1148 resolver
.async_resolve("", "", resolve_handler());
1149 #if !defined(BOOST_ASIO_NO_DEPRECATED)
1150 resolver
.async_resolve("", "", legacy_resolve_handler());
1151 #endif // !defined(BOOST_ASIO_NO_DEPRECATED)
1152 int i2
= resolver
.async_resolve("", "", lazy
);
1155 resolver
.async_resolve("", "",
1156 ip::tcp::resolver::flags(), resolve_handler());
1157 #if !defined(BOOST_ASIO_NO_DEPRECATED)
1158 resolver
.async_resolve("", "",
1159 ip::tcp::resolver::flags(), legacy_resolve_handler());
1160 #endif // !defined(BOOST_ASIO_NO_DEPRECATED)
1161 int i3
= resolver
.async_resolve("", "",
1162 ip::tcp::resolver::flags(), lazy
);
1165 resolver
.async_resolve(ip::tcp::v4(), "", "", resolve_handler());
1166 #if !defined(BOOST_ASIO_NO_DEPRECATED)
1167 resolver
.async_resolve(ip::tcp::v4(), "", "", legacy_resolve_handler());
1168 #endif // !defined(BOOST_ASIO_NO_DEPRECATED)
1169 int i4
= resolver
.async_resolve(ip::tcp::v4(), "", "", lazy
);
1172 resolver
.async_resolve(ip::tcp::v4(),
1173 "", "", ip::tcp::resolver::flags(), resolve_handler());
1174 #if !defined(BOOST_ASIO_NO_DEPRECATED)
1175 resolver
.async_resolve(ip::tcp::v4(),
1176 "", "", ip::tcp::resolver::flags(), legacy_resolve_handler());
1177 #endif // !defined(BOOST_ASIO_NO_DEPRECATED)
1178 int i5
= resolver
.async_resolve(ip::tcp::v4(),
1179 "", "", ip::tcp::resolver::flags(), lazy
);
1182 resolver
.async_resolve(e
, resolve_handler());
1183 #if !defined(BOOST_ASIO_NO_DEPRECATED)
1184 resolver
.async_resolve(e
, legacy_resolve_handler());
1185 #endif // !defined(BOOST_ASIO_NO_DEPRECATED)
1186 int i6
= resolver
.async_resolve(e
, lazy
);
1189 catch (std::exception
&)
1194 } // namespace ip_tcp_resolver_compile
1196 //------------------------------------------------------------------------------
1198 // ip_tcp_resolver_entry_compile test
1199 // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
1200 // The following test checks that all public member functions on the class
1201 // ip::tcp::resolver::entry compile and link correctly. Runtime failures are
1204 namespace ip_tcp_resolver_entry_compile
{
1208 using namespace boost::asio
;
1209 namespace ip
= boost::asio::ip
;
1210 const ip::tcp::endpoint endpoint
;
1211 const std::string host_name
;
1212 const std::string service_name
;
1213 const std::allocator
<char> alloc
;
1217 // basic_resolver_entry constructors.
1219 const ip::basic_resolver_entry
<ip::tcp
> entry1
;
1220 ip::basic_resolver_entry
<ip::tcp
> entry2(endpoint
, host_name
, service_name
);
1221 ip::basic_resolver_entry
<ip::tcp
> entry3(entry1
);
1222 #if defined(BOOST_ASIO_HAS_MOVE)
1223 ip::basic_resolver_entry
<ip::tcp
> entry4(std::move(entry2
));
1224 #endif // defined(BOOST_ASIO_HAS_MOVE)
1226 // basic_resolver_entry functions.
1228 ip::tcp::endpoint e1
= entry1
.endpoint();
1231 ip::tcp::endpoint e2
= entry1
;
1234 std::string s1
= entry1
.host_name();
1237 std::string s2
= entry1
.host_name(alloc
);
1240 std::string s3
= entry1
.service_name();
1243 std::string s4
= entry1
.service_name(alloc
);
1246 catch (std::exception
&)
1251 } // namespace ip_tcp_resolver_entry_compile
1253 //------------------------------------------------------------------------------
1255 // ip_tcp_iostream_compile test
1256 // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~
1257 // The following test checks that all public types and member functions on the
1258 // class ip::tcp::iostream compile and link correctly. Runtime failures are
1261 namespace ip_tcp_iostream_compile
{
1265 #if !defined(BOOST_ASIO_NO_IOSTREAM)
1266 using namespace boost::asio
;
1267 namespace ip
= boost::asio::ip
;
1269 boost::asio::io_context ioc
;
1270 boost::asio::ip::tcp::socket
sock(ioc
);
1272 // basic_socket_iostream typedefs.
1274 (void)static_cast<ip::tcp::iostream::protocol_type
*>(0);
1275 (void)static_cast<ip::tcp::iostream::endpoint_type
*>(0);
1276 (void)static_cast<ip::tcp::iostream::clock_type
*>(0);
1277 (void)static_cast<ip::tcp::iostream::time_point
*>(0);
1278 (void)static_cast<ip::tcp::iostream::duration
*>(0);
1279 (void)static_cast<ip::tcp::iostream::traits_type
*>(0);
1281 // basic_socket_iostream constructors.
1283 ip::tcp::iostream ios1
;
1285 #if defined(BOOST_ASIO_HAS_STD_IOSTREAM_MOVE)
1286 ip::tcp::iostream
ios2(std::move(sock
));
1287 #endif // defined(BOOST_ASIO_HAS_STD_IOSTREAM_MOVE)
1289 ip::tcp::iostream
ios3("hostname", "service");
1291 // basic_socket_iostream operators.
1293 #if defined(BOOST_ASIO_HAS_STD_IOSTREAM_MOVE)
1294 ios1
= ip::tcp::iostream();
1296 ios2
= std::move(ios1
);
1297 #endif // defined(BOOST_ASIO_HAS_STD_IOSTREAM_MOVE)
1299 // basic_socket_iostream members.
1301 ios1
.connect("hostname", "service");
1305 (void)static_cast<std::streambuf
*>(ios1
.rdbuf());
1307 basic_socket
<ip::tcp
>& sref
= ios1
.socket();
1310 boost::system::error_code ec
= ios1
.error();
1313 ip::tcp::iostream::time_point tp
= ios1
.expiry();
1316 ios1
.expires_at(tp
);
1318 ip::tcp::iostream::duration d
= ip::tcp::iostream::duration();
1319 ios1
.expires_after(d
);
1321 // iostream operators.
1326 #endif // !defined(BOOST_ASIO_NO_IOSTREAM)
1329 } // namespace ip_tcp_iostream_compile
1331 //------------------------------------------------------------------------------
1333 BOOST_ASIO_TEST_SUITE
1336 BOOST_ASIO_TEST_CASE(ip_tcp_compile::test
)
1337 BOOST_ASIO_TEST_CASE(ip_tcp_runtime::test
)
1338 BOOST_ASIO_TEST_CASE(ip_tcp_socket_compile::test
)
1339 BOOST_ASIO_TEST_CASE(ip_tcp_socket_runtime::test
)
1340 BOOST_ASIO_TEST_CASE(ip_tcp_acceptor_compile::test
)
1341 BOOST_ASIO_TEST_CASE(ip_tcp_acceptor_runtime::test
)
1342 BOOST_ASIO_TEST_CASE(ip_tcp_resolver_compile::test
)
1343 BOOST_ASIO_TEST_CASE(ip_tcp_resolver_entry_compile::test
)
1344 BOOST_ASIO_TEST_CASE(ip_tcp_resolver_entry_compile::test
)
1345 BOOST_ASIO_COMPILE_TEST_CASE(ip_tcp_iostream_compile::test
)