X-Git-Url: https://git.ozlabs.org/?p=ccan;a=blobdiff_plain;f=ccan%2Ffailtest%2Ffailtest.h;h=0cc8f60c51ba15aa48e207c6088bfe4d39b70050;hp=e8bf10ab5f6c46e056833610fd8c57b54bb1e3d5;hb=0a379f773681c7b3e53866b9a6e9cd0006012c1a;hpb=6c02fd599f5b3f925197c3161ee186a3305fc963;ds=sidebyside diff --git a/ccan/failtest/failtest.h b/ccan/failtest/failtest.h index e8bf10ab..0cc8f60c 100644 --- a/ccan/failtest/failtest.h +++ b/ccan/failtest/failtest.h @@ -1,5 +1,10 @@ +/* Licensed under LGPL - see LICENSE file for details */ #ifndef CCAN_FAILTEST_H #define CCAN_FAILTEST_H +#include "config.h" +#if HAVE_FILE_OFFSET_BITS +#define _FILE_OFFSET_BITS 64 +#endif #include #include #include @@ -36,6 +41,7 @@ enum failtest_call_type { FAILTEST_CALLOC, FAILTEST_REALLOC, FAILTEST_OPEN, + FAILTEST_CLOSE, FAILTEST_PIPE, FAILTEST_READ, FAILTEST_WRITE, @@ -66,17 +72,22 @@ struct open_call { mode_t mode; }; +struct close_call { + int fd; +}; + struct pipe_call { int ret; int fds[2]; + bool closed[2]; }; struct read_call { ssize_t ret; + off_t off; int fd; void *buf; size_t count; - off_t off; }; struct write_call { @@ -121,12 +132,15 @@ struct failtest_call { bool fail; /* What we set errno to. */ int error; + /* How do we clean this up? */ + void (*cleanup)(void *u); /* The actual call data. */ union { struct calloc_call calloc; struct malloc_call malloc; struct realloc_call realloc; struct open_call open; + struct close_call close; struct pipe_call pipe; struct read_call read; struct write_call write; @@ -134,30 +148,42 @@ struct failtest_call { } u; }; +enum failtest_result { + /* Yes try failing this call. */ + FAIL_OK, + /* No, don't try failing this call. */ + FAIL_DONT_FAIL, + /* Try failing this call but don't go too far down that path. */ + FAIL_PROBE, +}; + /** * failtest_hook - whether a certain call should fail or not. * @history: the ordered history of all failtest calls. * @num: the number of elements in @history (greater than 0) * * The default value of this hook is failtest_default_hook(), which returns - * true (ie. yes, fail the call). + * FAIL_OK (ie. yes, fail the call). * * You can override it, and avoid failing certain calls. The parameters * of the call (but not the return value(s)) will be filled in for the last * call. * * Example: - * static bool dont_fail_allocations(struct failtest_call *history, - * unsigned num) + * static enum failtest_result dont_fail_alloc(struct failtest_call *hist, + * unsigned num) * { - * return history[num-1].type != FAILTEST_MALLOC - * && history[num-1].type != FAILTEST_CALLOC - * && history[num-1].type != FAILTEST_REALLOC; + * if (hist[num-1].type == FAILTEST_MALLOC + * || hist[num-1].type == FAILTEST_CALLOC + * || hist[num-1].type == FAILTEST_REALLOC) + * return FAIL_DONT_FAIL; + * return FAIL_OK; * } * ... - * failtest_hook = dont_fail_allocations; + * failtest_hook = dont_fail_alloc; */ -extern bool (*failtest_hook)(struct failtest_call *history, unsigned num); +extern enum failtest_result +(*failtest_hook)(struct failtest_call *history, unsigned num); /** * failtest_exit_check - hook for additional checks on a failed child. @@ -174,8 +200,15 @@ extern bool (*failtest_hook)(struct failtest_call *history, unsigned num); extern bool (*failtest_exit_check)(struct failtest_call *history, unsigned num); -/* This usually fails the call. */ -bool failtest_default_hook(struct failtest_call *history, unsigned num); +/** + * failtest_has_failed - determine if a failure has occurred. + * + * Sometimes you want to exit immediately if you've experienced a failure. + * This is useful when you have four separate tests in your test suite, + * and you don't want to do the next one if you've had a failure in a + * previous one. + */ +extern bool failtest_has_failed(void); /** * failtest_timeout_ms - how long to wait before killing child.