Skip to content

Commit f261d5a

Browse files
committed
WIP unittest - should work on unix but fail to compile on windows
1 parent 69bb682 commit f261d5a

File tree

1 file changed

+65
-0
lines changed

1 file changed

+65
-0
lines changed

llvm/unittests/Support/ProgramTest.cpp

Lines changed: 65 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -260,6 +260,71 @@ 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+
int ParentSID = std::stoi(
270+
std::string(getenv("LLVM_PROGRAM_TEST_EXECUTE_NO_WAIT_DETACHED_SID")));
271+
272+
pid_t ChildSID = ::getsid(0);
273+
if (ChildSID == -1) {
274+
llvm::errs() << "Could not get process SID: " << strerror(errno) << '\n';
275+
exit(1);
276+
}
277+
278+
char *IsDetached =
279+
getenv("LLVM_PROGRAM_TEST_EXECUTE_NO_WAIT_DETACHED_TRUE");
280+
if (IsDetached && (ChildSID != ParentSID))
281+
exit(100);
282+
if (!IsDetached && (ChildSID == ParentSID))
283+
exit(200);
284+
285+
exit(0);
286+
}
287+
288+
std::string Executable =
289+
sys::fs::getMainExecutable(TestMainArgv0, &ProgramTestStringArg1);
290+
StringRef argv[] = {
291+
Executable, "--gtest_filter=ProgramEnvTest.TestExecuteNoWaitDetached"};
292+
addEnvVar("LLVM_PROGRAM_TEST_EXECUTE_NO_WAIT_DETACHED=1");
293+
294+
pid_t SID = ::getsid(0);
295+
ASSERT_NE(SID, -1);
296+
std::string SIDEnvVar =
297+
"LLVM_PROGRAM_TEST_EXECUTE_NO_WAIT_DETACHED_SID=" + std::to_string(SID);
298+
addEnvVar(SIDEnvVar);
299+
300+
// DetachProcess = true
301+
{
302+
std::string Error;
303+
bool ExecutionFailed;
304+
std::vector<llvm::StringRef> Env = getEnviron();
305+
Env.emplace_back("LLVM_PROGRAM_TEST_EXECUTE_NO_WAIT_DETACHED_TRUE=1");
306+
ProcessInfo PI1 =
307+
ExecuteNoWait(Executable, argv, Env, {}, 0, &Error, &ExecutionFailed,
308+
nullptr, /*DetachedProcess=*/true);
309+
ASSERT_FALSE(ExecutionFailed) << Error;
310+
ASSERT_NE(PI1.Pid, ProcessInfo::InvalidPid) << "Invalid process id";
311+
ProcessInfo WaitResult = Wait(PI1, std::nullopt, &Error);
312+
ASSERT_EQ(WaitResult.ReturnCode, 100);
313+
}
314+
315+
// DetachProcess = false
316+
{
317+
std::string Error;
318+
bool ExecutionFailed;
319+
ProcessInfo PI2 = ExecuteNoWait(Executable, argv, getEnviron(), {}, 0,
320+
&Error, &ExecutionFailed, nullptr);
321+
ASSERT_FALSE(ExecutionFailed) << Error;
322+
ASSERT_NE(PI2.Pid, ProcessInfo::InvalidPid) << "Invalid process id";
323+
ProcessInfo WaitResult = Wait(PI2, std::nullopt, &Error);
324+
ASSERT_EQ(WaitResult.ReturnCode, 200);
325+
}
326+
}
327+
263328
TEST_F(ProgramEnvTest, TestExecuteAndWaitTimeout) {
264329
using namespace llvm::sys;
265330

0 commit comments

Comments
 (0)