From 75e8c217ba64a66ac94719c597e6cf81a5625cc8 Mon Sep 17 00:00:00 2001 From: Rusty Russell Date: Fri, 14 Nov 2008 17:31:54 +1030 Subject: [PATCH] Tests for read_write_all. --- ccan/read_write_all/test/run-read_all.c | 70 ++++++++++++++++++++++++ ccan/read_write_all/test/run-write_all.c | 66 ++++++++++++++++++++++ 2 files changed, 136 insertions(+) create mode 100644 ccan/read_write_all/test/run-read_all.c create mode 100644 ccan/read_write_all/test/run-write_all.c diff --git a/ccan/read_write_all/test/run-read_all.c b/ccan/read_write_all/test/run-read_all.c new file mode 100644 index 00000000..2790b64d --- /dev/null +++ b/ccan/read_write_all/test/run-read_all.c @@ -0,0 +1,70 @@ +/* FIXME: Do something tricky to ensure we really do loop in read_all. */ + +#include "read_write_all/read_write_all.h" +#include "read_write_all/read_write_all.c" +#include "tap/tap.h" +#include +#include +#include +#include +#include +#include +#include +#include + +static volatile int sigcount; +static int p2c[2], c2p[2]; +static void got_signal(int sig) +{ + char c = 0; + if (write(p2c[1], &c, 1) == 1) + sigcount++; +} + +/* < PIPE_BUF *will* be atomic. But > PIPE_BUF only *might* be non-atomic. */ +#define BUFSZ (1024*1024) + +int main(int argc, char *argv[]) +{ + char buffer[BUFSZ*2] = { 0 }; + char c = 0; + int status; + pid_t child; + + plan_tests(6); + + /* We fork and torture parent. */ + if (pipe(p2c) != 0 || pipe(c2p) != 0) + err(1, "pipe"); + child = fork(); + + if (!child) { + /* Child. Make sure parent ready, then write in two parts. */ + if (read(p2c[0], &c, 1) != 1) + exit(1); + memset(buffer, 0xff, sizeof(buffer)); + if (!write_all(c2p[1], buffer, BUFSZ)) + exit(2); + if (kill(getppid(), SIGUSR1) != 0) + exit(3); + /* Make sure they get signal. */ + if (read(p2c[0], &c, 1) != 1) + exit(4); + if (write(c2p[1], buffer, PIPE_BUF) != PIPE_BUF) + exit(5); + exit(0); + } + if (child == -1) + err(1, "forking"); + + signal(SIGUSR1, got_signal); + ok1(write(p2c[1], &c, 1) == 1); + ok1(read_all(c2p[0], buffer, sizeof(buffer))); + ok1(memchr(buffer, 0, sizeof(buffer)) == NULL); + ok1(sigcount == 1); + ok1(wait(&status) == child); + ok(WIFEXITED(status) && WEXITSTATUS(status) == 0, + "WIFEXITED(status) = %u, WEXITSTATUS(status) = %u", + WIFEXITED(status), WEXITSTATUS(status)); + return exit_status(); +} diff --git a/ccan/read_write_all/test/run-write_all.c b/ccan/read_write_all/test/run-write_all.c new file mode 100644 index 00000000..fbfa1f99 --- /dev/null +++ b/ccan/read_write_all/test/run-write_all.c @@ -0,0 +1,66 @@ +/* FIXME: Do something tricky to ensure we really do loop in write_all. */ + +#include "read_write_all/read_write_all.h" +#include "read_write_all/read_write_all.c" +#include "tap/tap.h" +#include +#include +#include +#include +#include +#include +#include +#include +#include + +static volatile int sigcount; +static void got_signal(int sig) +{ + sigcount++; +} + +/* < PIPE_BUF *will* be atomic. But > PIPE_BUF only *might* be non-atomic. */ +#define BUFSZ (1024*1024) + +int main(int argc, char *argv[]) +{ + char buffer[BUFSZ*2] = { 0 }; + int p2c[2]; + int status; + pid_t child; + + plan_tests(4); + + /* We fork and torture parent. */ + if (pipe(p2c) != 0) + err(1, "pipe"); + child = fork(); + + if (!child) { + /* Make sure they started writing. */ + if (read(p2c[0], buffer, 1) != 1) + exit(1); + if (kill(getppid(), SIGUSR1) != 0) + exit(2); + if (!read_all(p2c[0], buffer+1, sizeof(buffer)-1)) + exit(3); + if (memchr(buffer, 0, sizeof(buffer))) { + fprintf(stderr, "buffer has 0 at offset %i\n", + memchr(buffer, 0, sizeof(buffer)) - (void *)buffer); + exit(4); + } + exit(0); + } + if (child == -1) + err(1, "forking"); + + memset(buffer, 0xff, sizeof(buffer)); + signal(SIGUSR1, got_signal); + ok1(write_all(p2c[1], buffer, sizeof(buffer))); + ok1(sigcount == 1); + ok1(wait(&status) == child); + ok(WIFEXITED(status) && WEXITSTATUS(status) == 0, + "WIFEXITED(status) = %u, WEXITSTATUS(status) = %u", + WIFEXITED(status), WEXITSTATUS(status)); + return exit_status(); +} -- 2.39.2