test_read.c 3.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146
  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. #else
  8. #define MKTEMP mkstemp
  9. #endif
  10. static char ZIPNAME[L_tmpnam + 1] = {0};
  11. #define CRC32DATA1 2220805626
  12. #define TESTDATA1 "Some test data 1...\0"
  13. #define TESTDATA2 "Some test data 2...\0"
  14. #define CRC32DATA2 2532008468
  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) { remove(ZIPNAME); }
  35. MU_TEST(test_read) {
  36. char *buf = NULL;
  37. ssize_t bufsize;
  38. size_t buftmp;
  39. struct zip_t *zip = zip_open(ZIPNAME, 0, 'r');
  40. mu_check(zip != NULL);
  41. mu_assert_int_eq(1, zip_is64(zip));
  42. mu_assert_int_eq(0, zip_entry_open(zip, "test\\test-1.txt"));
  43. mu_assert_int_eq(strlen(TESTDATA1), zip_entry_size(zip));
  44. mu_check(CRC32DATA1 == zip_entry_crc32(zip));
  45. bufsize = zip_entry_read(zip, (void **)&buf, &buftmp);
  46. mu_assert_int_eq(strlen(TESTDATA1), bufsize);
  47. mu_assert_int_eq((size_t)bufsize, buftmp);
  48. mu_assert_int_eq(0, strncmp(buf, TESTDATA1, bufsize));
  49. mu_assert_int_eq(0, zip_entry_close(zip));
  50. free(buf);
  51. buf = NULL;
  52. mu_assert_int_eq(0, zip_entry_open(zip, "test/test-2.txt"));
  53. mu_assert_int_eq(strlen(TESTDATA2), zip_entry_size(zip));
  54. mu_check(CRC32DATA2 == zip_entry_crc32(zip));
  55. bufsize = zip_entry_read(zip, (void **)&buf, NULL);
  56. mu_assert_int_eq(strlen(TESTDATA2), (size_t)bufsize);
  57. mu_assert_int_eq(0, strncmp(buf, TESTDATA2, (size_t)bufsize));
  58. mu_assert_int_eq(0, zip_entry_close(zip));
  59. free(buf);
  60. buf = NULL;
  61. mu_assert_int_eq(0, zip_entry_open(zip, "test\\empty/"));
  62. mu_assert_int_eq(0, strcmp(zip_entry_name(zip), "test/empty/"));
  63. mu_assert_int_eq(0, zip_entry_size(zip));
  64. mu_assert_int_eq(0, zip_entry_crc32(zip));
  65. mu_assert_int_eq(0, zip_entry_close(zip));
  66. zip_close(zip);
  67. }
  68. MU_TEST(test_noallocread) {
  69. ssize_t bufsize;
  70. size_t buftmp = strlen(TESTDATA2);
  71. char *buf = calloc(buftmp, sizeof(char));
  72. struct zip_t *zip = zip_open(ZIPNAME, 0, 'r');
  73. mu_check(zip != NULL);
  74. mu_assert_int_eq(1, zip_is64(zip));
  75. mu_assert_int_eq(0, zip_entry_open(zip, "test/test-2.txt"));
  76. bufsize = zip_entry_noallocread(zip, (void *)buf, buftmp);
  77. mu_assert_int_eq(buftmp, (size_t)bufsize);
  78. mu_assert_int_eq(0, strncmp(buf, TESTDATA2, buftmp));
  79. mu_assert_int_eq(0, zip_entry_close(zip));
  80. free(buf);
  81. buf = NULL;
  82. buftmp = strlen(TESTDATA1);
  83. buf = calloc(buftmp, sizeof(char));
  84. mu_assert_int_eq(0, zip_entry_open(zip, "test/test-1.txt"));
  85. bufsize = zip_entry_noallocread(zip, (void *)buf, buftmp);
  86. mu_assert_int_eq(buftmp, (size_t)bufsize);
  87. mu_assert_int_eq(0, strncmp(buf, TESTDATA1, buftmp));
  88. mu_assert_int_eq(0, zip_entry_close(zip));
  89. free(buf);
  90. buf = NULL;
  91. buftmp = strlen(TESTDATA2);
  92. buf = calloc(buftmp, sizeof(char));
  93. mu_assert_int_eq(0, zip_entry_open(zip, "dotfiles/.test"));
  94. bufsize = zip_entry_noallocread(zip, (void *)buf, buftmp);
  95. mu_assert_int_eq(buftmp, (size_t)bufsize);
  96. mu_assert_int_eq(0, strncmp(buf, TESTDATA2, buftmp));
  97. mu_assert_int_eq(0, zip_entry_close(zip));
  98. free(buf);
  99. buf = NULL;
  100. zip_close(zip);
  101. }
  102. MU_TEST_SUITE(test_read_suite) {
  103. MU_SUITE_CONFIGURE(&test_setup, &test_teardown);
  104. MU_RUN_TEST(test_read);
  105. MU_RUN_TEST(test_noallocread);
  106. }
  107. #define UNUSED(x) (void)x
  108. int main(int argc, char *argv[]) {
  109. UNUSED(argc);
  110. UNUSED(argv);
  111. MU_RUN_SUITE(test_read_suite);
  112. MU_REPORT();
  113. return MU_EXIT_CODE;
  114. }