23 #include <sys/resource.h> 32 const char* kSimpleCommand =
"cmd /c dir \\";
34 const char* kSimpleCommand =
"ls /";
44 TEST_F(SubprocessTest, BadCommandStderr) {
45 Subprocess* subproc = subprocs_.Add(
"cmd /c ninja_no_such_command");
48 while (!subproc->
Done()) {
58 TEST_F(SubprocessTest, NoSuchCommand) {
59 Subprocess* subproc = subprocs_.Add(
"ninja_no_such_command");
62 while (!subproc->
Done()) {
70 ASSERT_EQ(
"CreateProcess failed: The system cannot find the file " 77 TEST_F(SubprocessTest, InterruptChild) {
78 Subprocess* subproc = subprocs_.Add(
"kill -INT $$");
81 while (!subproc->
Done()) {
88 TEST_F(SubprocessTest, InterruptParent) {
89 Subprocess* subproc = subprocs_.Add(
"kill -INT $PPID ; sleep 1");
92 while (!subproc->
Done()) {
93 bool interrupted = subprocs_.DoWork();
101 TEST_F(SubprocessTest, InterruptChildWithSigTerm) {
102 Subprocess* subproc = subprocs_.Add(
"kill -TERM $$");
105 while (!subproc->
Done()) {
112 TEST_F(SubprocessTest, InterruptParentWithSigTerm) {
113 Subprocess* subproc = subprocs_.Add(
"kill -TERM $PPID ; sleep 1");
116 while (!subproc->
Done()) {
117 bool interrupted = subprocs_.DoWork();
125 TEST_F(SubprocessTest, InterruptChildWithSigHup) {
126 Subprocess* subproc = subprocs_.Add(
"kill -HUP $$");
129 while (!subproc->
Done()) {
136 TEST_F(SubprocessTest, InterruptParentWithSigHup) {
137 Subprocess* subproc = subprocs_.Add(
"kill -HUP $PPID ; sleep 1");
140 while (!subproc->
Done()) {
141 bool interrupted = subprocs_.DoWork();
151 if (isatty(0) && isatty(1) && isatty(2)) {
153 subprocs_.Add(
"test -t 0 -a -t 1 -a -t 2",
true);
156 while (!subproc->
Done()) {
167 Subprocess* subproc = subprocs_.Add(kSimpleCommand);
170 while (!subproc->
Done()) {
176 ASSERT_EQ(1u, subprocs_.finished_.size());
181 const char* kCommands[3] = {
192 for (
int i = 0; i < 3; ++i) {
193 processes[i] = subprocs_.Add(kCommands[i]);
197 ASSERT_EQ(3u, subprocs_.running_.size());
198 for (
int i = 0; i < 3; ++i) {
200 ASSERT_EQ(
"", processes[i]->GetOutput());
203 while (!processes[0]->Done() || !processes[1]->Done() ||
204 !processes[2]->Done()) {
205 ASSERT_GT(subprocs_.running_.size(), 0u);
209 ASSERT_EQ(0u, subprocs_.running_.size());
210 ASSERT_EQ(3u, subprocs_.finished_.size());
212 for (
int i = 0; i < 3; ++i) {
214 ASSERT_NE(
"", processes[i]->GetOutput());
219 #if defined(USE_PPOLL) 220 TEST_F(SubprocessTest, SetWithLots) {
223 const unsigned kNumProcs = 1025;
227 ASSERT_EQ(0, getrlimit(RLIMIT_NOFILE, &rlim));
228 if (rlim.rlim_cur < kNumProcs) {
229 printf(
"Raise [ulimit -n] above %u (currently %lu) to make this test go\n",
230 kNumProcs, rlim.rlim_cur);
234 vector<Subprocess*> procs;
235 for (
size_t i = 0; i < kNumProcs; ++i) {
236 Subprocess* subproc = subprocs_.Add(
"/bin/echo");
238 procs.push_back(subproc);
240 while (!subprocs_.running_.empty())
242 for (
size_t i = 0; i < procs.size(); ++i) {
246 ASSERT_EQ(kNumProcs, subprocs_.finished_.size());
248 #endif // !__APPLE__ && !_WIN32 257 while (!subproc->
Done()) {
261 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 std::string & GetOutput() const