xref: /aosp_15_r20/external/llvm-libc/test/integration/src/unistd/execve_test.cpp (revision 71db0c75aadcf003ffe3238005f61d7618a3fead)
1 //===-- Unittests for execve ----------------------------------------------===//
2 //
3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4 // See https://llvm.org/LICENSE.txt for license information.
5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6 //
7 //===----------------------------------------------------------------------===//
8 
9 #include "src/sys/wait/waitpid.h"
10 #include "src/unistd/execve.h"
11 #include "src/unistd/fork.h"
12 
13 #include "test/IntegrationTest/test.h"
14 
15 #include <signal.h>
16 #include <sys/wait.h>
17 
fork_and_execv_normal_exit(char ** envp)18 void fork_and_execv_normal_exit(char **envp) {
19   pid_t pid = LIBC_NAMESPACE::fork();
20   if (pid == 0) {
21     const char *path = "libc_execv_test_normal_exit";
22     char *const argv[] = {
23         const_cast<char *>("execv_test_normal_exit"),
24         nullptr,
25     };
26     LIBC_NAMESPACE::execve(path, argv, envp);
27   }
28   ASSERT_TRUE(pid > 0);
29   int status;
30   pid_t cpid = LIBC_NAMESPACE::waitpid(pid, &status, 0);
31   ASSERT_TRUE(cpid > 0);
32   ASSERT_EQ(cpid, pid);
33   ASSERT_TRUE(WIFEXITED(status));
34 }
35 
fork_and_execv_signal_exit(char ** envp)36 void fork_and_execv_signal_exit(char **envp) {
37   pid_t pid = LIBC_NAMESPACE::fork();
38   if (pid == 0) {
39     const char *path = "libc_execv_test_signal_exit";
40     char *const argv[] = {
41         const_cast<char *>("execv_test_normal_exit"),
42         nullptr,
43     };
44     LIBC_NAMESPACE::execve(path, argv, envp);
45   }
46   ASSERT_TRUE(pid > 0);
47   int status;
48   pid_t cpid = LIBC_NAMESPACE::waitpid(pid, &status, 0);
49   ASSERT_TRUE(cpid > 0);
50   ASSERT_EQ(cpid, pid);
51   ASSERT_FALSE(WIFEXITED(status));
52   ASSERT_TRUE(WTERMSIG(status) == SIGUSR1);
53 }
54 
TEST_MAIN(int argc,char ** argv,char ** envp)55 TEST_MAIN(int argc, char **argv, char **envp) {
56   fork_and_execv_normal_exit(envp);
57   fork_and_execv_signal_exit(envp);
58   return 0;
59 }
60