xref: /llvm-project/libc/test/integration/src/spawn/posix_spawn_test.cpp (revision b6bc9d72f65a5086f310f321e969d96e9a559e75)
102a543dbSSiva Chandra Reddy //===-- Unittests for posix_spawn -----------------------------------------===//
202a543dbSSiva Chandra Reddy //
302a543dbSSiva Chandra Reddy // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
402a543dbSSiva Chandra Reddy // See https://llvm.org/LICENSE.txt for license information.
502a543dbSSiva Chandra Reddy // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
602a543dbSSiva Chandra Reddy //
702a543dbSSiva Chandra Reddy //===----------------------------------------------------------------------===//
802a543dbSSiva Chandra Reddy 
902a543dbSSiva Chandra Reddy #include "test_binary_properties.h"
1002a543dbSSiva Chandra Reddy 
1102a543dbSSiva Chandra Reddy #include "src/spawn/posix_spawn.h"
1202a543dbSSiva Chandra Reddy #include "src/spawn/posix_spawn_file_actions_addopen.h"
1302a543dbSSiva Chandra Reddy #include "src/spawn/posix_spawn_file_actions_destroy.h"
1402a543dbSSiva Chandra Reddy #include "src/spawn/posix_spawn_file_actions_init.h"
1502a543dbSSiva Chandra Reddy #include "src/sys/wait/waitpid.h"
16af1315c2SSiva Chandra Reddy #include "test/IntegrationTest/test.h"
1702a543dbSSiva Chandra Reddy 
1802a543dbSSiva Chandra Reddy #include <fcntl.h>
1902a543dbSSiva Chandra Reddy #include <spawn.h>
2002a543dbSSiva Chandra Reddy #include <stddef.h>
2102a543dbSSiva Chandra Reddy #include <stdint.h>
2202a543dbSSiva Chandra Reddy #include <sys/wait.h>
2302a543dbSSiva Chandra Reddy 
2402a543dbSSiva Chandra Reddy char arg0[] = "libc_posix_spawn_test_binary";
2502a543dbSSiva Chandra Reddy char *argv[] = {
2602a543dbSSiva Chandra Reddy     arg0,
2702a543dbSSiva Chandra Reddy     nullptr,
2802a543dbSSiva Chandra Reddy };
2902a543dbSSiva Chandra Reddy 
spawn_and_wait_for_normal_exit(char ** envp)3002a543dbSSiva Chandra Reddy void spawn_and_wait_for_normal_exit(char **envp) {
3102a543dbSSiva Chandra Reddy   pid_t cpid;
3202a543dbSSiva Chandra Reddy   posix_spawn_file_actions_t file_actions;
33*b6bc9d72SGuillaume Chatelet   ASSERT_EQ(LIBC_NAMESPACE::posix_spawn_file_actions_init(&file_actions), 0);
34*b6bc9d72SGuillaume Chatelet   LIBC_NAMESPACE::posix_spawn_file_actions_addopen(
3502a543dbSSiva Chandra Reddy       &file_actions, CHILD_FD, "testdata/posix_spawn.test", O_RDONLY, 0);
36*b6bc9d72SGuillaume Chatelet   ASSERT_EQ(LIBC_NAMESPACE::posix_spawn(&cpid, arg0, &file_actions, nullptr,
37*b6bc9d72SGuillaume Chatelet                                         argv, envp),
3802a543dbSSiva Chandra Reddy             0);
3902a543dbSSiva Chandra Reddy   ASSERT_TRUE(cpid > 0);
4002a543dbSSiva Chandra Reddy   int status;
41*b6bc9d72SGuillaume Chatelet   ASSERT_EQ(LIBC_NAMESPACE::waitpid(cpid, &status, 0), cpid);
42*b6bc9d72SGuillaume Chatelet   ASSERT_EQ(LIBC_NAMESPACE::posix_spawn_file_actions_destroy(&file_actions), 0);
4302a543dbSSiva Chandra Reddy   ASSERT_TRUE(WIFEXITED(status));
4402a543dbSSiva Chandra Reddy   int exit_status = WEXITSTATUS(status);
4502a543dbSSiva Chandra Reddy   ASSERT_EQ(exit_status, 0);
4602a543dbSSiva Chandra Reddy }
4702a543dbSSiva Chandra Reddy 
TEST_MAIN(int argc,char ** argv,char ** envp)4802a543dbSSiva Chandra Reddy TEST_MAIN(int argc, char **argv, char **envp) {
4902a543dbSSiva Chandra Reddy   spawn_and_wait_for_normal_exit(envp);
5002a543dbSSiva Chandra Reddy   return 0;
5102a543dbSSiva Chandra Reddy }
52