use_future.cpp 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670
  1. //
  2. // use_future.cpp
  3. // ~~~~~~~~~~~~~~
  4. //
  5. // Copyright (c) 2003-2019 Christopher M. Kohlhoff (chris at kohlhoff dot com)
  6. //
  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)
  9. //
  10. // Disable autolinking for unit tests.
  11. #if !defined(BOOST_ALL_NO_LIB)
  12. #define BOOST_ALL_NO_LIB 1
  13. #endif // !defined(BOOST_ALL_NO_LIB)
  14. // Test that header file is self-contained.
  15. #include <boost/asio/use_future.hpp>
  16. #include <string>
  17. #include "unit_test.hpp"
  18. #if defined(BOOST_ASIO_HAS_STD_FUTURE)
  19. #include "archetypes/async_ops.hpp"
  20. void use_future_0_test()
  21. {
  22. using boost::asio::use_future;
  23. using namespace archetypes;
  24. std::future<void> f;
  25. f = async_op_0(use_future);
  26. try
  27. {
  28. f.get();
  29. }
  30. catch (...)
  31. {
  32. BOOST_ASIO_CHECK(false);
  33. }
  34. f = async_op_ec_0(true, use_future);
  35. try
  36. {
  37. f.get();
  38. }
  39. catch (...)
  40. {
  41. BOOST_ASIO_CHECK(false);
  42. }
  43. f = async_op_ec_0(false, use_future);
  44. try
  45. {
  46. f.get();
  47. BOOST_ASIO_CHECK(false);
  48. }
  49. catch (boost::system::system_error& e)
  50. {
  51. BOOST_ASIO_CHECK(e.code() == boost::asio::error::operation_aborted);
  52. }
  53. catch (...)
  54. {
  55. BOOST_ASIO_CHECK(false);
  56. }
  57. f = async_op_ex_0(true, use_future);
  58. try
  59. {
  60. f.get();
  61. }
  62. catch (...)
  63. {
  64. BOOST_ASIO_CHECK(false);
  65. }
  66. f = async_op_ex_0(false, use_future);
  67. try
  68. {
  69. f.get();
  70. BOOST_ASIO_CHECK(false);
  71. }
  72. catch (std::exception& e)
  73. {
  74. BOOST_ASIO_CHECK(e.what() == std::string("blah"));
  75. }
  76. catch (...)
  77. {
  78. BOOST_ASIO_CHECK(false);
  79. }
  80. }
  81. void use_future_1_test()
  82. {
  83. using boost::asio::use_future;
  84. using namespace archetypes;
  85. std::future<int> f;
  86. f = async_op_1(use_future);
  87. try
  88. {
  89. int i = f.get();
  90. BOOST_ASIO_CHECK(i == 42);
  91. }
  92. catch (...)
  93. {
  94. BOOST_ASIO_CHECK(false);
  95. }
  96. f = async_op_ec_1(true, use_future);
  97. try
  98. {
  99. int i = f.get();
  100. BOOST_ASIO_CHECK(i == 42);
  101. }
  102. catch (...)
  103. {
  104. BOOST_ASIO_CHECK(false);
  105. }
  106. f = async_op_ec_1(false, use_future);
  107. try
  108. {
  109. int i = f.get();
  110. BOOST_ASIO_CHECK(false);
  111. (void)i;
  112. }
  113. catch (boost::system::system_error& e)
  114. {
  115. BOOST_ASIO_CHECK(e.code() == boost::asio::error::operation_aborted);
  116. }
  117. catch (...)
  118. {
  119. BOOST_ASIO_CHECK(false);
  120. }
  121. f = async_op_ex_1(true, use_future);
  122. try
  123. {
  124. int i = f.get();
  125. BOOST_ASIO_CHECK(i == 42);
  126. }
  127. catch (...)
  128. {
  129. BOOST_ASIO_CHECK(false);
  130. }
  131. f = async_op_ex_1(false, use_future);
  132. try
  133. {
  134. int i = f.get();
  135. BOOST_ASIO_CHECK(false);
  136. (void)i;
  137. }
  138. catch (std::exception& e)
  139. {
  140. BOOST_ASIO_CHECK(e.what() == std::string("blah"));
  141. }
  142. catch (...)
  143. {
  144. BOOST_ASIO_CHECK(false);
  145. }
  146. }
  147. void use_future_2_test()
  148. {
  149. using boost::asio::use_future;
  150. using namespace archetypes;
  151. std::future<std::tuple<int, double>> f;
  152. f = async_op_2(use_future);
  153. try
  154. {
  155. int i;
  156. double d;
  157. std::tie(i, d) = f.get();
  158. BOOST_ASIO_CHECK(i == 42);
  159. BOOST_ASIO_CHECK(d == 2.0);
  160. }
  161. catch (...)
  162. {
  163. BOOST_ASIO_CHECK(false);
  164. }
  165. f = async_op_ec_2(true, use_future);
  166. try
  167. {
  168. int i;
  169. double d;
  170. std::tie(i, d) = f.get();
  171. BOOST_ASIO_CHECK(i == 42);
  172. BOOST_ASIO_CHECK(d == 2.0);
  173. }
  174. catch (...)
  175. {
  176. BOOST_ASIO_CHECK(false);
  177. }
  178. f = async_op_ec_2(false, use_future);
  179. try
  180. {
  181. std::tuple<int, double> t = f.get();
  182. BOOST_ASIO_CHECK(false);
  183. (void)t;
  184. }
  185. catch (boost::system::system_error& e)
  186. {
  187. BOOST_ASIO_CHECK(e.code() == boost::asio::error::operation_aborted);
  188. }
  189. catch (...)
  190. {
  191. BOOST_ASIO_CHECK(false);
  192. }
  193. f = async_op_ex_2(true, use_future);
  194. try
  195. {
  196. int i;
  197. double d;
  198. std::tie(i, d) = f.get();
  199. BOOST_ASIO_CHECK(i == 42);
  200. BOOST_ASIO_CHECK(d == 2.0);
  201. }
  202. catch (...)
  203. {
  204. BOOST_ASIO_CHECK(false);
  205. }
  206. f = async_op_ex_2(false, use_future);
  207. try
  208. {
  209. std::tuple<int, double> t = f.get();
  210. BOOST_ASIO_CHECK(false);
  211. (void)t;
  212. }
  213. catch (std::exception& e)
  214. {
  215. BOOST_ASIO_CHECK(e.what() == std::string("blah"));
  216. }
  217. catch (...)
  218. {
  219. BOOST_ASIO_CHECK(false);
  220. }
  221. }
  222. void use_future_3_test()
  223. {
  224. using boost::asio::use_future;
  225. using namespace archetypes;
  226. std::future<std::tuple<int, double, char>> f;
  227. f = async_op_3(use_future);
  228. try
  229. {
  230. int i;
  231. double d;
  232. char c;
  233. std::tie(i, d, c) = f.get();
  234. BOOST_ASIO_CHECK(i == 42);
  235. BOOST_ASIO_CHECK(d == 2.0);
  236. BOOST_ASIO_CHECK(c == 'a');
  237. }
  238. catch (...)
  239. {
  240. BOOST_ASIO_CHECK(false);
  241. }
  242. f = async_op_ec_3(true, use_future);
  243. try
  244. {
  245. int i;
  246. double d;
  247. char c;
  248. std::tie(i, d, c) = f.get();
  249. BOOST_ASIO_CHECK(i == 42);
  250. BOOST_ASIO_CHECK(d == 2.0);
  251. BOOST_ASIO_CHECK(c == 'a');
  252. }
  253. catch (...)
  254. {
  255. BOOST_ASIO_CHECK(false);
  256. }
  257. f = async_op_ec_3(false, use_future);
  258. try
  259. {
  260. std::tuple<int, double, char> t = f.get();
  261. BOOST_ASIO_CHECK(false);
  262. (void)t;
  263. }
  264. catch (boost::system::system_error& e)
  265. {
  266. BOOST_ASIO_CHECK(e.code() == boost::asio::error::operation_aborted);
  267. }
  268. catch (...)
  269. {
  270. BOOST_ASIO_CHECK(false);
  271. }
  272. f = async_op_ex_3(true, use_future);
  273. try
  274. {
  275. int i;
  276. double d;
  277. char c;
  278. std::tie(i, d, c) = f.get();
  279. BOOST_ASIO_CHECK(i == 42);
  280. BOOST_ASIO_CHECK(d == 2.0);
  281. BOOST_ASIO_CHECK(c == 'a');
  282. }
  283. catch (...)
  284. {
  285. BOOST_ASIO_CHECK(false);
  286. }
  287. f = async_op_ex_3(false, use_future);
  288. try
  289. {
  290. std::tuple<int, double, char> t = f.get();
  291. BOOST_ASIO_CHECK(false);
  292. (void)t;
  293. }
  294. catch (std::exception& e)
  295. {
  296. BOOST_ASIO_CHECK(e.what() == std::string("blah"));
  297. }
  298. catch (...)
  299. {
  300. BOOST_ASIO_CHECK(false);
  301. }
  302. }
  303. int package_0()
  304. {
  305. return 42;
  306. }
  307. int package_ec_0(boost::system::error_code ec)
  308. {
  309. return ec ? 0 : 42;
  310. }
  311. int package_ex_0(std::exception_ptr ex)
  312. {
  313. return ex ? 0 : 42;
  314. }
  315. void use_future_package_0_test()
  316. {
  317. using boost::asio::use_future;
  318. using namespace archetypes;
  319. std::future<int> f;
  320. f = async_op_0(use_future(package_0));
  321. try
  322. {
  323. int i = f.get();
  324. BOOST_ASIO_CHECK(i == 42);
  325. }
  326. catch (...)
  327. {
  328. BOOST_ASIO_CHECK(false);
  329. }
  330. f = async_op_ec_0(true, use_future(&package_ec_0));
  331. try
  332. {
  333. int i = f.get();
  334. BOOST_ASIO_CHECK(i == 42);
  335. }
  336. catch (...)
  337. {
  338. BOOST_ASIO_CHECK(false);
  339. }
  340. f = async_op_ec_0(false, use_future(package_ec_0));
  341. try
  342. {
  343. int i = f.get();
  344. BOOST_ASIO_CHECK(i == 0);
  345. }
  346. catch (...)
  347. {
  348. BOOST_ASIO_CHECK(false);
  349. }
  350. f = async_op_ex_0(true, use_future(package_ex_0));
  351. try
  352. {
  353. int i = f.get();
  354. BOOST_ASIO_CHECK(i == 42);
  355. }
  356. catch (...)
  357. {
  358. BOOST_ASIO_CHECK(false);
  359. }
  360. f = async_op_ex_0(false, use_future(package_ex_0));
  361. try
  362. {
  363. int i = f.get();
  364. BOOST_ASIO_CHECK(i == 0);
  365. }
  366. catch (...)
  367. {
  368. BOOST_ASIO_CHECK(false);
  369. }
  370. }
  371. int package_1(int i)
  372. {
  373. return i;
  374. }
  375. int package_ec_1(boost::system::error_code ec, int i)
  376. {
  377. return ec ? 0 : i;
  378. }
  379. int package_ex_1(std::exception_ptr ex, int i)
  380. {
  381. return ex ? 0 : i;
  382. }
  383. void use_future_package_1_test()
  384. {
  385. using boost::asio::use_future;
  386. using namespace archetypes;
  387. std::future<int> f;
  388. f = async_op_1(use_future(package_1));
  389. try
  390. {
  391. int i = f.get();
  392. BOOST_ASIO_CHECK(i == 42);
  393. }
  394. catch (...)
  395. {
  396. BOOST_ASIO_CHECK(false);
  397. }
  398. f = async_op_ec_1(true, use_future(package_ec_1));
  399. try
  400. {
  401. int i = f.get();
  402. BOOST_ASIO_CHECK(i == 42);
  403. }
  404. catch (...)
  405. {
  406. BOOST_ASIO_CHECK(false);
  407. }
  408. f = async_op_ec_1(false, use_future(package_ec_1));
  409. try
  410. {
  411. int i = f.get();
  412. BOOST_ASIO_CHECK(i == 0);
  413. }
  414. catch (...)
  415. {
  416. BOOST_ASIO_CHECK(false);
  417. }
  418. f = async_op_ex_1(true, use_future(package_ex_1));
  419. try
  420. {
  421. int i = f.get();
  422. BOOST_ASIO_CHECK(i == 42);
  423. }
  424. catch (...)
  425. {
  426. BOOST_ASIO_CHECK(false);
  427. }
  428. f = async_op_ex_1(false, use_future(package_ex_1));
  429. try
  430. {
  431. int i = f.get();
  432. BOOST_ASIO_CHECK(i == 0);
  433. }
  434. catch (...)
  435. {
  436. BOOST_ASIO_CHECK(false);
  437. }
  438. }
  439. int package_2(int i, double)
  440. {
  441. return i;
  442. }
  443. int package_ec_2(boost::system::error_code ec, int i, double)
  444. {
  445. return ec ? 0 : i;
  446. }
  447. int package_ex_2(std::exception_ptr ex, int i, double)
  448. {
  449. return ex ? 0 : i;
  450. }
  451. void use_future_package_2_test()
  452. {
  453. using boost::asio::use_future;
  454. using namespace archetypes;
  455. std::future<int> f;
  456. f = async_op_2(use_future(package_2));
  457. try
  458. {
  459. int i = f.get();
  460. BOOST_ASIO_CHECK(i == 42);
  461. }
  462. catch (...)
  463. {
  464. BOOST_ASIO_CHECK(false);
  465. }
  466. f = async_op_ec_2(true, use_future(package_ec_2));
  467. try
  468. {
  469. int i = f.get();
  470. BOOST_ASIO_CHECK(i == 42);
  471. }
  472. catch (...)
  473. {
  474. BOOST_ASIO_CHECK(false);
  475. }
  476. f = async_op_ec_2(false, use_future(package_ec_2));
  477. try
  478. {
  479. int i = f.get();
  480. BOOST_ASIO_CHECK(i == 0);
  481. }
  482. catch (...)
  483. {
  484. BOOST_ASIO_CHECK(false);
  485. }
  486. f = async_op_ex_2(true, use_future(package_ex_2));
  487. try
  488. {
  489. int i = f.get();
  490. BOOST_ASIO_CHECK(i == 42);
  491. }
  492. catch (...)
  493. {
  494. BOOST_ASIO_CHECK(false);
  495. }
  496. f = async_op_ex_2(false, use_future(package_ex_2));
  497. try
  498. {
  499. int i = f.get();
  500. BOOST_ASIO_CHECK(i == 0);
  501. }
  502. catch (...)
  503. {
  504. BOOST_ASIO_CHECK(false);
  505. }
  506. }
  507. int package_3(int i, double, char)
  508. {
  509. return i;
  510. }
  511. int package_ec_3(boost::system::error_code ec, int i, double, char)
  512. {
  513. return ec ? 0 : i;
  514. }
  515. int package_ex_3(std::exception_ptr ex, int i, double, char)
  516. {
  517. return ex ? 0 : i;
  518. }
  519. void use_future_package_3_test()
  520. {
  521. using boost::asio::use_future;
  522. using namespace archetypes;
  523. std::future<int> f;
  524. f = async_op_3(use_future(package_3));
  525. try
  526. {
  527. int i = f.get();
  528. BOOST_ASIO_CHECK(i == 42);
  529. }
  530. catch (...)
  531. {
  532. BOOST_ASIO_CHECK(false);
  533. }
  534. f = async_op_ec_3(true, use_future(package_ec_3));
  535. try
  536. {
  537. int i = f.get();
  538. BOOST_ASIO_CHECK(i == 42);
  539. }
  540. catch (...)
  541. {
  542. BOOST_ASIO_CHECK(false);
  543. }
  544. f = async_op_ec_3(false, use_future(package_ec_3));
  545. try
  546. {
  547. int i = f.get();
  548. BOOST_ASIO_CHECK(i == 0);
  549. }
  550. catch (...)
  551. {
  552. BOOST_ASIO_CHECK(false);
  553. }
  554. f = async_op_ex_3(true, use_future(package_ex_3));
  555. try
  556. {
  557. int i = f.get();
  558. BOOST_ASIO_CHECK(i == 42);
  559. }
  560. catch (...)
  561. {
  562. BOOST_ASIO_CHECK(false);
  563. }
  564. f = async_op_ex_3(false, use_future(package_ex_3));
  565. try
  566. {
  567. int i = f.get();
  568. BOOST_ASIO_CHECK(i == 0);
  569. }
  570. catch (...)
  571. {
  572. BOOST_ASIO_CHECK(false);
  573. }
  574. }
  575. BOOST_ASIO_TEST_SUITE
  576. (
  577. "use_future",
  578. BOOST_ASIO_TEST_CASE(use_future_0_test)
  579. BOOST_ASIO_TEST_CASE(use_future_1_test)
  580. BOOST_ASIO_TEST_CASE(use_future_2_test)
  581. BOOST_ASIO_TEST_CASE(use_future_3_test)
  582. BOOST_ASIO_TEST_CASE(use_future_package_0_test)
  583. BOOST_ASIO_TEST_CASE(use_future_package_1_test)
  584. BOOST_ASIO_TEST_CASE(use_future_package_2_test)
  585. BOOST_ASIO_TEST_CASE(use_future_package_3_test)
  586. )
  587. #else // defined(BOOST_ASIO_HAS_STD_FUTURE)
  588. BOOST_ASIO_TEST_SUITE
  589. (
  590. "use_future",
  591. BOOST_ASIO_TEST_CASE(null_test)
  592. )
  593. #endif // defined(BOOST_ASIO_HAS_STD_FUTURE)