@@ -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+
263336TEST_F (ProgramEnvTest, TestExecuteAndWaitTimeout) {
264337 using namespace llvm ::sys;
265338
0 commit comments