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>