seekable_tests.c 6.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196
  1. #include <stddef.h>
  2. #include <stdint.h>
  3. #include <stdlib.h> // malloc
  4. #include <stdio.h>
  5. #include <assert.h>
  6. #include "zstd_seekable.h"
  7. /* Basic unit tests for zstd seekable format */
  8. int main(int argc, const char** argv)
  9. {
  10. unsigned testNb = 1;
  11. (void)argc; (void)argv;
  12. printf("Beginning zstd seekable format tests...\n");
  13. printf("Test %u - simple round trip: ", testNb++);
  14. { size_t const inSize = 4000;
  15. void* const inBuffer = malloc(inSize);
  16. assert(inBuffer != NULL);
  17. size_t const seekCapacity = 5000;
  18. void* const seekBuffer = malloc(seekCapacity);
  19. assert(seekBuffer != NULL);
  20. size_t seekSize;
  21. size_t const outCapacity = inSize;
  22. void* const outBuffer = malloc(outCapacity);
  23. assert(outBuffer != NULL);
  24. ZSTD_seekable_CStream* const zscs = ZSTD_seekable_createCStream();
  25. assert(zscs != NULL);
  26. { size_t const initStatus = ZSTD_seekable_initCStream(zscs, 9, 0 /* checksumFlag */, (unsigned)inSize /* maxFrameSize */);
  27. assert(!ZSTD_isError(initStatus));
  28. }
  29. { ZSTD_outBuffer outb = { .dst=seekBuffer, .pos=0, .size=seekCapacity };
  30. ZSTD_inBuffer inb = { .src=inBuffer, .pos=0, .size=inSize };
  31. size_t const cStatus = ZSTD_seekable_compressStream(zscs, &outb, &inb);
  32. assert(!ZSTD_isError(cStatus));
  33. assert(inb.pos == inb.size);
  34. size_t const endStatus = ZSTD_seekable_endStream(zscs, &outb);
  35. assert(!ZSTD_isError(endStatus));
  36. seekSize = outb.pos;
  37. }
  38. ZSTD_seekable* const stream = ZSTD_seekable_create();
  39. assert(stream != NULL);
  40. { size_t const initStatus = ZSTD_seekable_initBuff(stream, seekBuffer, seekSize);
  41. assert(!ZSTD_isError(initStatus)); }
  42. { size_t const decStatus = ZSTD_seekable_decompress(stream, outBuffer, outCapacity, 0);
  43. assert(decStatus == inSize); }
  44. /* unit test ZSTD_seekTable functions */
  45. ZSTD_seekTable* const zst = ZSTD_seekTable_create_fromSeekable(stream);
  46. assert(zst != NULL);
  47. unsigned const nbFrames = ZSTD_seekTable_getNumFrames(zst);
  48. assert(nbFrames > 0);
  49. unsigned long long const frame0Offset = ZSTD_seekTable_getFrameCompressedOffset(zst, 0);
  50. assert(frame0Offset == 0);
  51. unsigned long long const content0Offset = ZSTD_seekTable_getFrameDecompressedOffset(zst, 0);
  52. assert(content0Offset == 0);
  53. size_t const cSize = ZSTD_seekTable_getFrameCompressedSize(zst, 0);
  54. assert(!ZSTD_isError(cSize));
  55. assert(cSize <= seekCapacity);
  56. size_t const origSize = ZSTD_seekTable_getFrameDecompressedSize(zst, 0);
  57. assert(origSize == inSize);
  58. unsigned const fo1idx = ZSTD_seekTable_offsetToFrameIndex(zst, 1);
  59. assert(fo1idx == 0);
  60. free(inBuffer);
  61. free(seekBuffer);
  62. free(outBuffer);
  63. ZSTD_seekable_freeCStream(zscs);
  64. ZSTD_seekTable_free(zst);
  65. ZSTD_seekable_free(stream);
  66. }
  67. printf("Success!\n");
  68. printf("Test %u - check that seekable decompress does not hang: ", testNb++);
  69. { /* Github issue #2335 */
  70. const size_t compressed_size = 17;
  71. const uint8_t compressed_data[17] = {
  72. '^',
  73. '*',
  74. 'M',
  75. '\x18',
  76. '\t',
  77. '\x00',
  78. '\x00',
  79. '\x00',
  80. '\x00',
  81. '\x00',
  82. '\x00',
  83. '\x00',
  84. (uint8_t)('\x03'),
  85. (uint8_t)('\xb1'),
  86. (uint8_t)('\xea'),
  87. (uint8_t)('\x92'),
  88. (uint8_t)('\x8f'),
  89. };
  90. const size_t uncompressed_size = 32;
  91. uint8_t uncompressed_data[32];
  92. ZSTD_seekable* const stream = ZSTD_seekable_create();
  93. assert(stream != NULL);
  94. { size_t const status = ZSTD_seekable_initBuff(stream, compressed_data, compressed_size);
  95. if (ZSTD_isError(status)) {
  96. ZSTD_seekable_free(stream);
  97. goto _test_error;
  98. } }
  99. /* Should return an error, but not hang */
  100. { const size_t offset = 2;
  101. size_t const status = ZSTD_seekable_decompress(stream, uncompressed_data, uncompressed_size, offset);
  102. if (!ZSTD_isError(status)) {
  103. ZSTD_seekable_free(stream);
  104. goto _test_error;
  105. } }
  106. ZSTD_seekable_free(stream);
  107. }
  108. printf("Success!\n");
  109. printf("Test %u - check #2 that seekable decompress does not hang: ", testNb++);
  110. { /* Github issue #FIXME */
  111. const size_t compressed_size = 27;
  112. const uint8_t compressed_data[27] = {
  113. (uint8_t)'\x28',
  114. (uint8_t)'\xb5',
  115. (uint8_t)'\x2f',
  116. (uint8_t)'\xfd',
  117. (uint8_t)'\x00',
  118. (uint8_t)'\x32',
  119. (uint8_t)'\x91',
  120. (uint8_t)'\x00',
  121. (uint8_t)'\x00',
  122. (uint8_t)'\x00',
  123. (uint8_t)'\x5e',
  124. (uint8_t)'\x2a',
  125. (uint8_t)'\x4d',
  126. (uint8_t)'\x18',
  127. (uint8_t)'\x09',
  128. (uint8_t)'\x00',
  129. (uint8_t)'\x00',
  130. (uint8_t)'\x00',
  131. (uint8_t)'\x00',
  132. (uint8_t)'\x00',
  133. (uint8_t)'\x00',
  134. (uint8_t)'\x00',
  135. (uint8_t)'\x00',
  136. (uint8_t)'\xb1',
  137. (uint8_t)'\xea',
  138. (uint8_t)'\x92',
  139. (uint8_t)'\x8f',
  140. };
  141. const size_t uncompressed_size = 400;
  142. uint8_t uncompressed_data[400];
  143. ZSTD_seekable* stream = ZSTD_seekable_create();
  144. size_t status = ZSTD_seekable_initBuff(stream, compressed_data, compressed_size);
  145. if (ZSTD_isError(status)) {
  146. ZSTD_seekable_free(stream);
  147. goto _test_error;
  148. }
  149. const size_t offset = 2;
  150. /* Should return an error, but not hang */
  151. status = ZSTD_seekable_decompress(stream, uncompressed_data, uncompressed_size, offset);
  152. if (!ZSTD_isError(status)) {
  153. ZSTD_seekable_free(stream);
  154. goto _test_error;
  155. }
  156. ZSTD_seekable_free(stream);
  157. }
  158. printf("Success!\n");
  159. /* TODO: Add more tests */
  160. printf("Finished tests\n");
  161. return 0;
  162. _test_error:
  163. printf("test failed! Exiting..\n");
  164. return 1;
  165. }