2 // Copyright (c) 2016-2019 Vinnie Falco (vinnie dot falco at gmail dot com)
4 // Distributed under the Boost Software License, Version 1.0. (See accompanying
5 // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
7 // Official repository: https://github.com/boostorg/beast
10 // Test that header file is self-contained.
11 #include <boost/beast/core/basic_stream.hpp>
13 #include "stream_tests.hpp"
15 #include <boost/beast/_experimental/unit_test/suite.hpp>
16 #include <boost/beast/core/flat_buffer.hpp>
17 #include <boost/beast/core/stream_traits.hpp>
18 #include <boost/beast/core/string.hpp>
19 #include <boost/beast/core/tcp_stream.hpp>
20 #include <boost/beast/http/message.hpp>
21 #include <boost/beast/http/empty_body.hpp>
22 #include <boost/beast/http/read.hpp>
23 #include <boost/beast/http/string_body.hpp>
24 #include <boost/beast/http/write.hpp>
25 #include <boost/asio/ip/tcp.hpp>
26 #include <boost/asio/spawn.hpp>
27 #include <boost/asio/strand.hpp>
28 #include <boost/asio/write.hpp>
29 #include <boost/optional.hpp>
33 #if BOOST_ASIO_HAS_CO_AWAIT
34 #include <boost/asio/awaitable.hpp>
35 #include <boost/asio/co_spawn.hpp>
36 #include <boost/asio/use_awaitable.hpp>
45 template<class Executor
= net::io_context::executor_type
>
49 // VFALCO These need to be atomic or something
65 state(Executor
const& ex_
)
71 std::shared_ptr
<state
> sp_
;
74 test_executor(test_executor
const&) = default;
75 test_executor
& operator=(test_executor
const&) = default;
78 test_executor(Executor
const& ex
)
79 : sp_(std::make_shared
<state
>(ex
))
83 decltype(sp_
->ex
.context())
84 context() const noexcept
86 return sp_
->ex
.context();
102 on_work_started() const noexcept
108 on_work_finished() const noexcept
112 template<class F
, class A
>
114 dispatch(F
&& f
, A
const& a
)
116 ++sp_
->info_
.dispatch
;
119 std::forward
<F
>(f
), a
);
122 template<class F
, class A
>
124 post(F
&& f
, A
const& a
)
129 std::forward
<F
>(f
), a
);
132 template<class F
, class A
>
134 defer(F
&& f
, A
const& a
)
139 std::forward
<F
>(f
), a
);
146 net::ip::tcp::acceptor a
;
147 net::ip::tcp::endpoint ep
;
151 , ep(net::ip::make_address_v4("127.0.0.1"), 0)
153 a
.open(ep
.protocol());
155 net::socket_base::reuse_address(true));
157 a
.listen(net::socket_base::max_listen_connections
);
158 ep
= a
.local_endpoint();
160 [](error_code
, net::ip::tcp::socket
)
170 net::io_context ioc_
;
171 net::ip::tcp::acceptor acceptor_
;
172 net::ip::tcp::socket socket_
;
176 fail(error_code
const& ec
, string_view what
)
178 if(ec
!= net::error::operation_aborted
)
179 log_
<< what
<< ": " << ec
.message() << "\n";
185 net::ip::tcp::endpoint ep
,
193 boost::system::error_code ec
;
195 acceptor_
.open(ep
.protocol(), ec
);
202 acceptor_
.set_option(
203 net::socket_base::reuse_address(true), ec
);
206 fail(ec
, "set_option");
210 acceptor_
.bind(ep
, ec
);
218 net::socket_base::max_listen_connections
, ec
);
225 acceptor_
.async_accept(socket_
,
226 [this](error_code ec
)
244 net::ip::tcp::endpoint
245 local_endpoint() const noexcept
247 return acceptor_
.local_endpoint();
252 : public std::enable_shared_from_this
<session
>
255 net::ip::tcp::socket socket_
;
260 net::ip::tcp::socket sock
,
263 , socket_(std::move(sock
))
272 net::socket_base::wait_read
,
275 shared_from_this()));
279 net::const_buffer(s_
.data(), s_
.size()),
282 shared_from_this()));
287 on_read(error_code
const&)
292 on_write(error_code
const&, std::size_t)
298 on_accept(error_code
const& ec
)
300 if(! acceptor_
.is_open())
305 std::make_shared
<session
>(
306 s_
, std::move(socket_
), log_
)->run();
307 acceptor_
.async_accept(socket_
,
308 [this](error_code ec
)
317 class basic_stream_test
318 : public beast::unit_test::suite
321 using tcp
= net::ip::tcp
;
322 using executor
= net::io_context::executor_type
;
323 using strand
= net::strand
<executor
>;
325 //--------------------------------------------------------------------------
332 // net::io_context::executor_type
335 auto ex
= ioc
.get_executor();
336 basic_stream
<tcp
, executor
> s1(ioc
);
337 basic_stream
<tcp
, executor
> s2(ex
);
338 basic_stream
<tcp
, executor
> s3(ioc
, tcp::v4());
339 basic_stream
<tcp
, executor
> s4(std::move(s1
));
341 net::basic_stream_socket
<tcp
, executor
>(ioc
);
342 BEAST_EXPECT(s1
.get_executor() == ex
);
343 BEAST_EXPECT(s2
.get_executor() == ex
);
344 BEAST_EXPECT(s3
.get_executor() == ex
);
345 BEAST_EXPECT(s4
.get_executor() == ex
);
347 BEAST_EXPECT((! static_cast<
348 basic_stream
<tcp
, executor
> const&>(
349 s2
).socket().is_open()));
353 tcp
, net::io_context::executor_type
>>();
357 tcp
, net::io_context::executor_type
>>();
360 // net::io_context::strand
363 auto ex
= net::make_strand(ioc
);
364 basic_stream
<tcp
, strand
> s1(ex
);
365 basic_stream
<tcp
, strand
> s2(ex
, tcp::v4());
366 basic_stream
<tcp
, strand
> s3(std::move(s1
));
367 BEAST_EXPECT(s1
.get_executor() == ex
);
368 BEAST_EXPECT(s2
.get_executor() == ex
);
369 BEAST_EXPECT(s3
.get_executor() == ex
);
383 net::socket_base::keep_alive opt
;
385 s
.socket().open(tcp::v4());
386 s
.socket().get_option(opt
);
387 BEAST_EXPECT(! opt
.value());
389 s
.socket().set_option(opt
);
391 BEAST_EXPECT(! opt
.value());
398 net::io_context::executor_type
,
399 simple_rate_policy
> s(ioc
);
404 net::io_context::executor_type
,
405 simple_rate_policy
> s(
406 simple_rate_policy
{}, ioc
);
411 net::io_context::executor_type
,
412 unlimited_rate_policy
> s(ioc
);
417 net::io_context::executor_type
,
418 unlimited_rate_policy
> s(
419 unlimited_rate_policy
{}, ioc
);
425 boost::optional
<error_code
> ec_
;
429 handler(error_code ec
, std::size_t n
)
435 handler(handler
&& other
)
437 , n_(boost::exchange(other
.n_
,
438 (std::numeric_limits
<std::size_t>::max
)()))
445 n_
== (std::numeric_limits
<std::size_t>::max
)());
449 operator()(error_code
const& ec
, std::size_t n
)
451 BEAST_EXPECTS(ec
== ec_
, ec
.message());
452 BEAST_EXPECT(n
== n_
);
453 n_
= (std::numeric_limits
<std::size_t>::max
)();
460 using stream_type
= basic_stream
<tcp
,
461 net::io_context::executor_type
>;
465 std::memset(buf
, 0, sizeof(buf
));
466 net::mutable_buffer
mb(buf
, sizeof(buf
));
467 auto const ep
= net::ip::tcp::endpoint(
468 net::ip::make_address("127.0.0.1"), 0);
474 stream_type
s(ioc
, tcp::v4());
475 BEAST_EXPECT(s
.read_some(net::mutable_buffer
{}) == 0);
476 BEAST_EXPECT(s
.read_some(net::mutable_buffer
{}, ec
) == 0);
477 BEAST_EXPECTS(! ec
, ec
.message());
484 test_server
srv("*", ep
, log
);
486 s
.socket().connect(srv
.local_endpoint());
488 s
.async_read_some(mb
, handler({}, 1));
494 // success, with timeout
495 test_server
srv("*", ep
, log
);
497 s
.socket().connect(srv
.local_endpoint());
498 s
.expires_after(std::chrono::seconds(30));
499 s
.async_read_some(mb
, handler({}, 1));
506 test_server
srv("*", ep
, log
);
508 s
.socket().connect(srv
.local_endpoint());
511 net::mutable_buffer
{}, handler({}, 0));
517 // empty buffer, timeout
518 test_server
srv("*", ep
, log
);
520 s
.socket().connect(srv
.local_endpoint());
521 s
.expires_after(std::chrono::seconds(0));
522 s
.async_read_some(net::mutable_buffer
{},
523 handler(error::timeout
, 0));
530 test_server
srv("", ep
, log
);
532 s
.socket().connect(srv
.local_endpoint());
533 s
.expires_after(std::chrono::seconds(0));
534 s
.async_read_some(mb
, handler(error::timeout
, 0));
541 test_server
srv("", ep
, log
);
543 s
.socket().connect(srv
.local_endpoint());
544 s
.expires_at(std::chrono::steady_clock::now());
545 s
.async_read_some(mb
, handler(error::timeout
, 0));
552 test_server
srv("", ep
, log
);
555 s
.socket().connect(srv
.local_endpoint());
556 s
.expires_after(std::chrono::seconds(0));
557 s
.async_read_some(mb
,
558 [](error_code
, std::size_t)
570 s
.expires_after(std::chrono::milliseconds(50));
571 s
.async_read_some(mb
,
572 [](error_code
, std::size_t)
575 std::this_thread::sleep_for(
576 std::chrono::milliseconds(100));
581 // abandoned operation
584 s
.async_read_some(net::mutable_buffer
{},
585 [](error_code
, std::size_t)
595 using stream_type
= basic_stream
<tcp
,
596 net::io_context::executor_type
>;
600 std::memset(buf
, 0, sizeof(buf
));
601 net::const_buffer
cb(buf
, sizeof(buf
));
602 auto const ep
= net::ip::tcp::endpoint(
603 net::ip::make_address("127.0.0.1"), 0);
609 stream_type
s(ioc
, tcp::v4());
610 BEAST_EXPECT(s
.write_some(net::const_buffer
{}) == 0);
611 BEAST_EXPECT(s
.write_some(net::const_buffer
{}, ec
) == 0);
612 BEAST_EXPECTS(! ec
, ec
.message());
619 test_server
srv("*", ep
, log
);
621 s
.socket().connect(srv
.local_endpoint());
623 s
.async_write_some(cb
, handler({}, 4));
629 // success, with timeout
630 test_server
srv("*", ep
, log
);
632 s
.socket().connect(srv
.local_endpoint());
633 s
.expires_after(std::chrono::seconds(30));
634 s
.async_write_some(cb
, handler({}, 4));
641 test_server
srv("*", ep
, log
);
643 s
.socket().connect(srv
.local_endpoint());
646 net::const_buffer
{}, handler({}, 0));
652 // empty buffer, timeout
653 test_server
srv("*", ep
, log
);
655 s
.socket().connect(srv
.local_endpoint());
656 s
.expires_after(std::chrono::seconds(0));
657 s
.async_write_some(net::const_buffer
{},
658 handler(error::timeout
, 0));
663 // abandoned operation
666 s
.async_write_some(cb
,
667 [](error_code
, std::size_t)
677 using stream_type
= basic_stream
<tcp
,
678 net::io_context::executor_type
>;
685 tcp::endpoint
const*;
687 // VFALCO This is here because asio mistakenly requires it
688 using const_iterator
=
689 tcp::endpoint
const*;
691 iterator
begin() const noexcept
696 // VFALCO need to use const_iterator to silence
697 // warning about unused types
698 const_iterator
end() const noexcept
704 class connect_handler
707 boost::optional
<error_code
> expected_
= {};
716 : expected_(error_code
{})
721 connect_handler(error_code expected
)
722 : expected_(expected
)
727 connect_handler(boost::none_t
)
731 connect_handler(connect_handler
&& other
)
732 : pass_(boost::exchange(other
.pass_
, true))
733 , expected_(other
.expected_
)
737 void operator()(error_code ec
)
742 ec
== expected_
, ec
.message());
750 range_handler() = default;
752 range_handler(range_handler
&& other
)
753 : pass(boost::exchange(other
.pass
, true))
762 void operator()(error_code ec
, tcp::endpoint
)
765 BEAST_EXPECTS(! ec
, ec
.message());
769 struct iterator_handler
773 iterator_handler() = default;
775 iterator_handler(iterator_handler
&& other
)
776 : pass(boost::exchange(other
.pass
, true))
785 void operator()(error_code ec
, tcp::endpoint
const*)
788 BEAST_EXPECTS(! ec
, ec
.message());
792 struct connect_condition
794 bool operator()(error_code
, tcp::endpoint
) const
802 connect_condition cond
;
813 BEAST_EXPECTS(! ec
, ec
.message());
826 BEAST_EXPECTS(! ec
, ec
.message());
836 s
.connect(r
, cond
, ec
);
837 BEAST_EXPECTS(! ec
, ec
.message());
845 s
.connect(r
.begin(), r
.end());
847 s
.connect(r
.begin(), r
.end(), ec
);
848 BEAST_EXPECTS(! ec
, ec
.message());
856 s
.connect(r
.begin(), r
.end(), cond
);
858 s
.connect(r
.begin(), r
.end(), cond
, ec
);
859 BEAST_EXPECTS(! ec
, ec
.message());
862 // async_connect (member)
868 s
.async_connect(a
.ep
, connect_handler
{});
872 s
.expires_after(std::chrono::seconds(30));
873 s
.async_connect(a
.ep
, connect_handler
{});
885 s
.async_connect(r
, range_handler
{});
889 s
.expires_after(std::chrono::seconds(30));
890 s
.async_connect(r
, range_handler
{});
900 s
.async_connect(r
, cond
, range_handler
{});
904 s
.expires_after(std::chrono::seconds(30));
905 s
.async_connect(r
, cond
, range_handler
{});
915 s
.async_connect(r
.begin(), r
.end(),
920 s
.expires_after(std::chrono::seconds(30));
921 s
.async_connect(r
.begin(), r
.end(),
932 s
.async_connect(r
.begin(), r
.end(), cond
,
937 s
.expires_after(std::chrono::seconds(30));
938 s
.async_connect(r
.begin(), r
.end(), cond
,
946 BEAST_EXPECT(static_cast<std::future
<
947 tcp::endpoint
>(*)(stream_type
&,
948 std::array
<tcp::endpoint
, 2> const&,
949 net::use_future_t
<>&&)>(
950 &beast::async_connect
));
952 BEAST_EXPECT(static_cast<std::future
<
953 tcp::endpoint
>(*)(stream_type
&,
954 std::array
<tcp::endpoint
, 2> const&,
955 connect_condition
const&,
956 net::use_future_t
<>&&)>(
957 &beast::async_connect
));
959 BEAST_EXPECT(static_cast<std::future
<
960 tcp::endpoint
const*>(*)(stream_type
&,
961 tcp::endpoint
const*,
962 tcp::endpoint
const*,
963 net::use_future_t
<>&&)>(
964 &beast::async_connect
));
966 BEAST_EXPECT(static_cast<std::future
<
967 tcp::endpoint
const*>(*)(stream_type
&,
968 tcp::endpoint
const*,
969 tcp::endpoint
const*,
970 connect_condition
const&,
971 net::use_future_t
<>&&)>(
972 &beast::async_connect
));
976 BEAST_EXPECT(static_cast<
977 tcp::endpoint(*)(stream_type
&,
978 std::array
<tcp::endpoint
, 2> const&,
979 net::yield_context
&&)>(
980 &beast::async_connect
));
982 BEAST_EXPECT(static_cast<
983 tcp::endpoint(*)(stream_type
&,
984 std::array
<tcp::endpoint
, 2> const&,
985 connect_condition
const&,
986 net::yield_context
&&)>(
987 &beast::async_connect
));
989 BEAST_EXPECT(static_cast<
990 tcp::endpoint
const*(*)(stream_type
&,
991 tcp::endpoint
const*,
992 tcp::endpoint
const*,
993 net::yield_context
&&)>(
994 &beast::async_connect
));
996 BEAST_EXPECT(static_cast<
997 tcp::endpoint
const*(*)(stream_type
&,
998 tcp::endpoint
const*,
999 tcp::endpoint
const*,
1000 connect_condition
const&,
1001 net::yield_context
&&)>(
1002 &beast::async_connect
));
1006 // async_connect timeout
1011 // Requires timeout happen before ECONNREFUSED
1013 auto const ep
= net::ip::tcp::endpoint(
1015 // This address _should_ be unconnectible
1016 net::ip::make_address("72.5.65.111"), 1);
1018 // On Travis ECONNREFUSED happens before the timeout
1019 net::ip::make_address("127.0.0.1"), 1);
1021 s
.expires_after(std::chrono::seconds(0));
1022 s
.async_connect(ep
, connect_handler
{error::timeout
});
1023 ioc
.run_for(std::chrono::seconds(1));
1031 auto const ep
= net::ip::tcp::endpoint(
1032 net::ip::make_address("127.0.0.1"), 1);
1033 s
.expires_after(std::chrono::seconds(0));
1034 s
.async_connect(ep
, connect_handler
{boost::none
});
1044 s
.expires_after(std::chrono::milliseconds(50));
1045 s
.async_connect(a
.ep
, connect_handler
{});
1046 std::this_thread::sleep_for(
1047 std::chrono::milliseconds(100));
1052 // abandoned operation
1055 net::ip::tcp::endpoint
ep(
1056 net::ip::make_address_v4("127.0.0.1"), 1);
1068 using stream_type
= basic_stream
<tcp
,
1069 net::io_context::executor_type
>;
1074 boost::optional
<error_code
> expected_
= {};
1079 BEAST_EXPECT(pass_
);
1083 : expected_(error_code
{})
1088 handler(error_code expected
)
1089 : expected_(expected
)
1094 handler(boost::none_t
)
1098 handler(handler
&& other
)
1099 : pass_(boost::exchange(other
.pass_
, true))
1100 , expected_(other
.expected_
)
1104 void operator()(error_code ec
, std::size_t)
1109 ec
== expected_
, ec
.message());
1113 auto const ep
= net::ip::tcp::endpoint(
1114 net::ip::make_address("127.0.0.1"), 0);
1117 net::io_context ioc
;
1118 auto mb
= net::buffer(buf
);
1119 std::memset(buf
, 0, sizeof(buf
));
1124 test_server
srv("", ep
, log
);
1126 s
.connect(srv
.local_endpoint());
1128 s
.socket().async_read_some(mb
, handler(
1129 net::error::operation_aborted
));
1138 test_server
srv("", ep
, log
);
1140 s
.connect(srv
.local_endpoint());
1142 s
.socket().async_read_some(mb
,
1143 handler(boost::none
));
1152 test_server
srv("", ep
, log
);
1155 s
.connect(srv
.local_endpoint());
1157 s
.socket().async_read_some(mb
,
1158 handler(boost::none
));
1164 // customization points
1168 beast::close_socket(s
);
1174 teardown(role_type::client
, s
, ec
);
1179 async_teardown(role_type::server
, s
,
1186 //--------------------------------------------------------------------------
1188 http::response
<http::string_body
>
1189 make_response(http::request
<http::empty_body
>)
1194 void process_http_1 (tcp_stream
& stream
, net::yield_context yield
)
1197 http::request
<http::empty_body
> req
;
1199 // Read the request, with a 15 second timeout
1200 stream
.expires_after(std::chrono::seconds(15));
1201 http::async_read(stream
, buffer
, req
, yield
);
1203 // Calculate the response
1204 http::response
<http::string_body
> res
= make_response(req
);
1206 // Send the response, with a 30 second timeout.
1207 stream
.expires_after (std::chrono::seconds(30));
1208 http::async_write (stream
, res
, yield
);
1211 void process_http_2 (tcp_stream
& stream
, net::yield_context yield
)
1214 http::request
<http::empty_body
> req
;
1216 // Require that the read and write combined take no longer than 30 seconds
1217 stream
.expires_after(std::chrono::seconds(30));
1219 http::async_read(stream
, buffer
, req
, yield
);
1221 http::response
<http::string_body
> res
= make_response(req
);
1222 http::async_write (stream
, res
, yield
);
1228 BEAST_EXPECT(&basic_stream_test::process_http_1
);
1229 BEAST_EXPECT(&basic_stream_test::process_http_2
);
1232 //--------------------------------------------------------------------------
1237 net::io_context ioc
;
1239 // the timer needlessly used polymorphic executor
1242 net::io_context::executor_type
>{ioc
};
1244 // make sure strands work
1248 net::io_context::executor_type
>>{
1249 net::make_strand(ioc
)};
1251 // address the problem in the issue
1253 net::basic_stream_socket
<
1256 net::io_context::executor_type
>
1257 > sock(net::make_strand(ioc
));
1261 net::io_context::executor_type
>,
1262 unlimited_rate_policy
> stream(std::move(sock
));
1263 BOOST_STATIC_ASSERT(
1264 std::is_convertible
<
1265 decltype(sock
)::executor_type
,
1266 decltype(stream
)::executor_type
>::value
);
1270 //--------------------------------------------------------------------------
1272 #if BOOST_ASIO_HAS_CO_AWAIT
1273 void testAwaitableCompilation(
1274 basic_stream
<net::ip::tcp
>& stream
,
1275 net::mutable_buffer outbuf
,
1276 net::const_buffer inbuf
,
1277 net::ip::tcp::resolver::results_type resolve_results
)
1279 static_assert(std::is_same_v
<
1280 net::awaitable
<std::size_t>, decltype(
1281 stream
.async_read_some(outbuf
, net::use_awaitable
))>);
1283 static_assert(std::is_same_v
<
1284 net::awaitable
<std::size_t>, decltype(
1285 stream
.async_write_some(inbuf
, net::use_awaitable
))>);
1287 static_assert(std::is_same_v
<
1288 net::awaitable
<net::ip::tcp::resolver::results_type::const_iterator
>, decltype(
1289 stream
.async_connect(
1290 resolve_results
.begin(),
1291 resolve_results
.end(),
1292 net::use_awaitable
))>);
1294 static_assert(std::is_same_v
<
1295 net::awaitable
<net::ip::tcp::endpoint
>, decltype(
1296 stream
.async_connect(
1298 net::use_awaitable
))>);
1300 static_assert(std::is_same_v
<
1301 net::awaitable
<void>, decltype(
1302 stream
.async_connect(
1303 resolve_results
.begin()->endpoint(),
1304 net::use_awaitable
))>);
1306 auto comparison_function
= [](error_code
&, net::ip::tcp::endpoint
) { return true; };
1308 static_assert(std::is_same_v
<
1309 net::awaitable
<net::ip::tcp::resolver::results_type::const_iterator
>, decltype(
1310 stream
.async_connect(
1311 resolve_results
.begin(),
1312 resolve_results
.end(),
1313 comparison_function
,
1314 net::use_awaitable
))>);
1316 static_assert(std::is_same_v
<
1317 net::awaitable
<net::ip::tcp::endpoint
>, decltype(
1318 stream
.async_connect(
1320 comparison_function
,
1321 net::use_awaitable
))>);
1326 testConnectionConditionArgs(
1327 basic_stream
<net::ip::tcp
> &stream
,
1328 net::ip::tcp::resolver::results_type
const &results
)
1333 operator()(const error_code
&,
1334 net::ip::tcp::endpoint
const &) const;
1341 operator()(error_code
const &,
1342 net::ip::tcp::resolver::results_type::const_iterator
) const;
1345 static_assert(std::is_void
<decltype(
1346 stream
.async_connect(
1350 handler()))>::value
, "");
1357 operator()(error_code
const &,
1358 net::ip::tcp::endpoint
const &);
1361 static_assert(std::is_void
<decltype(
1362 stream
.async_connect(
1365 handler()))>::value
, "");
1372 using stream_type
= basic_stream
<tcp
,
1373 net::io_context::executor_type
>;
1376 net::io_context ioc
;
1377 std::memset(buf
, 0, sizeof(buf
));
1378 net::mutable_buffer
mb(buf
, sizeof(buf
));
1379 auto const ep
= net::ip::tcp::endpoint(
1380 net::ip::make_address("127.0.0.1"), 0);
1386 test_server
srv("*", ep
, log
);
1388 s
.socket().connect(srv
.local_endpoint());
1390 s
.async_read_some(mb
, handler({}, 1));
1391 s
.async_read_some(net::buffer(buf
, 0), handler({}, 0));
1400 testSpecialMembers();
1408 #if BOOST_ASIO_HAS_CO_AWAIT
1409 // test for compilation success only
1410 boost::ignore_unused(&basic_stream_test::testAwaitableCompilation
);
1412 boost::ignore_unused(&basic_stream_test::testConnectionConditionArgs
);
1417 BEAST_DEFINE_TESTSUITE(beast
,core
,basic_stream
);