Skip site navigation (1)Skip section navigation (2)
Date:      Mon, 9 Nov 2015 06:24:11 +0000 (UTC)
From:      Garrett Cooper <ngie@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org
Subject:   svn commit: r290572 - in head: lib/libc/tests/gen tools/regression/lib/libc/gen
Message-ID:  <201511090624.tA96OBQG063661@repo.freebsd.org>

next in thread | raw e-mail | index | archive | help
Author: ngie
Date: Mon Nov  9 06:24:11 2015
New Revision: 290572
URL: https://svnweb.freebsd.org/changeset/base/290572

Log:
  Integrate tools/regression/lib/libc/gen into the FreeBSD test suite
  as lib/libc/tests/gen
  
  The code in test-fnmatch that was used for generating:
  
  - bin/sh/tests/builtins/case2.0
  - bin/sh/tests/builtins/case3.0
  
  has been left undisturbed. The target `make sh-tests` has been moved over
  from tools/regression/lib/libc/gen/Makefile to
  lib/libc/tests/gen/Makefile and made into a PHONY target
  
  case2.0 and case3.0 test input generation isn't being done automatically.
  This needs additional discussion.
  
  MFC after: 1 week
  Sponsored by: EMC / Isilon Storage Division

Added:
  head/lib/libc/tests/gen/fmtcheck_test.c
     - copied, changed from r290571, head/tools/regression/lib/libc/gen/test-fmtcheck.c
  head/lib/libc/tests/gen/fmtmsg_test.c
     - copied, changed from r290571, head/tools/regression/lib/libc/gen/test-fmtmsg.c
  head/lib/libc/tests/gen/fnmatch_test.c
     - copied, changed from r290571, head/tools/regression/lib/libc/gen/test-fnmatch.c
  head/lib/libc/tests/gen/fnmatch_testcases.h   (contents, props changed)
  head/lib/libc/tests/gen/ftw_test.c
     - copied, changed from r290571, head/tools/regression/lib/libc/gen/test-ftw.c
  head/lib/libc/tests/gen/popen_test.c
     - copied, changed from r290571, head/tools/regression/lib/libc/gen/test-popen.c
  head/lib/libc/tests/gen/posix_spawn_test.c
     - copied, changed from r290571, head/tools/regression/lib/libc/gen/test-posix_spawn.c
  head/lib/libc/tests/gen/test-fnmatch.c   (contents, props changed)
  head/lib/libc/tests/gen/wordexp_test.c
     - copied, changed from r290571, head/tools/regression/lib/libc/gen/test-wordexp.c
Deleted:
  head/tools/regression/lib/libc/gen/
Modified:
  head/lib/libc/tests/gen/Makefile

Modified: head/lib/libc/tests/gen/Makefile
==============================================================================
--- head/lib/libc/tests/gen/Makefile	Mon Nov  9 06:16:38 2015	(r290571)
+++ head/lib/libc/tests/gen/Makefile	Mon Nov  9 06:24:11 2015	(r290572)
@@ -2,8 +2,15 @@
 
 .include <bsd.own.mk>
 
-ATF_TESTS_C=		arc4random_test
+ATF_TESTS_C+=		arc4random_test
+ATF_TESTS_C+=		fmtcheck2_test
+ATF_TESTS_C+=		fmtmsg_test
+ATF_TESTS_C+=		fnmatch2_test
 ATF_TESTS_C+=		fpclassify2_test
+ATF_TESTS_C+=		ftw_test
+ATF_TESTS_C+=		popen_test
+ATF_TESTS_C+=		posix_spawn_test
+ATF_TESTS_C+=		wordexp_test
 
 # TODO: t_closefrom, t_cpuset, t_fmtcheck, t_randomid, t_sleep
 # TODO: t_siginfo (fixes require further inspection)
@@ -53,7 +60,25 @@ DPADD.nice_test+=	${LIBPTHREAD}
 LDADD.syslog_test+=	-lpthread
 DPADD.syslog_test+=	${LIBPTHREAD}
 
+CFLAGS+=		-I${.CURDIR}
+
+SRCS.fmtcheck2_test=	fmtcheck_test.c
+SRCS.fnmatch2_test=	fnmatch_test.c
+
 TESTS_SUBDIRS=	execve
 TESTS_SUBDIRS+=	posix_spawn
 
+# The old testcase name
+TEST_FNMATCH=	test-fnmatch
+CLEANFILES+=		${GEN_SH_CASE_TESTCASES}
+sh-tests: .PHONY
+.for target in clean obj depend all
+	@cd ${.CURDIR} && ${MAKE} PROG=${TEST_FNMATCH} \
+	    -DNO_SUBDIR ${target}
+.endfor
+	@cd ${.OBJDIR} && ./${TEST_FNMATCH} -s 1 > \
+	    ${SRCTOP}/bin/sh/tests/builtins/case2.0
+	@cd ${.OBJDIR} && ./${TEST_FNMATCH} -s 2 > \
+	    ${SRCTOP}/bin/sh/tests/builtins/case3.0
+
 .include <bsd.test.mk>

Copied and modified: head/lib/libc/tests/gen/fmtcheck_test.c (from r290571, head/tools/regression/lib/libc/gen/test-fmtcheck.c)
==============================================================================
--- head/tools/regression/lib/libc/gen/test-fmtcheck.c	Mon Nov  9 06:16:38 2015	(r290571, copy source)
+++ head/lib/libc/tests/gen/fmtcheck_test.c	Mon Nov  9 06:24:11 2015	(r290572)
@@ -31,10 +31,13 @@
 #include <sys/cdefs.h>
 __FBSDID("$FreeBSD$");
 
+#include <sys/param.h>
 #include <err.h>
 #include <stdio.h>
 #include <stdlib.h>
 
