From 00ac73be579a096d951ea2e49c2ba63b06d97f0e Mon Sep 17 00:00:00 2001 From: Tim Schumacher Date: Thu, 27 Apr 2023 08:16:59 +0200 Subject: [PATCH] Tests: Add a zlib test for "missing end bits" The actual cause for the "missing bits" is currently unknown, and this test case doesn't actually start obviously breaking yet unless we start reporting errors about missing bits. However, since we are touching the BitStream implementation already, let's add the test early to make extra sure that we aren't breaking anything. --- Tests/LibCompress/TestZlib.cpp | 35 ++++++++++++++++++++++++++++++++++ 1 file changed, 35 insertions(+) diff --git a/Tests/LibCompress/TestZlib.cpp b/Tests/LibCompress/TestZlib.cpp index 4ba56f8d7b..8c72e8f3a8 100644 --- a/Tests/LibCompress/TestZlib.cpp +++ b/Tests/LibCompress/TestZlib.cpp @@ -42,3 +42,38 @@ TEST_CASE(zlib_compress_simple) auto const freshly_pressed = Compress::ZlibCompressor::compress_all({ uncompressed, sizeof(uncompressed) - 1 }); EXPECT(freshly_pressed.value().bytes() == compressed.span()); } + +TEST_CASE(zlib_decompress_with_missing_end_bits) +{ + // This test case has been extracted from compressed PNG data of `/res/icons/16x16/app-masterword.png`. + // The decompression results have been confirmed using the `zlib-flate` tool. + // Note: It is unconfirmed whether there are actually bits missing. + // However, our decompressor implementation ends up in a weird state nonetheless. + + Array const compressed { + 0x08, 0xD7, 0x63, 0x30, 0x86, 0x00, 0x01, 0x06, 0x23, 0x25, 0x30, 0x00, + 0x32, 0x42, 0x95, 0x54, 0x83, 0xD0, 0x18, 0x41, 0xA1, 0x50, 0x46, 0x28, + 0x8C, 0xA1, 0x8A, 0xA1, 0x46, 0xC5, 0x35, 0x48, 0xC9, 0x05, 0x99, 0xA1, + 0xA4, 0xE2, 0x02, 0x44, 0x60, 0x93, 0x5D, 0x54, 0x54, 0x9C, 0x20, 0x0C, + 0x17, 0x17, 0x08, 0x43, 0xC5, 0xC9, 0x05, 0xA8, 0x4B, 0x50, 0x50, 0x50, + 0xC4, 0xD1, 0x45, 0x50, 0x80, 0x01, 0x06, 0x00, 0xB6, 0x1F, 0x15, 0xEF + }; + Array const decompressed { + 0x00, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x10, 0x00, 0x32, 0x22, + 0x22, 0x22, 0x22, 0x22, 0x22, 0x10, 0x00, 0x32, 0x55, 0x22, 0x25, 0x52, + 0x22, 0x22, 0x10, 0x00, 0x32, 0x55, 0x22, 0x25, 0x52, 0x22, 0x22, 0x10, + 0x00, 0x32, 0x55, 0x52, 0x55, 0x52, 0x22, 0x22, 0x10, 0x00, 0x32, 0x55, + 0x55, 0x55, 0x52, 0x22, 0x22, 0x10, 0x00, 0x32, 0x55, 0x25, 0x25, 0x52, + 0x22, 0x22, 0x10, 0x00, 0x32, 0x55, 0x22, 0x25, 0x52, 0x22, 0x22, 0x10, + 0x00, 0x32, 0x55, 0x24, 0x45, 0x52, 0x22, 0x44, 0x10, 0x00, 0x32, 0x55, + 0x24, 0x45, 0x52, 0x22, 0x44, 0x10, 0x00, 0x32, 0x22, 0x24, 0x44, 0x22, + 0x24, 0x44, 0x10, 0x00, 0x32, 0x22, 0x22, 0x44, 0x24, 0x24, 0x42, 0x10, + 0x00, 0x32, 0x22, 0x22, 0x44, 0x44, 0x44, 0x42, 0x10, 0x00, 0x32, 0x22, + 0x22, 0x24, 0x42, 0x44, 0x22, 0x10, 0x00, 0x11, 0x11, 0x11, 0x14, 0x41, + 0x44, 0x11, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 + }; + + auto const maybe_decompressed = Compress::ZlibDecompressor::decompress_all(compressed); + EXPECT(maybe_decompressed.has_value()); + EXPECT_EQ(maybe_decompressed.value().span(), decompressed.span()); +}