23 #include <sys/resource.h> 30 const char* kSimpleCommand =
"cmd /c dir \\";
32 const char* kSimpleCommand =
"ls /";
42 TEST_F(SubprocessTest, BadCommandStderr) {
43 Subprocess* subproc = subprocs_.Add(
"cmd /c ninja_no_such_command");
46 while (!subproc->
Done()) {
56 TEST_F(SubprocessTest, NoSuchCommand) {
57 Subprocess* subproc = subprocs_.Add(
"ninja_no_such_command");
60 while (!subproc->
Done()) {
68 ASSERT_EQ(
"CreateProcess failed: The system cannot find the file " 75 TEST_F(SubprocessTest, InterruptChild) {
76 Subprocess* subproc = subprocs_.Add(
"kill -INT $$");
79 while (!subproc->
Done()) {
86 TEST_F(SubprocessTest, InterruptParent) {
87 Subprocess* subproc = subprocs_.Add(
"kill -INT $PPID ; sleep 1");
90 while (!subproc->
Done()) {
91 bool interrupted = subprocs_.DoWork();
99 TEST_F(SubprocessTest, InterruptChildWithSigTerm) {
100 Subprocess* subproc = subprocs_.Add(
"kill -TERM $$");
103 while (!subproc->
Done()) {
110 TEST_F(SubprocessTest, InterruptParentWithSigTerm) {
111 Subprocess* subproc = subprocs_.Add(
"kill -TERM $PPID ; sleep 1");
114 while (!subproc->
Done()) {
115 bool interrupted = subprocs_.DoWork();
123 TEST_F(SubprocessTest, InterruptChildWithSigHup) {
124 Subprocess* subproc = subprocs_.Add(
"kill -HUP $$");
127 while (!subproc->
Done()) {
134 TEST_F(SubprocessTest, InterruptParentWithSigHup) {
135 Subprocess* subproc = subprocs_.Add(
"kill -HUP $PPID ; sleep 1");
138 while (!subproc->
Done()) {
139 bool interrupted = subprocs_.DoWork();
149 if (isatty(0) && isatty(1) && isatty(2)) {
151 subprocs_.Add(
"test -t 0 -a -t 1 -a -t 2",
true);
154 while (!subproc->
Done()) {
165 Subprocess* subproc = subprocs_.Add(kSimpleCommand);
168 while (!subproc->
Done()) {
174 ASSERT_EQ(1u, subprocs_.finished_.size());
179 const char* kCommands[3] = {
190 for (
int i = 0; i < 3; ++i) {
191 processes[i] = subprocs_.Add(kCommands[i]);
195 ASSERT_EQ(3u, subprocs_.running_.size());
196 for (
int i = 0; i < 3; ++i) {
198 ASSERT_EQ(
"", processes[i]->GetOutput());
201 while (!processes[0]->Done() || !processes[1]->Done() ||
202 !processes[2]->Done()) {
203 ASSERT_GT(subprocs_.running_.size(), 0u);
207 ASSERT_EQ(0u, subprocs_.running_.size());
208 ASSERT_EQ(3u, subprocs_.finished_.size());
210 for (
int i = 0; i < 3; ++i) {
212 ASSERT_NE(
"", processes[i]->GetOutput());
217 #if defined(USE_PPOLL) 218 TEST_F(SubprocessTest, SetWithLots) {
221 const unsigned kNumProcs = 1025;
225 ASSERT_EQ(0, getrlimit(RLIMIT_NOFILE, &rlim));
226 if (rlim.rlim_cur < kNumProcs) {
227 printf(
"Raise [ulimit -n] above %u (currently %lu) to make this test go\n",
228 kNumProcs, rlim.rlim_cur);
232 vector<Subprocess*> procs;
233 for (
size_t i = 0; i < kNumProcs; ++i) {
234 Subprocess* subproc = subprocs_.Add(
"/bin/echo");
236 procs.push_back(subproc);
238 while (!subprocs_.running_.empty())
240 for (
size_t i = 0; i < procs.size(); ++i) {
244 ASSERT_EQ(kNumProcs, subprocs_.finished_.size());
246 #endif // !__APPLE__ && !_WIN32 255 while (!subproc->
Done()) {
259 ASSERT_EQ(1u, subprocs_.finished_.size());
SubprocessSet runs a ppoll/pselect() loop around a set of Subprocesses.
ExitStatus Finish()
Returns ExitSuccess on successful process exit, ExitInterrupted if the process was interrupted...
Subprocess wraps a single async subprocess.
TEST_F(SubprocessTest, BadCommandStderr)
const string & GetOutput() const