test_extract.c 3.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <zip.h>
  4. #include "minunit.h"
  5. #if defined(_WIN32) || defined(_WIN64)
  6. #define MKTEMP _mktemp
  7. #define UNLINK _unlink
  8. #else
  9. #define MKTEMP mkstemp
  10. #define UNLINK unlink
  11. #endif
  12. static char ZIPNAME[L_tmpnam + 1] = {0};
  13. #define TESTDATA1 "Some test data 1...\0"
  14. #define TESTDATA2 "Some test data 2...\0"
  15. void test_setup(void) {
  16. strncpy(ZIPNAME, "z-XXXXXX\0", L_tmpnam);
  17. MKTEMP(ZIPNAME);
  18. struct zip_t *zip = zip_open(ZIPNAME, ZIP_DEFAULT_COMPRESSION_LEVEL, 'w');
  19. zip_entry_open(zip, "test/test-1.txt");
  20. zip_entry_write(zip, TESTDATA1, strlen(TESTDATA1));
  21. zip_entry_close(zip);
  22. zip_entry_open(zip, "test\\test-2.txt");
  23. zip_entry_write(zip, TESTDATA2, strlen(TESTDATA2));
  24. zip_entry_close(zip);
  25. zip_entry_open(zip, "test\\empty/");
  26. zip_entry_close(zip);
  27. zip_entry_open(zip, "empty/");
  28. zip_entry_close(zip);
  29. zip_entry_open(zip, "dotfiles/.test");
  30. zip_entry_write(zip, TESTDATA2, strlen(TESTDATA2));
  31. zip_entry_close(zip);
  32. zip_close(zip);
  33. }
  34. void test_teardown(void) {
  35. UNLINK("test/test-1.txt");
  36. UNLINK("test/test-2.txt");
  37. UNLINK("test/empty");
  38. UNLINK("test");
  39. UNLINK("empty");
  40. UNLINK("dotfiles/.test");
  41. UNLINK("dotfiles");
  42. UNLINK(ZIPNAME);
  43. }
  44. #define UNUSED(x) (void)x
  45. struct buffer_t {
  46. char *data;
  47. size_t size;
  48. };
  49. static size_t on_extract(void *arg, uint64_t offset, const void *data,
  50. size_t size) {
  51. UNUSED(offset);
  52. struct buffer_t *buf = (struct buffer_t *)arg;
  53. buf->data = realloc(buf->data, buf->size + size + 1);
  54. memcpy(&(buf->data[buf->size]), data, size);
  55. buf->size += size;
  56. buf->data[buf->size] = 0;
  57. return size;
  58. }
  59. MU_TEST(test_extract) {
  60. struct buffer_t buf;
  61. struct zip_t *zip = zip_open(ZIPNAME, 0, 'r');
  62. mu_check(zip != NULL);
  63. memset((void *)&buf, 0, sizeof(struct buffer_t));
  64. mu_assert_int_eq(0, zip_entry_open(zip, "test/test-1.txt"));
  65. mu_assert_int_eq(0, zip_entry_extract(zip, on_extract, &buf));
  66. mu_assert_int_eq(strlen(TESTDATA1), buf.size);
  67. mu_assert_int_eq(0, strncmp(buf.data, TESTDATA1, buf.size));
  68. mu_assert_int_eq(0, zip_entry_close(zip));
  69. free(buf.data);
  70. buf.data = NULL;
  71. buf.size = 0;
  72. memset((void *)&buf, 0, sizeof(struct buffer_t));
  73. mu_assert_int_eq(0, zip_entry_open(zip, "dotfiles/.test"));
  74. mu_assert_int_eq(0, zip_entry_extract(zip, on_extract, &buf));
  75. mu_assert_int_eq(strlen(TESTDATA2), buf.size);
  76. mu_assert_int_eq(0, strncmp(buf.data, TESTDATA2, buf.size));
  77. mu_assert_int_eq(0, zip_entry_close(zip));
  78. free(buf.data);
  79. buf.data = NULL;
  80. buf.size = 0;
  81. zip_close(zip);
  82. }
  83. MU_TEST(test_extract_stream) {
  84. mu_assert_int_eq(
  85. ZIP_ENOINIT,
  86. zip_extract("non_existing_directory/non_existing_archive.zip", ".", NULL,
  87. NULL));
  88. mu_assert_int_eq(ZIP_ENOINIT, zip_stream_extract("", 0, ".", NULL, NULL));
  89. fprintf(stdout, "zip_stream_extract: %s\n", zip_strerror(ZIP_ENOINIT));
  90. FILE *fp = NULL;
  91. #if defined(_MSC_VER)
  92. if (0 != fopen_s(&fp, ZIPNAME, "rb+"))
  93. #else
  94. if (!(fp = fopen(ZIPNAME, "rb+")))
  95. #endif
  96. {
  97. mu_fail("Cannot open filename\n");
  98. }
  99. fseek(fp, 0L, SEEK_END);
  100. size_t filesize = ftell(fp);
  101. fseek(fp, 0L, SEEK_SET);
  102. char *stream = (char *)malloc(filesize * sizeof(char));
  103. memset(stream, 0, filesize);
  104. size_t size = fread(stream, sizeof(char), filesize, fp);
  105. mu_assert_int_eq(filesize, size);
  106. mu_assert_int_eq(0, zip_stream_extract(stream, size, ".", NULL, NULL));
  107. free(stream);
  108. fclose(fp);
  109. }
  110. MU_TEST_SUITE(test_extract_suite) {
  111. MU_SUITE_CONFIGURE(&test_setup, &test_teardown);
  112. MU_RUN_TEST(test_extract);
  113. MU_RUN_TEST(test_extract_stream);
  114. }
  115. int main(int argc, char *argv[]) {
  116. UNUSED(argc);
  117. UNUSED(argv);
  118. MU_RUN_SUITE(test_extract_suite);
  119. MU_REPORT();
  120. return MU_EXIT_CODE;
  121. }