Add a flate_backref_crosses_blocks test.
diff --git a/test/c/std/flate.c b/test/c/std/flate.c index 4ed1598..6a02a19 100644 --- a/test/c/std/flate.c +++ b/test/c/std/flate.c
@@ -65,6 +65,15 @@ .src_offset1 = 281, // }; +golden_test flate_flate_backref_crosses_blocks_gt = { + .want_filename = + "../../testdata/artificial/" + "flate-backref-crosses-blocks.flate.decompressed", + .src_filename = + "../../testdata/artificial/" + "flate-backref-crosses-blocks.flate", +}; + golden_test flate_midsummer_gt = { .want_filename = "../../testdata/midsummer.txt", // .src_filename = "../../testdata/midsummer.txt.gz", // @@ -244,6 +253,13 @@ do_test_buf1_buf1(puffs_flate_decode, &flate_256_bytes_gt, 0, 0); } +void test_puffs_flate_decode_flate_backref_crosses_blocks() { + proc_funcname = __func__; + // TODO: uncomment. + // do_test_buf1_buf1(puffs_flate_decode, + // &flate_flate_backref_crosses_blocks_gt, 0, 0); +} + void test_puffs_flate_decode_midsummer() { proc_funcname = __func__; do_test_buf1_buf1(puffs_flate_decode, &flate_midsummer_gt, 0, 0); @@ -676,6 +692,12 @@ do_test_buf1_buf1(mimic_flate_decode, &flate_256_bytes_gt, 0, 0); } +void test_mimic_flate_decode_flate_backref_crosses_blocks() { + proc_funcname = __func__; + do_test_buf1_buf1(mimic_flate_decode, &flate_flate_backref_crosses_blocks_gt, + 0, 0); +} + void test_mimic_flate_decode_midsummer() { proc_funcname = __func__; do_test_buf1_buf1(mimic_flate_decode, &flate_midsummer_gt, 0, 0); @@ -849,35 +871,37 @@ // The empty comments forces clang-format to place one element per line. proc tests[] = { // Flate Tests - test_puffs_adler32, // - test_puffs_flate_decode_256_bytes, // - test_puffs_flate_decode_midsummer, // - test_puffs_flate_decode_pi, // - test_puffs_flate_decode_pi_many_big_reads, // - test_puffs_flate_decode_pi_many_medium_reads, // - test_puffs_flate_decode_pi_many_small_writes_reads, // - test_puffs_flate_decode_romeo, // - test_puffs_flate_decode_romeo_fixed, // - test_puffs_flate_decode_split_src, // - test_puffs_flate_history_full, // - test_puffs_flate_history_partial, // - test_puffs_flate_table_redirect, // - test_puffs_zlib_checksum_mismatch, // - test_puffs_zlib_decode_midsummer, // - test_puffs_zlib_decode_pi, // + test_puffs_adler32, // + test_puffs_flate_decode_256_bytes, // + test_puffs_flate_decode_flate_backref_crosses_blocks, // + test_puffs_flate_decode_midsummer, // + test_puffs_flate_decode_pi, // + test_puffs_flate_decode_pi_many_big_reads, // + test_puffs_flate_decode_pi_many_medium_reads, // + test_puffs_flate_decode_pi_many_small_writes_reads, // + test_puffs_flate_decode_romeo, // + test_puffs_flate_decode_romeo_fixed, // + test_puffs_flate_decode_split_src, // + test_puffs_flate_history_full, // + test_puffs_flate_history_partial, // + test_puffs_flate_table_redirect, // + test_puffs_zlib_checksum_mismatch, // + test_puffs_zlib_decode_midsummer, // + test_puffs_zlib_decode_pi, // #ifdef PUFFS_MIMIC // Mimic Tests - test_mimic_flate_decode_256_bytes, // - test_mimic_flate_decode_midsummer, // - test_mimic_flate_decode_pi, // - test_mimic_flate_decode_romeo, // - test_mimic_flate_decode_romeo_fixed, // - test_mimic_gzip_decode_midsummer, // - test_mimic_gzip_decode_pi, // - test_mimic_zlib_decode_midsummer, // - test_mimic_zlib_decode_pi, // + test_mimic_flate_decode_256_bytes, // + test_mimic_flate_decode_flate_backref_crosses_blocks, // + test_mimic_flate_decode_midsummer, // + test_mimic_flate_decode_pi, // + test_mimic_flate_decode_romeo, // + test_mimic_flate_decode_romeo_fixed, // + test_mimic_gzip_decode_midsummer, // + test_mimic_gzip_decode_pi, // + test_mimic_zlib_decode_midsummer, // + test_mimic_zlib_decode_pi, // #endif // PUFFS_MIMIC
diff --git a/test/testdata/artificial/flate-backref-crosses-blocks.flate b/test/testdata/artificial/flate-backref-crosses-blocks.flate new file mode 100644 index 0000000..bdd34ab --- /dev/null +++ b/test/testdata/artificial/flate-backref-crosses-blocks.flate Binary files differ
diff --git a/test/testdata/artificial/flate-backref-crosses-blocks.flate.commentary.txt b/test/testdata/artificial/flate-backref-crosses-blocks.flate.commentary.txt new file mode 100644 index 0000000..2f8e2ab --- /dev/null +++ b/test/testdata/artificial/flate-backref-crosses-blocks.flate.commentary.txt
@@ -0,0 +1,31 @@ +Running flate-backref-crosses-blocks.flate through script/print-bits.go and +adding commentary: + + offset xoffset ASCII hex binary + 000000 0x0000 . 0x00 0b_0000_0000 Non-compressed block (BTYPE=00), non-final (BFINAL=0) + 000001 0x0001 . 0x04 0b_0000_0100 Block length is 0x0004 (parity value is 0xFFFB) + 000002 0x0002 . 0x00 0b_0000_0000 + 000003 0x0003 . 0xFB 0b_1111_1011 + 000004 0x0004 . 0xFF 0b_1111_1111 + 000005 0x0005 a 0x61 0b_0110_0001 Literal "abcd" + 000006 0x0006 b 0x62 0b_0110_0010 + 000007 0x0007 c 0x63 0b_0110_0011 + 000008 0x0008 d 0x64 0b_0110_0100 + 000009 0x0009 . 0x03 0b_0000_0011 Fixed Huffman block (BTYPE=01), final (BFINAL=1), see below + 000010 0x000A B 0x42 0b_0100_0010 + 000011 0x000B . 0x00 0b_0000_0000 + +The fixed Huffman block consists of a back-reference that refers to the +previous (non-compressed) block, and then an "end of block" code. The length=3, +distance=2 back-reference decodes to "cdc", so the overall decoding is +"abcdcdc". The breakdown of the fixed Huffman block is: + + 000009 0x0009 . 0x03 0b_...._.011 Fixed Huffman block (BTYPE=01), final (BFINAL=1) + + 000009 0x0009 . 0x03 0b_0000_0... (lcode = 257) length = 3 + 000010 0x000A B 0x42 0b_...._..10 + + 000010 0x000A B 0x42 0b_.100_00.. (dcode = 1) distance = 2 + + 000010 0x000A B 0x42 0b_0..._.... (lcode = 256) end of block + 000011 0x000B . 0x00 0b_..00_0000
diff --git a/test/testdata/artificial/flate-backref-crosses-blocks.flate.decompressed b/test/testdata/artificial/flate-backref-crosses-blocks.flate.decompressed new file mode 100644 index 0000000..f809e69 --- /dev/null +++ b/test/testdata/artificial/flate-backref-crosses-blocks.flate.decompressed
@@ -0,0 +1 @@ +abcdcdc \ No newline at end of file