/* test_deflate_deterministic.cc - Test deterministic output after deflateReset */ #include "zbuild.h" #ifdef ZLIB_COMPAT # include "zlib.h" #else # include "zlib-ng.h" #endif #include #include #include "deflate.h" #include "test_shared.h" /* Issue: https://github.com/zlib-ng/zlib-ng/issues/2100 */ /* len(data_b) must be greater len(data_a) */ static const uint8_t data_a[] = { 0 , 'A', 'A', 'A', 'A', 0 , 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A' }; static const uint8_t data_b[] = { 'B', 'B', 'B', 'B', 'B', 'B', 'B', 'B', 'B', 'B', 'B', 'B', 'B', 'B', 'B' }; static std::string compress_data(const uint8_t *src, size_t len, PREFIX3(stream)* z_stream) { const uint32_t buffer_size = 1024; uint8_t buffer[buffer_size]; int err; z_stream->next_in = (z_const uint8_t *)src; z_stream->avail_in = (uint32_t)len; z_stream->next_out = buffer; z_stream->avail_out = buffer_size; err = PREFIX(deflate)(z_stream, Z_FINISH); EXPECT_EQ(err, Z_STREAM_END); return std::string((const char *)buffer, (size_t)(z_stream->next_out - buffer)); } TEST(deflate, deterministic) { const int compression_level = 6; const int window_bits = 15; int err; PREFIX3(stream) a_stream; memset(&a_stream, 0, sizeof(a_stream)); /* Compress a with newly created z_stream. */ err = PREFIX(deflateInit2)(&a_stream, compression_level, Z_DEFLATED, window_bits, 8, Z_DEFAULT_STRATEGY); EXPECT_EQ(err, Z_OK); const std::string a_compressed = compress_data(data_a, sizeof(data_a), &a_stream); err = PREFIX(deflateEnd)(&a_stream); EXPECT_EQ(err, Z_OK); /* Compress b with newly created z_stream. */ PREFIX3(stream) b_stream; memset(&b_stream, 0, sizeof(b_stream)); err = PREFIX(deflateInit2)(&b_stream, compression_level, Z_DEFLATED, window_bits, 8, Z_DEFAULT_STRATEGY); EXPECT_EQ(err, Z_OK); const std::string b_compressed = compress_data(data_b, sizeof(data_b), &b_stream); /* Reset the stream. */ err = PREFIX(deflateReset)(&b_stream); EXPECT_EQ(err, Z_OK); const std::string a_compressed2 = compress_data(data_a, sizeof(data_a), &b_stream); err = PREFIX(deflateEnd)(&b_stream); EXPECT_EQ(err, Z_OK); EXPECT_EQ(a_compressed, a_compressed2); }