From: Azat Khuzhin Date: Thu, 25 Jun 2020 18:01:53 +0000 (+0300) Subject: test: detect test failures if atexit handler calls _exit(!0) (sanitizers) X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=6754740f15e8200a12605a2e707fc6d3e6754d6a;p=libevent test: detect test failures if atexit handler calls _exit(!0) (sanitizers) tinytest uses another way of detecting test failures, it uses pipe between child and parent, and if the test function in child returns OK it writes OK flag into pipe, and reads it in parent. However sanitizers uses atexit handlers to detect leaks, and this will not detect failures in case of exit() will be called from the atexit handlers, fix this by checking status after waitpid(). --- diff --git a/test/tinytest.c b/test/tinytest.c index e9ccba38..85dfe74a 100644 --- a/test/tinytest.c +++ b/test/tinytest.c @@ -279,7 +279,7 @@ testcase_run_forked_(const struct testgroup_t *group, return FAIL; /* unreachable */ } else { /* parent */ - int status, r; + int status, r, exitcode; char b[1]; /* Close this now, so that if the other side closes it, * our read fails. */ @@ -287,12 +287,20 @@ testcase_run_forked_(const struct testgroup_t *group, r = (int)read(outcome_pipe[0], b, 1); if (r == 0) { printf("[Lost connection!] "); - return 0; + return FAIL; } else if (r != 1) { perror("read outcome from pipe"); } waitpid(pid, &status, 0); + exitcode = WEXITSTATUS(status); close(outcome_pipe[0]); + if (opt_verbosity>1) + printf("%s%s: exited with %i (%i)\n", group->prefix, testcase->name, exitcode, status); + if (exitcode != 0) + { + printf("[atexit failure!] "); + return FAIL; + } return b[0]=='Y' ? OK : (b[0]=='S' ? SKIP : FAIL); } #endif