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";
101 Subprocess* subproc = subprocs_.Add(kSimpleCommand);
104 while (!subproc->
Done()) {
110 ASSERT_EQ(1u, subprocs_.finished_.size());
115 const char* kCommands[3] = {
126 for (
int i = 0; i < 3; ++i) {
127 processes[i] = subprocs_.Add(kCommands[i]);
131 ASSERT_EQ(3u, subprocs_.running_.size());
132 for (
int i = 0; i < 3; ++i) {
133 ASSERT_FALSE(processes[i]->Done());
134 ASSERT_EQ(
"", processes[i]->GetOutput());
137 while (!processes[0]->Done() || !processes[1]->Done() ||
138 !processes[2]->Done()) {
139 ASSERT_GT(subprocs_.running_.size(), 0u);
143 ASSERT_EQ(0u, subprocs_.running_.size());
144 ASSERT_EQ(3u, subprocs_.finished_.size());
146 for (
int i = 0; i < 3; ++i) {
148 ASSERT_NE(
"", processes[i]->GetOutput());
155 #if defined(linux) || defined(__OpenBSD__)
156 TEST_F(SubprocessTest, SetWithLots) {
159 const size_t kNumProcs = 1025;
163 ASSERT_EQ(0, getrlimit(RLIMIT_NOFILE, &rlim));
164 ASSERT_GT(rlim.rlim_cur, kNumProcs)
165 <<
"Raise [ulimit -n] well above " << kNumProcs
166 <<
" to make this test go";
168 vector<Subprocess*> procs;
169 for (
size_t i = 0; i < kNumProcs; ++i) {
170 Subprocess* subproc = subprocs_.Add(
"/bin/echo");
172 procs.push_back(subproc);
174 while (!subprocs_.running_.empty())
176 for (
size_t i = 0; i < procs.size(); ++i) {
178 ASSERT_NE(
"", procs[i]->GetOutput());
180 ASSERT_EQ(kNumProcs, subprocs_.finished_.size());
182 #endif // linux || __OpenBSD__
191 while (!subproc->
Done()) {
195 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)