api-93-repack.c 1.7 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980
  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. #define NUM_TESTS 1000
  8. static bool store_all(struct ntdb_context *ntdb)
  9. {
  10. unsigned int i;
  11. NTDB_DATA key = { (unsigned char *)&i, sizeof(i) };
  12. NTDB_DATA dbuf = { (unsigned char *)&i, sizeof(i) };
  13. for (i = 0; i < NUM_TESTS; i++) {
  14. if (ntdb_store(ntdb, key, dbuf, NTDB_INSERT) != NTDB_SUCCESS)
  15. return false;
  16. }
  17. return true;
  18. }
  19. static int mark_entry(struct ntdb_context *ntdb,
  20. NTDB_DATA key, NTDB_DATA data, bool found[])
  21. {
  22. unsigned int num;
  23. if (key.dsize != sizeof(num))
  24. return -1;
  25. memcpy(&num, key.dptr, key.dsize);
  26. if (num >= NUM_TESTS)
  27. return -1;
  28. if (found[num])
  29. return -1;
  30. found[num] = true;
  31. return 0;
  32. }
  33. static bool is_all_set(bool found[], unsigned int num)
  34. {
  35. unsigned int i;
  36. for (i = 0; i < num; i++)
  37. if (!found[i])
  38. return false;
  39. return true;
  40. }
  41. int main(int argc, char *argv[])
  42. {
  43. unsigned int i;
  44. bool found[NUM_TESTS];
  45. struct ntdb_context *ntdb;
  46. int flags[] = { NTDB_DEFAULT, NTDB_NOMMAP,
  47. NTDB_CONVERT, NTDB_NOMMAP|NTDB_CONVERT
  48. };
  49. plan_tests(sizeof(flags) / sizeof(flags[0]) * 6 + 1);
  50. for (i = 0; i < sizeof(flags) / sizeof(flags[0]); i++) {
  51. ntdb = ntdb_open("run-93-repack.ntdb",
  52. flags[i]|MAYBE_NOSYNC,
  53. O_RDWR|O_CREAT|O_TRUNC, 0600, &tap_log_attr);
  54. ok1(ntdb);
  55. if (!ntdb)
  56. break;
  57. ok1(store_all(ntdb));
  58. ok1(ntdb_repack(ntdb) == NTDB_SUCCESS);
  59. memset(found, 0, sizeof(found));
  60. ok1(ntdb_check(ntdb, NULL, NULL) == NTDB_SUCCESS);
  61. ok1(ntdb_traverse(ntdb, mark_entry, found) == NUM_TESTS);
  62. ok1(is_all_set(found, NUM_TESTS));
  63. ntdb_close(ntdb);
  64. }
  65. ok1(tap_log_messages == 0);
  66. return exit_status();
  67. }