Skip to content

Commit 3372093

Browse files
committed
Add unittest
1 parent 69bb682 commit 3372093

File tree

1 file changed

+73
-0
lines changed

1 file changed

+73
-0
lines changed

llvm/unittests/Support/ProgramTest.cpp

Lines changed: 73 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -260,6 +260,79 @@ TEST_F(ProgramEnvTest, TestExecuteNoWait) {
260260
ASSERT_GT(LoopCount, 1u) << "LoopCount should be >1";
261261
}
262262

263+
TEST_F(ProgramEnvTest, TestExecuteNoWaitDetached) {
264+
using namespace llvm::sys;
265+
266+
if (getenv("LLVM_PROGRAM_TEST_EXECUTE_NO_WAIT_DETACHED")) {
267+
sleep_for(/*seconds=*/5);
268+
269+
#if _WIN32
270+
HWND ConsoleWnd = GetConsoleWindow();
271+
if (ConsoleWnd == NULL)
272+
exit(100);
273+
else
274+
exit(200);
275+
#else
276+
int ParentSID = std::stoi(
277+
std::string(getenv("LLVM_PROGRAM_TEST_EXECUTE_NO_WAIT_DETACHED_SID")));
278+
279+
pid_t ChildSID = ::getsid(0);
280+
if (ChildSID == -1) {
281+
llvm::errs() << "Could not get process SID: " << strerror(errno) << '\n';
282+
exit(1);
283+
}
284+
285+
char *Detached = getenv("LLVM_PROGRAM_TEST_EXECUTE_NO_WAIT_DETACHED_TRUE");
286+
if (Detached && (ChildSID != ParentSID))
287+
exit(100);
288+
if (!Detached && (ChildSID == ParentSID))
289+
exit(200);
290+
#endif
291+
exit(0);
292+
}
293+
294+
std::string Executable =
295+
sys::fs::getMainExecutable(TestMainArgv0, &ProgramTestStringArg1);
296+
StringRef argv[] = {
297+
Executable, "--gtest_filter=ProgramEnvTest.TestExecuteNoWaitDetached"};
298+
addEnvVar("LLVM_PROGRAM_TEST_EXECUTE_NO_WAIT_DETACHED=1");
299+
300+
#ifndef _WIN32
301+
pid_t SID = ::getsid(0);
302+
ASSERT_NE(SID, -1);
303+
std::string SIDEnvVar =
304+
"LLVM_PROGRAM_TEST_EXECUTE_NO_WAIT_DETACHED_SID=" + std::to_string(SID);
305+
addEnvVar(SIDEnvVar);
306+
#endif
307+
308+
// DetachProcess = true
309+
{
310+
std::string Error;
311+
bool ExecutionFailed;
312+
std::vector<llvm::StringRef> Env = getEnviron();
313+
Env.emplace_back("LLVM_PROGRAM_TEST_EXECUTE_NO_WAIT_DETACHED_TRUE=1");
314+
ProcessInfo PI1 =
315+
ExecuteNoWait(Executable, argv, Env, {}, 0, &Error, &ExecutionFailed,
316+
nullptr, /*DetachedProcess=*/true);
317+
ASSERT_FALSE(ExecutionFailed) << Error;
318+
ASSERT_NE(PI1.Pid, ProcessInfo::InvalidPid) << "Invalid process id";
319+
ProcessInfo WaitResult = Wait(PI1, std::nullopt, &Error);
320+
ASSERT_EQ(WaitResult.ReturnCode, 100);
321+
}
322+
323+
// DetachProcess = false
324+
{
325+
std::string Error;
326+
bool ExecutionFailed;
327+
ProcessInfo PI2 = ExecuteNoWait(Executable, argv, getEnviron(), {}, 0,
328+
&Error, &ExecutionFailed, nullptr);
329+
ASSERT_FALSE(ExecutionFailed) << Error;
330+
ASSERT_NE(PI2.Pid, ProcessInfo::InvalidPid) << "Invalid process id";
331+
ProcessInfo WaitResult = Wait(PI2, std::nullopt, &Error);
332+
ASSERT_EQ(WaitResult.ReturnCode, 200);
333+
}
334+
}
335+
263336
TEST_F(ProgramEnvTest, TestExecuteAndWaitTimeout) {
264337
using namespace llvm::sys;
265338

0 commit comments

Comments
 (0)