]> granicus.if.org Git - libevent/commitdiff
test: detect test failures if atexit handler calls _exit(!0) (sanitizers)
authorAzat Khuzhin <azat@libevent.org>
Thu, 25 Jun 2020 18:01:53 +0000 (21:01 +0300)
committerAzat Khuzhin <azat@libevent.org>
Thu, 25 Jun 2020 19:57:40 +0000 (22:57 +0300)
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().

test/tinytest.c

index e9ccba385f5679f5e03f9c96f2165fb6d3d9f377..85dfe74a720e676c80b590cb75d7aa5aced81d97 100644 (file)
@@ -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