1*6dbdd20aSAndroid Build Coastguard Worker /*
2*6dbdd20aSAndroid Build Coastguard Worker * Copyright (C) 2019 The Android Open Source Project
3*6dbdd20aSAndroid Build Coastguard Worker *
4*6dbdd20aSAndroid Build Coastguard Worker * Licensed under the Apache License, Version 2.0 (the "License");
5*6dbdd20aSAndroid Build Coastguard Worker * you may not use this file except in compliance with the License.
6*6dbdd20aSAndroid Build Coastguard Worker * You may obtain a copy of the License at
7*6dbdd20aSAndroid Build Coastguard Worker *
8*6dbdd20aSAndroid Build Coastguard Worker * http://www.apache.org/licenses/LICENSE-2.0
9*6dbdd20aSAndroid Build Coastguard Worker *
10*6dbdd20aSAndroid Build Coastguard Worker * Unless required by applicable law or agreed to in writing, software
11*6dbdd20aSAndroid Build Coastguard Worker * distributed under the License is distributed on an "AS IS" BASIS,
12*6dbdd20aSAndroid Build Coastguard Worker * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13*6dbdd20aSAndroid Build Coastguard Worker * See the License for the specific language governing permissions and
14*6dbdd20aSAndroid Build Coastguard Worker * limitations under the License.
15*6dbdd20aSAndroid Build Coastguard Worker */
16*6dbdd20aSAndroid Build Coastguard Worker
17*6dbdd20aSAndroid Build Coastguard Worker #include "perfetto/ext/base/subprocess.h"
18*6dbdd20aSAndroid Build Coastguard Worker
19*6dbdd20aSAndroid Build Coastguard Worker #include <thread>
20*6dbdd20aSAndroid Build Coastguard Worker
21*6dbdd20aSAndroid Build Coastguard Worker #if PERFETTO_BUILDFLAG(PERFETTO_OS_WIN)
22*6dbdd20aSAndroid Build Coastguard Worker #include <Windows.h>
23*6dbdd20aSAndroid Build Coastguard Worker #else
24*6dbdd20aSAndroid Build Coastguard Worker #include <signal.h>
25*6dbdd20aSAndroid Build Coastguard Worker #include <sys/stat.h>
26*6dbdd20aSAndroid Build Coastguard Worker #include <unistd.h>
27*6dbdd20aSAndroid Build Coastguard Worker #endif
28*6dbdd20aSAndroid Build Coastguard Worker
29*6dbdd20aSAndroid Build Coastguard Worker #include "perfetto/base/time.h"
30*6dbdd20aSAndroid Build Coastguard Worker #include "perfetto/ext/base/file_utils.h"
31*6dbdd20aSAndroid Build Coastguard Worker #include "perfetto/ext/base/pipe.h"
32*6dbdd20aSAndroid Build Coastguard Worker #include "perfetto/ext/base/temp_file.h"
33*6dbdd20aSAndroid Build Coastguard Worker #include "test/gtest_and_gmock.h"
34*6dbdd20aSAndroid Build Coastguard Worker
35*6dbdd20aSAndroid Build Coastguard Worker namespace perfetto {
36*6dbdd20aSAndroid Build Coastguard Worker namespace base {
37*6dbdd20aSAndroid Build Coastguard Worker namespace {
38*6dbdd20aSAndroid Build Coastguard Worker
GetOutput(const Subprocess & p)39*6dbdd20aSAndroid Build Coastguard Worker std::string GetOutput(const Subprocess& p) {
40*6dbdd20aSAndroid Build Coastguard Worker std::string output = p.output();
41*6dbdd20aSAndroid Build Coastguard Worker #if PERFETTO_BUILDFLAG(PERFETTO_OS_WIN)
42*6dbdd20aSAndroid Build Coastguard Worker size_t pos = 0;
43*6dbdd20aSAndroid Build Coastguard Worker while ((pos = output.find("\r\n", pos)) != std::string::npos)
44*6dbdd20aSAndroid Build Coastguard Worker output.erase(pos, 1);
45*6dbdd20aSAndroid Build Coastguard Worker #endif
46*6dbdd20aSAndroid Build Coastguard Worker return output;
47*6dbdd20aSAndroid Build Coastguard Worker }
48*6dbdd20aSAndroid Build Coastguard Worker
GenLargeString()49*6dbdd20aSAndroid Build Coastguard Worker std::string GenLargeString() {
50*6dbdd20aSAndroid Build Coastguard Worker std::string contents;
51*6dbdd20aSAndroid Build Coastguard Worker for (int i = 0; i < 4096; i++) {
52*6dbdd20aSAndroid Build Coastguard Worker contents += "very long text " + std::to_string(i) + "\n";
53*6dbdd20aSAndroid Build Coastguard Worker }
54*6dbdd20aSAndroid Build Coastguard Worker // Make sure that |contents| is > the default pipe buffer on Linux (4 pages).
55*6dbdd20aSAndroid Build Coastguard Worker PERFETTO_DCHECK(contents.size() > 4096 * 4);
56*6dbdd20aSAndroid Build Coastguard Worker return contents;
57*6dbdd20aSAndroid Build Coastguard Worker }
58*6dbdd20aSAndroid Build Coastguard Worker
TEST(SubprocessTest,InvalidPath)59*6dbdd20aSAndroid Build Coastguard Worker TEST(SubprocessTest, InvalidPath) {
60*6dbdd20aSAndroid Build Coastguard Worker Subprocess p({"/usr/bin/invalid_1337"});
61*6dbdd20aSAndroid Build Coastguard Worker EXPECT_FALSE(p.Call());
62*6dbdd20aSAndroid Build Coastguard Worker EXPECT_EQ(p.status(), Subprocess::kTerminated);
63*6dbdd20aSAndroid Build Coastguard Worker #if PERFETTO_BUILDFLAG(PERFETTO_OS_WIN)
64*6dbdd20aSAndroid Build Coastguard Worker EXPECT_EQ(p.returncode(), ERROR_FILE_NOT_FOUND);
65*6dbdd20aSAndroid Build Coastguard Worker #else
66*6dbdd20aSAndroid Build Coastguard Worker EXPECT_EQ(p.returncode(), 128);
67*6dbdd20aSAndroid Build Coastguard Worker EXPECT_EQ(GetOutput(p), "execve() failed\n");
68*6dbdd20aSAndroid Build Coastguard Worker #endif
69*6dbdd20aSAndroid Build Coastguard Worker }
70*6dbdd20aSAndroid Build Coastguard Worker
TEST(SubprocessTest,StdoutOnly)71*6dbdd20aSAndroid Build Coastguard Worker TEST(SubprocessTest, StdoutOnly) {
72*6dbdd20aSAndroid Build Coastguard Worker #if PERFETTO_BUILDFLAG(PERFETTO_OS_WIN)
73*6dbdd20aSAndroid Build Coastguard Worker Subprocess p({"cmd", "/c", "(echo skip_err 1>&2) && echo out_only"});
74*6dbdd20aSAndroid Build Coastguard Worker #else
75*6dbdd20aSAndroid Build Coastguard Worker Subprocess p({"sh", "-c", "(echo skip_err >&2); echo out_only"});
76*6dbdd20aSAndroid Build Coastguard Worker #endif
77*6dbdd20aSAndroid Build Coastguard Worker p.args.stdout_mode = Subprocess::OutputMode::kBuffer;
78*6dbdd20aSAndroid Build Coastguard Worker p.args.stderr_mode = Subprocess::OutputMode::kDevNull;
79*6dbdd20aSAndroid Build Coastguard Worker
80*6dbdd20aSAndroid Build Coastguard Worker EXPECT_TRUE(p.Call());
81*6dbdd20aSAndroid Build Coastguard Worker EXPECT_EQ(p.status(), Subprocess::kTerminated);
82*6dbdd20aSAndroid Build Coastguard Worker EXPECT_EQ(GetOutput(p), "out_only\n");
83*6dbdd20aSAndroid Build Coastguard Worker }
84*6dbdd20aSAndroid Build Coastguard Worker
TEST(SubprocessTest,StderrOnly)85*6dbdd20aSAndroid Build Coastguard Worker TEST(SubprocessTest, StderrOnly) {
86*6dbdd20aSAndroid Build Coastguard Worker #if PERFETTO_BUILDFLAG(PERFETTO_OS_WIN)
87*6dbdd20aSAndroid Build Coastguard Worker Subprocess p({"cmd", "/c", "(echo err_only>&2) && echo skip_out"});
88*6dbdd20aSAndroid Build Coastguard Worker #else
89*6dbdd20aSAndroid Build Coastguard Worker Subprocess p({"sh", "-c", "(echo err_only >&2); echo skip_out"});
90*6dbdd20aSAndroid Build Coastguard Worker #endif
91*6dbdd20aSAndroid Build Coastguard Worker p.args.stdout_mode = Subprocess::OutputMode::kDevNull;
92*6dbdd20aSAndroid Build Coastguard Worker p.args.stderr_mode = Subprocess::OutputMode::kBuffer;
93*6dbdd20aSAndroid Build Coastguard Worker EXPECT_TRUE(p.Call());
94*6dbdd20aSAndroid Build Coastguard Worker EXPECT_EQ(GetOutput(p), "err_only\n");
95*6dbdd20aSAndroid Build Coastguard Worker }
96*6dbdd20aSAndroid Build Coastguard Worker
TEST(SubprocessTest,BothStdoutAndStderr)97*6dbdd20aSAndroid Build Coastguard Worker TEST(SubprocessTest, BothStdoutAndStderr) {
98*6dbdd20aSAndroid Build Coastguard Worker #if PERFETTO_BUILDFLAG(PERFETTO_OS_WIN)
99*6dbdd20aSAndroid Build Coastguard Worker Subprocess p({"cmd", "/c", "echo out&&(echo err>&2)&&echo out2"});
100*6dbdd20aSAndroid Build Coastguard Worker #else
101*6dbdd20aSAndroid Build Coastguard Worker Subprocess p({"sh", "-c", "echo out; (echo err >&2); echo out2"});
102*6dbdd20aSAndroid Build Coastguard Worker #endif
103*6dbdd20aSAndroid Build Coastguard Worker p.args.stdout_mode = Subprocess::OutputMode::kBuffer;
104*6dbdd20aSAndroid Build Coastguard Worker p.args.stderr_mode = Subprocess::OutputMode::kBuffer;
105*6dbdd20aSAndroid Build Coastguard Worker EXPECT_TRUE(p.Call());
106*6dbdd20aSAndroid Build Coastguard Worker EXPECT_EQ(GetOutput(p), "out\nerr\nout2\n");
107*6dbdd20aSAndroid Build Coastguard Worker }
108*6dbdd20aSAndroid Build Coastguard Worker
TEST(SubprocessTest,CatInputModeDevNull)109*6dbdd20aSAndroid Build Coastguard Worker TEST(SubprocessTest, CatInputModeDevNull) {
110*6dbdd20aSAndroid Build Coastguard Worker std::string ignored_input = "ignored input";
111*6dbdd20aSAndroid Build Coastguard Worker #if PERFETTO_BUILDFLAG(PERFETTO_OS_WIN)
112*6dbdd20aSAndroid Build Coastguard Worker Subprocess p({"cmd", "/C", "findstr . || exit 0"});
113*6dbdd20aSAndroid Build Coastguard Worker #else
114*6dbdd20aSAndroid Build Coastguard Worker Subprocess p({"cat", "-"});
115*6dbdd20aSAndroid Build Coastguard Worker #endif
116*6dbdd20aSAndroid Build Coastguard Worker p.args.stdout_mode = Subprocess::OutputMode::kBuffer;
117*6dbdd20aSAndroid Build Coastguard Worker p.args.input = ignored_input;
118*6dbdd20aSAndroid Build Coastguard Worker p.args.stdin_mode = Subprocess::InputMode::kDevNull;
119*6dbdd20aSAndroid Build Coastguard Worker EXPECT_TRUE(p.Call());
120*6dbdd20aSAndroid Build Coastguard Worker EXPECT_EQ(p.status(), Subprocess::kTerminated);
121*6dbdd20aSAndroid Build Coastguard Worker EXPECT_EQ(GetOutput(p), "");
122*6dbdd20aSAndroid Build Coastguard Worker }
123*6dbdd20aSAndroid Build Coastguard Worker
TEST(SubprocessTest,BothStdoutAndStderrInputModeDevNull)124*6dbdd20aSAndroid Build Coastguard Worker TEST(SubprocessTest, BothStdoutAndStderrInputModeDevNull) {
125*6dbdd20aSAndroid Build Coastguard Worker #if PERFETTO_BUILDFLAG(PERFETTO_OS_WIN)
126*6dbdd20aSAndroid Build Coastguard Worker Subprocess p({"cmd", "/c", "echo out&&(echo err>&2)&&echo out2"});
127*6dbdd20aSAndroid Build Coastguard Worker #else
128*6dbdd20aSAndroid Build Coastguard Worker Subprocess p({"sh", "-c", "echo out; (echo err >&2); echo out2"});
129*6dbdd20aSAndroid Build Coastguard Worker #endif
130*6dbdd20aSAndroid Build Coastguard Worker p.args.stdout_mode = Subprocess::OutputMode::kBuffer;
131*6dbdd20aSAndroid Build Coastguard Worker p.args.stderr_mode = Subprocess::OutputMode::kBuffer;
132*6dbdd20aSAndroid Build Coastguard Worker p.args.stdin_mode = Subprocess::InputMode::kDevNull;
133*6dbdd20aSAndroid Build Coastguard Worker EXPECT_TRUE(p.Call());
134*6dbdd20aSAndroid Build Coastguard Worker EXPECT_EQ(GetOutput(p), "out\nerr\nout2\n");
135*6dbdd20aSAndroid Build Coastguard Worker }
136*6dbdd20aSAndroid Build Coastguard Worker
TEST(SubprocessTest,AllDevNull)137*6dbdd20aSAndroid Build Coastguard Worker TEST(SubprocessTest, AllDevNull) {
138*6dbdd20aSAndroid Build Coastguard Worker #if PERFETTO_BUILDFLAG(PERFETTO_OS_WIN)
139*6dbdd20aSAndroid Build Coastguard Worker Subprocess p({"cmd", "/c", "(exit 1)"});
140*6dbdd20aSAndroid Build Coastguard Worker #else
141*6dbdd20aSAndroid Build Coastguard Worker Subprocess p({"false"});
142*6dbdd20aSAndroid Build Coastguard Worker #endif
143*6dbdd20aSAndroid Build Coastguard Worker p.args.stdout_mode = Subprocess::OutputMode::kDevNull;
144*6dbdd20aSAndroid Build Coastguard Worker p.args.stderr_mode = Subprocess::OutputMode::kDevNull;
145*6dbdd20aSAndroid Build Coastguard Worker p.args.stdin_mode = Subprocess::InputMode::kDevNull;
146*6dbdd20aSAndroid Build Coastguard Worker EXPECT_FALSE(p.Call());
147*6dbdd20aSAndroid Build Coastguard Worker EXPECT_EQ(p.status(), Subprocess::kTerminated);
148*6dbdd20aSAndroid Build Coastguard Worker EXPECT_EQ(p.returncode(), 1);
149*6dbdd20aSAndroid Build Coastguard Worker }
150*6dbdd20aSAndroid Build Coastguard Worker
TEST(SubprocessTest,BinTrue)151*6dbdd20aSAndroid Build Coastguard Worker TEST(SubprocessTest, BinTrue) {
152*6dbdd20aSAndroid Build Coastguard Worker #if PERFETTO_BUILDFLAG(PERFETTO_OS_WIN)
153*6dbdd20aSAndroid Build Coastguard Worker Subprocess p({"cmd", "/c", "(exit 0)"});
154*6dbdd20aSAndroid Build Coastguard Worker #else
155*6dbdd20aSAndroid Build Coastguard Worker Subprocess p({"true"});
156*6dbdd20aSAndroid Build Coastguard Worker #endif
157*6dbdd20aSAndroid Build Coastguard Worker EXPECT_TRUE(p.Call());
158*6dbdd20aSAndroid Build Coastguard Worker EXPECT_EQ(p.status(), Subprocess::kTerminated);
159*6dbdd20aSAndroid Build Coastguard Worker EXPECT_EQ(p.returncode(), 0);
160*6dbdd20aSAndroid Build Coastguard Worker }
161*6dbdd20aSAndroid Build Coastguard Worker
TEST(SubprocessTest,BinFalse)162*6dbdd20aSAndroid Build Coastguard Worker TEST(SubprocessTest, BinFalse) {
163*6dbdd20aSAndroid Build Coastguard Worker #if PERFETTO_BUILDFLAG(PERFETTO_OS_WIN)
164*6dbdd20aSAndroid Build Coastguard Worker Subprocess p({"cmd", "/c", "(exit 1)"});
165*6dbdd20aSAndroid Build Coastguard Worker #else
166*6dbdd20aSAndroid Build Coastguard Worker Subprocess p({"false"});
167*6dbdd20aSAndroid Build Coastguard Worker #endif
168*6dbdd20aSAndroid Build Coastguard Worker EXPECT_FALSE(p.Call());
169*6dbdd20aSAndroid Build Coastguard Worker EXPECT_EQ(p.status(), Subprocess::kTerminated);
170*6dbdd20aSAndroid Build Coastguard Worker EXPECT_EQ(p.returncode(), 1);
171*6dbdd20aSAndroid Build Coastguard Worker }
172*6dbdd20aSAndroid Build Coastguard Worker
TEST(SubprocessTest,Echo)173*6dbdd20aSAndroid Build Coastguard Worker TEST(SubprocessTest, Echo) {
174*6dbdd20aSAndroid Build Coastguard Worker #if PERFETTO_BUILDFLAG(PERFETTO_OS_WIN)
175*6dbdd20aSAndroid Build Coastguard Worker Subprocess p({"cmd", "/c", "echo|set /p ignored_var=foobar"});
176*6dbdd20aSAndroid Build Coastguard Worker #else
177*6dbdd20aSAndroid Build Coastguard Worker Subprocess p({"echo", "-n", "foobar"});
178*6dbdd20aSAndroid Build Coastguard Worker #endif
179*6dbdd20aSAndroid Build Coastguard Worker p.args.stdout_mode = Subprocess::OutputMode::kBuffer;
180*6dbdd20aSAndroid Build Coastguard Worker EXPECT_TRUE(p.Call());
181*6dbdd20aSAndroid Build Coastguard Worker EXPECT_EQ(p.status(), Subprocess::kTerminated);
182*6dbdd20aSAndroid Build Coastguard Worker EXPECT_EQ(p.returncode(), 0);
183*6dbdd20aSAndroid Build Coastguard Worker EXPECT_EQ(GetOutput(p), "foobar");
184*6dbdd20aSAndroid Build Coastguard Worker }
185*6dbdd20aSAndroid Build Coastguard Worker
TEST(SubprocessTest,FeedbackLongInput)186*6dbdd20aSAndroid Build Coastguard Worker TEST(SubprocessTest, FeedbackLongInput) {
187*6dbdd20aSAndroid Build Coastguard Worker std::string contents = GenLargeString();
188*6dbdd20aSAndroid Build Coastguard Worker #if PERFETTO_BUILDFLAG(PERFETTO_OS_WIN)
189*6dbdd20aSAndroid Build Coastguard Worker Subprocess p({"cmd", "/C", "findstr ."});
190*6dbdd20aSAndroid Build Coastguard Worker #else
191*6dbdd20aSAndroid Build Coastguard Worker Subprocess p({"cat", "-"});
192*6dbdd20aSAndroid Build Coastguard Worker #endif
193*6dbdd20aSAndroid Build Coastguard Worker p.args.stdout_mode = Subprocess::OutputMode::kBuffer;
194*6dbdd20aSAndroid Build Coastguard Worker p.args.input = contents;
195*6dbdd20aSAndroid Build Coastguard Worker EXPECT_TRUE(p.Call());
196*6dbdd20aSAndroid Build Coastguard Worker EXPECT_EQ(p.status(), Subprocess::kTerminated);
197*6dbdd20aSAndroid Build Coastguard Worker EXPECT_EQ(p.returncode(), 0);
198*6dbdd20aSAndroid Build Coastguard Worker EXPECT_EQ(GetOutput(p), contents);
199*6dbdd20aSAndroid Build Coastguard Worker }
200*6dbdd20aSAndroid Build Coastguard Worker
TEST(SubprocessTest,CatLargeFile)201*6dbdd20aSAndroid Build Coastguard Worker TEST(SubprocessTest, CatLargeFile) {
202*6dbdd20aSAndroid Build Coastguard Worker std::string contents = GenLargeString();
203*6dbdd20aSAndroid Build Coastguard Worker TempFile tf = TempFile::Create();
204*6dbdd20aSAndroid Build Coastguard Worker WriteAll(tf.fd(), contents.data(), contents.size());
205*6dbdd20aSAndroid Build Coastguard Worker FlushFile(tf.fd());
206*6dbdd20aSAndroid Build Coastguard Worker #if PERFETTO_BUILDFLAG(PERFETTO_OS_WIN)
207*6dbdd20aSAndroid Build Coastguard Worker Subprocess p({"cmd", "/c", ("type \"" + tf.path() + "\"").c_str()});
208*6dbdd20aSAndroid Build Coastguard Worker #else
209*6dbdd20aSAndroid Build Coastguard Worker Subprocess p({"cat", tf.path().c_str()});
210*6dbdd20aSAndroid Build Coastguard Worker #endif
211*6dbdd20aSAndroid Build Coastguard Worker p.args.stdout_mode = Subprocess::OutputMode::kBuffer;
212*6dbdd20aSAndroid Build Coastguard Worker EXPECT_TRUE(p.Call());
213*6dbdd20aSAndroid Build Coastguard Worker EXPECT_EQ(GetOutput(p), contents);
214*6dbdd20aSAndroid Build Coastguard Worker }
215*6dbdd20aSAndroid Build Coastguard Worker
TEST(SubprocessTest,Timeout)216*6dbdd20aSAndroid Build Coastguard Worker TEST(SubprocessTest, Timeout) {
217*6dbdd20aSAndroid Build Coastguard Worker #if PERFETTO_BUILDFLAG(PERFETTO_OS_WIN)
218*6dbdd20aSAndroid Build Coastguard Worker Subprocess p({"ping", "127.0.0.1", "-n", "60"});
219*6dbdd20aSAndroid Build Coastguard Worker p.args.stdout_mode = Subprocess::OutputMode::kDevNull;
220*6dbdd20aSAndroid Build Coastguard Worker #else
221*6dbdd20aSAndroid Build Coastguard Worker Subprocess p({"sleep", "60"});
222*6dbdd20aSAndroid Build Coastguard Worker #endif
223*6dbdd20aSAndroid Build Coastguard Worker
224*6dbdd20aSAndroid Build Coastguard Worker EXPECT_FALSE(p.Call(/*timeout_ms=*/1));
225*6dbdd20aSAndroid Build Coastguard Worker EXPECT_EQ(p.status(), Subprocess::kTerminated);
226*6dbdd20aSAndroid Build Coastguard Worker EXPECT_TRUE(p.timed_out());
227*6dbdd20aSAndroid Build Coastguard Worker }
228*6dbdd20aSAndroid Build Coastguard Worker
TEST(SubprocessTest,TimeoutNotHit)229*6dbdd20aSAndroid Build Coastguard Worker TEST(SubprocessTest, TimeoutNotHit) {
230*6dbdd20aSAndroid Build Coastguard Worker #if PERFETTO_BUILDFLAG(PERFETTO_OS_WIN)
231*6dbdd20aSAndroid Build Coastguard Worker Subprocess p({"ping", "127.0.0.1", "-n", "1"});
232*6dbdd20aSAndroid Build Coastguard Worker p.args.stdout_mode = Subprocess::OutputMode::kDevNull;
233*6dbdd20aSAndroid Build Coastguard Worker #else
234*6dbdd20aSAndroid Build Coastguard Worker Subprocess p({"sleep", "0.01"});
235*6dbdd20aSAndroid Build Coastguard Worker #endif
236*6dbdd20aSAndroid Build Coastguard Worker EXPECT_TRUE(p.Call(/*timeout_ms=*/100000));
237*6dbdd20aSAndroid Build Coastguard Worker EXPECT_EQ(p.status(), Subprocess::kTerminated);
238*6dbdd20aSAndroid Build Coastguard Worker }
239*6dbdd20aSAndroid Build Coastguard Worker
TEST(SubprocessTest,TimeoutStopOutput)240*6dbdd20aSAndroid Build Coastguard Worker TEST(SubprocessTest, TimeoutStopOutput) {
241*6dbdd20aSAndroid Build Coastguard Worker #if PERFETTO_BUILDFLAG(PERFETTO_OS_WIN)
242*6dbdd20aSAndroid Build Coastguard Worker Subprocess p({"cmd", "/c", "FOR /L %N IN () DO @echo stuff>NUL"});
243*6dbdd20aSAndroid Build Coastguard Worker #else
244*6dbdd20aSAndroid Build Coastguard Worker Subprocess p({"sh", "-c", "while true; do echo stuff; done"});
245*6dbdd20aSAndroid Build Coastguard Worker #endif
246*6dbdd20aSAndroid Build Coastguard Worker p.args.stdout_mode = Subprocess::OutputMode::kDevNull;
247*6dbdd20aSAndroid Build Coastguard Worker EXPECT_FALSE(p.Call(/*timeout_ms=*/10));
248*6dbdd20aSAndroid Build Coastguard Worker EXPECT_EQ(p.status(), Subprocess::kTerminated);
249*6dbdd20aSAndroid Build Coastguard Worker EXPECT_TRUE(p.timed_out());
250*6dbdd20aSAndroid Build Coastguard Worker }
251*6dbdd20aSAndroid Build Coastguard Worker
TEST(SubprocessTest,ExitBeforeReadingStdin)252*6dbdd20aSAndroid Build Coastguard Worker TEST(SubprocessTest, ExitBeforeReadingStdin) {
253*6dbdd20aSAndroid Build Coastguard Worker #if PERFETTO_BUILDFLAG(PERFETTO_OS_WIN)
254*6dbdd20aSAndroid Build Coastguard Worker Subprocess p({"ping", "127.0.0.1", "-n", "1"});
255*6dbdd20aSAndroid Build Coastguard Worker #else
256*6dbdd20aSAndroid Build Coastguard Worker // 'sh -c' is to avoid closing stdin (sleep closes it before sleeping).
257*6dbdd20aSAndroid Build Coastguard Worker Subprocess p({"sh", "-c", "sleep 0.01"});
258*6dbdd20aSAndroid Build Coastguard Worker #endif
259*6dbdd20aSAndroid Build Coastguard Worker p.args.stdout_mode = Subprocess::OutputMode::kDevNull;
260*6dbdd20aSAndroid Build Coastguard Worker p.args.stderr_mode = Subprocess::OutputMode::kDevNull;
261*6dbdd20aSAndroid Build Coastguard Worker p.args.input = GenLargeString();
262*6dbdd20aSAndroid Build Coastguard Worker EXPECT_TRUE(p.Call());
263*6dbdd20aSAndroid Build Coastguard Worker EXPECT_EQ(p.status(), Subprocess::kTerminated);
264*6dbdd20aSAndroid Build Coastguard Worker EXPECT_EQ(p.returncode(), 0);
265*6dbdd20aSAndroid Build Coastguard Worker }
266*6dbdd20aSAndroid Build Coastguard Worker
TEST(SubprocessTest,StdinWriteStall)267*6dbdd20aSAndroid Build Coastguard Worker TEST(SubprocessTest, StdinWriteStall) {
268*6dbdd20aSAndroid Build Coastguard Worker #if PERFETTO_BUILDFLAG(PERFETTO_OS_WIN)
269*6dbdd20aSAndroid Build Coastguard Worker Subprocess p({"ping", "127.0.0.1", "-n", "10"});
270*6dbdd20aSAndroid Build Coastguard Worker #else
271*6dbdd20aSAndroid Build Coastguard Worker // 'sh -c' is to avoid closing stdin (sleep closes it before sleeping).
272*6dbdd20aSAndroid Build Coastguard Worker // This causes a situation where the write on the stdin will stall because
273*6dbdd20aSAndroid Build Coastguard Worker // nobody reads it and the pipe buffer fills up. In this situation we should
274*6dbdd20aSAndroid Build Coastguard Worker // still handle the timeout properly.
275*6dbdd20aSAndroid Build Coastguard Worker Subprocess p({"sh", "-c", "sleep 10"});
276*6dbdd20aSAndroid Build Coastguard Worker #endif
277*6dbdd20aSAndroid Build Coastguard Worker p.args.stdout_mode = Subprocess::OutputMode::kDevNull;
278*6dbdd20aSAndroid Build Coastguard Worker p.args.stderr_mode = Subprocess::OutputMode::kDevNull;
279*6dbdd20aSAndroid Build Coastguard Worker p.args.input = GenLargeString();
280*6dbdd20aSAndroid Build Coastguard Worker EXPECT_FALSE(p.Call(/*timeout_ms=*/10));
281*6dbdd20aSAndroid Build Coastguard Worker EXPECT_EQ(p.status(), Subprocess::kTerminated);
282*6dbdd20aSAndroid Build Coastguard Worker EXPECT_TRUE(p.timed_out());
283*6dbdd20aSAndroid Build Coastguard Worker }
284*6dbdd20aSAndroid Build Coastguard Worker
TEST(SubprocessTest,StartAndWait)285*6dbdd20aSAndroid Build Coastguard Worker TEST(SubprocessTest, StartAndWait) {
286*6dbdd20aSAndroid Build Coastguard Worker #if PERFETTO_BUILDFLAG(PERFETTO_OS_WIN)
287*6dbdd20aSAndroid Build Coastguard Worker Subprocess p({"ping", "127.0.0.1", "-n", "1000"});
288*6dbdd20aSAndroid Build Coastguard Worker #else
289*6dbdd20aSAndroid Build Coastguard Worker Subprocess p({"sleep", "1000"});
290*6dbdd20aSAndroid Build Coastguard Worker #endif
291*6dbdd20aSAndroid Build Coastguard Worker p.args.stdout_mode = Subprocess::OutputMode::kDevNull;
292*6dbdd20aSAndroid Build Coastguard Worker p.Start();
293*6dbdd20aSAndroid Build Coastguard Worker EXPECT_EQ(p.Poll(), Subprocess::kRunning);
294*6dbdd20aSAndroid Build Coastguard Worker p.KillAndWaitForTermination();
295*6dbdd20aSAndroid Build Coastguard Worker
296*6dbdd20aSAndroid Build Coastguard Worker EXPECT_EQ(p.status(), Subprocess::kTerminated);
297*6dbdd20aSAndroid Build Coastguard Worker EXPECT_EQ(p.Poll(), Subprocess::kTerminated);
298*6dbdd20aSAndroid Build Coastguard Worker #if PERFETTO_BUILDFLAG(PERFETTO_OS_WIN)
299*6dbdd20aSAndroid Build Coastguard Worker EXPECT_EQ(p.returncode(), static_cast<int>(STATUS_CONTROL_C_EXIT));
300*6dbdd20aSAndroid Build Coastguard Worker #else
301*6dbdd20aSAndroid Build Coastguard Worker EXPECT_EQ(p.returncode(), static_cast<int>(128 + SIGKILL));
302*6dbdd20aSAndroid Build Coastguard Worker #endif
303*6dbdd20aSAndroid Build Coastguard Worker }
304*6dbdd20aSAndroid Build Coastguard Worker
TEST(SubprocessTest,PollBehavesProperly)305*6dbdd20aSAndroid Build Coastguard Worker TEST(SubprocessTest, PollBehavesProperly) {
306*6dbdd20aSAndroid Build Coastguard Worker Pipe pipe = Pipe::Create();
307*6dbdd20aSAndroid Build Coastguard Worker #if PERFETTO_BUILDFLAG(PERFETTO_OS_WIN)
308*6dbdd20aSAndroid Build Coastguard Worker Subprocess p({"cmd", "/c", "(exit 0)"});
309*6dbdd20aSAndroid Build Coastguard Worker #else
310*6dbdd20aSAndroid Build Coastguard Worker Subprocess p({"true"});
311*6dbdd20aSAndroid Build Coastguard Worker #endif
312*6dbdd20aSAndroid Build Coastguard Worker p.args.stdout_mode = Subprocess::OutputMode::kFd;
313*6dbdd20aSAndroid Build Coastguard Worker p.args.out_fd = std::move(pipe.wr);
314*6dbdd20aSAndroid Build Coastguard Worker p.Start();
315*6dbdd20aSAndroid Build Coastguard Worker
316*6dbdd20aSAndroid Build Coastguard Worker // Wait for EOF (which really means the child process has terminated).
317*6dbdd20aSAndroid Build Coastguard Worker std::string ignored;
318*6dbdd20aSAndroid Build Coastguard Worker ReadPlatformHandle(*pipe.rd, &ignored);
319*6dbdd20aSAndroid Build Coastguard Worker
320*6dbdd20aSAndroid Build Coastguard Worker // The kernel takes some time to detect the termination of the process. The
321*6dbdd20aSAndroid Build Coastguard Worker // best thing we can do here is check that we detect the termination within
322*6dbdd20aSAndroid Build Coastguard Worker // some reasonable time.
323*6dbdd20aSAndroid Build Coastguard Worker auto start_ms = GetWallTimeMs();
324*6dbdd20aSAndroid Build Coastguard Worker while (p.Poll() != Subprocess::kTerminated) {
325*6dbdd20aSAndroid Build Coastguard Worker auto elapsed_ms = GetWallTimeMs() - start_ms;
326*6dbdd20aSAndroid Build Coastguard Worker ASSERT_LT(elapsed_ms, TimeMillis(10000));
327*6dbdd20aSAndroid Build Coastguard Worker std::this_thread::sleep_for(TimeMillis(5));
328*6dbdd20aSAndroid Build Coastguard Worker }
329*6dbdd20aSAndroid Build Coastguard Worker
330*6dbdd20aSAndroid Build Coastguard Worker // At this point Poll() must detect the termination.
331*6dbdd20aSAndroid Build Coastguard Worker EXPECT_EQ(p.Poll(), Subprocess::kTerminated);
332*6dbdd20aSAndroid Build Coastguard Worker EXPECT_EQ(p.returncode(), 0);
333*6dbdd20aSAndroid Build Coastguard Worker }
334*6dbdd20aSAndroid Build Coastguard Worker
TEST(SubprocessTest,Wait)335*6dbdd20aSAndroid Build Coastguard Worker TEST(SubprocessTest, Wait) {
336*6dbdd20aSAndroid Build Coastguard Worker #if PERFETTO_BUILDFLAG(PERFETTO_OS_WIN)
337*6dbdd20aSAndroid Build Coastguard Worker Subprocess p({"cmd", "/c", "echo exec_done && FOR /L %N IN () DO @echo>NUL"});
338*6dbdd20aSAndroid Build Coastguard Worker #else
339*6dbdd20aSAndroid Build Coastguard Worker Subprocess p({"sh", "-c", "echo exec_done; while true; do true; done"});
340*6dbdd20aSAndroid Build Coastguard Worker #endif
341*6dbdd20aSAndroid Build Coastguard Worker p.args.stdout_mode = Subprocess::OutputMode::kBuffer;
342*6dbdd20aSAndroid Build Coastguard Worker p.Start();
343*6dbdd20aSAndroid Build Coastguard Worker
344*6dbdd20aSAndroid Build Coastguard Worker // Wait for the fork()+exec() to complete.
345*6dbdd20aSAndroid Build Coastguard Worker while (p.output().find("exec_done") == std::string::npos) {
346*6dbdd20aSAndroid Build Coastguard Worker EXPECT_FALSE(p.Wait(1 /*ms*/));
347*6dbdd20aSAndroid Build Coastguard Worker EXPECT_EQ(p.status(), Subprocess::kRunning);
348*6dbdd20aSAndroid Build Coastguard Worker }
349*6dbdd20aSAndroid Build Coastguard Worker
350*6dbdd20aSAndroid Build Coastguard Worker #if PERFETTO_BUILDFLAG(PERFETTO_OS_WIN)
351*6dbdd20aSAndroid Build Coastguard Worker ScopedPlatformHandle proc_handle(::OpenProcess(
352*6dbdd20aSAndroid Build Coastguard Worker PROCESS_TERMINATE, /*inherit=*/false, static_cast<DWORD>(p.pid())));
353*6dbdd20aSAndroid Build Coastguard Worker ASSERT_TRUE(proc_handle);
354*6dbdd20aSAndroid Build Coastguard Worker ASSERT_TRUE(::TerminateProcess(*proc_handle, DBG_CONTROL_BREAK));
355*6dbdd20aSAndroid Build Coastguard Worker #else
356*6dbdd20aSAndroid Build Coastguard Worker kill(p.pid(), SIGBUS);
357*6dbdd20aSAndroid Build Coastguard Worker #endif
358*6dbdd20aSAndroid Build Coastguard Worker EXPECT_TRUE(p.Wait(30000 /*ms*/)); // We shouldn't hit this.
359*6dbdd20aSAndroid Build Coastguard Worker EXPECT_TRUE(p.Wait()); // Should be a no-op.
360*6dbdd20aSAndroid Build Coastguard Worker EXPECT_EQ(p.status(), Subprocess::kTerminated);
361*6dbdd20aSAndroid Build Coastguard Worker #if PERFETTO_BUILDFLAG(PERFETTO_OS_WIN)
362*6dbdd20aSAndroid Build Coastguard Worker EXPECT_EQ(p.returncode(), static_cast<int>(DBG_CONTROL_BREAK));
363*6dbdd20aSAndroid Build Coastguard Worker #else
364*6dbdd20aSAndroid Build Coastguard Worker EXPECT_EQ(p.returncode(), 128 + SIGBUS);
365*6dbdd20aSAndroid Build Coastguard Worker #endif
366*6dbdd20aSAndroid Build Coastguard Worker }
367*6dbdd20aSAndroid Build Coastguard Worker
TEST(SubprocessTest,KillOnDtor)368*6dbdd20aSAndroid Build Coastguard Worker TEST(SubprocessTest, KillOnDtor) {
369*6dbdd20aSAndroid Build Coastguard Worker auto is_process_alive = [](PlatformProcessId pid) {
370*6dbdd20aSAndroid Build Coastguard Worker #if PERFETTO_BUILDFLAG(PERFETTO_OS_WIN)
371*6dbdd20aSAndroid Build Coastguard Worker DWORD ignored = 0;
372*6dbdd20aSAndroid Build Coastguard Worker return ProcessIdToSessionId(static_cast<DWORD>(pid), &ignored);
373*6dbdd20aSAndroid Build Coastguard Worker #else
374*6dbdd20aSAndroid Build Coastguard Worker // We use kill(SIGWINCH) as a way to tell if the process is still alive by
375*6dbdd20aSAndroid Build Coastguard Worker // looking at the kill(2) return value. SIGWINCH is one of the few signals
376*6dbdd20aSAndroid Build Coastguard Worker // that has default ignore disposition.
377*6dbdd20aSAndroid Build Coastguard Worker return kill(pid, SIGWINCH) == 0;
378*6dbdd20aSAndroid Build Coastguard Worker #endif
379*6dbdd20aSAndroid Build Coastguard Worker };
380*6dbdd20aSAndroid Build Coastguard Worker
381*6dbdd20aSAndroid Build Coastguard Worker PlatformProcessId pid;
382*6dbdd20aSAndroid Build Coastguard Worker {
383*6dbdd20aSAndroid Build Coastguard Worker #if PERFETTO_BUILDFLAG(PERFETTO_OS_WIN)
384*6dbdd20aSAndroid Build Coastguard Worker Subprocess p({"ping", "127.0.0.1", "-n", "1000"});
385*6dbdd20aSAndroid Build Coastguard Worker #else
386*6dbdd20aSAndroid Build Coastguard Worker Subprocess p({"sleep", "1000"});
387*6dbdd20aSAndroid Build Coastguard Worker #endif
388*6dbdd20aSAndroid Build Coastguard Worker p.Start();
389*6dbdd20aSAndroid Build Coastguard Worker pid = p.pid();
390*6dbdd20aSAndroid Build Coastguard Worker EXPECT_TRUE(is_process_alive(pid));
391*6dbdd20aSAndroid Build Coastguard Worker }
392*6dbdd20aSAndroid Build Coastguard Worker
393*6dbdd20aSAndroid Build Coastguard Worker // Both on Windows and Linux, kill can take some time to free up the pid.
394*6dbdd20aSAndroid Build Coastguard Worker bool alive = true;
395*6dbdd20aSAndroid Build Coastguard Worker for (int attempt = 0; attempt < 1000 && alive; attempt++) {
396*6dbdd20aSAndroid Build Coastguard Worker alive = is_process_alive(pid);
397*6dbdd20aSAndroid Build Coastguard Worker std::this_thread::sleep_for(TimeMillis(5));
398*6dbdd20aSAndroid Build Coastguard Worker }
399*6dbdd20aSAndroid Build Coastguard Worker EXPECT_FALSE(alive);
400*6dbdd20aSAndroid Build Coastguard Worker }
401*6dbdd20aSAndroid Build Coastguard Worker
402*6dbdd20aSAndroid Build Coastguard Worker // Regression test for b/162505491.
TEST(SubprocessTest,MoveOperators)403*6dbdd20aSAndroid Build Coastguard Worker TEST(SubprocessTest, MoveOperators) {
404*6dbdd20aSAndroid Build Coastguard Worker {
405*6dbdd20aSAndroid Build Coastguard Worker #if PERFETTO_BUILDFLAG(PERFETTO_OS_WIN)
406*6dbdd20aSAndroid Build Coastguard Worker Subprocess initial({"ping", "127.0.0.1", "-n", "100"});
407*6dbdd20aSAndroid Build Coastguard Worker #else
408*6dbdd20aSAndroid Build Coastguard Worker Subprocess initial = Subprocess({"sleep", "10000"});
409*6dbdd20aSAndroid Build Coastguard Worker #endif
410*6dbdd20aSAndroid Build Coastguard Worker initial.args.stdout_mode = Subprocess::OutputMode::kDevNull;
411*6dbdd20aSAndroid Build Coastguard Worker initial.Start();
412*6dbdd20aSAndroid Build Coastguard Worker Subprocess moved(std::move(initial));
413*6dbdd20aSAndroid Build Coastguard Worker EXPECT_EQ(moved.Poll(), Subprocess::kRunning);
414*6dbdd20aSAndroid Build Coastguard Worker EXPECT_EQ(initial.Poll(), Subprocess::kNotStarted);
415*6dbdd20aSAndroid Build Coastguard Worker
416*6dbdd20aSAndroid Build Coastguard Worker // Check that reuse works
417*6dbdd20aSAndroid Build Coastguard Worker #if PERFETTO_BUILDFLAG(PERFETTO_OS_WIN)
418*6dbdd20aSAndroid Build Coastguard Worker initial = Subprocess({"cmd", "/c", "echo|set /p ignored_var=hello"});
419*6dbdd20aSAndroid Build Coastguard Worker #else
420*6dbdd20aSAndroid Build Coastguard Worker initial = Subprocess({"echo", "-n", "hello"});
421*6dbdd20aSAndroid Build Coastguard Worker #endif
422*6dbdd20aSAndroid Build Coastguard Worker initial.args.stdout_mode = Subprocess::OutputMode::kBuffer;
423*6dbdd20aSAndroid Build Coastguard Worker initial.Start();
424*6dbdd20aSAndroid Build Coastguard Worker initial.Wait(/*timeout_ms=*/5000);
425*6dbdd20aSAndroid Build Coastguard Worker EXPECT_EQ(initial.status(), Subprocess::kTerminated);
426*6dbdd20aSAndroid Build Coastguard Worker EXPECT_EQ(initial.returncode(), 0);
427*6dbdd20aSAndroid Build Coastguard Worker EXPECT_EQ(initial.output(), "hello");
428*6dbdd20aSAndroid Build Coastguard Worker }
429*6dbdd20aSAndroid Build Coastguard Worker
430*6dbdd20aSAndroid Build Coastguard Worker std::vector<Subprocess> v;
431*6dbdd20aSAndroid Build Coastguard Worker for (int i = 0; i < 10; i++) {
432*6dbdd20aSAndroid Build Coastguard Worker #if PERFETTO_BUILDFLAG(PERFETTO_OS_WIN)
433*6dbdd20aSAndroid Build Coastguard Worker v.emplace_back(Subprocess({"ping", "127.0.0.1", "-n", "10"}));
434*6dbdd20aSAndroid Build Coastguard Worker #else
435*6dbdd20aSAndroid Build Coastguard Worker v.emplace_back(Subprocess({"sleep", "10"}));
436*6dbdd20aSAndroid Build Coastguard Worker #endif
437*6dbdd20aSAndroid Build Coastguard Worker v.back().args.stdout_mode = Subprocess::OutputMode::kDevNull;
438*6dbdd20aSAndroid Build Coastguard Worker v.back().Start();
439*6dbdd20aSAndroid Build Coastguard Worker }
440*6dbdd20aSAndroid Build Coastguard Worker for (auto& p : v)
441*6dbdd20aSAndroid Build Coastguard Worker EXPECT_EQ(p.Poll(), Subprocess::kRunning);
442*6dbdd20aSAndroid Build Coastguard Worker }
443*6dbdd20aSAndroid Build Coastguard Worker
444*6dbdd20aSAndroid Build Coastguard Worker // posix_entrypoint_for_testing is not supported on Windows.
445*6dbdd20aSAndroid Build Coastguard Worker #if !PERFETTO_BUILDFLAG(PERFETTO_OS_WIN)
446*6dbdd20aSAndroid Build Coastguard Worker
447*6dbdd20aSAndroid Build Coastguard Worker // Test the case of passing a lambda in |entrypoint| but no cmd.c
TEST(SubprocessTest,Entrypoint)448*6dbdd20aSAndroid Build Coastguard Worker TEST(SubprocessTest, Entrypoint) {
449*6dbdd20aSAndroid Build Coastguard Worker Subprocess p;
450*6dbdd20aSAndroid Build Coastguard Worker p.args.input = "ping\n";
451*6dbdd20aSAndroid Build Coastguard Worker p.args.stdout_mode = Subprocess::OutputMode::kBuffer;
452*6dbdd20aSAndroid Build Coastguard Worker p.args.posix_entrypoint_for_testing = [] {
453*6dbdd20aSAndroid Build Coastguard Worker char buf[32]{};
454*6dbdd20aSAndroid Build Coastguard Worker PERFETTO_CHECK(fgets(buf, sizeof(buf), stdin));
455*6dbdd20aSAndroid Build Coastguard Worker PERFETTO_CHECK(strcmp(buf, "ping\n") == 0);
456*6dbdd20aSAndroid Build Coastguard Worker printf("pong\n");
457*6dbdd20aSAndroid Build Coastguard Worker fflush(stdout);
458*6dbdd20aSAndroid Build Coastguard Worker _exit(42);
459*6dbdd20aSAndroid Build Coastguard Worker };
460*6dbdd20aSAndroid Build Coastguard Worker EXPECT_FALSE(p.Call());
461*6dbdd20aSAndroid Build Coastguard Worker EXPECT_EQ(p.returncode(), 42);
462*6dbdd20aSAndroid Build Coastguard Worker EXPECT_EQ(GetOutput(p), "pong\n");
463*6dbdd20aSAndroid Build Coastguard Worker }
464*6dbdd20aSAndroid Build Coastguard Worker
465*6dbdd20aSAndroid Build Coastguard Worker // Test the case of passing both a lambda entrypoint and a process to exec.
TEST(SubprocessTest,EntrypointAndExec)466*6dbdd20aSAndroid Build Coastguard Worker TEST(SubprocessTest, EntrypointAndExec) {
467*6dbdd20aSAndroid Build Coastguard Worker base::Pipe pipe1 = base::Pipe::Create();
468*6dbdd20aSAndroid Build Coastguard Worker base::Pipe pipe2 = base::Pipe::Create();
469*6dbdd20aSAndroid Build Coastguard Worker int pipe1_wr = *pipe1.wr;
470*6dbdd20aSAndroid Build Coastguard Worker int pipe2_wr = *pipe2.wr;
471*6dbdd20aSAndroid Build Coastguard Worker
472*6dbdd20aSAndroid Build Coastguard Worker Subprocess p({"echo", "123"});
473*6dbdd20aSAndroid Build Coastguard Worker p.args.stdout_mode = Subprocess::OutputMode::kBuffer;
474*6dbdd20aSAndroid Build Coastguard Worker p.args.preserve_fds.push_back(pipe2_wr);
475*6dbdd20aSAndroid Build Coastguard Worker p.args.posix_entrypoint_for_testing = [pipe1_wr, pipe2_wr] {
476*6dbdd20aSAndroid Build Coastguard Worker base::ignore_result(write(pipe1_wr, "fail", 4));
477*6dbdd20aSAndroid Build Coastguard Worker base::ignore_result(write(pipe2_wr, "pass", 4));
478*6dbdd20aSAndroid Build Coastguard Worker };
479*6dbdd20aSAndroid Build Coastguard Worker
480*6dbdd20aSAndroid Build Coastguard Worker p.Start();
481*6dbdd20aSAndroid Build Coastguard Worker pipe1.wr.reset();
482*6dbdd20aSAndroid Build Coastguard Worker pipe2.wr.reset();
483*6dbdd20aSAndroid Build Coastguard Worker
484*6dbdd20aSAndroid Build Coastguard Worker char buf[8];
485*6dbdd20aSAndroid Build Coastguard Worker EXPECT_LE(read(*pipe1.rd, buf, sizeof(buf)), 0);
486*6dbdd20aSAndroid Build Coastguard Worker EXPECT_EQ(read(*pipe2.rd, buf, sizeof(buf)), 4);
487*6dbdd20aSAndroid Build Coastguard Worker buf[4] = '\0';
488*6dbdd20aSAndroid Build Coastguard Worker EXPECT_STREQ(buf, "pass");
489*6dbdd20aSAndroid Build Coastguard Worker EXPECT_TRUE(p.Wait());
490*6dbdd20aSAndroid Build Coastguard Worker EXPECT_EQ(p.status(), Subprocess::kTerminated);
491*6dbdd20aSAndroid Build Coastguard Worker EXPECT_EQ(GetOutput(p), "123\n");
492*6dbdd20aSAndroid Build Coastguard Worker }
493*6dbdd20aSAndroid Build Coastguard Worker
494*6dbdd20aSAndroid Build Coastguard Worker #endif
495*6dbdd20aSAndroid Build Coastguard Worker
496*6dbdd20aSAndroid Build Coastguard Worker } // namespace
497*6dbdd20aSAndroid Build Coastguard Worker } // namespace base
498*6dbdd20aSAndroid Build Coastguard Worker } // namespace perfetto
499