wait_for.cpp 3.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136
  1. // Copyright (c) 2006, 2007 Julio M. Merino Vidal
  2. // Copyright (c) 2008 Ilya Sokolov, Boris Schaeling
  3. // Copyright (c) 2009 Boris Schaeling
  4. // Copyright (c) 2010 Felipe Tanus, Boris Schaeling
  5. // Copyright (c) 2011, 2012 Jeff Flinn, Boris Schaeling
  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. #define BOOST_TEST_MAIN
  10. //#define BOOST_TEST_IGNORE_SIGCHLD
  11. #include <boost/test/included/unit_test.hpp>
  12. #include <boost/process/error.hpp>
  13. #include <boost/process/child.hpp>
  14. #include <boost/process/args.hpp>
  15. #include <thread>
  16. #include <atomic>
  17. #include <system_error>
  18. #include <boost/asio.hpp>
  19. #if defined(BOOST_POSIX_API)
  20. # include <signal.h>
  21. #endif
  22. namespace bp = boost::process;
  23. BOOST_AUTO_TEST_SUITE( wait_test);
  24. BOOST_AUTO_TEST_CASE(wait_for)
  25. {
  26. using boost::unit_test::framework::master_test_suite;
  27. std::error_code ec;
  28. auto launch_time = std::chrono::system_clock::now();
  29. bp::child c(
  30. master_test_suite().argv[1],
  31. bp::args+={"test", "--wait", "1"},
  32. ec
  33. );
  34. BOOST_REQUIRE(!ec);
  35. BOOST_CHECK(!c.wait_for(std::chrono::milliseconds(200)));
  36. BOOST_CHECK( c.wait_for(std::chrono::milliseconds(1000)));
  37. auto timeout_t = std::chrono::system_clock::now();
  38. BOOST_CHECK_LE(std::chrono::duration_cast<std::chrono::seconds>(timeout_t - launch_time).count(), 5); //should be less
  39. }
  40. BOOST_AUTO_TEST_CASE(wait_for_ec)
  41. {
  42. using boost::unit_test::framework::master_test_suite;
  43. std::error_code ec;
  44. bp::child c(
  45. master_test_suite().argv[1],
  46. bp::args+={"test", "--wait", "1"},
  47. ec
  48. );
  49. BOOST_REQUIRE(!ec);
  50. BOOST_CHECK(!c.wait_for(std::chrono::milliseconds(400),ec));
  51. BOOST_CHECK( c.wait_for(std::chrono::milliseconds(1000),ec));
  52. BOOST_CHECK_MESSAGE(!ec, ec.message());
  53. }
  54. BOOST_AUTO_TEST_CASE(wait_until)
  55. {
  56. using boost::unit_test::framework::master_test_suite;
  57. std::error_code ec;
  58. bp::child c(
  59. master_test_suite().argv[1],
  60. bp::args+={"test", "--wait", "1"},
  61. ec
  62. );
  63. BOOST_REQUIRE(!ec);
  64. auto now = std::chrono::system_clock::now();
  65. auto t1 = now + std::chrono::milliseconds(400);
  66. auto t2 = now + std::chrono::milliseconds(1200);
  67. BOOST_CHECK(!c.wait_until(t1));
  68. BOOST_CHECK( c.wait_until(t2));
  69. }
  70. BOOST_AUTO_TEST_CASE(wait_until_ec)
  71. {
  72. using boost::unit_test::framework::master_test_suite;
  73. std::error_code ec;
  74. bp::child c(
  75. master_test_suite().argv[1],
  76. bp::args+={"test", "--wait", "1"},
  77. ec
  78. );
  79. BOOST_REQUIRE(!ec);
  80. auto now = std::chrono::system_clock::now();
  81. auto t1 = now + std::chrono::milliseconds(400);
  82. auto t2 = now + std::chrono::milliseconds(1200);
  83. BOOST_CHECK(!c.wait_until(t1, ec));
  84. BOOST_CHECK( c.wait_until(t2, ec));
  85. BOOST_CHECK_MESSAGE(!ec, ec.message());
  86. }
  87. BOOST_AUTO_TEST_CASE(wait_for_exit_before_timeout)
  88. {
  89. using boost::unit_test::framework::master_test_suite;
  90. std::error_code ec;
  91. auto launch_time = std::chrono::system_clock::now();
  92. bp::child c(
  93. master_test_suite().argv[1],
  94. bp::args+={"test", "--wait", "1"},
  95. ec
  96. );
  97. BOOST_REQUIRE(!ec);
  98. BOOST_CHECK(c.wait_for(std::chrono::seconds(20)));
  99. auto timeout_t = std::chrono::system_clock::now();
  100. // check that we didn't wait the entire timeout period
  101. BOOST_CHECK_LT(std::chrono::duration_cast<std::chrono::seconds>(timeout_t - launch_time).count(), 20);
  102. }
  103. BOOST_AUTO_TEST_SUITE_END();