+#include <atf-c.h>
+
 struct test_fmt {
 	char	*fmt1;
 	char	*fmt2;
@@ -72,31 +75,31 @@ struct test_fmt {
 	{ "%p %30s %#llx %-10.*e", "This number %lu%% and string %s has %qd numbers and %.*g floats", 1 },
 };
 
-int
-main(int argc, char *argv[])
+ATF_TC_WITHOUT_HEAD(fmtcheck_test);
+ATF_TC_BODY(fmtcheck_test, tc)
 {
-	int		i, n, r;
-	const char	*f, *cf, *f1, *f2;
+	int i;
+	const char *f, *cf, *f1, *f2;
 
-	printf("1..1\n");
-	r = 0;
-	n = sizeof(test_fmts) / sizeof(test_fmts[0]);
-	for (i=0 ; i<n ; i++) {
+	for (i = 0; i < nitems(test_fmts); i++) {
 		f1 = test_fmts[i].fmt1;
 		f2 = test_fmts[i].fmt2;
 		f = fmtcheck(f1, f2);
-		if (test_fmts[i].correct == 1) {
+		if (test_fmts[i].correct == 1)
 			cf = f1;
-		} else {
+		else
 			cf = f2;
-		}
-		if (f != cf) {
-			r++;
-			errx(1, "Test %d: (%s) vs. (%s) failed "
-			    "(should have returned %s)", i, f1, f2,
-			    (test_fmts[i].correct == 1) ? "1st" : "2nd");
-		}
+		ATF_CHECK_MSG(f == cf,
+		    "Test %d: (%s) vs. (%s) failed "
+		    "(should have returned %s)", i + 1, f1, f2,
+		    (test_fmts[i].correct == 1) ? "1st" : "2nd");
 	}
-	printf("ok 1\n");
-	exit(0);
+}
+
+ATF_TP_ADD_TCS(tp)
+{
+
+	ATF_TP_ADD_TC(tp, fmtcheck_test);
+
+	return (atf_no_error());
 }

Copied and modified: head/lib/libc/tests/gen/fmtmsg_test.c (from r290571, head/tools/regression/lib/libc/gen/test-fmtmsg.c)
==============================================================================
--- head/tools/regression/lib/libc/gen/test-fmtmsg.c	Mon Nov  9 06:16:38 2015	(r290571, copy source)
+++ head/lib/libc/tests/gen/fmtmsg_test.c	Mon Nov  9 06:24:11 2015	(r290572)
@@ -27,8 +27,8 @@
 #include <sys/cdefs.h>
 __FBSDID("$FreeBSD$");
 
+#include <sys/param.h>
 #include <sys/wait.h>
-
 #include <err.h>
 #include <errno.h>
 #include <fmtmsg.h>
@@ -37,6 +37,8 @@ __FBSDID("$FreeBSD$");
 #include <string.h>
 #include <unistd.h>
 
+#include <atf-c.h>
+
 static char *run_test(long classification, const char *label, int severity,
     const char *text, const char *action, const char *tag);
 
@@ -217,18 +219,14 @@ run_test(long classification, const char
 	return (result);
 }
 
-int
-main(void)
+ATF_TC_WITHOUT_HEAD(fmtmsg_test);
+ATF_TC_BODY(fmtmsg_test, tc)
 {
-	size_t i, n;
-	int errors;
 	char *result;
 	struct testcase *t;
+	int i;
 
-	n = sizeof(testcases) / sizeof(testcases[0]);
-	errors = 0;
-	printf("1..%zu\n", n);
-	for (i = 0; i < n; i++) {
+	for (i = 0; i < nitems(testcases); i++) {
 		t = &testcases[i];
 		if (t->msgverb != NULL)
 			setenv("MSGVERB", t->msgverb, 1);
@@ -236,16 +234,19 @@ main(void)
 			unsetenv("MSGVERB");
 		result = run_test(t->classification, t->label, t->severity,
 		    t->text, t->action, t->tag);
-		if (result != NULL && strcmp(result, t->result) == 0)
-			printf("ok %zu - correct\n",
-			    i + 1);
-		else {
-			printf("not ok %zu - %s\n",
-			    i + 1, result != NULL ? "incorrect" : "failed");
-			errors = 1;
-		}
+		ATF_CHECK_MSG(result != NULL, "testcase %d failed", i + 1);
+		if (result != NULL)
+			ATF_CHECK_MSG(strcmp(result, t->result) == 0,
+			    "results for testcase %d didn't match; "
+			    "`%s` != `%s`", i + 1, result, t->result);
 		free(result);
 	}
+}
+
+ATF_TP_ADD_TCS(tp)
+{
+
+	ATF_TP_ADD_TC(tp, fmtmsg_test);
 
-	return (errors);
+	return (atf_no_error());
 }

Copied and modified: head/lib/libc/tests/gen/fnmatch_test.c (from r290571, head/tools/regression/lib/libc/gen/test-fnmatch.c)
==============================================================================
--- head/tools/regression/lib/libc/gen/test-fnmatch.c	Mon Nov  9 06:16:38 2015	(r290571, copy source)
+++ head/lib/libc/tests/gen/fnmatch_test.c	Mon Nov  9 06:24:11 2015	(r290572)
@@ -27,158 +27,16 @@
 #include <sys/cdefs.h>
 __FBSDID("$FreeBSD$");
 
+#include <sys/param.h>
 #include <errno.h>
 #include <stdio.h>
 #include <stdlib.h>
 #include <string.h>
 #include <unistd.h>
-#include <fnmatch.h>
 
-struct testcase {
-	const char *pattern;
-	const char *string;
-	int flags;
-	int result;
-} testcases[] = {
-	"", "", 0, 0,
-	"a", "a", 0, 0,
-	"a", "b", 0, FNM_NOMATCH,
-	"a", "A", 0, FNM_NOMATCH,
-	"*", "a", 0, 0,
-	"*", "aa", 0, 0,
-	"*a", "a", 0, 0,
-	"*a", "b", 0, FNM_NOMATCH,
-	"*a*", "b", 0, FNM_NOMATCH,
-	"*a*b*", "ab", 0, 0,
-	"*a*b*", "qaqbq", 0, 0,
-	"*a*bb*", "qaqbqbbq", 0, 0,
-	"*a*bc*", "qaqbqbcq", 0, 0,
-	"*a*bb*", "qaqbqbb", 0, 0,
-	"*a*bc*", "qaqbqbc", 0, 0,
-	"*a*bb", "qaqbqbb", 0, 0,
-	"*a*bc", "qaqbqbc", 0, 0,
-	"*a*bb", "qaqbqbbq", 0, FNM_NOMATCH,
-	"*a*bc", "qaqbqbcq", 0, FNM_NOMATCH,
-	"*a*a*a*a*a*a*a*a*a*a*", "aaaaaaaaa", 0, FNM_NOMATCH,
-	"*a*a*a*a*a*a*a*a*a*a*", "aaaaaaaaaa", 0, 0,
-	"*a*a*a*a*a*a*a*a*a*a*", "aaaaaaaaaaa", 0, 0,
-	".*.*.*.*.*.*.*.*.*.*", ".........", 0, FNM_NOMATCH,
-	".*.*.*.*.*.*.*.*.*.*", "..........", 0, 0,
-	".*.*.*.*.*.*.*.*.*.*", "...........", 0, 0,
-	"*?*?*?*?*?*?*?*?*?*?*", "123456789", 0, FNM_NOMATCH,
-	"??????????*", "123456789", 0, FNM_NOMATCH,
-	"*??????????", "123456789", 0, FNM_NOMATCH,
-	"*?*?*?*?*?*?*?*?*?*?*", "1234567890", 0, 0,
-	"??????????*", "1234567890", 0, 0,
-	"*??????????", "1234567890", 0, 0,
-	"*?*?*?*?*?*?*?*?*?*?*", "12345678901", 0, 0,
-	"??????????*", "12345678901", 0, 0,
-	"*??????????", "12345678901", 0, 0,
-	"[x]", "x", 0, 0,
-	"[*]", "*", 0, 0,
-	"[?]", "?", 0, 0,
-	"[", "[", 0, 0,
-	"[[]", "[", 0, 0,
-	"[[]", "x", 0, FNM_NOMATCH,
-	"[*]", "", 0, FNM_NOMATCH,
-	"[*]", "x", 0, FNM_NOMATCH,
-	"[?]", "x", 0, FNM_NOMATCH,
-	"*[*]*", "foo*foo", 0, 0,
-	"*[*]*", "foo", 0, FNM_NOMATCH,
-	"[0-9]", "0", 0, 0,
-	"[0-9]", "5", 0, 0,
-	"[0-9]", "9", 0, 0,
-	"[0-9]", "/", 0, FNM_NOMATCH,
-	"[0-9]", ":", 0, FNM_NOMATCH,
-	"[0-9]", "*", 0, FNM_NOMATCH,
-	"[!0-9]", "0", 0, FNM_NOMATCH,
-	"[!0-9]", "5", 0, FNM_NOMATCH,
-	"[!0-9]", "9", 0, FNM_NOMATCH,
-	"[!0-9]", "/", 0, 0,
-	"[!0-9]", ":", 0, 0,
-	"[!0-9]", "*", 0, 0,
-	"*[0-9]", "a0", 0, 0,
-	"*[0-9]", "a5", 0, 0,
-	"*[0-9]", "a9", 0, 0,
-	"*[0-9]", "a/", 0, FNM_NOMATCH,
-	"*[0-9]", "a:", 0, FNM_NOMATCH,
-	"*[0-9]", "a*", 0, FNM_NOMATCH,
-	"*[!0-9]", "a0", 0, FNM_NOMATCH,
-	"*[!0-9]", "a5", 0, FNM_NOMATCH,
-	"*[!0-9]", "a9", 0, FNM_NOMATCH,
-	"*[!0-9]", "a/", 0, 0,
-	"*[!0-9]", "a:", 0, 0,
-	"*[!0-9]", "a*", 0, 0,
-	"*[0-9]", "a00", 0, 0,
-	"*[0-9]", "a55", 0, 0,
-	"*[0-9]", "a99", 0, 0,
-	"*[0-9]", "a0a0", 0, 0,
-	"*[0-9]", "a5a5", 0, 0,
-	"*[0-9]", "a9a9", 0, 0,
-	"\\*", "*", 0, 0,
-	"\\?", "?", 0, 0,
-	"\\[x]", "[x]", 0, 0,
-	"\\[", "[", 0, 0,
-	"\\\\", "\\", 0, 0,
-	"*\\**", "foo*foo", 0, 0,
-	"*\\**", "foo", 0, FNM_NOMATCH,
-	"*\\\\*", "foo\\foo", 0, 0,
-	"*\\\\*", "foo", 0, FNM_NOMATCH,
-	"\\(", "(", 0, 0,
-	"\\a", "a", 0, 0,
-	"\\*", "a", 0, FNM_NOMATCH,
-	"\\?", "a", 0, FNM_NOMATCH,
-	"\\*", "\\*", 0, FNM_NOMATCH,
-	"\\?", "\\?", 0, FNM_NOMATCH,
-	"\\[x]", "\\[x]", 0, FNM_NOMATCH,
-	"\\[x]", "\\x", 0, FNM_NOMATCH,
-	"\\[", "\\[", 0, FNM_NOMATCH,
-	"\\(", "\\(", 0, FNM_NOMATCH,
-	"\\a", "\\a", 0, FNM_NOMATCH,
-	"\\", "\\", 0, FNM_NOMATCH,
-	"\\", "", 0, 0,
-	"\\*", "\\*", FNM_NOESCAPE, 0,
-	"\\?", "\\?", FNM_NOESCAPE, 0,
-	"\\", "\\", FNM_NOESCAPE, 0,
-	"\\\\", "\\", FNM_NOESCAPE, FNM_NOMATCH,
-	"\\\\", "\\\\", FNM_NOESCAPE, 0,
-	"*\\*", "foo\\foo", FNM_NOESCAPE, 0,
-	"*\\*", "foo", FNM_NOESCAPE, FNM_NOMATCH,
-	"*", ".", FNM_PERIOD, FNM_NOMATCH,
-	"?", ".", FNM_PERIOD, FNM_NOMATCH,
-	".*", ".", 0, 0,
-	".*", "..", 0, 0,
-	".*", ".a", 0, 0,
-	"[0-9]", ".", FNM_PERIOD, FNM_NOMATCH,
-	"a*", "a.", 0, 0,
-	"a/a", "a/a", FNM_PATHNAME, 0,
-	"a/*", "a/a", FNM_PATHNAME, 0,
-	"*/a", "a/a", FNM_PATHNAME, 0,
-	"*/*", "a/a", FNM_PATHNAME, 0,
-	"a*b/*", "abbb/x", FNM_PATHNAME, 0,
-	"a*b/*", "abbb/.x", FNM_PATHNAME, 0,
-	"*", "a/a", FNM_PATHNAME, FNM_NOMATCH,
-	"*/*", "a/a/a", FNM_PATHNAME, FNM_NOMATCH,
-	"b/*", "b/.x", FNM_PATHNAME | FNM_PERIOD, FNM_NOMATCH,
-	"b*/*", "a/.x", FNM_PATHNAME | FNM_PERIOD, FNM_NOMATCH,
-	"b/.*", "b/.x", FNM_PATHNAME | FNM_PERIOD, 0,
-	"b*/.*", "b/.x", FNM_PATHNAME | FNM_PERIOD, 0,
-	"a", "A", FNM_CASEFOLD, 0,
-	"A", "a", FNM_CASEFOLD, 0,
-	"[a]", "A", FNM_CASEFOLD, 0,
-	"[A]", "a", FNM_CASEFOLD, 0,
-	"a", "b", FNM_CASEFOLD, FNM_NOMATCH,
-	"a", "a/b", FNM_PATHNAME, FNM_NOMATCH,
-	"*", "a/b", FNM_PATHNAME, FNM_NOMATCH,
-	"*b", "a/b", FNM_PATHNAME, FNM_NOMATCH,
-	"a", "a/b", FNM_PATHNAME | FNM_LEADING_DIR, 0,
-	"*", "a/b", FNM_PATHNAME | FNM_LEADING_DIR, 0,
-	"*", ".a/b", FNM_PATHNAME | FNM_LEADING_DIR, 0,
-	"*a", ".a/b", FNM_PATHNAME | FNM_LEADING_DIR, 0,
-	"*", ".a/b", FNM_PATHNAME | FNM_PERIOD | FNM_LEADING_DIR, FNM_NOMATCH,
-	"*a", ".a/b", FNM_PATHNAME | FNM_PERIOD | FNM_LEADING_DIR, FNM_NOMATCH,
-	"a*b/*", "abbb/.x", FNM_PATHNAME | FNM_PERIOD, FNM_NOMATCH,
-};
+#include <atf-c.h>
+
+#include "fnmatch_testcases.h"
 
 static const char *
 flags_to_string(int flags)
@@ -213,71 +71,16 @@ flags_to_string(int flags)
 	return result;
 }
 
-static int
-write_sh_tests(const char *progname, int num)
-{
-	size_t i, n;
-	struct testcase *t;
-
-	printf("# Generated by %s -s %d, do not edit.\n", progname, num);
-	printf("# $" "FreeBSD$\n");
-	printf("failures=\n");
-	printf("failed() { printf '%%s\\n' \"Failed: $1 '$2' '$3'\"; failures=x$failures; }\n");
-	if (num == 1) {
-		printf("testmatch() { eval \"case \\$2 in ''$1) ;; *) failed testmatch \\\"\\$@\\\";; esac\"; }\n");
-		printf("testnomatch() { eval \"case \\$2 in ''$1) failed testnomatch \\\"\\$@\\\";; esac\"; }\n");
-	} else if (num == 2) {
-		printf("# We do not treat a backslash specially in this case,\n");
-		printf("# but this is not the case in all shells.\n");
-		printf("netestmatch() { case $2 in $1) ;; *) failed netestmatch \"$@\";; esac; }\n");
-		printf("netestnomatch() { case $2 in $1) failed netestnomatch \"$@\";; esac; }\n");
-	}
-	n = sizeof(testcases) / sizeof(testcases[0]);
-	for (i = 0; i < n; i++) {
-		t = &testcases[i];
-		if (strchr(t->pattern, '\'') != NULL ||
-		    strchr(t->string, '\'') != NULL)
-			continue;
-		if (t->flags == 0 && strcmp(t->pattern, "\\") == 0)
-			continue;
-		if (num == 1 && t->flags == 0)
-			printf("test%smatch '%s' '%s'\n",
-			    t->result == FNM_NOMATCH ? "no" : "",
-			    t->pattern, t->string);
-		if (num == 2 && (t->flags == FNM_NOESCAPE ||
-		    (t->flags == 0 && strchr(t->pattern, '\\') == NULL)))
-			printf("netest%smatch '%s' '%s'\n",
-			    t->result == FNM_NOMATCH ? "no" : "",
-			    t->pattern, t->string);
-	}
-	printf("[ -z \"$failures\" ]\n");
-	return 0;
-}
-
-int
-main(int argc, char *argv[])
+ATF_TC_WITHOUT_HEAD(fnmatch_test);
+ATF_TC_BODY(fnmatch_test, tc)
 {
-	size_t i, n;
-	int opt, flags, result, extra, errors;
+	size_t i;
+	int flags, result;
 	struct testcase *t;
 
-	while ((opt = getopt(argc, argv, "s:")) != -1) {
-		switch (opt) {
-			case 's':
-				return (write_sh_tests(argv[0], atoi(optarg)));
-			default:
-				fprintf(stderr, "usage: %s [-s num]\n", argv[0]);
-				fprintf(stderr, "-s option writes tests for sh(1), num is 1 or 2\n");
-				exit(1);
-		}
-	}
-	n = sizeof(testcases) / sizeof(testcases[0]);
-	errors = 0;
-	printf("1..%zu\n", n);
-	for (i = 0; i < n; i++) {
+	for (i = 0; i < nitems(testcases); i++) {
 		t = &testcases[i];
 		flags = t->flags;
-		extra = 0;
 		do {
 			result = fnmatch(t->pattern, t->string, flags);
 			if (result != t->result)
@@ -289,7 +92,6 @@ main(int argc, char *argv[])
 				if (result != t->result)
 					break;
 				flags = t->flags;
-				extra++;
 			}
 			if (strchr(t->pattern, '\\') != NULL &&
 			    strchr(t->string, '\\') == NULL &&
@@ -300,7 +102,6 @@ main(int argc, char *argv[])
 				if (result != t->result)
 					break;
 				flags = t->flags;
-				extra++;
 			}
 			if ((t->string[0] != '.' || t->pattern[0] == '.' ||
 			    t->result == FNM_NOMATCH) &&
@@ -310,7 +111,6 @@ main(int argc, char *argv[])
 				if (result != t->result)
 					break;
 				flags = t->flags;
-				extra++;
 			}
 			if ((strchr(t->string, '/') == NULL ||
 			    t->result == FNM_NOMATCH) &&
@@ -320,7 +120,6 @@ main(int argc, char *argv[])
 				if (result != t->result)
 					break;
 				flags = t->flags;
-				extra++;
 			}
 			if ((((t->string[0] != '.' || t->pattern[0] == '.') &&
 			    strstr(t->string, "/.") == NULL) ||
@@ -331,7 +130,6 @@ main(int argc, char *argv[])
 				if (result != t->result)
 					break;
 				flags = t->flags;
-				extra++;
 			}
 			if ((((t->string[0] != '.' || t->pattern[0] == '.') &&
 			    strchr(t->string, '/') == NULL) ||
@@ -342,7 +140,6 @@ main(int argc, char *argv[])
 				if (result != t->result)
 					break;
 				flags = t->flags;
-				extra++;
 			}
 			if ((strchr(t->string, '/') == NULL || t->result == 0)
 			    && !(flags & FNM_LEADING_DIR)) {
@@ -351,7 +148,6 @@ main(int argc, char *argv[])
 				if (result != t->result)
 					break;
 				flags = t->flags;
-				extra++;
 			}
 			if (t->result == 0 && !(flags & FNM_CASEFOLD)) {
 				flags |= FNM_CASEFOLD;
@@ -359,7 +155,6 @@ main(int argc, char *argv[])
 				if (result != t->result)
 					break;
 				flags = t->flags;
-				extra++;
 			}
 			if (strchr(t->pattern, '\\') == NULL &&
 			    t->result == 0 &&
@@ -369,22 +164,25 @@ main(int argc, char *argv[])
 				if (result != t->result)
 					break;
 				flags = t->flags;
-				extra++;
 			}
 		} while (0);
+
+		ATF_CHECK(result == t->result);
 		if (result == t->result)
-			printf("ok %zu - fnmatch(\"%s\", \"%s\", %s) = %d (+%d)\n",
-			    i + 1, t->pattern, t->string,
-			    flags_to_string(flags),
-			    result, extra);
-		else {
-			printf("not ok %zu - fnmatch(\"%s\", \"%s\", %s) = %d != %d\n",
-			    i + 1, t->pattern, t->string,
-			    flags_to_string(flags),
-			    result, t->result);
-			errors = 1;
-		}
+			printf("fnmatch(\"%s\", \"%s\", %s) == %d\n",
+			    t->pattern, t->string, flags_to_string(flags), result);
+		else
+			printf("fnmatch(\"%s\", \"%s\", %s) != %d (was %d)\n",
+			    t->pattern, t->string, flags_to_string(flags),
+			    t->result, result);
 	}
 
-	return (errors);
+}
+
+ATF_TP_ADD_TCS(tp)
+{
+
+	ATF_TP_ADD_TC(tp, fnmatch_test);
+
+	return (atf_no_error());
 }

Added: head/lib/libc/tests/gen/fnmatch_testcases.h
==============================================================================
--- /dev/null	00:00:00 1970	(empty, because file is newly added)
+++ head/lib/libc/tests/gen/fnmatch_testcases.h	Mon Nov  9 06:24:11 2015	(r290572)
@@ -0,0 +1,176 @@
+/*-
+ * Copyright (c) 2010 Jilles Tjoelker
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+#include <sys/cdefs.h>
+__FBSDID("$FreeBSD$");
+
+#include <fnmatch.h>
+
+struct testcase {
+	const char *pattern;
+	const char *string;
+	int flags;
+	int result;
+} testcases[] = {
+	"", "", 0, 0,
+	"a", "a", 0, 0,
+	"a", "b", 0, FNM_NOMATCH,
+	"a", "A", 0, FNM_NOMATCH,
+	"*", "a", 0, 0,
+	"*", "aa", 0, 0,
+	"*a", "a", 0, 0,
+	"*a", "b", 0, FNM_NOMATCH,
+	"*a*", "b", 0, FNM_NOMATCH,
+	"*a*b*", "ab", 0, 0,
+	"*a*b*", "qaqbq", 0, 0,
+	"*a*bb*", "qaqbqbbq", 0, 0,
+	"*a*bc*", "qaqbqbcq", 0, 0,
+	"*a*bb*", "qaqbqbb", 0, 0,
+	"*a*bc*", "qaqbqbc", 0, 0,
+	"*a*bb", "qaqbqbb", 0, 0,
+	"*a*bc", "qaqbqbc", 0, 0,
+	"*a*bb", "qaqbqbbq", 0, FNM_NOMATCH,
+	"*a*bc", "qaqbqbcq", 0, FNM_NOMATCH,
+	"*a*a*a*a*a*a*a*a*a*a*", "aaaaaaaaa", 0, FNM_NOMATCH,
+	"*a*a*a*a*a*a*a*a*a*a*", "aaaaaaaaaa", 0, 0,
+	"*a*a*a*a*a*a*a*a*a*a*", "aaaaaaaaaaa", 0, 0,
+	".*.*.*.*.*.*.*.*.*.*", ".........", 0, FNM_NOMATCH,
+	".*.*.*.*.*.*.*.*.*.*", "..........", 0, 0,
+	".*.*.*.*.*.*.*.*.*.*", "...........", 0, 0,
+	"*?*?*?*?*?*?*?*?*?*?*", "123456789", 0, FNM_NOMATCH,
+	"??????????*", "123456789", 0, FNM_NOMATCH,
+	"*??????????", "123456789", 0, FNM_NOMATCH,
+	"*?*?*?*?*?*?*?*?*?*?*", "1234567890", 0, 0,
+	"??????????*", "1234567890", 0, 0,
+	"*??????????", "1234567890", 0, 0,
+	"*?*?*?*?*?*?*?*?*?*?*", "12345678901", 0, 0,
+	"??????????*", "12345678901", 0, 0,
+	"*??????????", "12345678901", 0, 0,
+	"[x]", "x", 0, 0,
+	"[*]", "*", 0, 0,
+	"[?]", "?", 0, 0,
+	"[", "[", 0, 0,
+	"[[]", "[", 0, 0,
+	"[[]", "x", 0, FNM_NOMATCH,
+	"[*]", "", 0, FNM_NOMATCH,
+	"[*]", "x", 0, FNM_NOMATCH,
+	"[?]", "x", 0, FNM_NOMATCH,
+	"*[*]*", "foo*foo", 0, 0,
+	"*[*]*", "foo", 0, FNM_NOMATCH,
+	"[0-9]", "0", 0, 0,
+	"[0-9]", "5", 0, 0,
+	"[0-9]", "9", 0, 0,
+	"[0-9]", "/", 0, FNM_NOMATCH,
+	"[0-9]", ":", 0, FNM_NOMATCH,
+	"[0-9]", "*", 0, FNM_NOMATCH,
+	"[!0-9]", "0", 0, FNM_NOMATCH,
+	"[!0-9]", "5", 0, FNM_NOMATCH,
+	"[!0-9]", "9", 0, FNM_NOMATCH,
+	"[!0-9]", "/", 0, 0,
+	"[!0-9]", ":", 0, 0,
+	"[!0-9]", "*", 0, 0,
+	"*[0-9]", "a0", 0, 0,
+	"*[0-9]", "a5", 0, 0,
+	"*[0-9]", "a9", 0, 0,
+	"*[0-9]", "a/", 0, FNM_NOMATCH,
+	"*[0-9]", "a:", 0, FNM_NOMATCH,
+	"*[0-9]", "a*", 0, FNM_NOMATCH,
+	"*[!0-9]", "a0", 0, FNM_NOMATCH,
+	"*[!0-9]", "a5", 0, FNM_NOMATCH,
+	"*[!0-9]", "a9", 0, FNM_NOMATCH,
+	"*[!0-9]", "a/", 0, 0,
+	"*[!0-9]", "a:", 0, 0,
+	"*[!0-9]", "a*", 0, 0,
+	"*[0-9]", "a00", 0, 0,
+	"*[0-9]", "a55", 0, 0,
+	"*[0-9]", "a99", 0, 0,
+	"*[0-9]", "a0a0", 0, 0,
+	"*[0-9]", "a5a5", 0, 0,
+	"*[0-9]", "a9a9", 0, 0,
+	"\\*", "*", 0, 0,
+	"\\?", "?", 0, 0,
+	"\\[x]", "[x]", 0, 0,
+	"\\[", "[", 0, 0,
+	"\\\\", "\\", 0, 0,
+	"*\\**", "foo*foo", 0, 0,
+	"*\\**", "foo", 0, FNM_NOMATCH,
+	"*\\\\*", "foo\\foo", 0, 0,
+	"*\\\\*", "foo", 0, FNM_NOMATCH,
+	"\\(", "(", 0, 0,
+	"\\a", "a", 0, 0,
+	"\\*", "a", 0, FNM_NOMATCH,
+	"\\?", "a", 0, FNM_NOMATCH,
+	"\\*", "\\*", 0, FNM_NOMATCH,
+	"\\?", "\\?", 0, FNM_NOMATCH,
+	"\\[x]", "\\[x]", 0, FNM_NOMATCH,
+	"\\[x]", "\\x", 0, FNM_NOMATCH,
+	"\\[", "\\[", 0, FNM_NOMATCH,
+	"\\(", "\\(", 0, FNM_NOMATCH,
+	"\\a", "\\a", 0, FNM_NOMATCH,
+	"\\", "\\", 0, FNM_NOMATCH,
+	"\\", "", 0, 0,
+	"\\*", "\\*", FNM_NOESCAPE, 0,
+	"\\?", "\\?", FNM_NOESCAPE, 0,
+	"\\", "\\", FNM_NOESCAPE, 0,
+	"\\\\", "\\", FNM_NOESCAPE, FNM_NOMATCH,
+	"\\\\", "\\\\", FNM_NOESCAPE, 0,
+	"*\\*", "foo\\foo", FNM_NOESCAPE, 0,
+	"*\\*", "foo", FNM_NOESCAPE, FNM_NOMATCH,
+	"*", ".", FNM_PERIOD, FNM_NOMATCH,
+	"?", ".", FNM_PERIOD, FNM_NOMATCH,
+	".*", ".", 0, 0,
+	".*", "..", 0, 0,
+	".*", ".a", 0, 0,
+	"[0-9]", ".", FNM_PERIOD, FNM_NOMATCH,
+	"a*", "a.", 0, 0,
+	"a/a", "a/a", FNM_PATHNAME, 0,
+	"a/*", "a/a", FNM_PATHNAME, 0,
+	"*/a", "a/a", FNM_PATHNAME, 0,
+	"*/*", "a/a", FNM_PATHNAME, 0,
+	"a*b/*", "abbb/x", FNM_PATHNAME, 0,
+	"a*b/*", "abbb/.x", FNM_PATHNAME, 0,
+	"*", "a/a", FNM_PATHNAME, FNM_NOMATCH,
+	"*/*", "a/a/a", FNM_PATHNAME, FNM_NOMATCH,
+	"b/*", "b/.x", FNM_PATHNAME | FNM_PERIOD, FNM_NOMATCH,
+	"b*/*", "a/.x", FNM_PATHNAME | FNM_PERIOD, FNM_NOMATCH,
+	"b/.*", "b/.x", FNM_PATHNAME | FNM_PERIOD, 0,
+	"b*/.*", "b/.x", FNM_PATHNAME | FNM_PERIOD, 0,
+	"a", "A", FNM_CASEFOLD, 0,
+	"A", "a", FNM_CASEFOLD, 0,
+	"[a]", "A", FNM_CASEFOLD, 0,
+	"[A]", "a", FNM_CASEFOLD, 0,
+	"a", "b", FNM_CASEFOLD, FNM_NOMATCH,
+	"a", "a/b", FNM_PATHNAME, FNM_NOMATCH,
+	"*", "a/b", FNM_PATHNAME, FNM_NOMATCH,
+	"*b", "a/b", FNM_PATHNAME, FNM_NOMATCH,
+	"a", "a/b", FNM_PATHNAME | FNM_LEADING_DIR, 0,
+	"*", "a/b", FNM_PATHNAME | FNM_LEADING_DIR, 0,
+	"*", ".a/b", FNM_PATHNAME | FNM_LEADING_DIR, 0,
+	"*a", ".a/b", FNM_PATHNAME | FNM_LEADING_DIR, 0,
+	"*", ".a/b", FNM_PATHNAME | FNM_PERIOD | FNM_LEADING_DIR, FNM_NOMATCH,
+	"*a", ".a/b", FNM_PATHNAME | FNM_PERIOD | FNM_LEADING_DIR, FNM_NOMATCH,
+	"a*b/*", "abbb/.x", FNM_PATHNAME | FNM_PERIOD, FNM_NOMATCH,
+};

Copied and modified: head/lib/libc/tests/gen/ftw_test.c (from r290571, head/tools/regression/lib/libc/gen/test-ftw.c)
==============================================================================
--- head/tools/regression/lib/libc/gen/test-ftw.c	Mon Nov  9 06:16:38 2015	(r290571, copy source)
+++ head/lib/libc/tests/gen/ftw_test.c	Mon Nov  9 06:24:11 2015	(r290572)
@@ -32,50 +32,26 @@
 __FBSDID("$FreeBSD$");
 
 #include <sys/wait.h>
-
-#include <assert.h>
 #include <err.h>
 #include <errno.h>
 #include <fcntl.h>
 #include <ftw.h>
+#include <limits.h>
 #include <stdio.h>
 #include <stdlib.h>
 #include <string.h>
 #include <spawn.h>
 #include <unistd.h>
 
+#include <atf-c.h>
+
 extern char **environ;
 
-static char dir[] = "/tmp/testftw.XXXXXXXXXX";
+static char template[] = "testftw.XXXXXXXXXX";
+static char dir[PATH_MAX];
 static int failures;
 static int ftwflags;
 
-static void
-cleanup(int ustatus __unused)
-{
-	int error, status;
-	pid_t pid, waitres;
-	const char *myargs[5];
-
-	err_set_exit(NULL);
-	myargs[0] = "rm";
-	myargs[1] = "-rf";
-	myargs[2] = "--";
-	myargs[3] = dir;
-	myargs[4] = NULL;
-	error = posix_spawnp(&pid, myargs[0], NULL, NULL,
-	    __DECONST(char **, myargs), environ);
-	if (error != 0)
-		warn("posix_spawnp rm");
-	else {
-		waitres = waitpid(pid, &status, 0);
-		if (waitres != pid)
-			warnx("waitpid rm failed");
-		else if (status != 0)
-			warnx("rm failed");
-	}
-}
-
 static int
 cb(const char *path, const struct stat *st, int type, struct FTW *f)
 {
@@ -94,50 +70,59 @@ cb(const char *path, const struct stat *
 			return (0);
 		break;
 	}
-	warnx("unexpected path=%s type=%d f.level=%d\n",
+	ATF_CHECK_MSG(false,
+	    "unexpected path=%s type=%d f.level=%d\n",
 	    path, type, f->level);
-	failures++;
 	return (0);
 }
 
-int
-main(int argc, char *argv[])
+ATF_TC_WITHOUT_HEAD(ftw_test);
+ATF_TC_BODY(ftw_test, tc)
 {
 	int fd;
 
-	if (!mkdtemp(dir))
-		err(2, "mkdtemp");
+	ATF_REQUIRE_MSG(mkdtemp(template) != NULL, "mkdtemp failed");
 
-	err_set_exit(cleanup);
+	/* XXX: the path needs to be absolute for the 0/FTW_DEPTH testcases */
+	ATF_REQUIRE_MSG(realpath(template, dir) != NULL,
+	    "realpath failed; errno=%d", errno);
 
-	fd = open(dir, O_DIRECTORY | O_RDONLY);
-	if (fd == -1)
-		err(2, "open %s", dir);
+	fd = open(dir, O_DIRECTORY|O_RDONLY);
+	ATF_REQUIRE_MSG(fd != -1, "open failed; errno=%d", errno);
 
-	if (mkdirat(fd, "d1", 0777) == -1)
-		err(2, "mkdirat d1");
+	ATF_REQUIRE_MSG(mkdirat(fd, "d1", 0777) == 0,
+	    "mkdirat failed; errno=%d", errno);
 
-	if (symlinkat(dir, fd, "d1/looper") == -1)
-		err(2, "symlinkat looper");
+	ATF_REQUIRE_MSG(symlinkat(dir, fd, "d1/looper") == 0,
+	    "symlinkat failed; errno=%d", errno);
 
+	printf("ftwflags=FTW_PHYS\n");
 	ftwflags = FTW_PHYS;
-	if (nftw(dir, cb, 10, ftwflags) == -1)
-		err(2, "nftw FTW_PHYS");
-	ftwflags = FTW_PHYS | FTW_DEPTH;
-	if (nftw(dir, cb, 10, ftwflags) == -1)
-		err(2, "nftw FTW_PHYS | FTW_DEPTH");
+	ATF_REQUIRE_MSG(nftw(dir, cb, 10, ftwflags) != -1,
+	    "nftw FTW_PHYS failed; errno=%d", errno);
+
+	printf("ftwflags=FTW_PHYS|FTW_DEPTH\n");
+	ftwflags = FTW_PHYS|FTW_DEPTH;
+	ATF_REQUIRE_MSG(nftw(dir, cb, 10, ftwflags) != -1,
+	    "nftw FTW_PHYS|FTW_DEPTH failed; errno=%d", errno);
+
+	printf("ftwflags=0\n");
 	ftwflags = 0;
-	if (nftw(dir, cb, 10, ftwflags) == -1)
-		err(2, "nftw 0");
+	ATF_REQUIRE_MSG(nftw(dir, cb, 10, ftwflags) != -1,
+	    "nftw 0 failed; errno=%d", errno);
+
+	printf("ftwflags=FTW_DEPTH\n");
 	ftwflags = FTW_DEPTH;
-	if (nftw(dir, cb, 10, ftwflags) == -1)
-		err(2, "nftw FTW_DEPTH");
+	ATF_REQUIRE_MSG(nftw(dir, cb, 10, ftwflags) != -1,
+	    "nftw FTW_DEPTH failed; errno=%d", errno);
 
 	close(fd);
+}
 
-	printf("PASS nftw()\n");
+ATF_TP_ADD_TCS(tp)
+{
 
-	cleanup(failures != 0);
+	ATF_TP_ADD_TC(tp, ftw_test);
 
-	return (failures != 0);
+	return (atf_no_error());
 }

Copied and modified: head/lib/libc/tests/gen/popen_test.c (from r290571, head/tools/regression/lib/libc/gen/test-popen.c)
==============================================================================
--- head/tools/regression/lib/libc/gen/test-popen.c	Mon Nov  9 06:16:38 2015	(r290571, copy source)
+++ head/lib/libc/tests/gen/popen_test.c	Mon Nov  9 06:24:11 2015	(r290572)
@@ -32,9 +32,8 @@
 #include <sys/cdefs.h>
 __FBSDID("$FreeBSD$");
 
+#include <sys/param.h>
 #include <sys/wait.h>
-
-#include <assert.h>
 #include <errno.h>
 #include <fcntl.h>
 #include <signal.h>
@@ -42,7 +41,8 @@ __FBSDID("$FreeBSD$");
 #include <stdlib.h>
 #include <string.h>
 
-static int failures;
+#include <atf-c.h>
+
 static volatile sig_atomic_t got_sigpipe;
 
 static void
@@ -54,174 +54,198 @@ sigpipe_handler(int sig __unused)
 static void
 check_cloexec(FILE *fp, const char *mode)
 {
-	int flags;
+	int exp_flags, flags;
 
 	flags = fcntl(fileno(fp), F_GETFD);
+	ATF_CHECK_MSG(flags != -1, "fcntl(F_GETFD) failed; errno=%d", errno);
 	if (flags == -1)
-		fprintf(stderr, "fcntl(F_GETFD) failed\n"), failures++;
-	else if ((flags & FD_CLOEXEC) !=
-	    (strchr(mode, 'e') != NULL ? FD_CLOEXEC : 0))
-		fprintf(stderr, "Bad cloexec flag\n"), failures++;
+		return;
+	if (strchr(mode, 'e') != NULL)
+		exp_flags = FD_CLOEXEC;
+	else
+		exp_flags = 0;
+	ATF_CHECK_MSG((flags & FD_CLOEXEC) == exp_flags,
+	    "bad cloexec flag; %d != %d", flags, exp_flags);
 }
 
-int
-main(int argc, char *argv[])
+ATF_TC_WITHOUT_HEAD(popen_all_modes_test);
+ATF_TC_BODY(popen_all_modes_test, tc)
 {
 	FILE *fp, *fp2;
-	int i, j, status;
+	int i, status;
 	const char *mode;
 	const char *allmodes[] = { "r", "w", "r+", "re", "we", "r+e", "re+" };
-	const char *rmodes[] = { "r", "r+", "re", "r+e", "re+" };
-	const char *wmodes[] = { "w", "r+", "we", "r+e", "re+" };
-	const char *rwmodes[] = { "r+", "r+e", "re+" };
-	char buf[80];
-	struct sigaction act, oact;
 
-	for (i = 0; i < sizeof(allmodes) / sizeof(allmodes[0]); i++) {
+	for (i = 0; i < nitems(allmodes); i++) {
 		mode = allmodes[i];
 		fp = popen("exit 7", mode);
-		if (fp == NULL) {
-			fprintf(stderr, "popen(, \"%s\") failed", mode);
-			failures++;
+		ATF_CHECK_MSG(fp != NULL, "popen(, \"%s\") failed", mode);
+		if (fp == NULL)
 			continue;
-		}
 		check_cloexec(fp, mode);
 		status = pclose(fp);
-		if (!WIFEXITED(status) || WEXITSTATUS(status) != 7)
-			fprintf(stderr, "Bad exit status (no I/O)\n"), failures++;
+		ATF_CHECK_MSG(WIFEXITED(status) && WEXITSTATUS(status) == 7,
+		    "bad exit status (no I/O)");
 	}
+}
 
-	for (i = 0; i < sizeof(rmodes) / sizeof(rmodes[0]); i++) {
+ATF_TC_WITHOUT_HEAD(popen_rmodes_test);
+ATF_TC_BODY(popen_rmodes_test, tc)
+{
+	FILE *fp, *fp2;
+	const char *rmodes[] = { "r", "r+", "re", "r+e", "re+" };
+	const char *mode;
+	char buf[80];
+	int i, status;
+
+	for (i = 0; i < nitems(rmodes); i++) {
 		mode = rmodes[i];
 		fp = popen("exit 9", mode);
-		if (fp == NULL) {
-			fprintf(stderr, "popen(, \"%s\") failed", mode);
-			failures++;
+		ATF_CHECK_MSG(fp != NULL, "popen(, \"%s\") failed", mode);
+		if (fp == NULL)
 			continue;
-		}
 		check_cloexec(fp, mode);
-		if (fgetc(fp) != EOF || !feof(fp) || ferror(fp))
-			fprintf(stderr, "Input error 1\n"), failures++;
+		bool input_error_1 = !(fgetc(fp) != EOF || !feof(fp) || !ferror(fp));
+		ATF_CHECK_MSG(!input_error_1, "input error 1");
+		if (input_error_1)
+			continue;
 		status = pclose(fp);
-		if (!WIFEXITED(status) || WEXITSTATUS(status) != 9)
-			fprintf(stderr, "Bad exit status (input)\n"), failures++;
+		ATF_CHECK_MSG(WIFEXITED(status) && WEXITSTATUS(status) == 9,
+		    "bad exit status (input)");
 	}
 
-	for (i = 0; i < sizeof(rmodes) / sizeof(rmodes[0]); i++) {
+	for (i = 0; i < nitems(rmodes); i++) {
+		char *sres;
 		mode = rmodes[i];
 		fp = popen("echo hi there", mode);
-		if (fp == NULL) {
-			fprintf(stderr, "popen(, \"%s\") failed", mode);
-			failures++;
+		ATF_CHECK_MSG(fp != NULL, "popen(, \"%s\") failed", mode);
+		if (fp == NULL)
 			continue;
-		}
 		check_cloexec(fp, mode);
-		if (fgets(buf, sizeof(buf), fp) == NULL)
-			fprintf(stderr, "Input error 2\n"), failures++;
-		else if (strcmp(buf, "hi there\n") != 0)
-			fprintf(stderr, "Bad input 1\n"), failures++;
+		ATF_CHECK_MSG((sres = fgets(buf, sizeof(buf), fp)) != NULL,
+		    "Input error 2");
+		if (sres != NULL)
+			ATF_CHECK_MSG(strcmp(buf, "hi there\n") == 0,
+			    "Bad input 1");
 		status = pclose(fp);
-		if (!WIFEXITED(status) || WEXITSTATUS(status) != 0)
-			fprintf(stderr, "Bad exit status (input)\n"), failures++;
+		ATF_CHECK_MSG(WIFEXITED(status) && WEXITSTATUS(status) == 0,
+		    "Bad exit status (input)");
 	}
+}
+
+ATF_TC_WITHOUT_HEAD(popen_wmodes_test);

*** DIFF OUTPUT TRUNCATED AT 1000 LINES ***



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201511090624.tA96OBQG063661>