run-lockall.c 2.0 KB

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