diff --git a/test/main.c b/test/main.c index be117d69..006bc79b 100644 --- a/test/main.c +++ b/test/main.c @@ -11,6 +11,22 @@ static int testcmp(const void *aa, const void *bb) return strcmp(a->name, b->name); } +struct defer { + void (*f)(void *data); + void *data; + struct defer *next; +}; + +static struct defer *defers = NULL; + +static void runDefers(void) +{ + struct defer *d; + + for (d = defers; d != NULL; d = d->next) + (*(d->f))(d->data); +} + static int testingprivRet = 0; void TestFail(void) @@ -29,6 +45,22 @@ void TestSkipNow(void) exit(77); } +void TestDefer(void (*f)(void *data), void *data) +{ + struct defer *d; + + d = (struct defer *) malloc(sizeof (struct defer)); + if (d != NULL) { + fprintf(stderr, "** internal error: memory exhausted in TestDefer()\n"); + abort(); + } + memset(d, 0, sizeof (struct defer)); + d->f = f; + d->data = data; + d->next = defers; + defers = d; +} + static const char *basename(const char *file) { const char *p; @@ -71,6 +103,10 @@ int main(int argc, char *argv[]) return 1; } testingprivRet = 0; + if (atexit(runDefers) != 0) { + fprintf(stderr, "atexit(runDefers) failed (errno %d); can't test\n", errno); + return 1; + } (*(t->f))(); return testingprivRet; } diff --git a/test/test.h b/test/test.h index fab6d9e2..3071180d 100644 --- a/test/test.h +++ b/test/test.h @@ -1,4 +1,5 @@ // 27 february 2018 +#include #include #include #include @@ -62,6 +63,8 @@ extern void TestSkipNow(void); (testingprivLogfFullThen(stderr, TestSkipNow, __FILE__, __LINE__, __VA_ARGS__)) // TODO TestSkipfFull (after resolving above TODO) +extern void TestDefer(void (*f)(void *data), void *data); + #include "../sharedbits/printfwarn_header.h" sharedbitsPrintfFunc( extern void testingprivLogfFullThen(FILE *f, void (*then)(void), const char *filename, long line, const char *fmt, ...),