From 997f3f4790dd4847982ce373ed18ee0cf64d5dbd Mon Sep 17 00:00:00 2001 From: Hiroshi Miura Date: Tue, 7 Jul 2020 13:21:40 +0900 Subject: [PATCH] lzma: support LZMA1 with FORMAT_RAW - Add test with LZMA1 and FORMAT_RAW - Update document. Signed-off-by: Hiroshi Miura --- Doc/library/lzma.rst | 2 +- Lib/test/test_lzma.py | 64 +++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 65 insertions(+), 1 deletion(-) diff --git a/Doc/library/lzma.rst b/Doc/library/lzma.rst index 4bfff9c..f6d2c6b 100644 --- a/Doc/library/lzma.rst +++ b/Doc/library/lzma.rst @@ -332,7 +332,7 @@ the key ``"id"``, and may contain additional keys to specify filter-dependent options. Valid filter IDs are as follows: * Compression filters: - * :const:`FILTER_LZMA1` (for use with :const:`FORMAT_ALONE`) + * :const:`FILTER_LZMA1` (for use with :const:`FORMAT_ALONE` and :const:`FORMAT_RAW`) * :const:`FILTER_LZMA2` (for use with :const:`FORMAT_XZ` and :const:`FORMAT_RAW`) * Delta filter: diff --git a/Lib/test/test_lzma.py b/Lib/test/test_lzma.py index c2427f8..acc4ed7 100644 --- a/Lib/test/test_lzma.py +++ b/Lib/test/test_lzma.py @@ -131,6 +131,10 @@ class CompressorDecompressorTestCase(unittest.TestCase): lzd = LZMADecompressor(lzma.FORMAT_RAW, filters=FILTERS_RAW_4) self._test_decompressor(lzd, COMPRESSED_RAW_4, lzma.CHECK_NONE) + def test_decompressor_raw_5(self): + lzd = LZMADecompressor(lzma.FORMAT_RAW, filters=FILTERS_RAW_5) + self._test_decompressor(lzd, COMPRESSED_RAW_5, lzma.CHECK_NONE) + def test_decompressor_chunks(self): lzd = LZMADecompressor() out = [] @@ -295,6 +299,12 @@ class CompressorDecompressorTestCase(unittest.TestCase): lzd = LZMADecompressor(lzma.FORMAT_RAW, filters=FILTERS_RAW_4) self._test_decompressor(lzd, cdata, lzma.CHECK_NONE) + def test_roundtrip_raw_lzma1(self): + lzc = LZMACompressor(lzma.FORMAT_RAW, filters=FILTERS_RAW_5) + cdata = lzc.compress(INPUT) + lzc.flush() + lzd = LZMADecompressor(lzma.FORMAT_RAW, filters=FILTERS_RAW_5) + self._test_decompressor(lzd, cdata, lzma.CHECK_NONE) + def test_roundtrip_raw_empty(self): lzc = LZMACompressor(lzma.FORMAT_RAW, filters=FILTERS_RAW_4) cdata = lzc.compress(INPUT) @@ -456,6 +466,10 @@ class CompressDecompressFunctionTestCase(unittest.TestCase): COMPRESSED_RAW_4, lzma.FORMAT_RAW, filters=FILTERS_RAW_4) self.assertEqual(ddata, INPUT) + ddata = lzma.decompress( + COMPRESSED_RAW_5, lzma.FORMAT_RAW, filters=FILTERS_RAW_5) + self.assertEqual(ddata, INPUT) + def test_decompress_incomplete_input(self): self.assertRaises(LZMAError, lzma.decompress, COMPRESSED_XZ[:128]) self.assertRaises(LZMAError, lzma.decompress, COMPRESSED_ALONE[:128]) @@ -467,6 +481,8 @@ class CompressDecompressFunctionTestCase(unittest.TestCase): format=lzma.FORMAT_RAW, filters=FILTERS_RAW_3) self.assertRaises(LZMAError, lzma.decompress, COMPRESSED_RAW_4[:128], format=lzma.FORMAT_RAW, filters=FILTERS_RAW_4) + self.assertRaises(LZMAError, lzma.decompress, COMPRESSED_RAW_5[:128], + format=lzma.FORMAT_RAW, filters=FILTERS_RAW_5) def test_decompress_bad_input(self): with self.assertRaises(LZMAError): @@ -812,6 +828,10 @@ class FileTestCase(unittest.TestCase): format=lzma.FORMAT_RAW, filters=FILTERS_RAW_4) as f: self.assertEqual(f.read(), INPUT) self.assertEqual(f.read(), b"") + with LZMAFile(BytesIO(COMPRESSED_RAW_5), + format=lzma.FORMAT_RAW, filters=FILTERS_RAW_5) as f: + self.assertEqual(f.read(), INPUT) + self.assertEqual(f.read(), b"") def test_read_0(self): with LZMAFile(BytesIO(COMPRESSED_XZ)) as f: @@ -1797,6 +1817,50 @@ COMPRESSED_RAW_4 = ( b"\x00" ) +FILTERS_RAW_5 = [{"id": lzma.FILTER_X86, "start_offset": 0x00}, + {"id": lzma.FILTER_LZMA1}] +COMPRESSED_RAW_5 = ( + b'\x00\x05\x14\x07bX\x19\xcd\xddn\x98\x15\xe4\xb4\x9do\x1d\xc4\xe5\n\x03\xcc2h' + b'\xc7\\\x86\xff\xf8\xe2\xfc\xe7\xd9\xfe6\xb8(\xa8wd\xc2"u.n\x1e\xc3\xf2\x8e\x8d' + b'\x8f\x02\x17/\xa6=\xf0\xa2\xdf/M\x89\xbe\xde\xa7\x1cz\x18-]\xd5\xef\x13\x8f' + b'rZ\x15\x80\x8c\xf8\x8do\xfa\x12\x9b#z/\xef\xf0\xfaF\x01\x82\xa3M\x8e\xa1t' + b'\xca6 BF$\xe5Q\xa4\x98\xee\xdel\xe8\x7f\xf0\x9d,bn\x0b\x13\xd4\xa8\x81\xe4' + b'N\xc8\x86\x153\xf5x2\xa2O\x13@Q\xa1\x00/\xa5\xd0O\x97\xdco\xae\xf7z\xc4\xcd' + b'S\xb6t<\x16\xf2\x9cI#\x89ud\xc66Y\xd9\xee\xe6\xce\x12]\xe5\xf0\xaa\x96-Pe' + b'\xade:\x04\t\x1b\xf7\xdb7\n\x86\x1fp\xc8J\xba\xf4\xf0V\xa9\xdc\xf0\x02%G' + b'\xf9\xdf=?\x15\x1b\xe1(\xce\x82=\xd6I\xac3\x12\x0cR\xb7\xae\r\xb1i\x03\x95' + b'\x01\xbd\xbe\xfa\x02s\x01P\x9d\x96X\xb12j\xc8L\xa8\x84b\xf6\xc3\xd4c-H\x93' + b'oJl\xd0iQ\xe4k\x84\x0b\xc1\xb7\xbc\xb1\x17\x88\xb1\xca?@\xf6\x07\xea\xe6x' + b'\xf1H12P\x0f\x8a\xc9\xeauw\xe3\xbe\xaai\xa9W\xd0\x80\xcd#cb5\x99\xd8]\xa9d' + b'\x0c\xbd\xa2\xdcWl\xedUG\xbf\x89yF\xf77\x81v\xbd5\x98\xbeh8\x18W\x08\xf0\x1b' + b'\x995:\x1a?rD\x96\xa1\x04\x0f\xae\xba\x85\xeb\x9d5@\xf5\x83\xd37\x83\x8ac' + b'\x06\xd4\x97i\xcdt\x16S\x82k\xf6K\x01vy\x88\x91\x9b6T\xdae\r\xfd]:k\xbal' + b'\xa9\xbba\xc34\xf9r\xeb}r\xdb\xc7\xdb*\x8f\x03z\xdc8h\xcc\xc9\xd3\xbcl' + b'\xa5-\xcb\xeaK\xa2\xc5\x15\xc0\xe3\xc1\x86Z\xfb\xebL\xe13\xcf\x9c\xe3\x1d' + b'\xc9\xed\xc2\x06\xcc\xce!\x92\xe5\xfe\x9c^\xa59w \x9bP\xa3PK\x08d\xf9\xe2Z}' + b'\xa7\xbf\xed\xeb%$\x0c\x82\xb8/\xb0\x01\xa9&,\xf7qh{Q\x96)\xf2q\x96\xc3\x80' + b'\xb4\x12\xb0\xba\xe6o\xf4!\xb4[\xd4\x8aw\x10\xf7t\x0c\xb3\xd9\xd5\xc3`^\x81' + b'\x11??\\\xa4\x99\x85R\xd4\x8e\x83\xc9\x1eX\xbfa\xf1\xac\xb0\xea\xea\xd7\xd0' + b'\xab\x18\xe2\xf2\xed\xe1\xb7\xc9\x18\xcbS\xe4>\xc9\x95H\xe8\xcb\t\r%\xeb\xc7' + b'$.o\xf1\xf3R\x17\x1db\xbb\xd8U\xa5^\xccS\x16\x01\x87\xf3/\x93\xd1\xf0v\xc0r' + b'\xd7\xcc\xa2Gkz\xca\x80\x0e\xfd\xd0\x8b\xbb\xd2Ix\xb3\x1ey\xca-0\xe3z^\xd6\xd6' + b'\x8f_\xf1\x9dP\x9fi\xa7\xd1\xe8\x90\x84\xdc\xbf\xcdky\x8e\xdc\x81\x7f\xa3\xb2+' + b'\xbf\x04\xef\xd8\\\xc4\xdf\xe1\xb0\x01\xe9\x93\xe3Y\xf1\x1dY\xe8h\x81\xcf\xf1w' + b'\xcc\xb4\xef \x8b|\x04\xea\x83ej\xbe\x1f\xd4z\x9c`\xd3\x1a\x92A\x06\xe5\x8f\xa9' + b'\x13\t\x9e=\xfa\x1c\xe5_\x9f%v\x1bo\x11ZO\xd8\xf4\t\xddM\x16-\x04\xfc\x18<"CM' + b'\xddg~b\xf6\xef\x8e\x0c\xd0\xde|\xa0\'\x8a\x0c\xd6x\xae!J\xa6F\x88\x15u\x008\x17' + b'\xbc7y\xb3\xd8u\xac_\x85\x8d\xe7\xc1@\x9c\xecqc\xa3#\xad\xf1\x935\xb5)_\r\xec3]' + b'\x0fo]5\xd0my\x07\x9b\xee\x81\xb5\x0f\xcfK+\x00\xc0\xe4b\x10\xe4\x0c\x1a \x9b\xe0' + b'\x97t\xf6\xa1\x9e\x850\xba\x0c\x9a\x8d\xc8\x8f\x07\xd7\xae\xc8\xf9+i\xdc\xb9k\xb0>f' + b'\x19\xb8\r\xa8\xf8\x1f$\xa5{p\xc6\x880\xce\xdb\xcf\xca_\x86\xac\x88h6\x8bZ%\'\xd0' + b'\n\xbf\x0f\x9c"\xba\xe5\x86\x9f\x0f7X=mNX[\xcc\x19FU\xc9\x860\xbc\x90a+* \xae_$' + b'\x03\x1e\xd3\xcd_\xa0\x9c\xde\xaf46q\xa5\xc9\x92\xd7\xca\xe3`\x9d\x85}\xb4\xff' + b'\xb3\x83\xfb\xb6\xca\xae`\x0bw\x7f\xfc\xd8\xacVe\x19\xc8\x17\x0bZ\xad\x88\xeb#' + b'\x97\x03\x13\xb1d\x0f{\x0c\x04w\x07\r\x97\xbd\xd6\xc1\xc3B:\x95\x08^\x10V\xaeaH' + b'\x02\xd9\xe3\n\\\x01X\xf6\x9c\x8a\x06u#%\xbe*\xa1\x18v\x85\xec!fz\\\xa7\xff\xe1' + b'\xdd\xd7r' +) + ISSUE_21872_DAT = ( b']\x00\x00@\x00h3\x00\x00\x00\x00\x00\x00\x00\x00`D\x0c\x99\xc8' b'\xd1\xbbZ^\xc43+\x83\xcd\xf1\xc6g\xec-\x061F\xb1\xbb\xc7\x17%-\xea' -- 2.22.0