X-Git-Url: https://git.ozlabs.org/?p=ccan;a=blobdiff_plain;f=tap%2Ftest%2Frun.c;fp=tap%2Ftest%2Frun.c;h=91f22e91726919eff9fd26067780fef2bb6a7f91;hp=0000000000000000000000000000000000000000;hb=ee4a263c10328674572e512a9b73ae74bf54447e;hpb=36ef9b2c28bdabc51aac41f1df34aaceb8481d5c diff --git a/tap/test/run.c b/tap/test/run.c new file mode 100644 index 00000000..91f22e91 --- /dev/null +++ b/tap/test/run.c @@ -0,0 +1,116 @@ +/* We use the fact that pipes have a buffer greater than the size of + * any output, and change stdout and stderr to use that. + * + * Since we don't use libtap for output, this looks like one big test. */ +#include "tap/tap.h" +#include +#include +#include +#include +#include +#include +#include +#include + +/* We dup stderr to here. */ +static int stderrfd; + +/* Simple replacement for err() */ +static void failmsg(const char *fmt, ...) +{ + char buf[1024]; + va_list ap; + + /* Write into buffer. */ + va_start(ap, fmt); + vsprintf(buf, fmt, ap); + va_end(ap); + + write(stderrfd, "# ", 2); + write(stderrfd, buf, strlen(buf)); + write(stderrfd, "\n", 1); + _exit(1); +} + +static void expect(int fd, const char *str) +{ + char buffer[PIPE_BUF]; + int r; + + r = read(fd, buffer, sizeof(buffer)); + if (r < 0) + failmsg("reading from pipe"); + + if (strlen(str) != r || strncmp(str, buffer, r) != 0) + failmsg("Expected '%s' got '%.*s'", + str, r, buffer); +} + +int main(int argc, char *argv[]) +{ + int p[2]; + int stdoutfd; + + printf("1..1\n"); + stderrfd = dup(STDERR_FILENO); + if (stderrfd < 0) + err(1, "dup of stderr failed"); + + stdoutfd = dup(STDOUT_FILENO); + if (stdoutfd < 0) + err(1, "dup of stdout failed"); + + if (pipe(p) != 0) + failmsg("pipe failed"); + + if (dup2(p[1], STDERR_FILENO) < 0 || dup2(p[1], STDOUT_FILENO) < 0) + failmsg("Duplicating file descriptor"); + + plan_tests(10); + expect(p[0], "1..10\n"); + + ok(1, "msg1"); + expect(p[0], "ok 1 - msg1\n"); + + ok(0, "msg2"); + expect(p[0], "not ok 2 - msg2\n" + "# Failed test (tap/test/run.c:main() at line 75)\n"); + + ok1(true); + expect(p[0], "ok 3 - true\n"); + + ok1(false); + expect(p[0], "not ok 4 - false\n" + "# Failed test (tap/test/run.c:main() at line 82)\n"); + + pass("passed"); + expect(p[0], "ok 5 - passed\n"); + + fail("failed"); + expect(p[0], "not ok 6 - failed\n" + "# Failed test (tap/test/run.c:main() at line 89)\n"); + + skip(2, "skipping %s", "test"); + expect(p[0], "ok 7 # skip skipping test\n" + "ok 8 # skip skipping test\n"); + + todo_start("todo"); + ok1(false); + expect(p[0], "not ok 9 - false # TODO todo\n" + "# Failed (TODO) test (tap/test/run.c:main() at line 98)\n"); + ok1(true); + expect(p[0], "ok 10 - true # TODO todo\n"); + todo_end(); + + if (exit_status() != 3) + failmsg("Expected exit status 3, not %i", exit_status()); + +#if 0 + /* Manually run the atexit command. */ + _cleanup(); + expect(p[0], "# Looks like you failed 2 tests of 9.\n"); +#endif + + write(stdoutfd, "ok 1 - All passed\n", strlen("ok 1 - All passed\n")); + _exit(0); +}