diff options
author | Rusty Russell <rusty@rustcorp.com.au> | 2011-09-14 08:13:26 +0930 |
---|---|---|
committer | Rusty Russell <rusty@rustcorp.com.au> | 2011-09-14 08:13:26 +0930 |
commit | 5e2ad32f810233499913a78ebec99581e0981d8e (patch) | |
tree | 75444eb364493d4b5ceb05ca0481efb176d8fac3 /lib/tdb2/test/api-93-repack.c | |
parent | 5fac36f5adcc3bd483fa5b4e068db3c1174e8a4a (diff) | |
download | samba-5e2ad32f810233499913a78ebec99581e0981d8e.tar.gz samba-5e2ad32f810233499913a78ebec99581e0981d8e.tar.bz2 samba-5e2ad32f810233499913a78ebec99581e0981d8e.zip |
tdb2: test: convert (non-invasive) run tests to api tests.
This reduces compilation time, since these are merely linked with the
pre-built module, rather than recompiling it into the test (which
allows for fancy things like failtest).
This reduces the test compile time down from about 62 seconds to 45
seconds. Since ccanlint compiles tests three times (once normally,
once with coverage, and once with reduced config.h) this makes a
difference: we go from 780 seconds to 729 seconds.
Signed-off-by: Rusty Russell <rusty@rustcorp.com.au>
(Imported from CCAN commit c4ca9f54301c0367891be6330f59fdd5dcdd51d1)
Diffstat (limited to 'lib/tdb2/test/api-93-repack.c')
-rw-r--r-- | lib/tdb2/test/api-93-repack.c | 79 |
1 files changed, 79 insertions, 0 deletions
diff --git a/lib/tdb2/test/api-93-repack.c b/lib/tdb2/test/api-93-repack.c new file mode 100644 index 0000000000..0a2e6d5b82 --- /dev/null +++ b/lib/tdb2/test/api-93-repack.c @@ -0,0 +1,79 @@ +#include <ccan/tdb2/tdb2.h> +#include <ccan/tap/tap.h> +#include <sys/types.h> +#include <sys/stat.h> +#include <fcntl.h> +#include "logging.h" + +#define NUM_TESTS 50000 + +static bool store_all(struct tdb_context *tdb) +{ + unsigned int i; + struct tdb_data key = { (unsigned char *)&i, sizeof(i) }; + struct tdb_data dbuf = { (unsigned char *)&i, sizeof(i) }; + + for (i = 0; i < NUM_TESTS; i++) { + if (tdb_store(tdb, key, dbuf, TDB_INSERT) != TDB_SUCCESS) + return false; + } + return true; +} + +static int mark_entry(struct tdb_context *tdb, + TDB_DATA key, TDB_DATA data, bool found[]) +{ + unsigned int num; + + if (key.dsize != sizeof(num)) + return -1; + memcpy(&num, key.dptr, key.dsize); + if (num >= NUM_TESTS) + return -1; + if (found[num]) + return -1; + found[num] = true; + return 0; +} + +static bool is_all_set(bool found[], unsigned int num) +{ + unsigned int i; + + for (i = 0; i < num; i++) + if (!found[i]) + return false; + return true; +} + +int main(int argc, char *argv[]) +{ + unsigned int i; + bool found[NUM_TESTS]; + struct tdb_context *tdb; + int flags[] = { TDB_DEFAULT, TDB_NOMMAP, + TDB_CONVERT, TDB_NOMMAP|TDB_CONVERT, + }; + + plan_tests(sizeof(flags) / sizeof(flags[0]) * 6 + 1); + + for (i = 0; i < sizeof(flags) / sizeof(flags[0]); i++) { + tdb = tdb_open("run-93-repack.tdb", flags[i], + O_RDWR|O_CREAT|O_TRUNC, 0600, &tap_log_attr); + ok1(tdb); + if (!tdb) + break; + + ok1(store_all(tdb)); + + ok1(tdb_repack(tdb) == TDB_SUCCESS); + memset(found, 0, sizeof(found)); + ok1(tdb_check(tdb, NULL, NULL) == TDB_SUCCESS); + ok1(tdb_traverse(tdb, mark_entry, found) == NUM_TESTS); + ok1(is_all_set(found, NUM_TESTS)); + tdb_close(tdb); + } + + ok1(tap_log_messages == 0); + return exit_status(); +} |