From 8f07403ac4baee4fb580bbfee103205c7350929e Mon Sep 17 00:00:00 2001 From: Joergen Ibsen Date: Fri, 18 Jan 2019 08:14:09 +0100 Subject: [PATCH] Add test using max codeword length --- test/test_tinf.c | 30 ++++++++++++++++ tools/mkzdata.c | 90 +++++++++++++++++++++++++++++++++++++++++++++++- 2 files changed, 119 insertions(+), 1 deletion(-) diff --git a/test/test_tinf.c b/test/test_tinf.c index 1f31b47..834097c 100644 --- a/test/test_tinf.c +++ b/test/test_tinf.c @@ -394,6 +394,35 @@ TEST inflate_code_length_codes(void) PASS(); } +TEST inflate_max_codelen(void) +{ + /* Use all codeword lengths including 15 */ + static const unsigned char data[] = { + 0x05, 0xEA, 0x01, 0x82, 0x24, 0x49, 0x92, 0x24, 0x49, 0x02, + 0x12, 0x8B, 0x9A, 0x47, 0x56, 0xCF, 0xDE, 0xFF, 0x9F, 0x7B, + 0x0F, 0xD0, 0xEE, 0x7D, 0xBF, 0xBF, 0x7F, 0xFF, 0xFD, 0xEF, + 0xFF, 0xFE, 0xDF, 0xFF, 0xF7, 0xFF, 0xFB, 0xFF, 0x03 + }; + unsigned char out[15]; + unsigned int dlen = ARRAY_SIZE(out); + int res; + int i; + + memset(out, 0xFF, ARRAY_SIZE(out)); + + res = tinf_uncompress(out, &dlen, data, ARRAY_SIZE(data)); + + ASSERT(res == TINF_OK && dlen == ARRAY_SIZE(out)); + + for (i = 0; i < ARRAY_SIZE(out); ++i) { + if (out[i] != i) { + FAIL(); + } + } + + PASS(); +} + /* Test tinf_uncompress on random data */ TEST inflate_random(void) { @@ -446,6 +475,7 @@ SUITE(tinflate) RUN_TEST(inflate_max_matchlen_alt); RUN_TEST(inflate_max_matchdist); RUN_TEST(inflate_code_length_codes); + RUN_TEST(inflate_max_codelen); RUN_TEST(inflate_random); diff --git a/tools/mkzdata.c b/tools/mkzdata.c index 386b28f..2de1509 100644 --- a/tools/mkzdata.c +++ b/tools/mkzdata.c @@ -372,7 +372,95 @@ write_max_dist(struct lsb_bitwriter *lbw) // end of block lbw_putbits_rev(lbw, 13, 4); // 256 = EOB +} +// Use length 15 codeword +void +write_max_codelen(struct lsb_bitwriter *lbw) +{ + // bfinal + lbw_putbits(lbw, 1, 1); + + // btype + lbw_putbits(lbw, 2, 2); + + // hlit + lbw_putbits(lbw, 0, 5); + + // hdist + lbw_putbits(lbw, 10, 5); + + // hclen + lbw_putbits(lbw, 15, 4); + + lbw_putbits(lbw, 0, 3); // 16 + lbw_putbits(lbw, 0, 3); // 17 + lbw_putbits(lbw, 4, 3); // 18 + lbw_putbits(lbw, 0, 3); // 0 + lbw_putbits(lbw, 4, 3); // 8 + lbw_putbits(lbw, 4, 3); // 7 + lbw_putbits(lbw, 4, 3); // 9 + lbw_putbits(lbw, 4, 3); // 6 + lbw_putbits(lbw, 4, 3); // 10 + lbw_putbits(lbw, 4, 3); // 5 + lbw_putbits(lbw, 4, 3); // 11 + lbw_putbits(lbw, 4, 3); // 4 + lbw_putbits(lbw, 4, 3); // 12 + lbw_putbits(lbw, 4, 3); // 3 + lbw_putbits(lbw, 4, 3); // 13 + lbw_putbits(lbw, 4, 3); // 2 + lbw_putbits(lbw, 4, 3); // 14 + lbw_putbits(lbw, 4, 3); // 1 + lbw_putbits(lbw, 4, 3); // 15 + + // code lengths for literal/length + lbw_putbits_rev(lbw, 0, 4); // 0 has len 1 + lbw_putbits_rev(lbw, 1, 4); // 1 has len 2 + lbw_putbits_rev(lbw, 2, 4); // 2 has len 3 + lbw_putbits_rev(lbw, 3, 4); // 3 has len 4 + lbw_putbits_rev(lbw, 4, 4); // 4 has len 5 + lbw_putbits_rev(lbw, 5, 4); // 5 has len 6 + lbw_putbits_rev(lbw, 6, 4); // 6 has len 7 + lbw_putbits_rev(lbw, 7, 4); // 7 has len 8 + lbw_putbits_rev(lbw, 8, 4); // 8 has len 9 + lbw_putbits_rev(lbw, 9, 4); // 9 has len 10 + lbw_putbits_rev(lbw, 10, 4); // 10 has len 11 + lbw_putbits_rev(lbw, 11, 4); // 11 has len 12 + lbw_putbits_rev(lbw, 12, 4); // 12 has len 13 + lbw_putbits_rev(lbw, 13, 4); // 13 has len 14 + lbw_putbits_rev(lbw, 14, 4); // 14 has len 15 + + lbw_putbits_rev(lbw, 15, 4); // repeat len 0 for 138 times + lbw_putbits(lbw, 127, 7); + + lbw_putbits_rev(lbw, 15, 4); // repeat len 0 for 103 times + lbw_putbits(lbw, 92, 7); + + lbw_putbits_rev(lbw, 14, 4); // 256 has len 15 + + // code lengths for distance + lbw_putbits_rev(lbw, 15, 4); // repeat len 0 for 11 times + lbw_putbits(lbw, 0, 7); + + // compressed data + lbw_putbits_rev(lbw, 0, 1); // literal 0 + lbw_putbits_rev(lbw, 2, 2); // literal 1 + lbw_putbits_rev(lbw, 6, 3); // literal 2 + lbw_putbits_rev(lbw, 14, 4); // literal 3 + lbw_putbits_rev(lbw, 30, 5); // literal 4 + lbw_putbits_rev(lbw, 62, 6); // literal 5 + lbw_putbits_rev(lbw, 126, 7); // literal 6 + lbw_putbits_rev(lbw, 254, 8); // literal 7 + lbw_putbits_rev(lbw, 510, 9); // literal 8 + lbw_putbits_rev(lbw, 1022, 10); // literal 9 + lbw_putbits_rev(lbw, 2046, 11); // literal 10 + lbw_putbits_rev(lbw, 4094, 12); // literal 11 + lbw_putbits_rev(lbw, 8190, 13); // literal 12 + lbw_putbits_rev(lbw, 16382, 14); // literal 13 + lbw_putbits_rev(lbw, 32766, 15); // literal 14 + + // end of block + lbw_putbits_rev(lbw, 32767, 15); // 256 = EOB } unsigned char buffer[64 * 1024]; @@ -393,7 +481,7 @@ main(int argc, char *argv[]) lbw_init(&lbw, &data[0]); - write_max_dist(&lbw); + write_max_codelen(&lbw); uint32_t size = lbw_finalize(&lbw) - &data[0];