logo

utils-std

Collection of commonly available Unix tools
commit: a476bc45fdd2b9462f7f86745c8b7025cd3923fe
parent 3957e385eaa266651e852fd52dacd7b1f887e682
Author: Haelwenn (lanodan) Monnier <contact@hacktivis.me>
Date:   Mon,  6 May 2024 05:16:11 +0200

test-lib/mode: Roll TAP producer

Diffstat:

MMakefile2+-
Mtest-lib/Kyuafile2+-
Mtest-lib/mode.c508++++++++++++++++++++++++++++++++++++-------------------------------------------
3 files changed, 235 insertions(+), 277 deletions(-)

diff --git a/Makefile b/Makefile @@ -88,7 +88,7 @@ cmd/timeout: cmd/timeout.c lib/strtodur.c lib/sys_signame.h Makefile $(CC) -std=c99 $(CFLAGS) -o $@ cmd/timeout.c lib/strtodur.c $(LDFLAGS) $(LDSTATIC) test-lib/mode: test-lib/mode.c lib/mode.c Makefile - $(CC) -std=c99 $(CFLAGS) $(ATF_CFLAGS) -o $@ test-lib/mode.c lib/mode.c $(LDFLAGS) $(ATF_LIBS) + $(CC) -std=c99 $(CFLAGS) -o $@ test-lib/mode.c lib/mode.c $(LDFLAGS) $(LDSTATIC) test-lib/strtodur: test-lib/strtodur.c lib/strtodur.c Makefile $(CC) -std=c99 $(CFLAGS) $(ATF_CFLAGS) -o $@ test-lib/strtodur.c lib/strtodur.c $(LDFLAGS) $(ATF_LIBS) diff --git a/test-lib/Kyuafile b/test-lib/Kyuafile @@ -5,7 +5,7 @@ syntax(2) test_suite("utils-std libs") -- 7,$|LC_ALL=C.UTF-8 sort -atf_test_program{name="mode"} +tap_test_program{name="mode"} atf_test_program{name="strtodur"} atf_test_program{name="symbolize_mode"} atf_test_program{name="truncation"} diff --git a/test-lib/mode.c b/test-lib/mode.c @@ -3,352 +3,310 @@ // SPDX-License-Identifier: MPL-2.0 #define _POSIX_C_SOURCE 200809L -#include <atf-c.h> #include <assert.h> -#include <signal.h> // SIGABRT +#include <stdio.h> // printf +#include <string.h> // strcmp #include <sys/stat.h> // umask #include "../lib/mode.h" -#define CHECK_EQ_MODE(expect, got) ATF_CHECK_EQ_MSG(expect, got, "Expected %04o; Got 0%06o\n", expect, got) +int counter = 0; +int err = 0; -#define TEST_MODE(str, old, expect) \ - res = new_mode(str, old, &errstr); \ - CHECK_EQ_MODE(expect, res); \ - ATF_CHECK_MSG(errstr == NULL, "errstr: %s", errstr) - -#define TEST_ERRSTR(str, old, error) \ - res = new_mode(str, old, &errstr); \ - CHECK_EQ_MODE(0, res); \ - ATF_CHECK(errstr != NULL); \ - ATF_CHECK_STREQ(error, errstr) - -ATF_TC(empty); -ATF_TC_HEAD(empty, tc) -{ - atf_tc_set_md_var(tc, "descr", "Empty string"); -} -ATF_TC_BODY(empty, tc) +static void +t_mode(char *str, mode_t old, mode_t expect) { + int id = ++counter; const char *errstr = NULL; - mode_t res; - - TEST_MODE("", 0, 0); - TEST_MODE("", 00777, 00777); + mode_t got = new_mode(str, old, &errstr); + if(got == expect && errstr == NULL) + { + printf("ok %d - new_mode(\"%s\", %d) == %d\n", id, str, old, expect); + return; + } + + err = 1; + printf("not ok %d - new_mode(\"%s\", %d) == %d\n", id, str, old, expect); + if(got != expect) printf("# Got: %d\n", got); + if(errstr != NULL) printf("# Errstr: \"%s\"\n", errstr); } -ATF_TC(null_str); -ATF_TC_HEAD(null_str, tc) +static void +t_mode_errstr(char *str, mode_t old, char *expect_errstr) { - atf_tc_set_md_var(tc, "descr", "NULL string"); -} -ATF_TC_BODY(null_str, tc) -{ - const char *errstr = NULL; - mode_t res; - - TEST_MODE(NULL, 0, 0); - TEST_MODE(NULL, 00777, 00777); -} + assert(expect_errstr != NULL); -ATF_TC(sole_comma); -ATF_TC_HEAD(sole_comma, tc) -{ - atf_tc_set_md_var(tc, "descr", "string containing only a comma"); -} -ATF_TC_BODY(sole_comma, tc) -{ + int id = ++counter; const char *errstr = NULL; - mode_t res; - - TEST_MODE(",", 0, 0); - TEST_MODE(",", 00777, 00777); + (void)new_mode(str, old, &errstr); + + if(errstr != NULL && strcmp(errstr, expect_errstr) == 0) + { + printf("ok %d - new_mode(\"%s\", %d) -> %s\n", id, str, old, expect_errstr); + } + else + { + printf("not ok %d - new_mode(\"%s\", %d) -> %s\n", id, str, old, expect_errstr); + printf("# Got errstr: \"%s\"\n", errstr); + err = 1; + } } -ATF_TC(add_read); -ATF_TC_HEAD(add_read, tc) -{ - atf_tc_set_md_var(tc, "descr", "chmod +r"); -} -ATF_TC_BODY(add_read, tc) +static void +add_read() { - const char *errstr = NULL; - mode_t res; - + printf("# => add_read\n"); umask(0044); - TEST_MODE( "+r", 0, 00400); - TEST_MODE("a+r", 0, 00444); - TEST_MODE("u+r", 0, 00400); - TEST_MODE("g+r", 0, 00040); - TEST_MODE("o+r", 0, 00004); - TEST_MODE("ug+r", 0, 00440); - TEST_MODE("go+r", 0, 00044); - TEST_MODE("uo+r", 0, 00404); - TEST_MODE("u+r,g+r", 0, 00440); - TEST_MODE("g+r,o+r", 0, 00044); - TEST_MODE("u+r,o+r", 0, 00404); - - TEST_MODE( "+r", 00777, 00777); - TEST_MODE("a+r", 00777, 00777); - TEST_MODE("u+r", 00777, 00777); - TEST_MODE("g+r", 00777, 00777); - TEST_MODE("o+r", 00777, 00777); - TEST_MODE("ug+r", 00777, 00777); - TEST_MODE("go+r", 00777, 00777); - TEST_MODE("uo+r", 00777, 00777); - TEST_MODE("u+r,g+r", 00777, 00777); - TEST_MODE("g+r,o+r", 00777, 00777); - TEST_MODE("u+r,o+r", 00777, 00777); + t_mode( "+r", 0, 00400); + t_mode("a+r", 0, 00444); + t_mode("u+r", 0, 00400); + t_mode("g+r", 0, 00040); + t_mode("o+r", 0, 00004); + t_mode("ug+r", 0, 00440); + t_mode("go+r", 0, 00044); + t_mode("uo+r", 0, 00404); + t_mode("u+r,g+r", 0, 00440); + t_mode("g+r,o+r", 0, 00044); + t_mode("u+r,o+r", 0, 00404); + + t_mode( "+r", 00777, 00777); + t_mode("a+r", 00777, 00777); + t_mode("u+r", 00777, 00777); + t_mode("g+r", 00777, 00777); + t_mode("o+r", 00777, 00777); + t_mode("ug+r", 00777, 00777); + t_mode("go+r", 00777, 00777); + t_mode("uo+r", 00777, 00777); + t_mode("u+r,g+r", 00777, 00777); + t_mode("g+r,o+r", 00777, 00777); + t_mode("u+r,o+r", 00777, 00777); } -ATF_TC(set_read); -ATF_TC_HEAD(set_read, tc) -{ - atf_tc_set_md_var(tc, "descr", "chmod =r"); -} -ATF_TC_BODY(set_read, tc) +static void +set_read() { - const char *errstr = NULL; - mode_t res; - + printf("# => set_read\n"); umask(0044); - TEST_MODE( "=r", 0, 00400); - TEST_MODE("a=r", 0, 00444); - TEST_MODE("u=r", 0, 00400); - TEST_MODE("g=r", 0, 00040); - TEST_MODE("o=r", 0, 00004); - TEST_MODE("ug=r", 0, 00440); - TEST_MODE("go=r", 0, 00044); - TEST_MODE("uo=r", 0, 00404); - TEST_MODE("u=r,g=r", 0, 00440); - TEST_MODE("g=r,o=r", 0, 00044); - TEST_MODE("u=r,o=r", 0, 00404); - - TEST_MODE( "=r", 00777, 00400); - TEST_MODE("a=r", 00777, 00444); - TEST_MODE("u=r", 00777, 00477); - TEST_MODE("g=r", 00777, 00747); - TEST_MODE("o=r", 00777, 00774); - TEST_MODE("ug=r", 00777, 00447); - TEST_MODE("go=r", 00777, 00744); - TEST_MODE("uo=r", 00777, 00474); - TEST_MODE("u=r,g=r", 00777, 00447); - TEST_MODE("g=r,o=r", 00777, 00744); - TEST_MODE("u=r,o=r", 00777, 00474); + t_mode( "=r", 0, 00400); + t_mode("a=r", 0, 00444); + t_mode("u=r", 0, 00400); + t_mode("g=r", 0, 00040); + t_mode("o=r", 0, 00004); + t_mode("ug=r", 0, 00440); + t_mode("go=r", 0, 00044); + t_mode("uo=r", 0, 00404); + t_mode("u=r,g=r", 0, 00440); + t_mode("g=r,o=r", 0, 00044); + t_mode("u=r,o=r", 0, 00404); + + t_mode( "=r", 00777, 00400); + t_mode("a=r", 00777, 00444); + t_mode("u=r", 00777, 00477); + t_mode("g=r", 00777, 00747); + t_mode("o=r", 00777, 00774); + t_mode("ug=r", 00777, 00447); + t_mode("go=r", 00777, 00744); + t_mode("uo=r", 00777, 00474); + t_mode("u=r,g=r", 00777, 00447); + t_mode("g=r,o=r", 00777, 00744); + t_mode("u=r,o=r", 00777, 00474); } -ATF_TC(del_read); -ATF_TC_HEAD(del_read, tc) +static void +del_read() { - atf_tc_set_md_var(tc, "descr", "chmod -r"); -} -ATF_TC_BODY(del_read, tc) -{ - const char *errstr = NULL; - mode_t res; - + printf("# => del_read\n"); umask(0044); - TEST_MODE( "-r", 0, 0); - TEST_MODE("a-r", 0, 0); - TEST_MODE("u-r", 0, 0); - TEST_MODE("g-r", 0, 0); - TEST_MODE("o-r", 0, 0); - TEST_MODE("ug-r", 0, 0); - TEST_MODE("go-r", 0, 0); - TEST_MODE("uo-r", 0, 0); - TEST_MODE("u-r,g-r", 0, 0); - TEST_MODE("g-r,o-r", 0, 0); - TEST_MODE("u-r,o-r", 0, 0); - - TEST_MODE( "-r", 00777, 00377); - TEST_MODE("a-r", 00777, 00333); - TEST_MODE("u-r", 00777, 00377); - TEST_MODE("g-r", 00777, 00737); - TEST_MODE("o-r", 00777, 00773); - TEST_MODE("ug-r", 00777, 00337); - TEST_MODE("go-r", 00777, 00733); - TEST_MODE("uo-r", 00777, 00373); - TEST_MODE("u-r,g-r", 00777, 00337); - TEST_MODE("g-r,o-r", 00777, 00733); - TEST_MODE("u-r,o-r", 00777, 00373); + t_mode( "-r", 0, 0); + t_mode("a-r", 0, 0); + t_mode("u-r", 0, 0); + t_mode("g-r", 0, 0); + t_mode("o-r", 0, 0); + t_mode("ug-r", 0, 0); + t_mode("go-r", 0, 0); + t_mode("uo-r", 0, 0); + t_mode("u-r,g-r", 0, 0); + t_mode("g-r,o-r", 0, 0); + t_mode("u-r,o-r", 0, 0); + + t_mode( "-r", 00777, 00377); + t_mode("a-r", 00777, 00333); + t_mode("u-r", 00777, 00377); + t_mode("g-r", 00777, 00737); + t_mode("o-r", 00777, 00773); + t_mode("ug-r", 00777, 00337); + t_mode("go-r", 00777, 00733); + t_mode("uo-r", 00777, 00373); + t_mode("u-r,g-r", 00777, 00337); + t_mode("g-r,o-r", 00777, 00733); + t_mode("u-r,o-r", 00777, 00373); } -ATF_TC(search); -ATF_TC_HEAD(search, tc) -{ - atf_tc_set_md_var(tc, "descr", "chmod [-+=]X"); -} -ATF_TC_BODY(search, tc) +static void +search() { - const char *errstr = NULL; - mode_t res; - - TEST_MODE( "-X", 0, 0); - TEST_MODE("a-X", 0, 0); - TEST_MODE("u-X", 0, 0); - TEST_MODE("g-X", 0, 0); - TEST_MODE("o-X", 0, 0); - - TEST_MODE( "+X", 0, 0); - TEST_MODE("a+X", 0, 0); - TEST_MODE("u+X", 0, 0); - TEST_MODE("g+X", 0, 0); - TEST_MODE("o+X", 0, 0); - - TEST_MODE( "=X", 0, 0); - TEST_MODE("a=X", 0, 0); - TEST_MODE("u=X", 0, 0); - TEST_MODE("g=X", 0, 0); - TEST_MODE("o=X", 0, 0); + printf("# => search\n"); + t_mode( "-X", 0, 0); + t_mode("a-X", 0, 0); + t_mode("u-X", 0, 0); + t_mode("g-X", 0, 0); + t_mode("o-X", 0, 0); + + t_mode( "+X", 0, 0); + t_mode("a+X", 0, 0); + t_mode("u+X", 0, 0); + t_mode("g+X", 0, 0); + t_mode("o+X", 0, 0); + + t_mode( "=X", 0, 0); + t_mode("a=X", 0, 0); + t_mode("u=X", 0, 0); + t_mode("g=X", 0, 0); + t_mode("o=X", 0, 0); // S_IFDIR = 0040000 - TEST_MODE( "-X", 0040777, 0040666); - TEST_MODE("a-X", 0040777, 0040666); - TEST_MODE("u-X", 0040777, 0040677); - TEST_MODE("g-X", 0040777, 0040767); - TEST_MODE("o-X", 0040777, 0040776); - - TEST_MODE( "+X", 0040777, 0040777); - TEST_MODE("a+X", 0040777, 0040777); - TEST_MODE("u+X", 0040777, 0040777); - TEST_MODE("g+X", 0040777, 0040777); - TEST_MODE("o+X", 0040777, 0040777); - - TEST_MODE( "=X", 0040777, 0040111); - TEST_MODE("a=X", 0040777, 0040111); - TEST_MODE("u=X", 0040777, 0040177); - TEST_MODE("g=X", 0040777, 0040717); - TEST_MODE("o=X", 0040777, 0040771); - - TEST_MODE( "-X", 0040000, 0040000); - TEST_MODE("a-X", 0040000, 0040000); - TEST_MODE("u-X", 0040000, 0040000); - TEST_MODE("g-X", 0040000, 0040000); - TEST_MODE("o-X", 0040000, 0040000); - - TEST_MODE( "+X", 0040000, 0040111); - TEST_MODE("a+X", 0040000, 0040111); - TEST_MODE("u+X", 0040000, 0040100); - TEST_MODE("g+X", 0040000, 0040010); - TEST_MODE("o+X", 0040000, 0040001); - - TEST_MODE( "=X", 0040000, 0040111); - TEST_MODE("a=X", 0040000, 0040111); - TEST_MODE("u=X", 0040000, 0040100); - TEST_MODE("g=X", 0040000, 0040010); - TEST_MODE("o=X", 0040000, 0040001); + t_mode( "-X", 0040777, 0040666); + t_mode("a-X", 0040777, 0040666); + t_mode("u-X", 0040777, 0040677); + t_mode("g-X", 0040777, 0040767); + t_mode("o-X", 0040777, 0040776); + + t_mode( "+X", 0040777, 0040777); + t_mode("a+X", 0040777, 0040777); + t_mode("u+X", 0040777, 0040777); + t_mode("g+X", 0040777, 0040777); + t_mode("o+X", 0040777, 0040777); + + t_mode( "=X", 0040777, 0040111); + t_mode("a=X", 0040777, 0040111); + t_mode("u=X", 0040777, 0040177); + t_mode("g=X", 0040777, 0040717); + t_mode("o=X", 0040777, 0040771); + + t_mode( "-X", 0040000, 0040000); + t_mode("a-X", 0040000, 0040000); + t_mode("u-X", 0040000, 0040000); + t_mode("g-X", 0040000, 0040000); + t_mode("o-X", 0040000, 0040000); + + t_mode( "+X", 0040000, 0040111); + t_mode("a+X", 0040000, 0040111); + t_mode("u+X", 0040000, 0040100); + t_mode("g+X", 0040000, 0040010); + t_mode("o+X", 0040000, 0040001); + + t_mode( "=X", 0040000, 0040111); + t_mode("a=X", 0040000, 0040111); + t_mode("u=X", 0040000, 0040100); + t_mode("g=X", 0040000, 0040010); + t_mode("o=X", 0040000, 0040001); } -ATF_TC(syntax); -ATF_TC_HEAD(syntax, tc) -{ - atf_tc_set_md_var(tc, "descr", "Weird syntax and syntax errors"); -} -ATF_TC_BODY(syntax, tc) +static void +syntax() { - const char *errstr = NULL; - mode_t res; + printf("# => syntax\n"); - TEST_MODE("=", 0, 0); - TEST_MODE("=", 0040777, 0040000); + t_mode("=", 0, 0); + t_mode("=", 0040777, 0040000); - TEST_MODE("-", 0, 0); - TEST_MODE("-", 0040777, 0040777); + t_mode("-", 0, 0); + t_mode("-", 0040777, 0040777); - TEST_MODE("+", 0, 0); - TEST_MODE("+", 0040777, 0040777); + t_mode("+", 0, 0); + t_mode("+", 0040777, 0040777); - TEST_ERRSTR("/", 0, "syntax error, got invalid character"); + t_mode_errstr("/", 0, "syntax error, got invalid character"); - TEST_ERRSTR("foo", 0, "syntax error, got invalid character"); + t_mode_errstr("foo", 0, "syntax error, got invalid character"); - TEST_ERRSTR("77777", 0, "can't be higher than 0o7777"); + t_mode_errstr("77777", 0, "can't be higher than 0o7777"); - TEST_ERRSTR("-0", 0, "syntax error, got invalid character"); + t_mode_errstr("-0", 0, "syntax error, got invalid character"); } -ATF_TC(posix_examples); -ATF_TC_HEAD(posix_examples, tc) +static void +posix_examples() { - atf_tc_set_md_var(tc, "descr", "Examples as given by POSIX in chmod(1p)"); -} -ATF_TC_BODY(posix_examples, tc) -{ - const char *errstr = NULL; - mode_t res; + // Examples as given by POSIX in chmod(1p) + printf("# => posix_examples\n"); // clears all file mode bits. - TEST_MODE("a+=", 0040777, 0040000); - TEST_MODE("a+=", 0040000, 0040000); + t_mode("a+=", 0040777, 0040000); + t_mode("a+=", 0040000, 0040000); // clears group and other write bits - TEST_MODE("go+-w", 0040777, 0040755); - TEST_MODE("go+-w", 0040000, 0040000); + t_mode("go+-w", 0040777, 0040755); + t_mode("go+-w", 0040000, 0040000); // sets group bit to match other bits and then clears group write bit. - TEST_MODE("g=o-w", 0040777, 0040757); - TEST_MODE("g=o-w", 0040642, 0040602); - TEST_MODE("g=o-w", 0040246, 0040246); - TEST_MODE("g=o-w", 0040000, 0040000); + t_mode("g=o-w", 0040777, 0040757); + t_mode("g=o-w", 0040642, 0040602); + t_mode("g=o-w", 0040246, 0040246); + t_mode("g=o-w", 0040000, 0040000); // clears group read bit and sets group write bit. - TEST_MODE("g-r+w", 0040777, 0040737); - TEST_MODE("g-r+w", 0040000, 0040020); + t_mode("g-r+w", 0040777, 0040737); + t_mode("g-r+w", 0040000, 0040020); // Sets owner bits to match group bits and sets other bits to match group bits. - TEST_MODE("uo=g", 0040777, 0040777); - TEST_MODE("uo=g", 0040642, 0040444); - TEST_MODE("uo=g", 0040000, 0040000); + t_mode("uo=g", 0040777, 0040777); + t_mode("uo=g", 0040642, 0040444); + t_mode("uo=g", 0040000, 0040000); } -ATF_TC(non_symbolic); -ATF_TC_HEAD(non_symbolic, tc) +static void +non_symbolic() { - atf_tc_set_md_var(tc, "descr", "chmod /[0-7]{1,4}/"); -} -ATF_TC_BODY(non_symbolic, tc) -{ - const char *errstr = NULL; - mode_t res; + printf("# => non_symbolic\n"); - TEST_MODE("0", 0, 0); - TEST_MODE("0", 0040777, 0040000); + t_mode("0", 0, 0); + t_mode("0", 0040777, 0040000); - TEST_MODE("7", 0, 07); - TEST_MODE("7", 0040777, 0040007); + t_mode("7", 0, 07); + t_mode("7", 0040777, 0040007); - TEST_MODE("77", 0, 077); - TEST_MODE("77", 0040777, 0040077); + t_mode("77", 0, 077); + t_mode("77", 0040777, 0040077); - TEST_MODE("777", 0, 0777); - TEST_MODE("777", 0040777, 0040777); + t_mode("777", 0, 0777); + t_mode("777", 0040777, 0040777); - TEST_MODE("700", 0, 0700); - TEST_MODE("700", 0040777, 0040700); + t_mode("700", 0, 0700); + t_mode("700", 0040777, 0040700); - TEST_MODE("7777", 0, 07777); - TEST_MODE("7777", 0040777, 0047777); + t_mode("7777", 0, 07777); + t_mode("7777", 0040777, 0047777); } -ATF_TP_ADD_TCS(tp) +int +main() { - ATF_TP_ADD_TC(tp, empty); - ATF_TP_ADD_TC(tp, null_str); - ATF_TP_ADD_TC(tp, sole_comma); + int plan = 152; + printf("1..%d\n", plan); + + t_mode(NULL, 0, 0); + t_mode(NULL, 00777, 00777); + t_mode("", 0, 0); + t_mode("", 00777, 00777); + t_mode(",", 0, 0); + t_mode(",", 00777, 00777); + + add_read(); + set_read(); + del_read(); - ATF_TP_ADD_TC(tp, add_read); - ATF_TP_ADD_TC(tp, set_read); - ATF_TP_ADD_TC(tp, del_read); + search(); - ATF_TP_ADD_TC(tp, search); + posix_examples(); - ATF_TP_ADD_TC(tp, syntax); - ATF_TP_ADD_TC(tp, posix_examples); + syntax(); - ATF_TP_ADD_TC(tp, non_symbolic); + non_symbolic(); - return atf_no_error(); + assert(counter == plan); + return err; }