// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
#define BOOST_TEST_MAIN
-#define BOOST_TEST_IGNORE_SIGCHLD
+
#include <boost/test/included/unit_test.hpp>
#include <boost/process/error.hpp>
struct wait_handler
{
HANDLE handle_;
-
- wait_handler(HANDLE handle) : handle_(handle) {}
+ bool &called_;
+ wait_handler(HANDLE handle, bool &called) : handle_(handle), called_(called) {}
void operator()(const boost::system::error_code &ec)
{
+ called_ = true;
BOOST_REQUIRE(!ec);
DWORD exit_code;
BOOST_REQUIRE(GetExitCodeProcess(handle_, &exit_code));
#elif defined(BOOST_POSIX_API)
struct wait_handler
{
+ bool &called_;
+
+ wait_handler (bool & called) : called_(called) {}
+
void operator()(const boost::system::error_code &ec, int signal)
{
+ called_ = true;
BOOST_REQUIRE(!ec);
BOOST_REQUIRE_EQUAL(SIGCHLD, signal);
int status;
boost::asio::io_context io_context;
+ boost::asio::deadline_timer timeout{io_context, boost::posix_time::seconds(3)};
+ timeout.async_wait([&](boost::system::error_code ec){if (!ec) io_context.stop();});
+
+
+ bool wh_called = false;
#if defined(BOOST_POSIX_API)
signal_set set(io_context, SIGCHLD);
- set.async_wait(wait_handler());
+ set.async_wait(wait_handler(wh_called));
#endif
std::error_code ec;
BOOST_REQUIRE(!ec);
#if defined(BOOST_WINDOWS_API)
- windows::object_handle handle(io_context, c.native_handle());
- handle.async_wait(wait_handler(handle.native_handle()));
+ windows::object_handle handle(io_context.get_executor(), c.native_handle());
+ handle.async_wait(wait_handler(handle.native_handle(), wh_called));
#endif
- std::cout << "async_wait 1" << std::endl;
io_context.run();
- std::cout << "async_wait 2" << std::endl;
+ BOOST_CHECK_MESSAGE(wh_called, "Wait handler not called");
}
+
+
+
+BOOST_AUTO_TEST_CASE(async_nowait)
+{
+ // No need to call wait when passing an io_context
+ using boost::unit_test::framework::master_test_suite;
+ using namespace boost::asio;
+
+ std::error_code ec;
+ boost::asio::io_context io_context;
+ bp::child c(
+ master_test_suite().argv[1],
+ "test", "--exit-code", "221",
+ ec,
+ bp::on_exit=[](int exit_code, std::error_code) mutable {},
+ io_context
+ );
+ BOOST_REQUIRE(!ec);
+ io_context.run();
+ BOOST_CHECK_EQUAL(221, c.exit_code());
+}
\ No newline at end of file