diff options
| author | Aldrik Ramaekers <aldrikboy@gmail.com> | 2025-08-23 11:18:44 +0200 |
|---|---|---|
| committer | Aldrik Ramaekers <aldrikboy@gmail.com> | 2025-08-23 11:18:44 +0200 |
| commit | 359422c97cce93bbb27051f9df3efb45bd0b9052 (patch) | |
| tree | 2e352bb852a25390d40d45e199f835d218ad497f /libs/zip/test/test_permissions.c | |
| parent | 8ea59863c5d13e68e080cf7612047ea4c655292c (diff) | |
settings file writing
Diffstat (limited to 'libs/zip/test/test_permissions.c')
| -rw-r--r-- | libs/zip/test/test_permissions.c | 204 |
1 files changed, 204 insertions, 0 deletions
diff --git a/libs/zip/test/test_permissions.c b/libs/zip/test/test_permissions.c new file mode 100644 index 0000000..eeb2f8a --- /dev/null +++ b/libs/zip/test/test_permissions.c @@ -0,0 +1,204 @@ +#include <stdio.h> +#include <stdlib.h> +#include <sys/stat.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}; +static char XFILE[L_tmpnam + 1] = {0}; +static char RFILE[L_tmpnam + 1] = {0}; +static char WFILE[L_tmpnam + 1] = {0}; + +void test_setup(void) { + strncpy(ZIPNAME, "z-XXXXXX\0", L_tmpnam); + strncpy(XFILE, "x-XXXXXX\0", L_tmpnam); + strncpy(RFILE, "r-XXXXXX\0", L_tmpnam); + strncpy(WFILE, "w-XXXXXX\0", L_tmpnam); + + MKTEMP(ZIPNAME); + MKTEMP(XFILE); + MKTEMP(RFILE); + MKTEMP(WFILE); +} + +void test_teardown(void) { + UNLINK(WFILE); + UNLINK(RFILE); + UNLINK(XFILE); + UNLINK(ZIPNAME); +} + +#if defined(_MSC_VER) || defined(__MINGW32__) +#define MZ_FILE_STAT_STRUCT _stat +#define MZ_FILE_STAT _stat +#else +#define MZ_FILE_STAT_STRUCT stat +#define MZ_FILE_STAT stat +#endif + +#define XMODE 0100777 +#define RMODE 0100444 +#define WMODE 0100666 +#define UNIXMODE 0100600 + +MU_TEST(test_exe_permissions) { + struct MZ_FILE_STAT_STRUCT file_stats; + + const char *filenames[] = {XFILE}; + FILE *f = fopen(XFILE, "w"); + fclose(f); + chmod(XFILE, XMODE); + + mu_assert_int_eq(0, zip_create(ZIPNAME, filenames, 1)); + remove(XFILE); + + mu_assert_int_eq(0, zip_extract(ZIPNAME, ".", NULL, NULL)); + + mu_assert_int_eq(0, MZ_FILE_STAT(XFILE, &file_stats)); + mu_assert_int_eq(XMODE, file_stats.st_mode); + +#ifdef UNZIP_PROGRAM + remove(XFILE); + + char command[128]; + sprintf(command, "%s %s", UNZIP_PROGRAM, ZIPNAME); + mu_assert_int_eq(0, system(command)); + + mu_assert_int_eq(0, MZ_FILE_STAT(XFILE, &file_stats)); + mu_assert_int_eq(XMODE, file_stats.st_mode); +#endif +} + +MU_TEST(test_read_permissions) { + struct MZ_FILE_STAT_STRUCT file_stats; + + const char *filenames[] = {RFILE}; + FILE *f = fopen(RFILE, "w"); + fclose(f); + chmod(RFILE, RMODE); + + mu_assert_int_eq(0, zip_create(ZIPNAME, filenames, 1)); + remove(RFILE); + + mu_assert_int_eq(0, zip_extract(ZIPNAME, ".", NULL, NULL)); + mu_assert_int_eq(0, MZ_FILE_STAT(RFILE, &file_stats)); + mu_assert_int_eq(RMODE, file_stats.st_mode); + + // chmod from 444 to 666 to be able delete the file on windows + chmod(RFILE, WMODE); +} + +MU_TEST(test_write_permissions) { + struct MZ_FILE_STAT_STRUCT file_stats; + + const char *filenames[] = {WFILE}; + FILE *f = fopen(WFILE, "w"); + fclose(f); + chmod(WFILE, WMODE); + + mu_assert_int_eq(0, zip_create(ZIPNAME, filenames, 1)); + remove(WFILE); + + mu_assert_int_eq(0, zip_extract(ZIPNAME, ".", NULL, NULL)); + mu_assert_int_eq(0, MZ_FILE_STAT(WFILE, &file_stats)); + mu_assert_int_eq(WMODE, file_stats.st_mode); +} + +#define TESTDATA1 "Some test data 1...\0" + +MU_TEST(test_unix_permissions) { + // UNIX or APPLE + struct MZ_FILE_STAT_STRUCT file_stats; + + struct zip_t *zip = zip_open(ZIPNAME, ZIP_DEFAULT_COMPRESSION_LEVEL, 'w'); + mu_check(zip != NULL); + + mu_assert_int_eq(0, zip_entry_open(zip, RFILE)); + mu_assert_int_eq(0, zip_entry_write(zip, TESTDATA1, strlen(TESTDATA1))); + mu_assert_int_eq(0, zip_entry_close(zip)); + + zip_close(zip); + + mu_assert_int_eq(0, zip_extract(ZIPNAME, ".", NULL, NULL)); + + mu_assert_int_eq(0, MZ_FILE_STAT(RFILE, &file_stats)); + + mu_assert_int_eq(UNIXMODE, file_stats.st_mode); +} + +MU_TEST(test_mtime) { + struct MZ_FILE_STAT_STRUCT file_stat1, file_stat2; + + const char *filename = "test.data"; + FILE *stream = NULL; + struct zip_t *zip = NULL; +#if defined(_MSC_VER) + if (0 != fopen_s(&stream, filename, "w+")) +#else + if (!(stream = fopen(filename, "w+"))) +#endif + { + mu_fail("Cannot open filename\n"); + } + fwrite(TESTDATA1, sizeof(char), strlen(TESTDATA1), stream); + mu_assert_int_eq(0, fclose(stream)); + + memset(&file_stat1, 0, sizeof(file_stat1)); + memset(&file_stat2, 0, sizeof(file_stat2)); + + zip = zip_open(ZIPNAME, ZIP_DEFAULT_COMPRESSION_LEVEL, 'w'); + mu_check(zip != NULL); + + mu_assert_int_eq(0, zip_entry_open(zip, filename)); + mu_assert_int_eq(0, zip_entry_fwrite(zip, filename)); + mu_assert_int_eq(0, zip_entry_close(zip)); + + zip_close(zip); + + mu_assert_int_eq(0, MZ_FILE_STAT(filename, &file_stat1)); + remove(filename); + + mu_assert_int_eq(0, zip_extract(ZIPNAME, ".", NULL, NULL)); + mu_assert_int_eq(0, MZ_FILE_STAT(filename, &file_stat2)); + remove(filename); + + fprintf(stdout, "file_stat1.st_mtime: %lu\n", file_stat1.st_mtime); + fprintf(stdout, "file_stat2.st_mtime: %lu\n", file_stat2.st_mtime); + mu_check(labs(file_stat1.st_mtime - file_stat2.st_mtime) <= 1); +} + +MU_TEST_SUITE(test_permissions_suite) { + MU_SUITE_CONFIGURE(&test_setup, &test_teardown); + +#if defined(_WIN32) || defined(__WIN32__) +#else + MU_RUN_TEST(test_exe_permissions); + MU_RUN_TEST(test_read_permissions); + MU_RUN_TEST(test_write_permissions); + MU_RUN_TEST(test_unix_permissions); +#endif + MU_RUN_TEST(test_mtime); +} + +#define UNUSED(x) (void)x + +int main(int argc, char *argv[]) { + UNUSED(argc); + UNUSED(argv); + + MU_RUN_SUITE(test_permissions_suite); + MU_REPORT(); + return MU_EXIT_CODE; +} |
