• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /* test_dict.cc - Test deflate() and inflate() with preset dictionary */
2 
3 #include "zbuild.h"
4 #ifdef ZLIB_COMPAT
5 #  include "zlib.h"
6 #else
7 #  include "zlib-ng.h"
8 #endif
9 
10 #include <stdio.h>
11 #include <stdint.h>
12 #include <stdlib.h>
13 #include <string.h>
14 
15 #include "test_shared.h"
16 
17 #include <gtest/gtest.h>
18 
19 /* Maximum dictionary size, according to inflateGetDictionary() description. */
20 #define MAX_DICTIONARY_SIZE 32768
21 
22 static const char dictionary[] = "hello";
23 
TEST(dictionary,basic)24 TEST(dictionary, basic) {
25     PREFIX3(stream) c_stream, d_stream;
26     uint8_t compr[128], uncompr[128];
27     z_size_t compr_len = sizeof(compr), uncompr_len = sizeof(uncompr);
28     uint32_t dict_adler = 0;
29     uint8_t check_dict[MAX_DICTIONARY_SIZE];
30     uint32_t check_dict_len = 0;
31     int err;
32 
33     memset(&c_stream, 0, sizeof(c_stream));
34     memset(&d_stream, 0, sizeof(d_stream));
35 
36     err = PREFIX(deflateInit)(&c_stream, Z_BEST_COMPRESSION);
37     EXPECT_EQ(err, Z_OK);
38 
39     err = PREFIX(deflateSetDictionary)(&c_stream,
40         (const unsigned char *)dictionary, (int)sizeof(dictionary));
41     EXPECT_EQ(err, Z_OK);
42 
43     dict_adler = c_stream.adler;
44     c_stream.next_out = compr;
45     c_stream.avail_out = (uint32_t)compr_len;
46 
47     c_stream.next_in = (z_const unsigned char *)hello;
48     c_stream.avail_in = (uint32_t)hello_len;
49 
50     err = PREFIX(deflate)(&c_stream, Z_FINISH);
51     EXPECT_EQ(err, Z_STREAM_END);
52 
53     err = PREFIX(deflateEnd)(&c_stream);
54     EXPECT_EQ(err, Z_OK);
55 
56     strcpy((char*)uncompr, "garbage garbage garbage");
57 
58     d_stream.next_in  = compr;
59     d_stream.avail_in = (unsigned int)compr_len;
60 
61     err = PREFIX(inflateInit)(&d_stream);
62     EXPECT_EQ(err, Z_OK);
63 
64     d_stream.next_out = uncompr;
65     d_stream.avail_out = (unsigned int)uncompr_len;
66 
67     for (;;) {
68         err = PREFIX(inflate)(&d_stream, Z_NO_FLUSH);
69         if (err == Z_STREAM_END)
70             break;
71         if (err == Z_NEED_DICT) {
72             EXPECT_EQ(d_stream.adler, dict_adler);
73             err = PREFIX(inflateSetDictionary)(&d_stream, (const unsigned char*)dictionary,
74                 (uint32_t)sizeof(dictionary));
75             EXPECT_EQ(d_stream.adler, dict_adler);
76         }
77         EXPECT_EQ(err, Z_OK);
78     }
79 
80     err = PREFIX(inflateGetDictionary)(&d_stream, NULL, &check_dict_len);
81     EXPECT_EQ(err, Z_OK);
82 #ifndef S390_DFLTCC_INFLATE
83     EXPECT_GE(check_dict_len, sizeof(dictionary));
84 #endif
85 
86     err = PREFIX(inflateGetDictionary)(&d_stream, check_dict, &check_dict_len);
87     EXPECT_EQ(err, Z_OK);
88 #ifndef S390_DFLTCC_INFLATE
89     EXPECT_TRUE(memcmp(dictionary, check_dict, sizeof(dictionary)) == 0);
90 #endif
91 
92     err = PREFIX(inflateEnd)(&d_stream);
93     EXPECT_EQ(err, Z_OK);
94 
95     EXPECT_TRUE(strncmp((char*)uncompr, hello, sizeof(hello)) == 0);
96 }
97