1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
|
/* 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 <string>
#include <gtest/gtest.h>
#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);
}
|