summaryrefslogtreecommitdiff
path: root/neozip/test/test_small_window.cc
blob: e351efac0deb5432835a660a30619d28d44deb90 (plain)
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
/* test_small_window.cc - Test deflate() and inflate() with a small window and a preset dictionary */

#include "zbuild.h"
#ifdef ZLIB_COMPAT
#  include "zlib.h"
#else
#  include "zlib-ng.h"
#endif

#include <gtest/gtest.h>

TEST(small_window, basic) {
    PREFIX3(stream) stream;
    int err;
    unsigned char plain[128];
    unsigned char dictionary1[(1 << 9) - sizeof(plain) / 2];
    size_t i;
    unsigned char compr[sizeof(plain)];
    unsigned int compr_len;
    unsigned char plain_again[sizeof(plain)];

    memset(&stream, 0, sizeof(stream));
    err = PREFIX(deflateInit2)(&stream, Z_BEST_COMPRESSION, Z_DEFLATED, -9, 8, Z_DEFAULT_STRATEGY);
    EXPECT_EQ(err, Z_OK);

    /* Use a large dictionary that is loaded in two parts */
    memset(dictionary1, 'a', sizeof(dictionary1));
    err = PREFIX(deflateSetDictionary)(&stream, dictionary1, (unsigned int)sizeof(dictionary1));
    EXPECT_EQ(err, Z_OK);
    for (i = 0; i < sizeof(plain); i++)
        plain[i] = (unsigned char)i;
    err = PREFIX(deflateSetDictionary)(&stream, plain, (unsigned int)sizeof(plain));
    EXPECT_EQ(err, Z_OK);

    stream.next_in = plain;
    stream.avail_in = (uint32_t)sizeof(plain);
    stream.next_out = compr;
    stream.avail_out = (uint32_t)sizeof(compr);
    err = PREFIX(deflate)(&stream, Z_FINISH);
    EXPECT_EQ(err, Z_STREAM_END);
    compr_len = sizeof(compr) - stream.avail_out;

    err = PREFIX(deflateEnd)(&stream);
    EXPECT_EQ(err, Z_OK);

    memset(&stream, 0, sizeof(stream));
    err = PREFIX(inflateInit2)(&stream, -9);
    EXPECT_EQ(err, Z_OK);

    err = PREFIX(inflateSetDictionary)(&stream, dictionary1, (unsigned int)sizeof(dictionary1));
    EXPECT_EQ(err, Z_OK);
    err = PREFIX(inflateSetDictionary)(&stream, plain, (unsigned int)sizeof(plain));
    EXPECT_EQ(err, Z_OK);

    stream.next_in = compr;
    stream.avail_in = compr_len;
    stream.next_out = plain_again;
    stream.avail_out = (unsigned int)sizeof(plain_again);

    err = PREFIX(inflate)(&stream, Z_NO_FLUSH);
    EXPECT_EQ(err, Z_STREAM_END);

    err = PREFIX(inflateEnd)(&stream);
    EXPECT_EQ(err, Z_OK);

    EXPECT_TRUE(memcmp(plain_again, plain, sizeof(plain)) == 0);
}