From f0ad3d9feb075dd30296d4c5a68f3ab84134bb03 Mon Sep 17 00:00:00 2001 From: Ivan Baravy Date: Mon, 20 Apr 2026 20:25:03 +0100 Subject: [PATCH] runtests: support tags Examples: $ cd test $ ../runtests $ ../runtests xfs --- runtests.c | 134 ++++++++++++++++++++++++++++++++++++++++++--- test/d057/tags.txt | 4 +- test/d068/tags.txt | 2 +- test/t001/tags.txt | 8 +-- test/t002/tags.txt | 8 +-- test/t003/tags.txt | 6 +- test/t004/tags.txt | 4 +- test/t005/tags.txt | 4 +- test/t006/tags.txt | 6 +- test/t007/tags.txt | 4 +- test/t008/tags.txt | 8 +-- test/t009/tags.txt | 8 +-- test/t010/tags.txt | 6 +- test/t011/tags.txt | 4 +- test/t012/tags.txt | 8 +-- test/t013/tags.txt | 6 +- test/t014/tags.txt | 8 +-- test/t015/tags.txt | 8 +-- test/t016/tags.txt | 2 +- test/t017/tags.txt | 6 +- test/t018/tags.txt | 2 +- test/t019/tags.txt | 6 +- test/t022/tags.txt | 2 +- test/t024/tags.txt | 2 +- test/t025/tags.txt | 2 +- test/t044/tags.txt | 4 +- test/t045/tags.txt | 4 +- test/t046/tags.txt | 6 +- test/t047/tags.txt | 6 +- test/t049/tags.txt | 2 +- test/t050/tags.txt | 2 +- test/t051/tags.txt | 2 +- test/t054/tags.txt | 2 +- test/t055/tags.txt | 4 +- test/t056/tags.txt | 4 +- test/t058/tags.txt | 4 +- test/t059/tags.txt | 2 +- test/t060/tags.txt | 6 +- test/t061/tags.txt | 6 +- test/t062/tags.txt | 6 +- test/t063/tags.txt | 6 +- test/t064/tags.txt | 8 +-- test/t066/tags.txt | 4 +- test/t067/tags.txt | 4 +- test/t068/tags.txt | 2 +- 45 files changed, 231 insertions(+), 111 deletions(-) diff --git a/runtests.c b/runtests.c index 5ba6b71..0b3d888 100644 --- a/runtests.c +++ b/runtests.c @@ -26,12 +26,14 @@ #endif #define CMPFILE_BUF_LEN 0x100000 +#define TAGS_FILENAME "tags.txt" #define TIMEOUT_FILENAME "timeout.txt" +#define TAGS_STR_MAX_LEN 1024 #define TIMEOUT_STR_MAX_LEN 16 -#define ACTION_RUN 0 _Thread_local char bufa[CMPFILE_BUF_LEN]; _Thread_local char bufb[CMPFILE_BUF_LEN]; +_Thread_local char tagsfname[PATH_MAX]; _Thread_local char timeoutfname[PATH_MAX]; _Thread_local char reffname[PATH_MAX]; _Thread_local char outfname[PATH_MAX]; @@ -40,6 +42,87 @@ int coverage = 0; int no_timeout = 0; int silent_success = 1; +enum tag_mode { + TAG_ENABLED, + TAG_DISABLED, +}; + +struct tag; +struct tag { + struct tag *next; + const char *name; + enum tag_mode mode; +}; + +struct tag *user_tags = NULL; + +/* +static void +dump_tags(const struct tag *tags) { + printf("dumping tags\n"); + for (const struct tag *t = tags; t; t = t->next) { + printf("tag: %s (%i)\n", t->name, t->mode); + } +} +*/ + +static void +add_tag(struct tag **root, struct tag *t) { + t->next = *root; + *root = t; +} + +static struct tag * +parse_tag(const char *prefix, const char *s) { + char name[32]; + struct tag *t = malloc(sizeof(struct tag)); + if (s[0] == '-') { + t->mode = TAG_DISABLED; + s += 1; + } else { + t->mode = TAG_ENABLED; + } + if (prefix) { + sprintf(name, "%s_%s", prefix, s); + } else { + sprintf(name, "%s", s); + } + t->name = strdup(name); + return t; +} + +static void +parse_tags(struct tag **tags, char *str) { + for (char *asave = str, *as; (as = strtok_r(asave, " \n\r\t", &asave));) { + char *colon = strchr(as, ':'); + if (!colon) { + for (char *csave = as, *cs; (cs = strtok_r(csave, ",", &csave));) { + add_tag(tags, parse_tag(NULL, cs)); + } + } else { + *colon = '\0'; + for (char *csave = colon+1, *cs; (cs = strtok_r(csave, ",", &csave));) { + add_tag(tags, parse_tag(as, cs)); + } + } + } +} + +static bool +match_tags(const struct tag *user, const struct tag *test) { + if (!user) { + return true; + } + for (const struct tag *ut = user; ut; ut = ut->next) { + for (const struct tag *tt = test; tt; tt = tt->next) { + if ((ut->mode == TAG_ENABLED) && !strcmp(ut->name, tt->name)) { + return true; + } + } + } + return false; +} + static int is_valid_test(const char *name) { // Check that name starts with t\d\d\d @@ -156,6 +239,24 @@ get_test_timeout(const char *testname) { return min*60 + sec; } +static struct tag * +get_test_tags(const char *testname) { + sprintf(tagsfname, "%s/%s", testname, TAGS_FILENAME); + FILE *f = fopen(tagsfname, "rb"); + if (!f) { + fprintf(stderr, "[!] Can't open %s\n: %s\n", TAGS_FILENAME, + strerror(errno)); + return 0; + } + char str[TAGS_STR_MAX_LEN]; + fread(str, 1, TAGS_STR_MAX_LEN, f); + fclose(f); + struct tag *test_tags; + parse_tags(&test_tags, str); +// dump_tags(test_tags); + return test_tags; +} + #ifndef _WIN32 #include @@ -268,6 +369,10 @@ thread_run_test(void *arg) { if (!is_valid_test(testname)) { continue; } + struct tag *test_tags = get_test_tags(testname); + if (!match_tags(user_tags, test_tags)) { + continue; + } fprintf(stderr, "running test %s\n", testname); if (run_test(testname) || check_test_artefacts(testname)) { fprintf(stderr, "[!] test %s failed\n", testname); @@ -281,17 +386,32 @@ thread_run_test(void *arg) { int main(int argc, char *argv[]) { (void)argc; -// int action = ACTION_RUN; + const char *usage = \ + "usage: runtests [-c] [-f] [-h] [-j] [-s]\n" + " -c collect coverage\n" + " -f run without timeouts (forever)\n" + " -h show this help\n" + " -j run threads in parallel\n" + " -s repost each successful test\n" + " -t run only specific tests\n"; + size_t nthreads = 1; struct optparse opts; optparse_init(&opts, argv); int opt; - while ((opt = optparse(&opts, "cj:st")) != -1) { + while ((opt = optparse(&opts, "cfhj:st:")) != -1) { switch (opt) { case 'c': coverage = 1; break; + case 'f': + no_timeout = 1; + break; + case 'h': + fputs(usage, stderr); + exit(EXIT_SUCCESS); + break; case 'j': nthreads = strtoul(opts.optarg, NULL, 0); break; @@ -299,15 +419,15 @@ main(int argc, char *argv[]) { silent_success = 0; break; case 't': - no_timeout = 1; + parse_tags(&user_tags, opts.optarg); +// dump_tags(user_tags); break; default: - fprintf(stderr, "[!] Unknown option: '%c'\n", opt); - exit(1); + fprintf(stderr, "[!] %s: %s\n", argv[0], opts.errmsg); + exit(EXIT_FAILURE); } } - DIR *cwd = opendir("."); pthread_t *threads = malloc(sizeof(pthread_t)*nthreads); for (size_t i = 0; i < nthreads; i++) { diff --git a/test/d057/tags.txt b/test/d057/tags.txt index e5b4f60..c27344c 100644 --- a/test/d057/tags.txt +++ b/test/d057/tags.txt @@ -1,2 +1,2 @@ -fs: xfs lookup -xfs: v5 +fs:xfs,lookup +xfs:v5 diff --git a/test/d068/tags.txt b/test/d068/tags.txt index c12979b..3274acc 100644 --- a/test/d068/tags.txt +++ b/test/d068/tags.txt @@ -1 +1 @@ -syscall: f68 f68s27 +syscall:f68,f68s27 diff --git a/test/t001/tags.txt b/test/t001/tags.txt index eb4021f..6047cab 100644 --- a/test/t001/tags.txt +++ b/test/t001/tags.txt @@ -1,4 +1,4 @@ -syscall: f70 f70s1 -fs: xfs -xfs: ftype1 -blkdev: s05k +syscall:f70,f70s1 +fs:xfs +xfs:ftype1 +blkdev:s05k diff --git a/test/t002/tags.txt b/test/t002/tags.txt index cecdcf3..0162de2 100644 --- a/test/t002/tags.txt +++ b/test/t002/tags.txt @@ -1,4 +1,4 @@ -syscall: f70 f70s1 -fs: xfs -xfs: ftype0 -blkdev: s05k +syscall:f70,f70s1 +fs:xfs +xfs:ftype0 +blkdev:s05k diff --git a/test/t003/tags.txt b/test/t003/tags.txt index f8e5c3a..361b857 100644 --- a/test/t003/tags.txt +++ b/test/t003/tags.txt @@ -1,3 +1,3 @@ -syscall: f70 f70s0 -fs: read readonly xfs -blkdev: s05k read readonly +syscall:f70,f70s0 +fs:read,readonly,xfs +blkdev:s05k,read,readonly diff --git a/test/t004/tags.txt b/test/t004/tags.txt index eb07619..ede38b3 100644 --- a/test/t004/tags.txt +++ b/test/t004/tags.txt @@ -1,3 +1,3 @@ -syscall: f70 f70s5 -fs: readonly xfs +syscall:f70,f70s5 +fs:readonly,xfs blkdev: diff --git a/test/t005/tags.txt b/test/t005/tags.txt index 7f9b5ad..85caff2 100644 --- a/test/t005/tags.txt +++ b/test/t005/tags.txt @@ -1,2 +1,2 @@ -syscall: f30 -fs: readonly xfs +syscall:f30 +fs:readonly,xfs diff --git a/test/t006/tags.txt b/test/t006/tags.txt index 096e061..d48b651 100644 --- a/test/t006/tags.txt +++ b/test/t006/tags.txt @@ -1,3 +1,3 @@ -syscall: f70 f70s0 -fs: xfs hole read readonly -blkdev: s05k +syscall:f70,f70s0 +fs:xfs,hole,read,readonly +blkdev:s05k diff --git a/test/t007/tags.txt b/test/t007/tags.txt index 305a97f..1a05187 100644 --- a/test/t007/tags.txt +++ b/test/t007/tags.txt @@ -1,2 +1,2 @@ -syscall: f70 -fs: xfs lookup +syscall:f70 +fs:xfs,lookup diff --git a/test/t008/tags.txt b/test/t008/tags.txt index f6b3846..0c22733 100644 --- a/test/t008/tags.txt +++ b/test/t008/tags.txt @@ -1,4 +1,4 @@ -syscall: f70 f70s1 -fs: xfs -xfs: ftype0 -blkdev: s4k +syscall:f70,f70s1 +fs:xfs +xfs:ftype0 +blkdev:s4k diff --git a/test/t009/tags.txt b/test/t009/tags.txt index d1f503c..82e6f59 100644 --- a/test/t009/tags.txt +++ b/test/t009/tags.txt @@ -1,4 +1,4 @@ -syscall: f70 f70s0 f70s1 -fs: xfs xattr -xfs: xattr -blkdev: s05k +syscall:f70,f70s0,f70s1 +fs:xfs,xattr +xfs:xattr +blkdev:s05k diff --git a/test/t010/tags.txt b/test/t010/tags.txt index 00d2450..3971a49 100644 --- a/test/t010/tags.txt +++ b/test/t010/tags.txt @@ -1,3 +1,3 @@ -syscall: f70 -fs: xfs lookup xattr -xfs: xattr +syscall:f70 +fs:xfs,lookup,xattr +xfs:xattr diff --git a/test/t011/tags.txt b/test/t011/tags.txt index 1f467ad..b001019 100644 --- a/test/t011/tags.txt +++ b/test/t011/tags.txt @@ -1,2 +1,2 @@ -syscall: f70 f70s1 -fs: xfs lookup unicode +syscall:f70,f70s1 +fs:xfs,lookup,unicode diff --git a/test/t012/tags.txt b/test/t012/tags.txt index 988abc0..4e371f6 100644 --- a/test/t012/tags.txt +++ b/test/t012/tags.txt @@ -1,4 +1,4 @@ -syscall: f70 f70s1 -fs: xfs -xfs: v5 ftype1 -blkdev: s05k +syscall:f70,f70s1 +fs:xfs +xfs:v5,ftype1 +blkdev:s05k diff --git a/test/t013/tags.txt b/test/t013/tags.txt index 219ec03..ae3e16a 100644 --- a/test/t013/tags.txt +++ b/test/t013/tags.txt @@ -1,3 +1,3 @@ -syscall: f70 -fs: xfs lookup -xfs: v5 +syscall:f70 +fs:xfs,lookup +xfs:v5 diff --git a/test/t014/tags.txt b/test/t014/tags.txt index 4c68550..658b26f 100644 --- a/test/t014/tags.txt +++ b/test/t014/tags.txt @@ -1,4 +1,4 @@ -syscall: f70 f70s0 -fs: xfs hole -xfs: v5 -blkdev: s05k +syscall:f70,f70s0 +fs:xfs,hole +xfs:v5 +blkdev:s05k diff --git a/test/t015/tags.txt b/test/t015/tags.txt index 830fb32..97f2482 100644 --- a/test/t015/tags.txt +++ b/test/t015/tags.txt @@ -1,4 +1,4 @@ -syscall: f70 f70s0 -fs: xfs read -xfs: v5 -blkdev: s05k +syscall:f70,f70s0 +fs:xfs,read +xfs:v5 +blkdev:s05k diff --git a/test/t016/tags.txt b/test/t016/tags.txt index 1473128..d33d67b 100644 --- a/test/t016/tags.txt +++ b/test/t016/tags.txt @@ -1,2 +1,2 @@ -syscall: f01 +syscall:f01 draw: diff --git a/test/t017/tags.txt b/test/t017/tags.txt index 8960e18..bd594b6 100644 --- a/test/t017/tags.txt +++ b/test/t017/tags.txt @@ -1,3 +1,3 @@ -syscall: f70 f70s0 -fs: xfs read -blkdev: s05k +syscall:f70,f70s0 +fs:xfs,read +blkdev:s05k diff --git a/test/t018/tags.txt b/test/t018/tags.txt index f8d9a38..7bfde8d 100644 --- a/test/t018/tags.txt +++ b/test/t018/tags.txt @@ -1,2 +1,2 @@ -fs: xfs +fs:xfs coverage: diff --git a/test/t019/tags.txt b/test/t019/tags.txt index 9728c24..8d13526 100644 --- a/test/t019/tags.txt +++ b/test/t019/tags.txt @@ -1,3 +1,3 @@ -syscall: f70 -fs: xfs -xfs: btree +syscall:f70 +fs:xfs +xfs:btree diff --git a/test/t022/tags.txt b/test/t022/tags.txt index a64cf68..d4bd014 100644 --- a/test/t022/tags.txt +++ b/test/t022/tags.txt @@ -1,2 +1,2 @@ -syscall: f74 +syscall:f74 net: diff --git a/test/t024/tags.txt b/test/t024/tags.txt index f3bb3f5..7321969 100644 --- a/test/t024/tags.txt +++ b/test/t024/tags.txt @@ -1,2 +1,2 @@ -syscall: f76 +syscall:f76 net: diff --git a/test/t025/tags.txt b/test/t025/tags.txt index 13591ce..687fd7e 100644 --- a/test/t025/tags.txt +++ b/test/t025/tags.txt @@ -1,2 +1,2 @@ -syscall: f76 +syscall:f76 net: arp diff --git a/test/t044/tags.txt b/test/t044/tags.txt index 51f7c53..acd8f36 100644 --- a/test/t044/tags.txt +++ b/test/t044/tags.txt @@ -1,2 +1,2 @@ -syscall: f01 -draw: winmap +syscall:f01 +draw:winmap diff --git a/test/t045/tags.txt b/test/t045/tags.txt index 59eb1ed..bee31d4 100644 --- a/test/t045/tags.txt +++ b/test/t045/tags.txt @@ -1,2 +1,2 @@ -syscall: f70 -fs: fat fat32 +syscall:f70 +fs:fat,fat32 diff --git a/test/t046/tags.txt b/test/t046/tags.txt index e15da90..e0b7ec9 100644 --- a/test/t046/tags.txt +++ b/test/t046/tags.txt @@ -1,3 +1,3 @@ -syscall: f70 f70s1 -fs: fat exfat -blkdev: s05k +syscall:f70,f70s1 +fs:fat,exfat +blkdev:s05k diff --git a/test/t047/tags.txt b/test/t047/tags.txt index e15da90..e0b7ec9 100644 --- a/test/t047/tags.txt +++ b/test/t047/tags.txt @@ -1,3 +1,3 @@ -syscall: f70 f70s1 -fs: fat exfat -blkdev: s05k +syscall:f70,f70s1 +fs:fat,exfat +blkdev:s05k diff --git a/test/t049/tags.txt b/test/t049/tags.txt index fd9595f..ca82351 100644 --- a/test/t049/tags.txt +++ b/test/t049/tags.txt @@ -1 +1 @@ -hw: keyboard +hw:keyboard diff --git a/test/t050/tags.txt b/test/t050/tags.txt index 9005c19..288a842 100644 --- a/test/t050/tags.txt +++ b/test/t050/tags.txt @@ -1 +1 @@ -hw: mouse +hw:mouse diff --git a/test/t051/tags.txt b/test/t051/tags.txt index 05d2633..7ac0ebe 100644 --- a/test/t051/tags.txt +++ b/test/t051/tags.txt @@ -1 +1 @@ -draw: cursor +draw:cursor diff --git a/test/t054/tags.txt b/test/t054/tags.txt index 63b0da7..eb48787 100644 --- a/test/t054/tags.txt +++ b/test/t054/tags.txt @@ -1,2 +1,2 @@ -draw: cursor +draw:cursor osloop: diff --git a/test/t055/tags.txt b/test/t055/tags.txt index c98f92a..834d2c9 100644 --- a/test/t055/tags.txt +++ b/test/t055/tags.txt @@ -1,2 +1,2 @@ -fs: xfs -xfs: bigtime +fs:xfs +xfs:bigtime diff --git a/test/t056/tags.txt b/test/t056/tags.txt index e9e3923..fe2ed83 100644 --- a/test/t056/tags.txt +++ b/test/t056/tags.txt @@ -1,2 +1,2 @@ -fs: xfs -xfs: nrext64 +fs:xfs +xfs:nrext64 diff --git a/test/t058/tags.txt b/test/t058/tags.txt index 39c00b6..d45d217 100644 --- a/test/t058/tags.txt +++ b/test/t058/tags.txt @@ -1,2 +1,2 @@ -fs: xfs lookup -xfs: v4 +fs:xfs,lookup +xfs:v4 diff --git a/test/t059/tags.txt b/test/t059/tags.txt index 2811af1..6687ca2 100644 --- a/test/t059/tags.txt +++ b/test/t059/tags.txt @@ -1 +1 @@ -blkdev: gpt +blkdev:gpt diff --git a/test/t060/tags.txt b/test/t060/tags.txt index 70aa13f..b6f6048 100644 --- a/test/t060/tags.txt +++ b/test/t060/tags.txt @@ -1,3 +1,3 @@ -syscall: f70 f70s1 -fs: ext ext2 -blkdev: s05k +syscall:f70,f70s1 +fs:ext,ext2 +blkdev:s05k diff --git a/test/t061/tags.txt b/test/t061/tags.txt index 349c489..ae93208 100644 --- a/test/t061/tags.txt +++ b/test/t061/tags.txt @@ -1,3 +1,3 @@ -syscall: f70 f70s1 -fs: ext ext4 -blkdev: s05k +syscall:f70,f70s1 +fs:ext,ext4 +blkdev:s05k diff --git a/test/t062/tags.txt b/test/t062/tags.txt index a7c0361..3a7084d 100644 --- a/test/t062/tags.txt +++ b/test/t062/tags.txt @@ -1,3 +1,3 @@ -syscall: f70 f70s1 -fs: fat fat12 -blkdev: s05k +syscall:f70,f70s1 +fs:fat,fat12 +blkdev:s05k diff --git a/test/t063/tags.txt b/test/t063/tags.txt index e2fcf38..f45ef5b 100644 --- a/test/t063/tags.txt +++ b/test/t063/tags.txt @@ -1,3 +1,3 @@ -syscall: f70 f70s1 -fs: fat fat16 -blkdev: s05k +syscall:f70,f70s1 +fs:fat,fat16 +blkdev:s05k diff --git a/test/t064/tags.txt b/test/t064/tags.txt index cfc67ef..40d83a7 100644 --- a/test/t064/tags.txt +++ b/test/t064/tags.txt @@ -1,4 +1,4 @@ -syscall: f70 f70s1 -fs: xfs -xfs: v5 samehash -blkdev: s05k +syscall:f70,f70s1 +fs:xfs +xfs:v5,samehash +blkdev:s05k diff --git a/test/t066/tags.txt b/test/t066/tags.txt index f0aac21..52c0f75 100644 --- a/test/t066/tags.txt +++ b/test/t066/tags.txt @@ -1,2 +1,2 @@ -syscall: f01 -draw: 16bit +syscall:f01 +draw:16bit diff --git a/test/t067/tags.txt b/test/t067/tags.txt index 9bebe90..207388f 100644 --- a/test/t067/tags.txt +++ b/test/t067/tags.txt @@ -1,2 +1,2 @@ -syscall: f01 -draw: 24bit +syscall:f01 +draw:24bit diff --git a/test/t068/tags.txt b/test/t068/tags.txt index 0226271..f873ef5 100644 --- a/test/t068/tags.txt +++ b/test/t068/tags.txt @@ -1,2 +1,2 @@ -fs: iso9660 +fs:iso9660 iso9660: