1 // Copyright (c) 2016 Klemens D. Morgenstern
2 //
3 // Distributed under the Boost Software License, Version 1.0. (See accompanying
4 // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
5 
6 #define BOOST_TEST_MAIN
7 #define BOOST_TEST_IGNORE_SIGCHLD
8 #include <boost/test/included/unit_test.hpp>
9 
10 #include <boost/process/error.hpp>
11 #include <boost/process/io.hpp>
12 #include <boost/process/async.hpp>
13 #include <boost/process/child.hpp>
14 #include <boost/process/async_system.hpp>
15 
16 #include <string>
17 #include <boost/asio/io_context.hpp>
18 #include <boost/asio/post.hpp>
19 #include <boost/asio/spawn.hpp>
20 #include <boost/asio/coroutine.hpp>
21 #include <boost/asio/use_future.hpp>
22 #include <boost/asio/yield.hpp>
23 
24 #include <vector>
25 #include <array>
26 BOOST_AUTO_TEST_SUITE( async );
27 
28 namespace bp = boost::process;
29 BOOST_AUTO_TEST_CASE(stackful, *boost::unit_test::timeout(15))
30 {
31     using boost::unit_test::framework::master_test_suite;
32 
33     bool did_something_else = false;
34 
35     boost::asio::io_context ios;
36     auto stackful =
37             [&](boost::asio::yield_context yield_)
__anonae5e02810102(boost::asio::yield_context yield_) 38             {
39                 int ret =
40                     bp::async_system(
41                         ios, yield_,
42                         master_test_suite().argv[1],
43                         "test", "--exit-code", "123");
44 
45                 BOOST_CHECK_EQUAL(ret, 123);
46                 BOOST_CHECK(did_something_else);
47             };
48 
49     boost::asio::spawn(ios, stackful);
__anonae5e02810202null50     boost::asio::post(ios.get_executor(), [&]{did_something_else = true;});
51 
52     ios.run();
53     BOOST_CHECK(did_something_else);
54 }
55 
56 BOOST_AUTO_TEST_CASE(stackful_except, *boost::unit_test::timeout(15))
57 {
58     using boost::unit_test::framework::master_test_suite;
59 
60     bool did_something_else = false;
61 
62     boost::asio::io_context ios;
63     auto stackful =
64             [&](boost::asio::yield_context yield_)
__anonae5e02810302(boost::asio::yield_context yield_) 65             {
66 
67                 BOOST_CHECK_THROW(
68                     bp::async_system(
69                         ios, yield_,
70                         "none-existing-exe"), boost::system::system_error);
71 
72                 BOOST_CHECK(did_something_else);
73             };
74 
75     boost::asio::spawn(ios, stackful);
__anonae5e02810402null76     boost::asio::post(ios.get_executor(), [&]{did_something_else = true;});
77     ios.run();
78 
79     BOOST_CHECK(did_something_else);
80 }
81 
82 
83 BOOST_AUTO_TEST_CASE(stackful_error, *boost::unit_test::timeout(15))
84 {
85     using boost::unit_test::framework::master_test_suite;
86 
87     bool did_something_else = false;
88 
89     boost::asio::io_context ios;
90     auto stackful =
91             [&](boost::asio::yield_context yield_)
__anonae5e02810502(boost::asio::yield_context yield_) 92             {
93                 boost::system::error_code ec;
94                 auto ret =
95                     bp::async_system(
96                         ios, yield_[ec],
97                         "none-existing-exe");
98 
99                 BOOST_CHECK(ec);
100                 BOOST_CHECK_EQUAL(ret, -1);
101                 BOOST_CHECK(did_something_else);
102             };
103 
104     boost::asio::spawn(ios, stackful);
__anonae5e02810602null105     boost::asio::post(ios.get_executor(), [&]{did_something_else = true;});
106     ios.run();
107 
108     BOOST_CHECK(did_something_else);
109 }
110 
111 BOOST_AUTO_TEST_SUITE_END();