@@ -260,6 +260,71 @@ 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
+ 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
+
263
328
TEST_F (ProgramEnvTest, TestExecuteAndWaitTimeout) {
264
329
using namespace llvm ::sys;
265
330
0 commit comments