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
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)
10 #define BOOST_TEST_MAIN
11 #define BOOST_TEST_IGNORE_SIGCHLD
12 #include <boost/test/included/unit_test.hpp>
14 #include <boost/system/error_code.hpp>
16 #include <boost/asio.hpp>
17 #include <boost/algorithm/string/predicate.hpp>
19 #include <boost/process/error.hpp>
20 #include <boost/process/io.hpp>
21 #include <boost/process/args.hpp>
22 #include <boost/process/child.hpp>
23 #include <boost/process/group.hpp>
24 #include <system_error>
31 #if defined(BOOST_WINDOWS_API)
33 typedef boost::asio::windows::stream_handle pipe_end
;
34 #elif defined(BOOST_POSIX_API)
35 # include <sys/wait.h>
37 typedef boost::asio::posix::stream_descriptor pipe_end
;
40 namespace bp
= boost::process
;
42 BOOST_AUTO_TEST_CASE(group_test
, *boost::unit_test::timeout(5))
44 std::cout
<< "group_test" << std::endl
;
45 using boost::unit_test::framework::master_test_suite
;
52 master_test_suite().argv
[1],
56 BOOST_CHECK(c
.running());
59 BOOST_REQUIRE(c
.in_group());
61 BOOST_CHECK(c
.running());
63 BOOST_REQUIRE_NO_THROW(g
.terminate());
64 std::this_thread::sleep_for(std::chrono::milliseconds(50));
66 BOOST_CHECK(!c
.running());
71 BOOST_AUTO_TEST_CASE(attached
, *boost::unit_test::timeout(5))
73 using boost::unit_test::framework::master_test_suite
;
81 master_test_suite().argv
[1],
82 bp::args
+={"--launch-attached"},
88 BOOST_REQUIRE(c
.in_group(ec
));
96 is
>> pid
; //invalid pid.
100 std::this_thread::sleep_for(std::chrono::milliseconds(50)); //just to be sure.
103 #if defined( BOOST_POSIX_API )
104 BOOST_CHECK(kill(sub_c
.id(), 0) == 0);
106 BOOST_CHECK(sub_c
.running());
109 BOOST_REQUIRE_NO_THROW(g
.terminate());
112 std::this_thread::sleep_for(std::chrono::milliseconds(50)); //just to be sure.
114 BOOST_CHECK(!c
.running());
116 #if defined( BOOST_POSIX_API )
117 bool still_runs
= kill(sub_c
.id(), 0) == 0;
119 bool still_runs
= sub_c
.running();
122 BOOST_CHECK(!still_runs
);
125 BOOST_CHECK(!c
.running());
133 BOOST_AUTO_TEST_CASE(detached
, *boost::unit_test::timeout(5))
135 std::cerr
<< "detached" << std::endl
;
137 using boost::unit_test::framework::master_test_suite
;
146 master_test_suite().argv
[1],
147 bp::args
+={"--launch-detached"},
159 bp::child
sub_c(pid
);
161 std::this_thread::sleep_for(std::chrono::milliseconds(50)); //just to be sure.
163 #if defined( BOOST_POSIX_API )
164 BOOST_CHECK(kill(sub_c
.id(), 0) == 0);
166 BOOST_CHECK(sub_c
.running());
169 BOOST_REQUIRE_NO_THROW(g
.terminate());
172 std::this_thread::sleep_for(std::chrono::milliseconds(50)); //just to be sure.
174 #if defined( BOOST_POSIX_API )
175 bool still_runs
= kill(sub_c
.id(), 0) == 0;
177 bool still_runs
= sub_c
.running();
180 BOOST_CHECK(still_runs
);
184 BOOST_CHECK(!c
.running());