mirror of
				https://github.com/RGBCube/serenity
				synced 2025-10-30 17:42:45 +00:00 
			
		
		
		
	 00ac73be57
			
		
	
	
		00ac73be57
		
	
	
	
	
		
			
			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.
		
			
				
	
	
		
			79 lines
		
	
	
	
		
			3.7 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
			
		
		
	
	
			79 lines
		
	
	
	
		
			3.7 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
| /*
 | |
|  * Copyright (c) 2020-2021, the SerenityOS developers.
 | |
|  *
 | |
|  * SPDX-License-Identifier: BSD-2-Clause
 | |
|  */
 | |
| 
 | |
| #include <LibTest/TestCase.h>
 | |
| 
 | |
| #include <AK/Array.h>
 | |
| #include <LibCompress/Zlib.h>
 | |
| 
 | |
| TEST_CASE(zlib_decompress_simple)
 | |
| {
 | |
|     Array<u8, 40> const compressed {
 | |
|         0x78, 0x01, 0x01, 0x1D, 0x00, 0xE2, 0xFF, 0x54, 0x68, 0x69, 0x73, 0x20,
 | |
|         0x69, 0x73, 0x20, 0x61, 0x20, 0x73, 0x69, 0x6D, 0x70, 0x6C, 0x65, 0x20,
 | |
|         0x74, 0x65, 0x78, 0x74, 0x20, 0x66, 0x69, 0x6C, 0x65, 0x20, 0x3A, 0x29,
 | |
|         0x99, 0x5E, 0x09, 0xE8
 | |
|     };
 | |
| 
 | |
|     const u8 uncompressed[] = "This is a simple text file :)";
 | |
| 
 | |
|     auto const decompressed = Compress::ZlibDecompressor::decompress_all(compressed);
 | |
|     EXPECT(decompressed.value().bytes() == (ReadonlyBytes { uncompressed, sizeof(uncompressed) - 1 }));
 | |
| }
 | |
| 
 | |
| TEST_CASE(zlib_compress_simple)
 | |
| {
 | |
|     // Note: This is just the output of our compression function from an arbitrary point in time.
 | |
|     // This test is intended to ensure that the decompression doesn't change unintentionally,
 | |
|     // it does not make any guarantees for correctness.
 | |
| 
 | |
|     Array<u8, 37> const compressed {
 | |
|         0x78, 0x9C, 0x0B, 0xC9, 0xC8, 0x2C, 0x56, 0xC8, 0x2C, 0x56, 0x48, 0x54,
 | |
|         0x28, 0xCE, 0xCC, 0x2D, 0xC8, 0x49, 0x55, 0x28, 0x49, 0xAD, 0x28, 0x51,
 | |
|         0x48, 0xCB, 0xCC, 0x49, 0x55, 0xB0, 0xD2, 0x04, 0x00, 0x99, 0x5E, 0x09,
 | |
|         0xE8
 | |
|     };
 | |
| 
 | |
|     const u8 uncompressed[] = "This is a simple text file :)";
 | |
| 
 | |
|     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<u8, 72> 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<u8, 144> 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());
 | |
| }
 |