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();
 }

Reply via email to