22 #include <sys/resource.h> 29 const char* kSimpleCommand =
"cmd /c dir \\";
31 const char* kSimpleCommand =
"ls /";
34 struct SubprocessTest :
public testing::Test {
41 TEST_F(SubprocessTest, BadCommandStderr) {
42 Subprocess* subproc = subprocs_.Add(
"cmd /c ninja_no_such_command");
45 while (!subproc->
Done()) {
55 TEST_F(SubprocessTest, NoSuchCommand) {
56 Subprocess* subproc = subprocs_.Add(
"ninja_no_such_command");
59 while (!subproc->
Done()) {
67 ASSERT_EQ(
"CreateProcess failed: The system cannot find the file " 74 TEST_F(SubprocessTest, InterruptChild) {
75 Subprocess* subproc = subprocs_.Add(
"kill -INT $$");
78 while (!subproc->
Done()) {
85 TEST_F(SubprocessTest, InterruptParent) {
86 Subprocess* subproc = subprocs_.Add(
"kill -INT $PPID ; sleep 1");
89 while (!subproc->
Done()) {
90 bool interrupted = subprocs_.DoWork();
95 ADD_FAILURE() <<
"We should have been interrupted";
100 if (isatty(0) && isatty(1) && isatty(2)) {
101 Subprocess* subproc = subprocs_.Add(
"test -t 0 -a -t 1 -a -t 2",
105 while (!subproc->
Done()) {
116 Subprocess* subproc = subprocs_.Add(kSimpleCommand);
119 while (!subproc->
Done()) {
125 ASSERT_EQ(1u, subprocs_.finished_.size());
130 const char* kCommands[3] = {
141 for (
int i = 0; i < 3; ++i) {
142 processes[i] = subprocs_.Add(kCommands[i]);
146 ASSERT_EQ(3u, subprocs_.running_.size());
147 for (
int i = 0; i < 3; ++i) {
148 ASSERT_FALSE(processes[i]->Done());
149 ASSERT_EQ(
"", processes[i]->GetOutput());
152 while (!processes[0]->Done() || !processes[1]->Done() ||
153 !processes[2]->Done()) {
154 ASSERT_GT(subprocs_.running_.size(), 0u);
158 ASSERT_EQ(0u, subprocs_.running_.size());
159 ASSERT_EQ(3u, subprocs_.finished_.size());
161 for (
int i = 0; i < 3; ++i) {
163 ASSERT_NE(
"", processes[i]->GetOutput());
170 #if !defined(__APPLE__) && !defined(_WIN32) 174 const size_t kNumProcs = 1025;
178 ASSERT_EQ(0, getrlimit(RLIMIT_NOFILE, &rlim));
179 ASSERT_GT(rlim.rlim_cur, kNumProcs)
180 <<
"Raise [ulimit -n] well above " << kNumProcs
181 <<
" to make this test go";
183 vector<Subprocess*> procs;
184 for (
size_t i = 0; i < kNumProcs; ++i) {
185 Subprocess* subproc = subprocs_.Add(
"/bin/echo");
187 procs.push_back(subproc);
189 while (!subprocs_.running_.empty())
191 for (
size_t i = 0; i < procs.size(); ++i) {
193 ASSERT_NE(
"", procs[i]->GetOutput());
195 ASSERT_EQ(kNumProcs, subprocs_.finished_.size());
197 #endif // !__APPLE__ && !_WIN32 206 while (!subproc->
Done()) {
210 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...
const string & GetOutput() const
Subprocess wraps a single async subprocess.
TEST_F(SubprocessTest, BadCommandStderr)