5 // Copyright (c) 2003-2018 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/use_future.hpp>
20 #include "unit_test.hpp"
22 #if defined(BOOST_ASIO_HAS_STD_FUTURE)
24 #include "archetypes/async_ops.hpp"
25 #include "archetypes/deprecated_async_ops.hpp"
27 void use_future_0_test()
29 using boost::asio::use_future
;
30 using namespace archetypes
;
34 f
= async_op_0(use_future
);
41 BOOST_ASIO_CHECK(false);
44 f
= async_op_ec_0(true, use_future
);
51 BOOST_ASIO_CHECK(false);
54 f
= async_op_ec_0(false, use_future
);
58 BOOST_ASIO_CHECK(false);
60 catch (boost::system::system_error
& e
)
62 BOOST_ASIO_CHECK(e
.code() == boost::asio::error::operation_aborted
);
66 BOOST_ASIO_CHECK(false);
69 f
= async_op_ex_0(true, use_future
);
76 BOOST_ASIO_CHECK(false);
79 f
= async_op_ex_0(false, use_future
);
83 BOOST_ASIO_CHECK(false);
85 catch (std::exception
& e
)
87 BOOST_ASIO_CHECK(e
.what() == std::string("blah"));
91 BOOST_ASIO_CHECK(false);
95 void use_future_1_test()
97 using boost::asio::use_future
;
98 using namespace archetypes
;
102 f
= async_op_1(use_future
);
106 BOOST_ASIO_CHECK(i
== 42);
110 BOOST_ASIO_CHECK(false);
113 f
= async_op_ec_1(true, use_future
);
117 BOOST_ASIO_CHECK(i
== 42);
121 BOOST_ASIO_CHECK(false);
124 f
= async_op_ec_1(false, use_future
);
128 BOOST_ASIO_CHECK(false);
131 catch (boost::system::system_error
& e
)
133 BOOST_ASIO_CHECK(e
.code() == boost::asio::error::operation_aborted
);
137 BOOST_ASIO_CHECK(false);
140 f
= async_op_ex_1(true, use_future
);
144 BOOST_ASIO_CHECK(i
== 42);
148 BOOST_ASIO_CHECK(false);
151 f
= async_op_ex_1(false, use_future
);
155 BOOST_ASIO_CHECK(false);
158 catch (std::exception
& e
)
160 BOOST_ASIO_CHECK(e
.what() == std::string("blah"));
164 BOOST_ASIO_CHECK(false);
168 void use_future_2_test()
170 using boost::asio::use_future
;
171 using namespace archetypes
;
173 std::future
<std::tuple
<int, double>> f
;
175 f
= async_op_2(use_future
);
180 std::tie(i
, d
) = f
.get();
181 BOOST_ASIO_CHECK(i
== 42);
182 BOOST_ASIO_CHECK(d
== 2.0);
186 BOOST_ASIO_CHECK(false);
189 f
= async_op_ec_2(true, use_future
);
194 std::tie(i
, d
) = f
.get();
195 BOOST_ASIO_CHECK(i
== 42);
196 BOOST_ASIO_CHECK(d
== 2.0);
200 BOOST_ASIO_CHECK(false);
203 f
= async_op_ec_2(false, use_future
);
206 std::tuple
<int, double> t
= f
.get();
207 BOOST_ASIO_CHECK(false);
210 catch (boost::system::system_error
& e
)
212 BOOST_ASIO_CHECK(e
.code() == boost::asio::error::operation_aborted
);
216 BOOST_ASIO_CHECK(false);
219 f
= async_op_ex_2(true, use_future
);
224 std::tie(i
, d
) = f
.get();
225 BOOST_ASIO_CHECK(i
== 42);
226 BOOST_ASIO_CHECK(d
== 2.0);
230 BOOST_ASIO_CHECK(false);
233 f
= async_op_ex_2(false, use_future
);
236 std::tuple
<int, double> t
= f
.get();
237 BOOST_ASIO_CHECK(false);
240 catch (std::exception
& e
)
242 BOOST_ASIO_CHECK(e
.what() == std::string("blah"));
246 BOOST_ASIO_CHECK(false);
250 void use_future_3_test()
252 using boost::asio::use_future
;
253 using namespace archetypes
;
255 std::future
<std::tuple
<int, double, char>> f
;
257 f
= async_op_3(use_future
);
263 std::tie(i
, d
, c
) = f
.get();
264 BOOST_ASIO_CHECK(i
== 42);
265 BOOST_ASIO_CHECK(d
== 2.0);
266 BOOST_ASIO_CHECK(c
== 'a');
270 BOOST_ASIO_CHECK(false);
273 f
= async_op_ec_3(true, use_future
);
279 std::tie(i
, d
, c
) = f
.get();
280 BOOST_ASIO_CHECK(i
== 42);
281 BOOST_ASIO_CHECK(d
== 2.0);
282 BOOST_ASIO_CHECK(c
== 'a');
286 BOOST_ASIO_CHECK(false);
289 f
= async_op_ec_3(false, use_future
);
292 std::tuple
<int, double, char> t
= f
.get();
293 BOOST_ASIO_CHECK(false);
296 catch (boost::system::system_error
& e
)
298 BOOST_ASIO_CHECK(e
.code() == boost::asio::error::operation_aborted
);
302 BOOST_ASIO_CHECK(false);
305 f
= async_op_ex_3(true, use_future
);
311 std::tie(i
, d
, c
) = f
.get();
312 BOOST_ASIO_CHECK(i
== 42);
313 BOOST_ASIO_CHECK(d
== 2.0);
314 BOOST_ASIO_CHECK(c
== 'a');
318 BOOST_ASIO_CHECK(false);
321 f
= async_op_ex_3(false, use_future
);
324 std::tuple
<int, double, char> t
= f
.get();
325 BOOST_ASIO_CHECK(false);
328 catch (std::exception
& e
)
330 BOOST_ASIO_CHECK(e
.what() == std::string("blah"));
334 BOOST_ASIO_CHECK(false);
343 int package_ec_0(boost::system::error_code ec
)
348 int package_ex_0(std::exception_ptr ex
)
353 void use_future_package_0_test()
355 using boost::asio::use_future
;
356 using namespace archetypes
;
360 f
= async_op_0(use_future(package_0
));
364 BOOST_ASIO_CHECK(i
== 42);
368 BOOST_ASIO_CHECK(false);
371 f
= async_op_ec_0(true, use_future(&package_ec_0
));
375 BOOST_ASIO_CHECK(i
== 42);
379 BOOST_ASIO_CHECK(false);
382 f
= async_op_ec_0(false, use_future(package_ec_0
));
386 BOOST_ASIO_CHECK(i
== 0);
390 BOOST_ASIO_CHECK(false);
393 f
= async_op_ex_0(true, use_future(package_ex_0
));
397 BOOST_ASIO_CHECK(i
== 42);
401 BOOST_ASIO_CHECK(false);
404 f
= async_op_ex_0(false, use_future(package_ex_0
));
408 BOOST_ASIO_CHECK(i
== 0);
412 BOOST_ASIO_CHECK(false);
421 int package_ec_1(boost::system::error_code ec
, int i
)
426 int package_ex_1(std::exception_ptr ex
, int i
)
431 void use_future_package_1_test()
433 using boost::asio::use_future
;
434 using namespace archetypes
;
438 f
= async_op_1(use_future(package_1
));
442 BOOST_ASIO_CHECK(i
== 42);
446 BOOST_ASIO_CHECK(false);
449 f
= async_op_ec_1(true, use_future(package_ec_1
));
453 BOOST_ASIO_CHECK(i
== 42);
457 BOOST_ASIO_CHECK(false);
460 f
= async_op_ec_1(false, use_future(package_ec_1
));
464 BOOST_ASIO_CHECK(i
== 0);
468 BOOST_ASIO_CHECK(false);
471 f
= async_op_ex_1(true, use_future(package_ex_1
));
475 BOOST_ASIO_CHECK(i
== 42);
479 BOOST_ASIO_CHECK(false);
482 f
= async_op_ex_1(false, use_future(package_ex_1
));
486 BOOST_ASIO_CHECK(i
== 0);
490 BOOST_ASIO_CHECK(false);
494 int package_2(int i
, double)
499 int package_ec_2(boost::system::error_code ec
, int i
, double)
504 int package_ex_2(std::exception_ptr ex
, int i
, double)
509 void use_future_package_2_test()
511 using boost::asio::use_future
;
512 using namespace archetypes
;
516 f
= async_op_2(use_future(package_2
));
520 BOOST_ASIO_CHECK(i
== 42);
524 BOOST_ASIO_CHECK(false);
527 f
= async_op_ec_2(true, use_future(package_ec_2
));
531 BOOST_ASIO_CHECK(i
== 42);
535 BOOST_ASIO_CHECK(false);
538 f
= async_op_ec_2(false, use_future(package_ec_2
));
542 BOOST_ASIO_CHECK(i
== 0);
546 BOOST_ASIO_CHECK(false);
549 f
= async_op_ex_2(true, use_future(package_ex_2
));
553 BOOST_ASIO_CHECK(i
== 42);
557 BOOST_ASIO_CHECK(false);
560 f
= async_op_ex_2(false, use_future(package_ex_2
));
564 BOOST_ASIO_CHECK(i
== 0);
568 BOOST_ASIO_CHECK(false);
572 int package_3(int i
, double, char)
577 int package_ec_3(boost::system::error_code ec
, int i
, double, char)
582 int package_ex_3(std::exception_ptr ex
, int i
, double, char)
587 void use_future_package_3_test()
589 using boost::asio::use_future
;
590 using namespace archetypes
;
594 f
= async_op_3(use_future(package_3
));
598 BOOST_ASIO_CHECK(i
== 42);
602 BOOST_ASIO_CHECK(false);
605 f
= async_op_ec_3(true, use_future(package_ec_3
));
609 BOOST_ASIO_CHECK(i
== 42);
613 BOOST_ASIO_CHECK(false);
616 f
= async_op_ec_3(false, use_future(package_ec_3
));
620 BOOST_ASIO_CHECK(i
== 0);
624 BOOST_ASIO_CHECK(false);
627 f
= async_op_ex_3(true, use_future(package_ex_3
));
631 BOOST_ASIO_CHECK(i
== 42);
635 BOOST_ASIO_CHECK(false);
638 f
= async_op_ex_3(false, use_future(package_ex_3
));
642 BOOST_ASIO_CHECK(i
== 0);
646 BOOST_ASIO_CHECK(false);
650 void deprecated_use_future_0_test()
652 #if !defined(BOOST_ASIO_NO_DEPRECATED)
653 using boost::asio::use_future
;
654 using namespace archetypes
;
657 boost::asio::io_context ctx
;
659 f
= deprecated_async_op_0(ctx
, use_future
);
668 BOOST_ASIO_CHECK(false);
671 f
= deprecated_async_op_ec_0(ctx
, true, use_future
);
680 BOOST_ASIO_CHECK(false);
683 f
= deprecated_async_op_ec_0(ctx
, false, use_future
);
689 BOOST_ASIO_CHECK(false);
691 catch (boost::system::system_error
& e
)
693 BOOST_ASIO_CHECK(e
.code() == boost::asio::error::operation_aborted
);
697 BOOST_ASIO_CHECK(false);
700 f
= async_op_ex_0(true, use_future
);
709 BOOST_ASIO_CHECK(false);
712 f
= async_op_ex_0(false, use_future
);
718 BOOST_ASIO_CHECK(false);
720 catch (std::exception
& e
)
722 BOOST_ASIO_CHECK(e
.what() == std::string("blah"));
726 BOOST_ASIO_CHECK(false);
728 #endif // !defined(BOOST_ASIO_NO_DEPRECATED)
731 void deprecated_use_future_1_test()
733 #if !defined(BOOST_ASIO_NO_DEPRECATED)
734 using boost::asio::use_future
;
735 using namespace archetypes
;
738 boost::asio::io_context ctx
;
740 f
= deprecated_async_op_1(ctx
, use_future
);
746 BOOST_ASIO_CHECK(i
== 42);
750 BOOST_ASIO_CHECK(false);
753 f
= deprecated_async_op_ec_1(ctx
, true, use_future
);
759 BOOST_ASIO_CHECK(i
== 42);
763 BOOST_ASIO_CHECK(false);
766 f
= deprecated_async_op_ec_1(ctx
, false, use_future
);
772 BOOST_ASIO_CHECK(false);
775 catch (boost::system::system_error
& e
)
777 BOOST_ASIO_CHECK(e
.code() == boost::asio::error::operation_aborted
);
781 BOOST_ASIO_CHECK(false);
784 f
= deprecated_async_op_ex_1(ctx
, true, use_future
);
790 BOOST_ASIO_CHECK(i
== 42);
794 BOOST_ASIO_CHECK(false);
797 f
= deprecated_async_op_ex_1(ctx
, false, use_future
);
803 BOOST_ASIO_CHECK(false);
806 catch (std::exception
& e
)
808 BOOST_ASIO_CHECK(e
.what() == std::string("blah"));
812 BOOST_ASIO_CHECK(false);
814 #endif // !defined(BOOST_ASIO_NO_DEPRECATED)
817 void deprecated_use_future_2_test()
819 #if !defined(BOOST_ASIO_NO_DEPRECATED)
820 using boost::asio::use_future
;
821 using namespace archetypes
;
823 std::future
<std::tuple
<int, double>> f
;
824 boost::asio::io_context ctx
;
826 f
= deprecated_async_op_2(ctx
, use_future
);
833 std::tie(i
, d
) = f
.get();
834 BOOST_ASIO_CHECK(i
== 42);
835 BOOST_ASIO_CHECK(d
== 2.0);
839 BOOST_ASIO_CHECK(false);
842 f
= deprecated_async_op_ec_2(ctx
, true, use_future
);
849 std::tie(i
, d
) = f
.get();
850 BOOST_ASIO_CHECK(i
== 42);
851 BOOST_ASIO_CHECK(d
== 2.0);
855 BOOST_ASIO_CHECK(false);
858 f
= deprecated_async_op_ec_2(ctx
, false, use_future
);
863 std::tuple
<int, double> t
= f
.get();
864 BOOST_ASIO_CHECK(false);
867 catch (boost::system::system_error
& e
)
869 BOOST_ASIO_CHECK(e
.code() == boost::asio::error::operation_aborted
);
873 BOOST_ASIO_CHECK(false);
876 f
= deprecated_async_op_ex_2(ctx
, true, use_future
);
883 std::tie(i
, d
) = f
.get();
884 BOOST_ASIO_CHECK(i
== 42);
885 BOOST_ASIO_CHECK(d
== 2.0);
889 BOOST_ASIO_CHECK(false);
892 f
= deprecated_async_op_ex_2(ctx
, false, use_future
);
897 std::tuple
<int, double> t
= f
.get();
898 BOOST_ASIO_CHECK(false);
901 catch (std::exception
& e
)
903 BOOST_ASIO_CHECK(e
.what() == std::string("blah"));
907 BOOST_ASIO_CHECK(false);
909 #endif // !defined(BOOST_ASIO_NO_DEPRECATED)
912 void deprecated_use_future_3_test()
914 #if !defined(BOOST_ASIO_NO_DEPRECATED)
915 using boost::asio::use_future
;
916 using namespace archetypes
;
918 std::future
<std::tuple
<int, double, char>> f
;
919 boost::asio::io_context ctx
;
921 f
= deprecated_async_op_3(ctx
, use_future
);
929 std::tie(i
, d
, c
) = f
.get();
930 BOOST_ASIO_CHECK(i
== 42);
931 BOOST_ASIO_CHECK(d
== 2.0);
932 BOOST_ASIO_CHECK(c
== 'a');
936 BOOST_ASIO_CHECK(false);
939 f
= deprecated_async_op_ec_3(ctx
, true, use_future
);
947 std::tie(i
, d
, c
) = f
.get();
948 BOOST_ASIO_CHECK(i
== 42);
949 BOOST_ASIO_CHECK(d
== 2.0);
950 BOOST_ASIO_CHECK(c
== 'a');
954 BOOST_ASIO_CHECK(false);
957 f
= deprecated_async_op_ec_3(ctx
, false, use_future
);
962 std::tuple
<int, double, char> t
= f
.get();
963 BOOST_ASIO_CHECK(false);
966 catch (boost::system::system_error
& e
)
968 BOOST_ASIO_CHECK(e
.code() == boost::asio::error::operation_aborted
);
972 BOOST_ASIO_CHECK(false);
975 f
= deprecated_async_op_ex_3(ctx
, true, use_future
);
983 std::tie(i
, d
, c
) = f
.get();
984 BOOST_ASIO_CHECK(i
== 42);
985 BOOST_ASIO_CHECK(d
== 2.0);
986 BOOST_ASIO_CHECK(c
== 'a');
990 BOOST_ASIO_CHECK(false);
993 f
= deprecated_async_op_ex_3(ctx
, false, use_future
);
998 std::tuple
<int, double, char> t
= f
.get();
999 BOOST_ASIO_CHECK(false);
1002 catch (std::exception
& e
)
1004 BOOST_ASIO_CHECK(e
.what() == std::string("blah"));
1008 BOOST_ASIO_CHECK(false);
1010 #endif // !defined(BOOST_ASIO_NO_DEPRECATED)
1013 void deprecated_use_future_package_0_test()
1015 #if !defined(BOOST_ASIO_NO_DEPRECATED)
1016 using boost::asio::use_future
;
1017 using namespace archetypes
;
1020 boost::asio::io_context ctx
;
1022 f
= deprecated_async_op_0(ctx
, use_future(package_0
));
1028 BOOST_ASIO_CHECK(i
== 42);
1032 BOOST_ASIO_CHECK(false);
1035 f
= deprecated_async_op_ec_0(ctx
, true, use_future(&package_ec_0
));
1041 BOOST_ASIO_CHECK(i
== 42);
1045 BOOST_ASIO_CHECK(false);
1048 f
= deprecated_async_op_ec_0(ctx
, false, use_future(package_ec_0
));
1054 BOOST_ASIO_CHECK(i
== 0);
1058 BOOST_ASIO_CHECK(false);
1061 f
= deprecated_async_op_ex_0(ctx
, true, use_future(package_ex_0
));
1067 BOOST_ASIO_CHECK(i
== 42);
1071 BOOST_ASIO_CHECK(false);
1074 f
= deprecated_async_op_ex_0(ctx
, false, use_future(package_ex_0
));
1080 BOOST_ASIO_CHECK(i
== 0);
1084 BOOST_ASIO_CHECK(false);
1086 #endif // !defined(BOOST_ASIO_NO_DEPRECATED)
1089 void deprecated_use_future_package_1_test()
1091 #if !defined(BOOST_ASIO_NO_DEPRECATED)
1092 using boost::asio::use_future
;
1093 using namespace archetypes
;
1096 boost::asio::io_context ctx
;
1098 f
= deprecated_async_op_1(ctx
, use_future(package_1
));
1104 BOOST_ASIO_CHECK(i
== 42);
1108 BOOST_ASIO_CHECK(false);
1111 f
= deprecated_async_op_ec_1(ctx
, true, use_future(package_ec_1
));
1117 BOOST_ASIO_CHECK(i
== 42);
1121 BOOST_ASIO_CHECK(false);
1124 f
= deprecated_async_op_ec_1(ctx
, false, use_future(package_ec_1
));
1130 BOOST_ASIO_CHECK(i
== 0);
1134 BOOST_ASIO_CHECK(false);
1137 f
= deprecated_async_op_ex_1(ctx
, true, use_future(package_ex_1
));
1143 BOOST_ASIO_CHECK(i
== 42);
1147 BOOST_ASIO_CHECK(false);
1150 f
= deprecated_async_op_ex_1(ctx
, false, use_future(package_ex_1
));
1156 BOOST_ASIO_CHECK(i
== 0);
1160 BOOST_ASIO_CHECK(false);
1162 #endif // !defined(BOOST_ASIO_NO_DEPRECATED)
1165 void deprecated_use_future_package_2_test()
1167 #if !defined(BOOST_ASIO_NO_DEPRECATED)
1168 using boost::asio::use_future
;
1169 using namespace archetypes
;
1172 boost::asio::io_context ctx
;
1174 f
= deprecated_async_op_2(ctx
, use_future(package_2
));
1180 BOOST_ASIO_CHECK(i
== 42);
1184 BOOST_ASIO_CHECK(false);
1187 f
= deprecated_async_op_ec_2(ctx
, true, use_future(package_ec_2
));
1193 BOOST_ASIO_CHECK(i
== 42);
1197 BOOST_ASIO_CHECK(false);
1200 f
= deprecated_async_op_ec_2(ctx
, false, use_future(package_ec_2
));
1206 BOOST_ASIO_CHECK(i
== 0);
1210 BOOST_ASIO_CHECK(false);
1213 f
= deprecated_async_op_ex_2(ctx
, true, use_future(package_ex_2
));
1219 BOOST_ASIO_CHECK(i
== 42);
1223 BOOST_ASIO_CHECK(false);
1226 f
= deprecated_async_op_ex_2(ctx
, false, use_future(package_ex_2
));
1232 BOOST_ASIO_CHECK(i
== 0);
1236 BOOST_ASIO_CHECK(false);
1238 #endif // !defined(BOOST_ASIO_NO_DEPRECATED)
1241 void deprecated_use_future_package_3_test()
1243 #if !defined(BOOST_ASIO_NO_DEPRECATED)
1244 using boost::asio::use_future
;
1245 using namespace archetypes
;
1248 boost::asio::io_context ctx
;
1250 f
= deprecated_async_op_3(ctx
, use_future(package_3
));
1256 BOOST_ASIO_CHECK(i
== 42);
1260 BOOST_ASIO_CHECK(false);
1263 f
= deprecated_async_op_ec_3(ctx
, true, use_future(package_ec_3
));
1269 BOOST_ASIO_CHECK(i
== 42);
1273 BOOST_ASIO_CHECK(false);
1276 f
= deprecated_async_op_ec_3(ctx
, false, use_future(package_ec_3
));
1282 BOOST_ASIO_CHECK(i
== 0);
1286 BOOST_ASIO_CHECK(false);
1289 f
= deprecated_async_op_ex_3(ctx
, true, use_future(package_ex_3
));
1295 BOOST_ASIO_CHECK(i
== 42);
1299 BOOST_ASIO_CHECK(false);
1302 f
= deprecated_async_op_ex_3(ctx
, false, use_future(package_ex_3
));
1308 BOOST_ASIO_CHECK(i
== 0);
1312 BOOST_ASIO_CHECK(false);
1314 #endif // !defined(BOOST_ASIO_NO_DEPRECATED)
1317 BOOST_ASIO_TEST_SUITE
1320 BOOST_ASIO_TEST_CASE(use_future_0_test
)
1321 BOOST_ASIO_TEST_CASE(use_future_1_test
)
1322 BOOST_ASIO_TEST_CASE(use_future_2_test
)
1323 BOOST_ASIO_TEST_CASE(use_future_3_test
)
1324 BOOST_ASIO_TEST_CASE(use_future_package_0_test
)
1325 BOOST_ASIO_TEST_CASE(use_future_package_1_test
)
1326 BOOST_ASIO_TEST_CASE(use_future_package_2_test
)
1327 BOOST_ASIO_TEST_CASE(use_future_package_3_test
)
1328 BOOST_ASIO_TEST_CASE(deprecated_use_future_0_test
)
1329 BOOST_ASIO_TEST_CASE(deprecated_use_future_1_test
)
1330 BOOST_ASIO_TEST_CASE(deprecated_use_future_2_test
)
1331 BOOST_ASIO_TEST_CASE(deprecated_use_future_3_test
)
1332 BOOST_ASIO_TEST_CASE(deprecated_use_future_package_0_test
)
1333 BOOST_ASIO_TEST_CASE(deprecated_use_future_package_1_test
)
1334 BOOST_ASIO_TEST_CASE(deprecated_use_future_package_2_test
)
1335 BOOST_ASIO_TEST_CASE(deprecated_use_future_package_3_test
)
1338 #else // defined(BOOST_ASIO_HAS_STD_FUTURE)
1340 BOOST_ASIO_TEST_SUITE
1343 BOOST_ASIO_TEST_CASE(null_test
)
1346 #endif // defined(BOOST_ASIO_HAS_STD_FUTURE)