X-Git-Url: http://git.ozlabs.org/?p=ccan;a=blobdiff_plain;f=ccan%2Ftap%2Ftap.c;h=106da912487ba28665fc82d9f206e4c639085a34;hp=4bbd977bbfdd6f3312295afb67a3d9e5d7832206;hb=c520b4adbbfba5a663b94e71216b90eddd0bf877;hpb=650c775ff00cccd03fc84e7789a03c51d9839004 diff --git a/ccan/tap/tap.c b/ccan/tap/tap.c index 4bbd977b..106da912 100644 --- a/ccan/tap/tap.c +++ b/ccan/tap/tap.c @@ -23,11 +23,15 @@ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. */ -#define _GNU_SOURCE +/* FIXME: The real fix is an asprintf module. */ +#ifndef _GNU_SOURCE +#define _GNU_SOURCE 1 +#endif #include #include #include #include +#include #include "tap.h" @@ -38,9 +42,10 @@ static unsigned int test_count = 0; /* Number of tests that have been run */ static unsigned int e_tests = 0; /* Expected number of tests to run */ static unsigned int failures = 0; /* Number of tests that failed */ static char *todo_msg = NULL; -static char *todo_msg_fixed = "libtap malloc issue"; +static const char *todo_msg_fixed = "libtap malloc issue"; static int todo = 0; static int test_died = 0; +static int test_pid; /* Encapsulate the pthread code in a conditional. In the absence of libpthread the code does nothing */ @@ -63,15 +68,15 @@ _expected_tests(unsigned int tests) } static void -diagv(char *fmt, va_list ap) +diagv(const char *fmt, va_list ap) { - fputs("# ", stderr); - vfprintf(stderr, fmt, ap); - fputs("\n", stderr); + fputs("# ", stdout); + vfprintf(stdout, fmt, ap); + fputs("\n", stdout); } static void -_diag(char *fmt, ...) +_diag(const char *fmt, ...) { va_list ap; va_start(ap, fmt); @@ -87,8 +92,8 @@ _diag(char *fmt, ...) * test_comment -- a comment to print afterwards, may be NULL */ unsigned int -_gen_result(int ok, const char *func, char *file, unsigned int line, - char *test_name, ...) +_gen_result(int ok, const char *func, const char *file, unsigned int line, + const char *test_name, ...) { va_list ap; char *local_test_name = NULL; @@ -103,7 +108,8 @@ _gen_result(int ok, const char *func, char *file, unsigned int line, expansions on it */ if(test_name != NULL) { va_start(ap, test_name); - vasprintf(&local_test_name, test_name, ap); + if (vasprintf(&local_test_name, test_name, ap) < 0) + local_test_name = NULL; va_end(ap); /* Make sure the test name contains more than digits @@ -173,6 +179,9 @@ _gen_result(int ok, const char *func, char *file, unsigned int line, UNLOCK; + if (!ok && tap_fail_callback) + tap_fail_callback(); + /* We only care (when testing) that ok is positive, but here we specifically only want to return 1 or 0 */ return ok ? 1 : 0; @@ -185,6 +194,9 @@ _gen_result(int ok, const char *func, char *file, unsigned int line, static void _cleanup(void) { + /* If we forked, don't do cleanup in child! */ + if (getpid() != test_pid) + return; LOCK; @@ -245,12 +257,13 @@ _tap_init(void) static int run_once = 0; if(!run_once) { + test_pid = getpid(); atexit(_cleanup); /* stdout needs to be unbuffered so that the output appears in the same place relative to stderr output as it does with Test::Harness */ - setbuf(stdout, 0); +// setbuf(stdout, 0); run_once = 1; } } @@ -283,7 +296,7 @@ plan_no_plan(void) * Note that the plan is to skip all tests */ void -plan_skip_all(char *reason) +plan_skip_all(const char *reason) { LOCK; @@ -335,7 +348,7 @@ plan_tests(unsigned int tests) } void -diag(char *fmt, ...) +diag(const char *fmt, ...) { va_list ap; @@ -349,7 +362,7 @@ diag(char *fmt, ...) } void -skip(unsigned int n, char *fmt, ...) +skip(unsigned int n, const char *fmt, ...) { va_list ap; char *skip_msg; @@ -357,7 +370,8 @@ skip(unsigned int n, char *fmt, ...) LOCK; va_start(ap, fmt); - vasprintf(&skip_msg, fmt, ap); + if (vasprintf(&skip_msg, fmt, ap) < 0) + skip_msg = NULL; va_end(ap); while(n-- > 0) { @@ -373,14 +387,15 @@ skip(unsigned int n, char *fmt, ...) } void -todo_start(char *fmt, ...) +todo_start(const char *fmt, ...) { va_list ap; LOCK; va_start(ap, fmt); - vasprintf(&todo_msg, fmt, ap); + if (vasprintf(&todo_msg, fmt, ap) < 0) + todo_msg = NULL; va_end(ap); todo = 1;