run-features.c 2.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172
  1. #include <ccan/tdb2/tdb.c>
  2. #include <ccan/tdb2/open.c>
  3. #include <ccan/tdb2/free.c>
  4. #include <ccan/tdb2/lock.c>
  5. #include <ccan/tdb2/io.c>
  6. #include <ccan/tdb2/hash.c>
  7. #include <ccan/tdb2/check.c>
  8. #include <ccan/tdb2/summary.c>
  9. #include <ccan/tdb2/transaction.c>
  10. #include <ccan/tap/tap.h>
  11. #include "logging.h"
  12. int main(int argc, char *argv[])
  13. {
  14. unsigned int i, j;
  15. struct tdb_context *tdb;
  16. int flags[] = { TDB_DEFAULT, TDB_NOMMAP,
  17. TDB_CONVERT, TDB_NOMMAP|TDB_CONVERT };
  18. struct tdb_data key = { (unsigned char *)&j, sizeof(j) };
  19. struct tdb_data data = { (unsigned char *)&j, sizeof(j) };
  20. plan_tests(sizeof(flags) / sizeof(flags[0]) * 8 + 1);
  21. for (i = 0; i < sizeof(flags) / sizeof(flags[0]); i++) {
  22. uint64_t features;
  23. tdb = tdb_open("run-features.tdb", flags[i],
  24. O_RDWR|O_CREAT|O_TRUNC, 0600, &tap_log_attr);
  25. ok1(tdb);
  26. if (!tdb)
  27. continue;
  28. /* Put some stuff in there. */
  29. for (j = 0; j < 100; j++) {
  30. if (tdb_store(tdb, key, data, TDB_REPLACE) != 0)
  31. fail("Storing in tdb");
  32. }
  33. /* Mess with features fields in hdr. */
  34. features = (~TDB_FEATURE_MASK ^ 1);
  35. ok1(tdb_write_convert(tdb, offsetof(struct tdb_header,
  36. features_used),
  37. &features, sizeof(features)) == 0);
  38. ok1(tdb_write_convert(tdb, offsetof(struct tdb_header,
  39. features_offered),
  40. &features, sizeof(features)) == 0);
  41. tdb_close(tdb);
  42. tdb = tdb_open("run-features.tdb", flags[i], O_RDWR, 0,
  43. &tap_log_attr);
  44. ok1(tdb);
  45. if (!tdb)
  46. continue;
  47. /* Should not have changed features offered. */
  48. ok1(tdb_read_convert(tdb, offsetof(struct tdb_header,
  49. features_offered),
  50. &features, sizeof(features)) == 0);
  51. ok1(features == (~TDB_FEATURE_MASK ^ 1));
  52. /* Should have cleared unknown bits in features_used. */
  53. ok1(tdb_read_convert(tdb, offsetof(struct tdb_header,
  54. features_used),
  55. &features, sizeof(features)) == 0);
  56. ok1(features == (1 & TDB_FEATURE_MASK));
  57. tdb_close(tdb);
  58. }
  59. ok1(tap_log_messages == 0);
  60. return exit_status();
  61. }