api-92-get-set-readonly.c 3.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106
  1. #include "config.h"
  2. #include "../ntdb.h"
  3. #include "../private.h"
  4. #include "tap-interface.h"
  5. #include "logging.h"
  6. #include "helpapi-external-agent.h"
  7. int main(int argc, char *argv[])
  8. {
  9. unsigned int i;
  10. struct ntdb_context *ntdb;
  11. NTDB_DATA key = ntdb_mkdata("key", 3);
  12. NTDB_DATA data = ntdb_mkdata("data", 4);
  13. int flags[] = { NTDB_DEFAULT, NTDB_NOMMAP,
  14. NTDB_CONVERT, NTDB_NOMMAP|NTDB_CONVERT };
  15. plan_tests(sizeof(flags) / sizeof(flags[0]) * 48);
  16. for (i = 0; i < sizeof(flags) / sizeof(flags[0]); i++) {
  17. /* RW -> R0 */
  18. ntdb = ntdb_open("run-92-get-set-readonly.ntdb",
  19. flags[i]|MAYBE_NOSYNC,
  20. O_RDWR|O_CREAT|O_TRUNC, 0600, &tap_log_attr);
  21. ok1(ntdb);
  22. ok1(!(ntdb_get_flags(ntdb) & NTDB_RDONLY));
  23. ok1(ntdb_store(ntdb, key, data, NTDB_INSERT) == NTDB_SUCCESS);
  24. ntdb_add_flag(ntdb, NTDB_RDONLY);
  25. ok1(ntdb_get_flags(ntdb) & NTDB_RDONLY);
  26. /* Can't store, append, delete. */
  27. ok1(ntdb_store(ntdb, key, data, NTDB_MODIFY) == NTDB_ERR_RDONLY);
  28. ok1(tap_log_messages == 1);
  29. ok1(ntdb_append(ntdb, key, data) == NTDB_ERR_RDONLY);
  30. ok1(tap_log_messages == 2);
  31. ok1(ntdb_delete(ntdb, key) == NTDB_ERR_RDONLY);
  32. ok1(tap_log_messages == 3);
  33. /* Can't start a transaction, or any write lock. */
  34. ok1(ntdb_transaction_start(ntdb) == NTDB_ERR_RDONLY);
  35. ok1(tap_log_messages == 4);
  36. ok1(ntdb_chainlock(ntdb, key) == NTDB_ERR_RDONLY);
  37. ok1(tap_log_messages == 5);
  38. ok1(ntdb_lockall(ntdb) == NTDB_ERR_RDONLY);
  39. ok1(tap_log_messages == 6);
  40. ok1(ntdb_wipe_all(ntdb) == NTDB_ERR_RDONLY);
  41. ok1(tap_log_messages == 7);
  42. /* Back to RW. */
  43. ntdb_remove_flag(ntdb, NTDB_RDONLY);
  44. ok1(!(ntdb_get_flags(ntdb) & NTDB_RDONLY));
  45. ok1(ntdb_store(ntdb, key, data, NTDB_MODIFY) == NTDB_SUCCESS);
  46. ok1(ntdb_append(ntdb, key, data) == NTDB_SUCCESS);
  47. ok1(ntdb_delete(ntdb, key) == NTDB_SUCCESS);
  48. ok1(ntdb_transaction_start(ntdb) == NTDB_SUCCESS);
  49. ok1(ntdb_store(ntdb, key, data, NTDB_INSERT) == NTDB_SUCCESS);
  50. ok1(ntdb_transaction_commit(ntdb) == NTDB_SUCCESS);
  51. ok1(ntdb_chainlock(ntdb, key) == NTDB_SUCCESS);
  52. ntdb_chainunlock(ntdb, key);
  53. ok1(ntdb_lockall(ntdb) == NTDB_SUCCESS);
  54. ntdb_unlockall(ntdb);
  55. ok1(ntdb_wipe_all(ntdb) == NTDB_SUCCESS);
  56. ok1(tap_log_messages == 7);
  57. ntdb_close(ntdb);
  58. /* R0 -> RW */
  59. ntdb = ntdb_open("run-92-get-set-readonly.ntdb",
  60. flags[i]|MAYBE_NOSYNC,
  61. O_RDONLY, 0600, &tap_log_attr);
  62. ok1(ntdb);
  63. ok1(ntdb_get_flags(ntdb) & NTDB_RDONLY);
  64. /* Can't store, append, delete. */
  65. ok1(ntdb_store(ntdb, key, data, NTDB_INSERT) == NTDB_ERR_RDONLY);
  66. ok1(tap_log_messages == 8);
  67. ok1(ntdb_append(ntdb, key, data) == NTDB_ERR_RDONLY);
  68. ok1(tap_log_messages == 9);
  69. ok1(ntdb_delete(ntdb, key) == NTDB_ERR_RDONLY);
  70. ok1(tap_log_messages == 10);
  71. /* Can't start a transaction, or any write lock. */
  72. ok1(ntdb_transaction_start(ntdb) == NTDB_ERR_RDONLY);
  73. ok1(tap_log_messages == 11);
  74. ok1(ntdb_chainlock(ntdb, key) == NTDB_ERR_RDONLY);
  75. ok1(tap_log_messages == 12);
  76. ok1(ntdb_lockall(ntdb) == NTDB_ERR_RDONLY);
  77. ok1(tap_log_messages == 13);
  78. ok1(ntdb_wipe_all(ntdb) == NTDB_ERR_RDONLY);
  79. ok1(tap_log_messages == 14);
  80. /* Can't remove NTDB_RDONLY since we opened with O_RDONLY */
  81. ntdb_remove_flag(ntdb, NTDB_RDONLY);
  82. ok1(tap_log_messages == 15);
  83. ok1(ntdb_get_flags(ntdb) & NTDB_RDONLY);
  84. ntdb_close(ntdb);
  85. ok1(tap_log_messages == 15);
  86. tap_log_messages = 0;
  87. }
  88. return exit_status();
  89. }