1*1a96fba6SXin Li // Copyright (c) 2012 The Chromium OS Authors. All rights reserved.
2*1a96fba6SXin Li // Use of this source code is governed by a BSD-style license that can be
3*1a96fba6SXin Li // found in the LICENSE file.
4*1a96fba6SXin Li
5*1a96fba6SXin Li #include "brillo/process.h"
6*1a96fba6SXin Li
7*1a96fba6SXin Li #include <unistd.h>
8*1a96fba6SXin Li
9*1a96fba6SXin Li #include <base/files/file_path.h>
10*1a96fba6SXin Li #include <base/files/file_util.h>
11*1a96fba6SXin Li #include <base/files/scoped_temp_dir.h>
12*1a96fba6SXin Li #include <gtest/gtest.h>
13*1a96fba6SXin Li
14*1a96fba6SXin Li #include "brillo/process_mock.h"
15*1a96fba6SXin Li #include "brillo/test_helpers.h"
16*1a96fba6SXin Li #include "brillo/unittest_utils.h"
17*1a96fba6SXin Li
18*1a96fba6SXin Li using base::FilePath;
19*1a96fba6SXin Li
20*1a96fba6SXin Li // This test assumes the following standard binaries are installed.
21*1a96fba6SXin Li #if defined(__ANDROID__)
22*1a96fba6SXin Li # define SYSTEM_PREFIX "/system"
23*1a96fba6SXin Li static const char kBinStat[] = SYSTEM_PREFIX "/bin/stat";
24*1a96fba6SXin Li #else
25*1a96fba6SXin Li # define SYSTEM_PREFIX ""
26*1a96fba6SXin Li static const char kBinStat[] = "/usr/bin/stat";
27*1a96fba6SXin Li #endif
28*1a96fba6SXin Li
29*1a96fba6SXin Li static const char kBinSh[] = SYSTEM_PREFIX "/bin/sh";
30*1a96fba6SXin Li static const char kBinCat[] = SYSTEM_PREFIX "/bin/cat";
31*1a96fba6SXin Li static const char kBinEcho[] = SYSTEM_PREFIX "/bin/echo";
32*1a96fba6SXin Li static const char kBinFalse[] = SYSTEM_PREFIX "/bin/false";
33*1a96fba6SXin Li static const char kBinSleep[] = SYSTEM_PREFIX "/bin/sleep";
34*1a96fba6SXin Li static const char kBinTrue[] = SYSTEM_PREFIX "/bin/true";
35*1a96fba6SXin Li
36*1a96fba6SXin Li namespace brillo {
37*1a96fba6SXin Li
38*1a96fba6SXin Li // Test that the mock has all the functions of the interface by
39*1a96fba6SXin Li // instantiating it. This variable is not used elsewhere.
40*1a96fba6SXin Li struct CompileMocks {
41*1a96fba6SXin Li ProcessMock process_mock;
42*1a96fba6SXin Li };
43*1a96fba6SXin Li
TEST(SimpleProcess,Basic)44*1a96fba6SXin Li TEST(SimpleProcess, Basic) {
45*1a96fba6SXin Li // Log must be cleared before running this test, just as ProcessTest::SetUp.
46*1a96fba6SXin Li ClearLog();
47*1a96fba6SXin Li ProcessImpl process;
48*1a96fba6SXin Li process.AddArg(kBinEcho);
49*1a96fba6SXin Li EXPECT_EQ(0, process.Run());
50*1a96fba6SXin Li EXPECT_EQ("", GetLog());
51*1a96fba6SXin Li }
52*1a96fba6SXin Li
TEST(SimpleProcess,NoSearchPath)53*1a96fba6SXin Li TEST(SimpleProcess, NoSearchPath) {
54*1a96fba6SXin Li ProcessImpl process;
55*1a96fba6SXin Li process.AddArg("echo");
56*1a96fba6SXin Li EXPECT_EQ(127, process.Run());
57*1a96fba6SXin Li }
58*1a96fba6SXin Li
TEST(SimpleProcess,SearchPath)59*1a96fba6SXin Li TEST(SimpleProcess, SearchPath) {
60*1a96fba6SXin Li ProcessImpl process;
61*1a96fba6SXin Li process.AddArg("echo");
62*1a96fba6SXin Li process.SetSearchPath(true);
63*1a96fba6SXin Li EXPECT_EQ(EXIT_SUCCESS, process.Run());
64*1a96fba6SXin Li }
65*1a96fba6SXin Li
TEST(SimpleProcess,BindFd)66*1a96fba6SXin Li TEST(SimpleProcess, BindFd) {
67*1a96fba6SXin Li int fds[2];
68*1a96fba6SXin Li char buf[16];
69*1a96fba6SXin Li static const char* kMsg = "hello, world!";
70*1a96fba6SXin Li ProcessImpl process;
71*1a96fba6SXin Li EXPECT_EQ(0, pipe(fds));
72*1a96fba6SXin Li process.AddArg(kBinEcho);
73*1a96fba6SXin Li process.AddArg(kMsg);
74*1a96fba6SXin Li process.BindFd(fds[1], 1);
75*1a96fba6SXin Li process.Run();
76*1a96fba6SXin Li memset(buf, 0, sizeof(buf));
77*1a96fba6SXin Li EXPECT_EQ(read(fds[0], buf, sizeof(buf) - 1), strlen(kMsg) + 1);
78*1a96fba6SXin Li EXPECT_EQ(std::string(kMsg) + "\n", std::string(buf));
79*1a96fba6SXin Li }
80*1a96fba6SXin Li
81*1a96fba6SXin Li // The test framework uses the device's dash shell as "sh", which doesn't
82*1a96fba6SXin Li // support redirecting stdout to arbitrary large file descriptor numbers
83*1a96fba6SXin Li // directly, nor has /proc mounted to open /proc/self/fd/NN. This test would
84*1a96fba6SXin Li // fail if pipe.writer is big enough.
85*1a96fba6SXin Li // TODO(deymo): Write a helper program that writes "hello_world" to the passed
86*1a96fba6SXin Li // file descriptor and re-enabled this test.
TEST(DISABLED_SimpleProcess,BindFdToSameFd)87*1a96fba6SXin Li TEST(DISABLED_SimpleProcess, BindFdToSameFd) {
88*1a96fba6SXin Li static const char* kMsg = "hello_world";
89*1a96fba6SXin Li ScopedPipe pipe;
90*1a96fba6SXin Li ProcessImpl process;
91*1a96fba6SXin Li process.AddArg(kBinSh);
92*1a96fba6SXin Li process.AddArg("-c");
93*1a96fba6SXin Li process.AddArg(base::StringPrintf("echo %s >&%d", kMsg, pipe.writer));
94*1a96fba6SXin Li process.BindFd(pipe.writer, pipe.writer);
95*1a96fba6SXin Li process.Run();
96*1a96fba6SXin Li close(pipe.writer);
97*1a96fba6SXin Li pipe.writer = -1;
98*1a96fba6SXin Li
99*1a96fba6SXin Li char buf[16];
100*1a96fba6SXin Li memset(buf, 0, sizeof(buf));
101*1a96fba6SXin Li EXPECT_EQ(read(pipe.reader, buf, sizeof(buf) - 1), strlen(kMsg) + 1);
102*1a96fba6SXin Li EXPECT_EQ(std::string(kMsg) + "\n", std::string(buf));
103*1a96fba6SXin Li }
104*1a96fba6SXin Li
105*1a96fba6SXin Li class ProcessTest : public ::testing::Test {
106*1a96fba6SXin Li public:
SetUp()107*1a96fba6SXin Li void SetUp() {
108*1a96fba6SXin Li CHECK(temp_dir_.CreateUniqueTempDir());
109*1a96fba6SXin Li output_file_ = temp_dir_.GetPath().Append("fork_out").value();
110*1a96fba6SXin Li process_.RedirectOutput(output_file_);
111*1a96fba6SXin Li ClearLog();
112*1a96fba6SXin Li }
113*1a96fba6SXin Li
SetUpTestCase()114*1a96fba6SXin Li static void SetUpTestCase() {
115*1a96fba6SXin Li base::CommandLine::Init(0, nullptr);
116*1a96fba6SXin Li ::brillo::InitLog(brillo::kLogToStderr);
117*1a96fba6SXin Li ::brillo::LogToString(true);
118*1a96fba6SXin Li }
119*1a96fba6SXin Li
120*1a96fba6SXin Li protected:
121*1a96fba6SXin Li void CheckStderrCaptured();
122*1a96fba6SXin Li FilePath GetFdPath(int fd);
123*1a96fba6SXin Li
124*1a96fba6SXin Li ProcessImpl process_;
125*1a96fba6SXin Li std::vector<const char*> args_;
126*1a96fba6SXin Li std::string output_file_;
127*1a96fba6SXin Li base::ScopedTempDir temp_dir_;
128*1a96fba6SXin Li };
129*1a96fba6SXin Li
TEST_F(ProcessTest,Basic)130*1a96fba6SXin Li TEST_F(ProcessTest, Basic) {
131*1a96fba6SXin Li process_.AddArg(kBinEcho);
132*1a96fba6SXin Li process_.AddArg("hello world");
133*1a96fba6SXin Li EXPECT_EQ(0, process_.Run());
134*1a96fba6SXin Li ExpectFileEquals("hello world\n", output_file_.c_str());
135*1a96fba6SXin Li EXPECT_EQ("", GetLog());
136*1a96fba6SXin Li }
137*1a96fba6SXin Li
TEST_F(ProcessTest,AddStringOption)138*1a96fba6SXin Li TEST_F(ProcessTest, AddStringOption) {
139*1a96fba6SXin Li process_.AddArg(kBinEcho);
140*1a96fba6SXin Li process_.AddStringOption("--hello", "world");
141*1a96fba6SXin Li EXPECT_EQ(0, process_.Run());
142*1a96fba6SXin Li ExpectFileEquals("--hello world\n", output_file_.c_str());
143*1a96fba6SXin Li }
144*1a96fba6SXin Li
TEST_F(ProcessTest,AddIntValue)145*1a96fba6SXin Li TEST_F(ProcessTest, AddIntValue) {
146*1a96fba6SXin Li process_.AddArg(kBinEcho);
147*1a96fba6SXin Li process_.AddIntOption("--answer", 42);
148*1a96fba6SXin Li EXPECT_EQ(0, process_.Run());
149*1a96fba6SXin Li ExpectFileEquals("--answer 42\n", output_file_.c_str());
150*1a96fba6SXin Li }
151*1a96fba6SXin Li
TEST_F(ProcessTest,NonZeroReturnValue)152*1a96fba6SXin Li TEST_F(ProcessTest, NonZeroReturnValue) {
153*1a96fba6SXin Li process_.AddArg(kBinFalse);
154*1a96fba6SXin Li EXPECT_EQ(1, process_.Run());
155*1a96fba6SXin Li ExpectFileEquals("", output_file_.c_str());
156*1a96fba6SXin Li EXPECT_EQ("", GetLog());
157*1a96fba6SXin Li }
158*1a96fba6SXin Li
TEST_F(ProcessTest,RedirectInputDevNull)159*1a96fba6SXin Li TEST_F(ProcessTest, RedirectInputDevNull) {
160*1a96fba6SXin Li process_.AddArg(kBinCat);
161*1a96fba6SXin Li process_.RedirectInput("/dev/null");
162*1a96fba6SXin Li EXPECT_EQ(0, process_.Run());
163*1a96fba6SXin Li }
164*1a96fba6SXin Li
TEST_F(ProcessTest,BadInputFile)165*1a96fba6SXin Li TEST_F(ProcessTest, BadInputFile) {
166*1a96fba6SXin Li process_.AddArg(kBinCat);
167*1a96fba6SXin Li process_.RedirectInput("/bad/path");
168*1a96fba6SXin Li EXPECT_EQ(static_cast<pid_t>(Process::kErrorExitStatus), process_.Run());
169*1a96fba6SXin Li }
170*1a96fba6SXin Li
TEST_F(ProcessTest,BadOutputFile)171*1a96fba6SXin Li TEST_F(ProcessTest, BadOutputFile) {
172*1a96fba6SXin Li process_.AddArg(kBinEcho);
173*1a96fba6SXin Li process_.RedirectOutput("/bad/path");
174*1a96fba6SXin Li EXPECT_EQ(static_cast<pid_t>(Process::kErrorExitStatus), process_.Run());
175*1a96fba6SXin Li }
176*1a96fba6SXin Li
TEST_F(ProcessTest,BadExecutable)177*1a96fba6SXin Li TEST_F(ProcessTest, BadExecutable) {
178*1a96fba6SXin Li process_.AddArg("false");
179*1a96fba6SXin Li EXPECT_EQ(static_cast<pid_t>(Process::kErrorExitStatus), process_.Run());
180*1a96fba6SXin Li }
181*1a96fba6SXin Li
CheckStderrCaptured()182*1a96fba6SXin Li void ProcessTest::CheckStderrCaptured() {
183*1a96fba6SXin Li process_.AddArg(kBinSh);
184*1a96fba6SXin Li process_.AddArg("-c");
185*1a96fba6SXin Li process_.AddArg("echo errormessage 1>&2 && exit 1");
186*1a96fba6SXin Li EXPECT_EQ(1, process_.Run());
187*1a96fba6SXin Li std::string contents;
188*1a96fba6SXin Li EXPECT_TRUE(base::ReadFileToString(FilePath(output_file_), &contents));
189*1a96fba6SXin Li EXPECT_NE(std::string::npos, contents.find("errormessage"));
190*1a96fba6SXin Li EXPECT_EQ("", GetLog());
191*1a96fba6SXin Li }
192*1a96fba6SXin Li
TEST_F(ProcessTest,StderrCaptured)193*1a96fba6SXin Li TEST_F(ProcessTest, StderrCaptured) {
194*1a96fba6SXin Li CheckStderrCaptured();
195*1a96fba6SXin Li }
196*1a96fba6SXin Li
TEST_F(ProcessTest,StderrCapturedWhenPreviouslyClosed)197*1a96fba6SXin Li TEST_F(ProcessTest, StderrCapturedWhenPreviouslyClosed) {
198*1a96fba6SXin Li int saved_stderr = dup(STDERR_FILENO);
199*1a96fba6SXin Li close(STDERR_FILENO);
200*1a96fba6SXin Li CheckStderrCaptured();
201*1a96fba6SXin Li dup2(saved_stderr, STDERR_FILENO);
202*1a96fba6SXin Li }
203*1a96fba6SXin Li
GetFdPath(int fd)204*1a96fba6SXin Li FilePath ProcessTest::GetFdPath(int fd) {
205*1a96fba6SXin Li return FilePath(base::StringPrintf("/proc/self/fd/%d", fd));
206*1a96fba6SXin Li }
207*1a96fba6SXin Li
TEST_F(ProcessTest,RedirectStderrUsingPipe)208*1a96fba6SXin Li TEST_F(ProcessTest, RedirectStderrUsingPipe) {
209*1a96fba6SXin Li process_.RedirectOutput("");
210*1a96fba6SXin Li process_.AddArg(kBinSh);
211*1a96fba6SXin Li process_.AddArg("-c");
212*1a96fba6SXin Li process_.AddArg("echo errormessage >&2 && exit 1");
213*1a96fba6SXin Li process_.RedirectUsingPipe(STDERR_FILENO, false);
214*1a96fba6SXin Li EXPECT_EQ(-1, process_.GetPipe(STDERR_FILENO));
215*1a96fba6SXin Li EXPECT_EQ(1, process_.Run());
216*1a96fba6SXin Li int pipe_fd = process_.GetPipe(STDERR_FILENO);
217*1a96fba6SXin Li EXPECT_GE(pipe_fd, 0);
218*1a96fba6SXin Li EXPECT_EQ(-1, process_.GetPipe(STDOUT_FILENO));
219*1a96fba6SXin Li EXPECT_EQ(-1, process_.GetPipe(STDIN_FILENO));
220*1a96fba6SXin Li std::string contents;
221*1a96fba6SXin Li EXPECT_TRUE(base::ReadFileToString(GetFdPath(pipe_fd), &contents));
222*1a96fba6SXin Li EXPECT_NE(std::string::npos, contents.find("errormessage"));
223*1a96fba6SXin Li EXPECT_EQ("", GetLog());
224*1a96fba6SXin Li }
225*1a96fba6SXin Li
TEST_F(ProcessTest,RedirectStderrUsingPipeWhenPreviouslyClosed)226*1a96fba6SXin Li TEST_F(ProcessTest, RedirectStderrUsingPipeWhenPreviouslyClosed) {
227*1a96fba6SXin Li int saved_stderr = dup(STDERR_FILENO);
228*1a96fba6SXin Li close(STDERR_FILENO);
229*1a96fba6SXin Li process_.RedirectOutput("");
230*1a96fba6SXin Li process_.AddArg(kBinSh);
231*1a96fba6SXin Li process_.AddArg("-c");
232*1a96fba6SXin Li process_.AddArg("echo errormessage >&2 && exit 1");
233*1a96fba6SXin Li process_.RedirectUsingPipe(STDERR_FILENO, false);
234*1a96fba6SXin Li EXPECT_EQ(1, process_.Run());
235*1a96fba6SXin Li int pipe_fd = process_.GetPipe(STDERR_FILENO);
236*1a96fba6SXin Li EXPECT_GE(pipe_fd, 0);
237*1a96fba6SXin Li EXPECT_EQ(-1, process_.GetPipe(STDOUT_FILENO));
238*1a96fba6SXin Li EXPECT_EQ(-1, process_.GetPipe(STDIN_FILENO));
239*1a96fba6SXin Li std::string contents;
240*1a96fba6SXin Li EXPECT_TRUE(base::ReadFileToString(GetFdPath(pipe_fd), &contents));
241*1a96fba6SXin Li EXPECT_NE(std::string::npos, contents.find("errormessage"));
242*1a96fba6SXin Li EXPECT_EQ("", GetLog());
243*1a96fba6SXin Li dup2(saved_stderr, STDERR_FILENO);
244*1a96fba6SXin Li }
245*1a96fba6SXin Li
TEST_F(ProcessTest,RedirectStdoutUsingPipe)246*1a96fba6SXin Li TEST_F(ProcessTest, RedirectStdoutUsingPipe) {
247*1a96fba6SXin Li process_.RedirectOutput("");
248*1a96fba6SXin Li process_.AddArg(kBinEcho);
249*1a96fba6SXin Li process_.AddArg("hello world\n");
250*1a96fba6SXin Li process_.RedirectUsingPipe(STDOUT_FILENO, false);
251*1a96fba6SXin Li EXPECT_EQ(-1, process_.GetPipe(STDOUT_FILENO));
252*1a96fba6SXin Li EXPECT_EQ(0, process_.Run());
253*1a96fba6SXin Li int pipe_fd = process_.GetPipe(STDOUT_FILENO);
254*1a96fba6SXin Li EXPECT_GE(pipe_fd, 0);
255*1a96fba6SXin Li EXPECT_EQ(-1, process_.GetPipe(STDERR_FILENO));
256*1a96fba6SXin Li EXPECT_EQ(-1, process_.GetPipe(STDIN_FILENO));
257*1a96fba6SXin Li std::string contents;
258*1a96fba6SXin Li EXPECT_TRUE(base::ReadFileToString(GetFdPath(pipe_fd), &contents));
259*1a96fba6SXin Li EXPECT_NE(std::string::npos, contents.find("hello world\n"));
260*1a96fba6SXin Li EXPECT_EQ("", GetLog());
261*1a96fba6SXin Li }
262*1a96fba6SXin Li
TEST_F(ProcessTest,RedirectStdinUsingPipe)263*1a96fba6SXin Li TEST_F(ProcessTest, RedirectStdinUsingPipe) {
264*1a96fba6SXin Li const char kMessage[] = "made it!\n";
265*1a96fba6SXin Li process_.AddArg(kBinCat);
266*1a96fba6SXin Li process_.RedirectUsingPipe(STDIN_FILENO, true);
267*1a96fba6SXin Li process_.RedirectOutput(output_file_);
268*1a96fba6SXin Li EXPECT_TRUE(process_.Start());
269*1a96fba6SXin Li int write_fd = process_.GetPipe(STDIN_FILENO);
270*1a96fba6SXin Li EXPECT_EQ(-1, process_.GetPipe(STDERR_FILENO));
271*1a96fba6SXin Li EXPECT_TRUE(base::WriteFile(GetFdPath(write_fd), kMessage, strlen(kMessage)));
272*1a96fba6SXin Li close(write_fd);
273*1a96fba6SXin Li EXPECT_EQ(0, process_.Wait());
274*1a96fba6SXin Li ExpectFileEquals(kMessage, output_file_.c_str());
275*1a96fba6SXin Li }
276*1a96fba6SXin Li
TEST_F(ProcessTest,WithSameUid)277*1a96fba6SXin Li TEST_F(ProcessTest, WithSameUid) {
278*1a96fba6SXin Li gid_t uid = geteuid();
279*1a96fba6SXin Li process_.AddArg(kBinEcho);
280*1a96fba6SXin Li process_.SetUid(uid);
281*1a96fba6SXin Li EXPECT_EQ(0, process_.Run());
282*1a96fba6SXin Li }
283*1a96fba6SXin Li
TEST_F(ProcessTest,WithSameGid)284*1a96fba6SXin Li TEST_F(ProcessTest, WithSameGid) {
285*1a96fba6SXin Li gid_t gid = getegid();
286*1a96fba6SXin Li process_.AddArg(kBinEcho);
287*1a96fba6SXin Li process_.SetGid(gid);
288*1a96fba6SXin Li EXPECT_EQ(0, process_.Run());
289*1a96fba6SXin Li }
290*1a96fba6SXin Li
TEST_F(ProcessTest,WithIllegalUid)291*1a96fba6SXin Li TEST_F(ProcessTest, WithIllegalUid) {
292*1a96fba6SXin Li ASSERT_NE(0, geteuid());
293*1a96fba6SXin Li process_.AddArg(kBinEcho);
294*1a96fba6SXin Li process_.SetUid(0);
295*1a96fba6SXin Li EXPECT_EQ(static_cast<pid_t>(Process::kErrorExitStatus), process_.Run());
296*1a96fba6SXin Li std::string contents;
297*1a96fba6SXin Li EXPECT_TRUE(base::ReadFileToString(FilePath(output_file_), &contents));
298*1a96fba6SXin Li EXPECT_NE(std::string::npos, contents.find("Unable to set UID to 0: 1\n"));
299*1a96fba6SXin Li }
300*1a96fba6SXin Li
TEST_F(ProcessTest,WithIllegalGid)301*1a96fba6SXin Li TEST_F(ProcessTest, WithIllegalGid) {
302*1a96fba6SXin Li ASSERT_NE(0, getegid());
303*1a96fba6SXin Li process_.AddArg(kBinEcho);
304*1a96fba6SXin Li process_.SetGid(0);
305*1a96fba6SXin Li EXPECT_EQ(static_cast<pid_t>(Process::kErrorExitStatus), process_.Run());
306*1a96fba6SXin Li std::string contents;
307*1a96fba6SXin Li EXPECT_TRUE(base::ReadFileToString(FilePath(output_file_), &contents));
308*1a96fba6SXin Li EXPECT_NE(std::string::npos, contents.find("Unable to set GID to 0: 1\n"));
309*1a96fba6SXin Li }
310*1a96fba6SXin Li
TEST_F(ProcessTest,NoParams)311*1a96fba6SXin Li TEST_F(ProcessTest, NoParams) {
312*1a96fba6SXin Li EXPECT_EQ(-1, process_.Run());
313*1a96fba6SXin Li }
314*1a96fba6SXin Li
315*1a96fba6SXin Li #if !defined(__BIONIC__) // Bionic intercepts the segfault on Android.
TEST_F(ProcessTest,SegFaultHandling)316*1a96fba6SXin Li TEST_F(ProcessTest, SegFaultHandling) {
317*1a96fba6SXin Li process_.AddArg(kBinSh);
318*1a96fba6SXin Li process_.AddArg("-c");
319*1a96fba6SXin Li process_.AddArg("kill -SEGV $$");
320*1a96fba6SXin Li EXPECT_EQ(-1, process_.Run());
321*1a96fba6SXin Li EXPECT_TRUE(FindLog("did not exit normally: 11"));
322*1a96fba6SXin Li }
323*1a96fba6SXin Li #endif
324*1a96fba6SXin Li
TEST_F(ProcessTest,KillHandling)325*1a96fba6SXin Li TEST_F(ProcessTest, KillHandling) {
326*1a96fba6SXin Li process_.AddArg(kBinSh);
327*1a96fba6SXin Li process_.AddArg("-c");
328*1a96fba6SXin Li process_.AddArg("kill -KILL $$");
329*1a96fba6SXin Li EXPECT_EQ(-1, process_.Run());
330*1a96fba6SXin Li EXPECT_TRUE(FindLog("did not exit normally: 9"));
331*1a96fba6SXin Li }
332*1a96fba6SXin Li
333*1a96fba6SXin Li
TEST_F(ProcessTest,KillNoPid)334*1a96fba6SXin Li TEST_F(ProcessTest, KillNoPid) {
335*1a96fba6SXin Li process_.Kill(SIGTERM, 0);
336*1a96fba6SXin Li EXPECT_TRUE(FindLog("Process not running"));
337*1a96fba6SXin Li }
338*1a96fba6SXin Li
TEST_F(ProcessTest,ProcessExists)339*1a96fba6SXin Li TEST_F(ProcessTest, ProcessExists) {
340*1a96fba6SXin Li EXPECT_FALSE(Process::ProcessExists(0));
341*1a96fba6SXin Li EXPECT_TRUE(Process::ProcessExists(1));
342*1a96fba6SXin Li EXPECT_TRUE(Process::ProcessExists(getpid()));
343*1a96fba6SXin Li }
344*1a96fba6SXin Li
TEST_F(ProcessTest,ResetPidByFile)345*1a96fba6SXin Li TEST_F(ProcessTest, ResetPidByFile) {
346*1a96fba6SXin Li FilePath pid_path = temp_dir_.GetPath().Append("pid");
347*1a96fba6SXin Li EXPECT_FALSE(process_.ResetPidByFile(pid_path.value()));
348*1a96fba6SXin Li EXPECT_TRUE(base::WriteFile(pid_path, "456\n", 4));
349*1a96fba6SXin Li EXPECT_TRUE(process_.ResetPidByFile(pid_path.value()));
350*1a96fba6SXin Li EXPECT_EQ(456, process_.pid());
351*1a96fba6SXin Li // The purpose of this unit test is to check if Process::ResetPidByFile() can
352*1a96fba6SXin Li // properly read a pid from a file. We don't really want to kill the process
353*1a96fba6SXin Li // with pid 456, so update the pid to 0 to prevent the Process destructor from
354*1a96fba6SXin Li // killing any innocent process.
355*1a96fba6SXin Li process_.UpdatePid(0);
356*1a96fba6SXin Li }
357*1a96fba6SXin Li
TEST_F(ProcessTest,KillSleeper)358*1a96fba6SXin Li TEST_F(ProcessTest, KillSleeper) {
359*1a96fba6SXin Li process_.AddArg(kBinSleep);
360*1a96fba6SXin Li process_.AddArg("10000");
361*1a96fba6SXin Li ASSERT_TRUE(process_.Start());
362*1a96fba6SXin Li pid_t pid = process_.pid();
363*1a96fba6SXin Li ASSERT_GT(pid, 1);
364*1a96fba6SXin Li EXPECT_TRUE(process_.Kill(SIGTERM, 1));
365*1a96fba6SXin Li EXPECT_EQ(0, process_.pid());
366*1a96fba6SXin Li }
367*1a96fba6SXin Li
TEST_F(ProcessTest,Reset)368*1a96fba6SXin Li TEST_F(ProcessTest, Reset) {
369*1a96fba6SXin Li process_.AddArg(kBinFalse);
370*1a96fba6SXin Li process_.Reset(0);
371*1a96fba6SXin Li process_.AddArg(kBinEcho);
372*1a96fba6SXin Li EXPECT_EQ(0, process_.Run());
373*1a96fba6SXin Li }
374*1a96fba6SXin Li
ReturnFalse()375*1a96fba6SXin Li bool ReturnFalse() { return false; }
376*1a96fba6SXin Li
TEST_F(ProcessTest,PreExecCallback)377*1a96fba6SXin Li TEST_F(ProcessTest, PreExecCallback) {
378*1a96fba6SXin Li process_.AddArg(kBinTrue);
379*1a96fba6SXin Li process_.SetPreExecCallback(base::Bind(&ReturnFalse));
380*1a96fba6SXin Li ASSERT_NE(0, process_.Run());
381*1a96fba6SXin Li }
382*1a96fba6SXin Li
TEST_F(ProcessTest,LeakUnusedFileDescriptors)383*1a96fba6SXin Li TEST_F(ProcessTest, LeakUnusedFileDescriptors) {
384*1a96fba6SXin Li ScopedPipe pipe;
385*1a96fba6SXin Li process_.AddArg(kBinStat);
386*1a96fba6SXin Li process_.AddArg(GetFdPath(pipe.reader).value());
387*1a96fba6SXin Li process_.AddArg(GetFdPath(pipe.writer).value());
388*1a96fba6SXin Li process_.SetCloseUnusedFileDescriptors(false);
389*1a96fba6SXin Li EXPECT_EQ(0, process_.Run());
390*1a96fba6SXin Li }
391*1a96fba6SXin Li
TEST_F(ProcessTest,CloseUnusedFileDescriptors)392*1a96fba6SXin Li TEST_F(ProcessTest, CloseUnusedFileDescriptors) {
393*1a96fba6SXin Li ScopedPipe pipe;
394*1a96fba6SXin Li process_.AddArg(kBinStat);
395*1a96fba6SXin Li process_.AddArg(GetFdPath(pipe.reader).value());
396*1a96fba6SXin Li process_.AddArg(GetFdPath(pipe.writer).value());
397*1a96fba6SXin Li process_.SetCloseUnusedFileDescriptors(true);
398*1a96fba6SXin Li // Stat should fail when running on these file descriptor because the files
399*1a96fba6SXin Li // should not be there.
400*1a96fba6SXin Li EXPECT_EQ(1, process_.Run());
401*1a96fba6SXin Li }
402*1a96fba6SXin Li
403*1a96fba6SXin Li } // namespace brillo
404