test_filecache.c 4.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119
  1. #include "describe.h"
  2. #define PAR_FILECACHE_IMPLEMENTATION
  3. #include "par_filecache.h"
  4. #include <fcntl.h>
  5. #include <unistd.h>
  6. #if ENABLE_LZ4
  7. #define PREFIX "build/tfc.lz4."
  8. #else
  9. #define PREFIX "build/tfc.unc."
  10. #endif
  11. int main()
  12. {
  13. describe("the basics") {
  14. it("should be able to initialize and evict") {
  15. par_filecache_init(PREFIX, 1200);
  16. par_filecache_evict_all();
  17. par_filecache_evict_all();
  18. }
  19. it("should save and load small files") {
  20. char const* payload = "01234";
  21. par_filecache_save("small", (uint8_t*) payload, 5, 0, 0);
  22. uint8_t* received = 0;
  23. int nbytes = 0;
  24. int loaded = par_filecache_load("small", &received, &nbytes, 0, 0);
  25. assert_ok(loaded);
  26. assert_ok(received);
  27. assert_equal(nbytes, 5);
  28. assert_ok(!memcmp(received, payload, 5));
  29. free(received);
  30. }
  31. it("should save and load larger files") {
  32. char* payload = calloc(1024, 1);
  33. srand(1);
  34. for (int i = 0; i < 512; i++) {
  35. payload[i] = rand() % 256;
  36. }
  37. par_filecache_save("big", (uint8_t*) payload, 1024, 0, 0);
  38. uint8_t* received = 0;
  39. int nbytes = 0;
  40. int loaded = par_filecache_load("big", &received, &nbytes, 0, 0);
  41. assert_ok(loaded);
  42. assert_ok(received);
  43. assert_equal(nbytes, 1024);
  44. assert_ok(!memcmp(received, payload, 1024));
  45. free(received);
  46. free(payload);
  47. }
  48. it("should evict the oldest file when exceeding max size") {
  49. uint8_t* received = 0;
  50. int nbytes = 0;
  51. char* payload = calloc(1024, 1);
  52. par_filecache_save("second", (uint8_t*) payload, 1024, 0, 0);
  53. free(payload);
  54. int loaded = par_filecache_load("big", &received, &nbytes, 0, 0);
  55. #if ENABLE_LZ4
  56. assert_equal(loaded, 1);
  57. free(received);
  58. #else
  59. assert_equal(loaded, 0);
  60. #endif
  61. }
  62. it("returns false when not found") {
  63. uint8_t* received = 0;
  64. int nbytes = 0;
  65. int loaded = par_filecache_load("bar", &received, &nbytes, 0, 0);
  66. assert_equal(loaded, 0);
  67. }
  68. it("supports a fixed-size header (e.g., version number)") {
  69. char* payload = "philip";
  70. char* header = "v0001";
  71. par_filecache_save("versioned", (uint8_t*) payload,
  72. strlen(payload), (uint8_t*) header, 5);
  73. char* loaded_payload;
  74. char loaded_header[5] = {0};
  75. int nbytes = 0;
  76. int loaded = par_filecache_load("versioned",
  77. (uint8_t**) &loaded_payload, &nbytes,
  78. (uint8_t*) loaded_header, 5);
  79. assert_equal(loaded, 1);
  80. assert_equal(nbytes, 6);
  81. assert_ok(!memcmp(loaded_header, header, 5));
  82. assert_ok(!memcmp(loaded_payload, payload, 6));
  83. free(loaded_payload);
  84. }
  85. }
  86. describe("robustness") {
  87. it("is graceful when files are deleted") {
  88. int error = remove(PREFIX "versioned");
  89. assert_equal(error, 0);
  90. char* loaded_payload;
  91. char loaded_header[5] = {0};
  92. int nbytes = 0;
  93. int loaded = par_filecache_load("versioned",
  94. (uint8_t**) &loaded_payload, &nbytes,
  95. (uint8_t*) loaded_header, 5);
  96. assert_equal(loaded, 0);
  97. }
  98. it("is graceful when file content vanishes") {
  99. int error = remove(PREFIX "second");
  100. assert_equal(error, 0);
  101. FILE* cachefile = fopen(PREFIX "second", "wt");
  102. fclose(cachefile);
  103. char* loaded_payload;
  104. char loaded_header[5] = {0};
  105. int nbytes = 0;
  106. int loaded = par_filecache_load("second",
  107. (uint8_t**) &loaded_payload, &nbytes,
  108. (uint8_t*) loaded_header, 5);
  109. assert_equal(loaded, 0);
  110. }
  111. }
  112. return assert_failures();
  113. }