Module Name: src Committed By: christos Date: Mon Nov 15 13:59:16 UTC 2021
Modified Files: src/tests/lib/libc/gen/posix_spawn: t_spawn.c Log Message: Add missing test To generate a diff of this commit: cvs rdiff -u -r1.4 -r1.5 src/tests/lib/libc/gen/posix_spawn/t_spawn.c Please note that diffs are not public domain; they are subject to the copyright notices on the relevant files.
Modified files: Index: src/tests/lib/libc/gen/posix_spawn/t_spawn.c diff -u src/tests/lib/libc/gen/posix_spawn/t_spawn.c:1.4 src/tests/lib/libc/gen/posix_spawn/t_spawn.c:1.5 --- src/tests/lib/libc/gen/posix_spawn/t_spawn.c:1.4 Sun Nov 7 10:46:20 2021 +++ src/tests/lib/libc/gen/posix_spawn/t_spawn.c Mon Nov 15 08:59:16 2021 @@ -1,4 +1,4 @@ -/* $NetBSD: t_spawn.c,v 1.4 2021/11/07 15:46:20 christos Exp $ */ +/* $NetBSD: t_spawn.c,v 1.5 2021/11/15 13:59:16 christos Exp $ */ /*- * Copyright (c) 2012 The NetBSD Foundation, Inc. @@ -30,7 +30,7 @@ * POSSIBILITY OF SUCH DAMAGE. */ #include <sys/cdefs.h> -__RCSID("$NetBSD: t_spawn.c,v 1.4 2021/11/07 15:46:20 christos Exp $"); +__RCSID("$NetBSD: t_spawn.c,v 1.5 2021/11/15 13:59:16 christos Exp $"); #include <atf-c.h> @@ -193,7 +193,8 @@ static void check_success(const char *file, int argc, ...) { va_list ap; - int bytesRead, fd; + ssize_t bytesRead; + int fd; size_t sizeOfFile = (size_t)filesize(file); size_t sizeOfStr; char *contents; @@ -204,7 +205,7 @@ check_success(const char *file, int argc /* * for now only 1 variadic argument expected - * only from t_spawn_chdir_rel + * only from t_spawn_[f]chdir_rel */ if (argc != 0) { va_start(ap, argc); @@ -237,7 +238,7 @@ check_success(const char *file, int argc free(contents); /* XXX not really required */ - ATF_REQUIRE(bytesRead = sizeOfStr); + ATF_REQUIRE((size_t)bytesRead == sizeOfStr); } ATF_TC(t_spawn_chdir_abs); @@ -492,15 +493,15 @@ ATF_TC_BODY(t_spawn_chdir_permissions, t } -ATF_TC(t_spawn_fchdir); +ATF_TC(t_spawn_fchdir_abs); -ATF_TC_HEAD(t_spawn_fchdir, tc) +ATF_TC_HEAD(t_spawn_fchdir_abs, tc) { atf_tc_set_md_var(tc, "descr", "Test posix_spawn_fa_fchdir"); atf_tc_set_md_var(tc, "require.progs", "/bin/pwd"); } -ATF_TC_BODY(t_spawn_fchdir, tc) +ATF_TC_BODY(t_spawn_fchdir_abs, tc) { int error, fd, status; pid_t pid; @@ -510,7 +511,7 @@ ATF_TC_BODY(t_spawn_fchdir, tc) empty_outfile(FILEPATH); fd = open(CHDIRPATH, O_RDONLY); - ATF_REQUIRE(fd >= 0); + ATF_REQUIRE(fd != -1); error = posix_spawn_file_actions_init(&fa); ATF_REQUIRE(error == 0); @@ -539,59 +540,99 @@ ATF_TC_BODY(t_spawn_fchdir, tc) check_success(FILEPATH, 0); } -ATF_TC(t_spawn_fchdir_neg_fd); +ATF_TC(t_spawn_fchdir_rel); -ATF_TC_HEAD(t_spawn_fchdir_neg_fd, tc) +ATF_TC_HEAD(t_spawn_fchdir_rel, tc) { atf_tc_set_md_var(tc, "descr", - "Testing posix_spawn_file_actions_addfchdir on a negative file " - "descriptor"); + "Testing posix_spawn_file_actions_addfchdir on a relative " + "directory"); atf_tc_set_md_var(tc, "require.progs", "/bin/pwd"); } -ATF_TC_BODY(t_spawn_fchdir_neg_fd, tc) +ATF_TC_BODY(t_spawn_fchdir_rel, tc) { - int error, fd; + int error, fd, status; + pid_t pid; + const char *relative_dir = "ch-dir"; + const char *testdir = getcwd(NULL, 0); + char * const args[2] = { __UNCONST("pwd"), NULL }; + char *chdirwd, *filepath; posix_spawn_file_actions_t fa; - fd = -1; + error = mkdir(relative_dir, 0755); + ATF_REQUIRE(error == 0); + + /* + * This is done in parts purposely. + * It enbales the abs path of the relative dir + * to be passed to 'check_success()' for comparing + */ + error = asprintf(&chdirwd, "%s/%s", testdir, relative_dir); + ATF_CHECK(error != -1); + + error = asprintf(&filepath, "%s/%s", chdirwd, FILENAME); + ATF_CHECK(error != -1); + + empty_outfile(filepath); + + fd = open(relative_dir, O_RDONLY); + ATF_REQUIRE(fd != -1); error = posix_spawn_file_actions_init(&fa); ATF_REQUIRE(error == 0); error = posix_spawn_file_actions_addfchdir(&fa, fd); - ATF_REQUIRE(error == EBADF); + ATF_REQUIRE(error == 0); + + error = posix_spawn_file_actions_addopen(&fa, STDOUT_FILENO, FILENAME, + O_WRONLY, 0); + ATF_REQUIRE(error == 0); + + error = posix_spawn(&pid, "/bin/pwd", &fa, NULL, args, NULL); + ATF_REQUIRE(error == 0); + + /* wait for the child to finish */ + waitpid(pid, &status, 0); + ATF_REQUIRE_MSG(WIFEXITED(status) && WEXITSTATUS(status) == EXIT_SUCCESS, + "%s", "chdir failed"); posix_spawn_file_actions_destroy(&fa); + + error = close(fd); + ATF_REQUIRE(error == 0); + + /* finally cross check the directory */ + check_success(filepath, 1, chdirwd); + free(chdirwd); + free(filepath); + rmdir(relative_dir); } -ATF_TC(t_spawn_fchdir_closed); +ATF_TC(t_spawn_fchdir_file); -ATF_TC_HEAD(t_spawn_fchdir_closed, tc) +ATF_TC_HEAD(t_spawn_fchdir_file, tc) { atf_tc_set_md_var(tc, "descr", - "Testing posix_spawn_file_actions_addfchdir for a closed fd"); + "Testing posix_spawn_file_actions_addfchdir on a " + "regular file (not a directory)"); atf_tc_set_md_var(tc, "require.progs", "/bin/pwd"); } -ATF_TC_BODY(t_spawn_fchdir_closed, tc) +ATF_TC_BODY(t_spawn_fchdir_file, tc) { - int error, fd; + int error, fd; pid_t pid; char * const args[2] = { __UNCONST("pwd"), NULL }; posix_spawnattr_t attr; posix_spawn_file_actions_t fa; - /* - * fd = open(CHDIRPATH, O_RDONLY); - * ATF_REQUIRE(fd >= 0); - * error = close(fd); - * ATF_REQUIRE(error == 0); - */ - fd = 3; + fd = open(FILEPATH, O_WRONLY | O_CREAT | O_TRUNC, 0644); + ATF_REQUIRE_MSG(fd != -1, "Can't open `%s' (%s)", FILEPATH, + strerror(errno)); error = posix_spawnattr_init(&attr); - ATF_CHECK(error == 0); + ATF_REQUIRE(error == 0); /* * POSIX_SPAWN_RETURNERROR is a NetBSD specific flag that * will cause a "proper" return value from posix_spawn(2) @@ -609,36 +650,64 @@ ATF_TC_BODY(t_spawn_fchdir_closed, tc) ATF_REQUIRE(error == 0); error = posix_spawn(&pid, "/bin/pwd", &fa, &attr, args, NULL); - ATF_REQUIRE(error == EBADF); + ATF_CHECK(error == ENOTDIR); posix_spawn_file_actions_destroy(&fa); posix_spawnattr_destroy(&attr); + + error = close(fd); + ATF_REQUIRE(error == 0); + + unlink(FILEPATH); + } -ATF_TC(t_spawn_fchdir_file); +ATF_TC(t_spawn_fchdir_neg_fd); -ATF_TC_HEAD(t_spawn_fchdir_file, tc) +ATF_TC_HEAD(t_spawn_fchdir_neg_fd, tc) { atf_tc_set_md_var(tc, "descr", - "Testing posix_spawn_file_actions_addfchdir on a " - "regular file (not a directory)"); + "Testing posix_spawn_file_actions_addfchdir on a negative file " + "descriptor"); atf_tc_set_md_var(tc, "require.progs", "/bin/pwd"); } -ATF_TC_BODY(t_spawn_fchdir_file, tc) +ATF_TC_BODY(t_spawn_fchdir_neg_fd, tc) { - int error, fd; + int error, fd; + posix_spawn_file_actions_t fa; + + fd = -1; + + error = posix_spawn_file_actions_init(&fa); + ATF_REQUIRE(error == 0); + + error = posix_spawn_file_actions_addfchdir(&fa, fd); + ATF_REQUIRE(error == EBADF); + + posix_spawn_file_actions_destroy(&fa); +} + +ATF_TC(t_spawn_fchdir_closed); + +ATF_TC_HEAD(t_spawn_fchdir_closed, tc) +{ + atf_tc_set_md_var(tc, "descr", + "Testing posix_spawn_file_actions_addfchdir for a closed fd"); + atf_tc_set_md_var(tc, "require.progs", "/bin/pwd"); +} + +ATF_TC_BODY(t_spawn_fchdir_closed, tc) +{ + int error, fd; pid_t pid; char * const args[2] = { __UNCONST("pwd"), NULL }; posix_spawnattr_t attr; posix_spawn_file_actions_t fa; - fd = open(FILEPATH, O_WRONLY | O_CREAT | O_TRUNC, 0644); - ATF_REQUIRE_MSG(fd != -1, "Can't open `%s' (%s)", FILEPATH, - strerror(errno)); - + fd = 3; error = posix_spawnattr_init(&attr); - ATF_REQUIRE(error == 0); + ATF_CHECK(error == 0); /* * POSIX_SPAWN_RETURNERROR is a NetBSD specific flag that * will cause a "proper" return value from posix_spawn(2) @@ -656,16 +725,10 @@ ATF_TC_BODY(t_spawn_fchdir_file, tc) ATF_REQUIRE(error == 0); error = posix_spawn(&pid, "/bin/pwd", &fa, &attr, args, NULL); - ATF_CHECK(error == ENOTDIR); + ATF_REQUIRE(error == EBADF); posix_spawn_file_actions_destroy(&fa); posix_spawnattr_destroy(&attr); - - error = close(fd); - ATF_REQUIRE(error == 0); - - unlink(FILEPATH); - } #undef CHDIRPATH @@ -685,10 +748,11 @@ ATF_TP_ADD_TCS(tp) ATF_TP_ADD_TC(tp, t_spawn_chdir_file); ATF_TP_ADD_TC(tp, t_spawn_chdir_invalid); ATF_TP_ADD_TC(tp, t_spawn_chdir_permissions); - ATF_TP_ADD_TC(tp, t_spawn_fchdir); + ATF_TP_ADD_TC(tp, t_spawn_fchdir_abs); + ATF_TP_ADD_TC(tp, t_spawn_fchdir_rel); + ATF_TP_ADD_TC(tp, t_spawn_fchdir_file); ATF_TP_ADD_TC(tp, t_spawn_fchdir_neg_fd); ATF_TP_ADD_TC(tp, t_spawn_fchdir_closed); - ATF_TP_ADD_TC(tp, t_spawn_fchdir_file); return atf_no_error(); }