X-Git-Url: http://git.ozlabs.org/?p=ccan;a=blobdiff_plain;f=ccan%2Ftdb2%2Ftest%2Frun-01-new_database.c;h=7b5a57df529ee61ba7f09942ff3effbb62c3491b;hp=a2f5e8fcbb110dee2c7a7284a3f4f89c8774c2ef;hb=b3ae89992ecaffed31dcc2e912539c289478801a;hpb=b21004624683be5bf1d8f75e3b5be4e9618049ee diff --git a/ccan/tdb2/test/run-01-new_database.c b/ccan/tdb2/test/run-01-new_database.c index a2f5e8fc..7b5a57df 100644 --- a/ccan/tdb2/test/run-01-new_database.c +++ b/ccan/tdb2/test/run-01-new_database.c @@ -1,119 +1,19 @@ #include -#include -#include -#include -#include -#include -#include -#include +#include "tdb2-source.h" #include #include #include "logging.h" +#include "failtest_helper.h" -/* FIXME: Check these! */ -#define INITIAL_TDB_MALLOC "tdb.c", 189, FAILTEST_MALLOC -#define LOGGING_MALLOC "tdb.c", 766, FAILTEST_MALLOC -#define URANDOM_OPEN "tdb.c", 49, FAILTEST_OPEN -#define URANDOM_READ "tdb.c", 29, FAILTEST_READ +static bool failtest_suppress = false; -static bool failmatch(const struct failtest_call *call, - const char *file, int line, enum failtest_call_type type) -{ - return call->type == type - && call->line == line - && ((strcmp(call->file, file) == 0) - || (strends(call->file, file) - && (call->file[strlen(call->file) - strlen(file) - 1] - == '/'))); -} - -static const struct failtest_call * -find_repeat(const struct failtest_call *start, const struct failtest_call *end, - const struct failtest_call *call) -{ - const struct failtest_call *i; - - for (i = start; i < end; i++) { - if (failmatch(i, call->file, call->line, call->type)) - return i; - } - return NULL; -} - -static bool is_nonblocking_lock(const struct failtest_call *call) -{ - return call->type == FAILTEST_FCNTL && call->u.fcntl.cmd == F_SETLK; -} - -/* Some places we soldier on despite errors: only fail them once. */ +/* Don't need to test everything here, just want expand testing. */ static enum failtest_result -block_repeat_failures(struct failtest_call *history, unsigned num) +suppress_failure(struct failtest_call *history, unsigned num) { - const struct failtest_call *i, *last = &history[num-1]; - - if (failmatch(last, INITIAL_TDB_MALLOC) - || failmatch(last, LOGGING_MALLOC) - || failmatch(last, URANDOM_OPEN) - || failmatch(last, URANDOM_READ)) { - if (find_repeat(history, last, last)) - return FAIL_DONT_FAIL; - return FAIL_PROBE; - } - - /* Unlock or non-blocking lock is fail-once. */ - if (last->type == FAILTEST_FCNTL - && last->u.fcntl.arg.fl.l_type == F_UNLCK) { - /* Find a previous unlock at this point? */ - for (i = find_repeat(history, last, last); - i; - i = find_repeat(history, i, last)) { - if (i->u.fcntl.arg.fl.l_type == F_UNLCK) - return FAIL_DONT_FAIL; - } - return FAIL_PROBE; - } else if (is_nonblocking_lock(last)) { - /* Find a previous non-blocking lock at this point? */ - for (i = find_repeat(history, last, last); - i; - i = find_repeat(history, i, last)) { - if (is_nonblocking_lock(i)) - return FAIL_DONT_FAIL; - } - return FAIL_PROBE; - } - - return FAIL_OK; -} - -static bool exit_check(struct failtest_call *history, unsigned num) -{ - unsigned int i; - - for (i = 0; i < num; i++) { - if (!history[i].fail) - continue; - /* Failing the /dev/urandom open doesn't count: we fall back. */ - if (failmatch(&history[i], URANDOM_OPEN)) - continue; - - /* Similarly with read fail. */ - if (failmatch(&history[i], URANDOM_READ)) - continue; - - /* Initial allocation of tdb doesn't log. */ - if (failmatch(&history[i], INITIAL_TDB_MALLOC)) - continue; - - /* We don't block "failures" on non-blocking locks. */ - if (is_nonblocking_lock(&history[i])) - continue; - - if (!tap_log_messages) - diag("We didn't log for %u (%s:%u)", - i, history[i].file, history[i].line); - return tap_log_messages != 0; - } - return true; + if (failtest_suppress) + return FAIL_DONT_FAIL; + return block_repeat_failures(history, num); } int main(int argc, char *argv[]) @@ -122,23 +22,27 @@ int main(int argc, char *argv[]) struct tdb_context *tdb; int flags[] = { TDB_INTERNAL, TDB_DEFAULT, TDB_NOMMAP, TDB_INTERNAL|TDB_CONVERT, TDB_CONVERT, - TDB_NOMMAP|TDB_CONVERT }; + TDB_NOMMAP|TDB_CONVERT, + TDB_INTERNAL|TDB_VERSION1, TDB_VERSION1, + TDB_NOMMAP|TDB_VERSION1, + TDB_INTERNAL|TDB_CONVERT|TDB_VERSION1, + TDB_CONVERT|TDB_VERSION1, + TDB_NOMMAP|TDB_CONVERT|TDB_VERSION1 }; failtest_init(argc, argv); - failtest_hook = block_repeat_failures; - failtest_exit_check = exit_check; + failtest_hook = suppress_failure; + failtest_exit_check = exit_check_log; plan_tests(sizeof(flags) / sizeof(flags[0]) * 3); for (i = 0; i < sizeof(flags) / sizeof(flags[0]); i++) { tdb = tdb_open("run-new_database.tdb", flags[i], O_RDWR|O_CREAT|O_TRUNC, 0600, &tap_log_attr); if (!ok1(tdb)) failtest_exit(exit_status()); - if (tdb) { - bool ok = ok1(tdb_check(tdb, NULL, NULL) == 0); - tdb_close(tdb); - if (!ok) - failtest_exit(exit_status()); - } + + failtest_suppress = true; + ok1(tdb_check(tdb, NULL, NULL) == 0); + failtest_suppress = false; + tdb_close(tdb); if (!ok1(tap_log_messages == 0)) break; }