X-Git-Url: http://git.onelab.eu/?a=blobdiff_plain;f=tests%2Ftest-lockfile.c;h=a9ac17f2f226ad794c72bd656b61571ac4d625f7;hb=67e96a5dca90225358936b1392bba8b3207805b1;hp=31e13a72c42d7006543dbb1d1b0cc3a9e8d7b3fc;hpb=ac718c9dbde6340a85d18c5c8d555d8e0ec88bb3;p=sliver-openvswitch.git diff --git a/tests/test-lockfile.c b/tests/test-lockfile.c index 31e13a72c..a9ac17f2f 100644 --- a/tests/test-lockfile.c +++ b/tests/test-lockfile.c @@ -1,5 +1,5 @@ /* - * Copyright (c) 2009 Nicira Networks. + * Copyright (c) 2009, 2010, 2011 Nicira Networks. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -26,9 +26,7 @@ #include "process.h" #include "timeval.h" #include "util.h" - -#undef NDEBUG -#include +#include "vlog.h" struct test { const char *name; @@ -37,12 +35,25 @@ struct test { static const struct test tests[]; +#define CHECK(A, B) check(A, B, #A, #B, __FILE__, __LINE__) +static void +check(int a, int b, + const char *a_string, const char *b_string, const char *file, int line) +{ + if (a != b) { + fprintf(stderr, "%s:%d: expected %s == %s but %d != %d\n", + file, line, a_string, b_string, a, b); + fflush(stderr); + abort(); + } +} + static void run_lock_and_unlock(void) { struct lockfile *lockfile; - assert(lockfile_lock("file", 0, &lockfile) == 0); + CHECK(lockfile_lock("file", 0, &lockfile), 0); lockfile_unlock(lockfile); } @@ -51,10 +62,10 @@ run_lock_and_unlock_twice(void) { struct lockfile *lockfile; - assert(lockfile_lock("file", 0, &lockfile) == 0); + CHECK(lockfile_lock("file", 0, &lockfile), 0); lockfile_unlock(lockfile); - assert(lockfile_lock("file", 0, &lockfile) == 0); + CHECK(lockfile_lock("file", 0, &lockfile), 0); lockfile_unlock(lockfile); } @@ -63,8 +74,8 @@ run_lock_blocks_same_process(void) { struct lockfile *lockfile; - assert(lockfile_lock("file", 0, &lockfile) == 0); - assert(lockfile_lock("file", 0, &lockfile) == EDEADLK); + CHECK(lockfile_lock("file", 0, &lockfile), 0); + CHECK(lockfile_lock("file", 0, &lockfile), EDEADLK); lockfile_unlock(lockfile); } @@ -73,9 +84,9 @@ run_lock_blocks_same_process_twice(void) { struct lockfile *lockfile; - assert(lockfile_lock("file", 0, &lockfile) == 0); - assert(lockfile_lock("file", 0, &lockfile) == EDEADLK); - assert(lockfile_lock("file", 0, &lockfile) == EDEADLK); + CHECK(lockfile_lock("file", 0, &lockfile), 0); + CHECK(lockfile_lock("file", 0, &lockfile), EDEADLK); + CHECK(lockfile_lock("file", 0, &lockfile), EDEADLK); lockfile_unlock(lockfile); } @@ -100,11 +111,16 @@ do_fork(void) static void run_lock_blocks_other_process(void) { - struct lockfile *lockfile; + /* Making this static prevents a memory leak warning from valgrind for the + * parent process, which cannot easily unlock (and free) 'lockfile' because + * it can only do so after the child has exited, and it's the caller of + * this function that does the wait() call. */ + static struct lockfile *lockfile; - assert(lockfile_lock("file", 0, &lockfile) == 0); + CHECK(lockfile_lock("file", 0, &lockfile), 0); if (do_fork() == CHILD) { - assert(lockfile_lock("file", 0, &lockfile) == EAGAIN); + lockfile_unlock(lockfile); + CHECK(lockfile_lock("file", 0, &lockfile), EAGAIN); exit(11); } } @@ -114,10 +130,10 @@ run_lock_twice_blocks_other_process(void) { struct lockfile *lockfile, *dummy; - assert(lockfile_lock("file", 0, &lockfile) == 0); - assert(lockfile_lock("file", 0, &dummy) == EDEADLK); + CHECK(lockfile_lock("file", 0, &lockfile), 0); + CHECK(lockfile_lock("file", 0, &dummy), EDEADLK); if (do_fork() == CHILD) { - assert(lockfile_lock("file", 0, &dummy) == EAGAIN); + CHECK(lockfile_lock("file", 0, &dummy), EAGAIN); exit(11); } } @@ -127,11 +143,11 @@ run_lock_and_unlock_allows_other_process(void) { struct lockfile *lockfile; - assert(lockfile_lock("file", 0, &lockfile) == 0); + CHECK(lockfile_lock("file", 0, &lockfile), 0); lockfile_unlock(lockfile); if (do_fork() == CHILD) { - assert(lockfile_lock("file", 0, &lockfile) == 0); + CHECK(lockfile_lock("file", 0, &lockfile), 0); exit(11); } } @@ -141,11 +157,11 @@ run_lock_timeout_gets_the_lock(void) { struct lockfile *lockfile; - assert(lockfile_lock("file", 0, &lockfile) == 0); + CHECK(lockfile_lock("file", 0, &lockfile), 0); if (do_fork() == CHILD) { - assert(lockfile_lock("file", TIME_UPDATE_INTERVAL * 3, - &lockfile) == 0); + lockfile_unlock(lockfile); + CHECK(lockfile_lock("file", TIME_UPDATE_INTERVAL * 3, &lockfile), 0); exit(11); } else { long long int now = time_msec(); @@ -161,11 +177,12 @@ run_lock_timeout_runs_out(void) { struct lockfile *lockfile; - assert(lockfile_lock("file", 0, &lockfile) == 0); + CHECK(lockfile_lock("file", 0, &lockfile), 0); if (do_fork() == CHILD) { - assert(lockfile_lock("file", TIME_UPDATE_INTERVAL, - &lockfile) == ETIMEDOUT); + lockfile_unlock(lockfile); + CHECK(lockfile_lock("file", TIME_UPDATE_INTERVAL, &lockfile), + ETIMEDOUT); exit(11); } else { long long int now = time_msec(); @@ -181,17 +198,17 @@ run_lock_multiple(void) { struct lockfile *a, *b, *c, *dummy; - assert(lockfile_lock("a", 0, &a) == 0); - assert(lockfile_lock("b", 0, &b) == 0); - assert(lockfile_lock("c", 0, &c) == 0); + CHECK(lockfile_lock("a", 0, &a), 0); + CHECK(lockfile_lock("b", 0, &b), 0); + CHECK(lockfile_lock("c", 0, &c), 0); lockfile_unlock(a); - assert(lockfile_lock("a", 0, &a) == 0); - assert(lockfile_lock("a", 0, &dummy) == EDEADLK); + CHECK(lockfile_lock("a", 0, &a), 0); + CHECK(lockfile_lock("a", 0, &dummy), EDEADLK); lockfile_unlock(a); lockfile_unlock(b); - assert(lockfile_lock("a", 0, &a) == 0); + CHECK(lockfile_lock("a", 0, &a), 0); lockfile_unlock(c); lockfile_unlock(a); @@ -223,17 +240,18 @@ static const struct test tests[] = { TEST(lock_timeout_runs_out), TEST(lock_multiple), TEST(help), - { 0, 0 } + { NULL, NULL } #undef TEST }; int main(int argc, char *argv[]) { + extern struct vlog_module VLM_lockfile; size_t i; set_program_name(argv[0]); - time_init(); + vlog_set_levels(&VLM_lockfile, VLF_ANY_FACILITY, VLL_ERR); if (argc != 2) { ovs_fatal(0, "exactly one argument required; use \"%s help\" for help",