]> git.ozlabs.org Git - ccan/blobdiff - ccan/tdb/test/run-open-during-transaction.c
tdb: new test for dying during a transaction.
[ccan] / ccan / tdb / test / run-open-during-transaction.c
index b0eed67b1f56a78519175a951a7360184697bb00..27356e785f6b00c59539887b5e82ae1a641c77a6 100644 (file)
@@ -19,6 +19,7 @@ static int ftruncate_check(int fd, off_t length);
 #include <ccan/tdb/transaction.c>
 #include <ccan/tdb/error.c>
 #include <ccan/tdb/open.c>
+#include <ccan/tdb/check.c>
 #include <ccan/tap/tap.h>
 #include <stdlib.h>
 #include <stdbool.h>
@@ -41,6 +42,20 @@ static bool clear_if_first;
 #undef fcntl
 #undef ftruncate
 
+static void taplog(struct tdb_context *tdb,
+                  enum tdb_debug_level level,
+                  const char *fmt, ...)
+{
+       va_list ap;
+       char line[200];
+
+       va_start(ap, fmt);
+       vsprintf(line, fmt, ap);
+       va_end(ap);
+
+       diag("%s", line);
+}
+
 static void save_file_contents(int fd)
 {
        struct stat st;
@@ -66,7 +81,7 @@ static void check_for_agent(int fd, bool block)
        if (!external_agent_operation_check(agent, block, &res))
                return;
 
-       if (res != 0)
+       if (res != 1)
                err(1, "Agent failed open");
        agent_pending = false;
 
@@ -195,6 +210,7 @@ static int ftruncate_check(int fd, off_t length)
 
 int main(int argc, char *argv[])
 {
+       struct tdb_logging_context logctx = { taplog, NULL };
        const int flags[] = { TDB_DEFAULT,
                              TDB_CLEAR_IF_FIRST,
                              TDB_NOMMAP, 
@@ -213,11 +229,15 @@ int main(int argc, char *argv[])
        nice(15);
 
        for (i = 0; i < sizeof(flags)/sizeof(flags[0]); i++) {
+               clear_if_first = (flags[i] & TDB_CLEAR_IF_FIRST);
+               diag("Test with %s and %s\n",
+                    clear_if_first ? "CLEAR" : "DEFAULT",
+                    (flags[i] & TDB_NOMMAP) ? "no mmap" : "mmap");
                unlink(TEST_DBNAME);
-               tdb = tdb_open(TEST_DBNAME, 1024, flags[i],
-                              O_CREAT|O_TRUNC|O_RDWR, 0600);
+               tdb = tdb_open_ex(TEST_DBNAME, 1024, flags[i],
+                                 O_CREAT|O_TRUNC|O_RDWR, 0600,
+                                 &logctx, NULL);
                ok1(tdb);
-               clear_if_first = (flags[i] & TDB_CLEAR_IF_FIRST);
 
                ok1(tdb_transaction_start(tdb) == 0);
                in_transaction = true;
@@ -230,7 +250,7 @@ int main(int argc, char *argv[])
                ok1(tdb_transaction_commit(tdb) == 0);
                if (agent_pending)
                        check_for_agent(tdb->fd, true);
-               ok(errors == 0, "We had %u errors", errors);
+               ok(errors == 0, "We had %u unexpected changes", errors);
 
                tdb_close(tdb);
        }