diff options
Diffstat (limited to 'libs/zip/test/test_extract.c')
| -rw-r--r-- | libs/zip/test/test_extract.c | 199 |
1 files changed, 199 insertions, 0 deletions
diff --git a/libs/zip/test/test_extract.c b/libs/zip/test/test_extract.c new file mode 100644 index 0000000..177a04d --- /dev/null +++ b/libs/zip/test/test_extract.c @@ -0,0 +1,199 @@ +#include <stdio.h> +#include <stdlib.h> + +#include <zip.h> + +#include "minunit.h" + +#if defined(_WIN32) || defined(_WIN64) +#include <io.h> + +#define MKTEMP _mktemp +#define UNLINK _unlink +#else +#define MKTEMP mkstemp +#define UNLINK unlink +#endif + +static char ZIPNAME[L_tmpnam + 1] = {0}; + +#define TESTDATA1 "Some test data 1...\0" +#define TESTDATA2 "Some test data 2...\0" + +void test_setup(void) { + strncpy(ZIPNAME, "z-XXXXXX\0", L_tmpnam); + MKTEMP(ZIPNAME); + + struct zip_t *zip = zip_open(ZIPNAME, ZIP_DEFAULT_COMPRESSION_LEVEL, 'w'); + + zip_entry_open(zip, "test/test-1.txt"); + zip_entry_write(zip, TESTDATA1, strlen(TESTDATA1)); + zip_entry_close(zip); + + zip_entry_open(zip, "test\\test-2.txt"); + zip_entry_write(zip, TESTDATA2, strlen(TESTDATA2)); + zip_entry_close(zip); + + zip_entry_open(zip, "test\\empty/"); + zip_entry_close(zip); + + zip_entry_open(zip, "empty/"); + zip_entry_close(zip); + + zip_entry_open(zip, "dotfiles/.test"); + zip_entry_write(zip, TESTDATA2, strlen(TESTDATA2)); + zip_entry_close(zip); + + zip_close(zip); +} + +void test_teardown(void) { + UNLINK("test/test-1.txt"); + UNLINK("test/test-2.txt"); + UNLINK("test/empty"); + UNLINK("test"); + UNLINK("empty"); + UNLINK("dotfiles/.test"); + UNLINK("dotfiles"); + UNLINK(ZIPNAME); +} + +#define UNUSED(x) (void)x + +struct buffer_t { + char *data; + size_t size; +}; + +static size_t on_extract(void *arg, uint64_t offset, const void *data, + size_t size) { + UNUSED(offset); + + struct buffer_t *buf = (struct buffer_t *)arg; + buf->data = realloc(buf->data, buf->size + size + 1); + + memcpy(&(buf->data[buf->size]), data, size); + buf->size += size; + buf->data[buf->size] = 0; + + return size; +} + +MU_TEST(test_extract) { + struct buffer_t buf; + + struct zip_t *zip = zip_open(ZIPNAME, 0, 'r'); + mu_check(zip != NULL); + + memset((void *)&buf, 0, sizeof(struct buffer_t)); + + mu_assert_int_eq(0, zip_entry_open(zip, "test/test-1.txt")); + mu_assert_int_eq(0, zip_entry_extract(zip, on_extract, &buf)); + mu_assert_int_eq(strlen(TESTDATA1), buf.size); + mu_assert_int_eq(0, strncmp(buf.data, TESTDATA1, buf.size)); + mu_assert_int_eq(0, zip_entry_close(zip)); + + free(buf.data); + buf.data = NULL; + buf.size = 0; + + memset((void *)&buf, 0, sizeof(struct buffer_t)); + + mu_assert_int_eq(0, zip_entry_open(zip, "dotfiles/.test")); + mu_assert_int_eq(0, zip_entry_extract(zip, on_extract, &buf)); + mu_assert_int_eq(strlen(TESTDATA2), buf.size); + mu_assert_int_eq(0, strncmp(buf.data, TESTDATA2, buf.size)); + mu_assert_int_eq(0, zip_entry_close(zip)); + + free(buf.data); + buf.data = NULL; + buf.size = 0; + + zip_close(zip); +} + +MU_TEST(test_extract_stream) { + mu_assert_int_eq( + ZIP_ENOINIT, + zip_extract("non_existing_directory/non_existing_archive.zip", ".", NULL, + NULL)); + mu_assert_int_eq(ZIP_ENOINIT, zip_stream_extract("", 0, ".", NULL, NULL)); + fprintf(stdout, "zip_stream_extract: %s\n", zip_strerror(ZIP_ENOINIT)); + + FILE *fp = NULL; +#if defined(_MSC_VER) + if (0 != fopen_s(&fp, ZIPNAME, "rb+")) +#else + if (!(fp = fopen(ZIPNAME, "rb+"))) +#endif + { + mu_fail("Cannot open filename\n"); + } + + fseek(fp, 0L, SEEK_END); + size_t filesize = ftell(fp); + fseek(fp, 0L, SEEK_SET); + + char *stream = (char *)malloc(filesize * sizeof(char)); + memset(stream, 0, filesize); + + size_t size = fread(stream, sizeof(char), filesize, fp); + mu_assert_int_eq(filesize, size); + + mu_assert_int_eq(0, zip_stream_extract(stream, size, ".", NULL, NULL)); + + free(stream); + fclose(fp); +} + +MU_TEST(test_extract_cstream) { + struct buffer_t buf; + FILE *ZIPFILE = fopen(ZIPNAME, "r"); + + struct zip_t *zip = zip_cstream_open(ZIPFILE, 0, 'r'); + mu_check(zip != NULL); + + memset((void *)&buf, 0, sizeof(struct buffer_t)); + + mu_assert_int_eq(0, zip_entry_open(zip, "test/test-1.txt")); + mu_assert_int_eq(0, zip_entry_extract(zip, on_extract, &buf)); + mu_assert_int_eq(strlen(TESTDATA1), buf.size); + mu_assert_int_eq(0, strncmp(buf.data, TESTDATA1, buf.size)); + mu_assert_int_eq(0, zip_entry_close(zip)); + + free(buf.data); + buf.data = NULL; + buf.size = 0; + + memset((void *)&buf, 0, sizeof(struct buffer_t)); + + mu_assert_int_eq(0, zip_entry_open(zip, "dotfiles/.test")); + mu_assert_int_eq(0, zip_entry_extract(zip, on_extract, &buf)); + mu_assert_int_eq(strlen(TESTDATA2), buf.size); + mu_assert_int_eq(0, strncmp(buf.data, TESTDATA2, buf.size)); + mu_assert_int_eq(0, zip_entry_close(zip)); + + free(buf.data); + buf.data = NULL; + buf.size = 0; + fclose(ZIPFILE); + + zip_cstream_close(zip); +} + +MU_TEST_SUITE(test_extract_suite) { + MU_SUITE_CONFIGURE(&test_setup, &test_teardown); + + MU_RUN_TEST(test_extract); + MU_RUN_TEST(test_extract_stream); + MU_RUN_TEST(test_extract_cstream); +} + +int main(int argc, char *argv[]) { + UNUSED(argc); + UNUSED(argv); + + MU_RUN_SUITE(test_extract_suite); + MU_REPORT(); + return MU_EXIT_CODE; +} |
