xref: /llvm-project/libc/test/integration/src/unistd/execv_test.cpp (revision b6bc9d72f65a5086f310f321e969d96e9a559e75)
13f965818SSiva Chandra Reddy //===-- Unittests for execv -----------------------------------------------===//
23f965818SSiva Chandra Reddy //
33f965818SSiva Chandra Reddy // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
43f965818SSiva Chandra Reddy // See https://llvm.org/LICENSE.txt for license information.
53f965818SSiva Chandra Reddy // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
63f965818SSiva Chandra Reddy //
73f965818SSiva Chandra Reddy //===----------------------------------------------------------------------===//
83f965818SSiva Chandra Reddy 
93f965818SSiva Chandra Reddy #include "src/sys/wait/waitpid.h"
103f965818SSiva Chandra Reddy #include "src/unistd/execv.h"
113f965818SSiva Chandra Reddy #include "src/unistd/fork.h"
123f965818SSiva Chandra Reddy 
13af1315c2SSiva Chandra Reddy #include "test/IntegrationTest/test.h"
143f965818SSiva Chandra Reddy 
153f965818SSiva Chandra Reddy #include <signal.h>
163f965818SSiva Chandra Reddy #include <sys/wait.h>
173f965818SSiva Chandra Reddy 
fork_and_execv_normal_exit()183f965818SSiva Chandra Reddy void fork_and_execv_normal_exit() {
19*b6bc9d72SGuillaume Chatelet   pid_t pid = LIBC_NAMESPACE::fork();
203f965818SSiva Chandra Reddy   if (pid == 0) {
213f965818SSiva Chandra Reddy     const char *path = "libc_execv_test_normal_exit";
223f965818SSiva Chandra Reddy     char *const argv[] = {
233f965818SSiva Chandra Reddy         const_cast<char *>("execv_test_normal_exit"),
243f965818SSiva Chandra Reddy         nullptr,
253f965818SSiva Chandra Reddy     };
26*b6bc9d72SGuillaume Chatelet     LIBC_NAMESPACE::execv(path, argv);
273f965818SSiva Chandra Reddy   }
283f965818SSiva Chandra Reddy   ASSERT_TRUE(pid > 0);
293f965818SSiva Chandra Reddy   int status;
30*b6bc9d72SGuillaume Chatelet   pid_t cpid = LIBC_NAMESPACE::waitpid(pid, &status, 0);
313f965818SSiva Chandra Reddy   ASSERT_TRUE(cpid > 0);
323f965818SSiva Chandra Reddy   ASSERT_EQ(cpid, pid);
333f965818SSiva Chandra Reddy   ASSERT_TRUE(WIFEXITED(status));
343f965818SSiva Chandra Reddy }
353f965818SSiva Chandra Reddy 
fork_and_execv_signal_exit()363f965818SSiva Chandra Reddy void fork_and_execv_signal_exit() {
37*b6bc9d72SGuillaume Chatelet   pid_t pid = LIBC_NAMESPACE::fork();
383f965818SSiva Chandra Reddy   if (pid == 0) {
393f965818SSiva Chandra Reddy     const char *path = "libc_execv_test_signal_exit";
403f965818SSiva Chandra Reddy     char *const argv[] = {
413f965818SSiva Chandra Reddy         const_cast<char *>("execv_test_normal_exit"),
423f965818SSiva Chandra Reddy         nullptr,
433f965818SSiva Chandra Reddy     };
44*b6bc9d72SGuillaume Chatelet     LIBC_NAMESPACE::execv(path, argv);
453f965818SSiva Chandra Reddy   }
463f965818SSiva Chandra Reddy   ASSERT_TRUE(pid > 0);
473f965818SSiva Chandra Reddy   int status;
48*b6bc9d72SGuillaume Chatelet   pid_t cpid = LIBC_NAMESPACE::waitpid(pid, &status, 0);
493f965818SSiva Chandra Reddy   ASSERT_TRUE(cpid > 0);
503f965818SSiva Chandra Reddy   ASSERT_EQ(cpid, pid);
513f965818SSiva Chandra Reddy   ASSERT_FALSE(WIFEXITED(status));
523f965818SSiva Chandra Reddy   ASSERT_TRUE(WTERMSIG(status) == SIGUSR1);
533f965818SSiva Chandra Reddy }
543f965818SSiva Chandra Reddy 
TEST_MAIN(int argc,char ** argv,char ** envp)553f965818SSiva Chandra Reddy TEST_MAIN(int argc, char **argv, char **envp) {
563f965818SSiva Chandra Reddy   fork_and_execv_normal_exit();
573f965818SSiva Chandra Reddy   fork_and_execv_signal_exit();
583f965818SSiva Chandra Reddy   return 0;
593f965818SSiva Chandra Reddy }
60