run-lockall.c 1.9 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374
  1. #include <ccan/tdb2/private.h>
  2. #include <unistd.h>
  3. #include "lock-tracking.h"
  4. #define fcntl fcntl_with_lockcheck
  5. #include "tdb2-source.h"
  6. #include <ccan/tap/tap.h>
  7. #include <stdlib.h>
  8. #include <stdbool.h>
  9. #include <stdarg.h>
  10. #include <err.h>
  11. #include "external-agent.h"
  12. #include "logging.h"
  13. #define TEST_DBNAME "run-lockall.tdb"
  14. #undef fcntl
  15. int main(int argc, char *argv[])
  16. {
  17. struct agent *agent;
  18. int flags[] = { TDB_DEFAULT, TDB_NOMMAP,
  19. TDB_CONVERT, TDB_NOMMAP|TDB_CONVERT,
  20. TDB_VERSION1, TDB_NOMMAP|TDB_VERSION1,
  21. TDB_CONVERT|TDB_VERSION1,
  22. TDB_NOMMAP|TDB_CONVERT|TDB_VERSION1 };
  23. int i;
  24. plan_tests(13 * sizeof(flags)/sizeof(flags[0]) + 1);
  25. agent = prepare_external_agent();
  26. if (!agent)
  27. err(1, "preparing agent");
  28. for (i = 0; i < sizeof(flags)/sizeof(flags[0]); i++) {
  29. enum agent_return ret;
  30. struct tdb_context *tdb;
  31. tdb = tdb_open(TEST_DBNAME, flags[i],
  32. O_RDWR|O_CREAT|O_TRUNC, 0600, &tap_log_attr);
  33. ok1(tdb);
  34. ret = external_agent_operation(agent, OPEN, TEST_DBNAME);
  35. ok1(ret == SUCCESS);
  36. ok1(tdb_lockall(tdb) == TDB_SUCCESS);
  37. ok1(external_agent_operation(agent, STORE, "key")
  38. == WOULD_HAVE_BLOCKED);
  39. ok1(external_agent_operation(agent, FETCH, "key")
  40. == WOULD_HAVE_BLOCKED);
  41. /* Test nesting. */
  42. ok1(tdb_lockall(tdb) == TDB_SUCCESS);
  43. tdb_unlockall(tdb);
  44. tdb_unlockall(tdb);
  45. ok1(external_agent_operation(agent, STORE, "key") == SUCCESS);
  46. ok1(tdb_lockall_read(tdb) == TDB_SUCCESS);
  47. ok1(external_agent_operation(agent, STORE, "key")
  48. == WOULD_HAVE_BLOCKED);
  49. ok1(external_agent_operation(agent, FETCH, "key") == SUCCESS);
  50. ok1(tdb_lockall_read(tdb) == TDB_SUCCESS);
  51. tdb_unlockall_read(tdb);
  52. tdb_unlockall_read(tdb);
  53. ok1(external_agent_operation(agent, STORE, "key") == SUCCESS);
  54. ok1(external_agent_operation(agent, CLOSE, NULL) == SUCCESS);
  55. tdb_close(tdb);
  56. }
  57. free_external_agent(agent);
  58. ok1(tap_log_messages == 0);
  59. return exit_status();
  60. }