@@ -260,6 +260,79 @@ TEST_F(ProgramEnvTest, TestExecuteNoWait) {
260
260
ASSERT_GT (LoopCount, 1u ) << " LoopCount should be >1" ;
261
261
}
262
262
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
+
263
336
TEST_F (ProgramEnvTest, TestExecuteAndWaitTimeout) {
264
337
using namespace llvm ::sys;
265
338
0 commit comments