Avoid using fdropen in mz_zip_add_mem_to_archive_file_in_place or if new flag MZ_ZIP_FLAG_READ_ALLOW_WRITING is set. This improves performance, but also fdreopen is broken on Android (some kind of race).
127 lines
3.5 KiB
C++
127 lines
3.5 KiB
C++
#include "catch_amalgamated.hpp"
|
|
#include "../miniz.h"
|
|
#include <assert.h>
|
|
#include <string>
|
|
|
|
#ifdef _WIN32
|
|
#define unlink _unlink
|
|
#endif
|
|
|
|
bool create_test_zip()
|
|
{
|
|
unlink("test.zip");
|
|
mz_zip_archive zip_archive = {};
|
|
auto b = mz_zip_writer_init_file(&zip_archive, "test.zip", 0);
|
|
if (!b)
|
|
return false;
|
|
|
|
b = mz_zip_writer_add_mem(&zip_archive, "test.txt", "foo", 3, MZ_DEFAULT_COMPRESSION);
|
|
if (!b)
|
|
return false;
|
|
|
|
b = mz_zip_writer_finalize_archive(&zip_archive);
|
|
if (!b)
|
|
return false;
|
|
|
|
b = mz_zip_writer_end(&zip_archive);
|
|
if (!b)
|
|
return false;
|
|
|
|
return true;
|
|
}
|
|
|
|
TEST_CASE("Zip writer tests")
|
|
{
|
|
auto b = create_test_zip();
|
|
REQUIRE(b);
|
|
|
|
SECTION("Test test.txt content correct")
|
|
{
|
|
mz_zip_archive zip_archive = {};
|
|
|
|
auto b = mz_zip_reader_init_file(&zip_archive, "test.zip", 0);
|
|
REQUIRE(b);
|
|
|
|
size_t content_size;
|
|
auto content = mz_zip_reader_extract_file_to_heap(&zip_archive, "test.txt", &content_size, 0);
|
|
|
|
std::string_view content_view(reinterpret_cast<char *>(content), content_size);
|
|
|
|
REQUIRE(content_view == "foo");
|
|
REQUIRE(content_view.size() == 3);
|
|
|
|
free(content);
|
|
|
|
mz_zip_reader_end(&zip_archive);
|
|
}
|
|
|
|
SECTION("Test repeated file addition to zip")
|
|
{
|
|
mz_zip_archive zip_archive = {};
|
|
auto b = mz_zip_writer_init_file(&zip_archive, "test2.zip", 0);
|
|
REQUIRE(b);
|
|
|
|
b = mz_zip_writer_finalize_archive(&zip_archive);
|
|
REQUIRE(b);
|
|
|
|
b = mz_zip_writer_end(&zip_archive);
|
|
REQUIRE(b);
|
|
|
|
for (int i = 0; i < 50; i++)
|
|
{
|
|
const char *str = "hello world";
|
|
b = mz_zip_add_mem_to_archive_file_in_place(
|
|
std::string("test2.zip").c_str(), ("file1.txt" + std::to_string(i)).c_str(),
|
|
str, (mz_uint16)strlen(str),
|
|
NULL, 0,
|
|
MZ_BEST_COMPRESSION);
|
|
REQUIRE(b);
|
|
}
|
|
}
|
|
}
|
|
|
|
TEST_CASE("Tinfl / tdefl tests")
|
|
{
|
|
SECTION("simple_test1")
|
|
{
|
|
size_t cmp_len = 0;
|
|
|
|
const char *p = "This is a test.This is a test.This is a test.1234567This is a test.This is a test.123456";
|
|
size_t uncomp_len = strlen(p);
|
|
|
|
void *pComp_data = tdefl_compress_mem_to_heap(p, uncomp_len, &cmp_len, TDEFL_WRITE_ZLIB_HEADER);
|
|
REQUIRE(pComp_data);
|
|
|
|
size_t decomp_len = 0;
|
|
void *pDecomp_data = tinfl_decompress_mem_to_heap(pComp_data, cmp_len, &decomp_len, TINFL_FLAG_PARSE_ZLIB_HEADER);
|
|
|
|
REQUIRE(pDecomp_data);
|
|
REQUIRE(decomp_len == uncomp_len);
|
|
REQUIRE(memcmp(pDecomp_data, p, uncomp_len) == 0);
|
|
|
|
free(pComp_data);
|
|
free(pDecomp_data);
|
|
}
|
|
|
|
SECTION("simple_test2")
|
|
{
|
|
uint8_t cmp_buf[1024], decomp_buf[1024];
|
|
uLong cmp_len = sizeof(cmp_buf);
|
|
|
|
const char *p = "This is a test.This is a test.This is a test.1234567This is a test.This is a test.123456";
|
|
uLong uncomp_len = (uLong)strlen(p);
|
|
|
|
int status = compress(cmp_buf, &cmp_len, (const uint8_t *)p, uncomp_len);
|
|
REQUIRE(status == Z_OK);
|
|
|
|
REQUIRE(cmp_len <= compressBound(uncomp_len));
|
|
|
|
uLong decomp_len = sizeof(decomp_buf);
|
|
status = uncompress(decomp_buf, &decomp_len, cmp_buf, cmp_len);
|
|
;
|
|
|
|
REQUIRE(status == Z_OK);
|
|
REQUIRE(decomp_len == uncomp_len);
|
|
REQUIRE(memcmp(decomp_buf, p, uncomp_len) == 0);
|
|
}
|
|
} |