Skip to content

Commit c759b63

Browse files
committed
Improve dependency check for decompression tests
1 parent 0f50a6f commit c759b63

File tree

1 file changed

+157
-144
lines changed

1 file changed

+157
-144
lines changed

Lib/test/test_zipfile/test_core.py

Lines changed: 157 additions & 144 deletions
Original file line numberDiff line numberDiff line change
@@ -2584,180 +2584,193 @@ def test_scan_data_descriptor_no_sig(self):
25842584
(0x4ff4f23f, 5, 5, 12),
25852585
)
25862586

2587+
def test_scan_data_descriptor_no_sig_by_decompression_stored(self):
2588+
self._test_scan_data_descriptor_no_sig_by_decompression_invalid(zipfile.ZIP_STORED)
2589+
25872590
@requires_zlib()
2591+
def test_scan_data_descriptor_no_sig_by_decompression_zlib(self):
2592+
self._test_scan_data_descriptor_no_sig_by_decompression(zipfile.ZIP_DEFLATED)
2593+
25882594
@requires_bz2()
2595+
def test_scan_data_descriptor_no_sig_by_decompression_bz2(self):
2596+
self._test_scan_data_descriptor_no_sig_by_decompression(zipfile.ZIP_BZIP2)
2597+
2598+
@requires_lzma()
2599+
def test_scan_data_descriptor_no_sig_by_decompression_lzma(self):
2600+
self._test_scan_data_descriptor_no_sig_by_decompression_invalid(zipfile.ZIP_LZMA)
2601+
25892602
@requires_zstd()
2590-
def test_scan_data_descriptor_no_sig_by_decompression(self):
2603+
def test_scan_data_descriptor_no_sig_by_decompression_zstd(self):
2604+
self._test_scan_data_descriptor_no_sig_by_decompression(zipfile.ZIP_ZSTANDARD)
2605+
2606+
def test_scan_data_descriptor_no_sig_by_decompression_unknown(self):
2607+
method = 1024 # simulate an unknown method
2608+
self._test_scan_data_descriptor_no_sig_by_decompression_invalid(method)
2609+
2610+
def _test_scan_data_descriptor_no_sig_by_decompression(self, method):
25912611
repacker = zipfile._ZipRepacker()
25922612

2593-
for method in (
2594-
zipfile.ZIP_DEFLATED,
2595-
zipfile.ZIP_BZIP2,
2596-
zipfile.ZIP_ZSTANDARD,
2597-
):
2598-
compressor = zipfile._get_compressor(method)
2599-
with self.subTest(method=method, compressor=compressor):
2600-
comp_bytes = compressor.compress(b'dummy')
2601-
comp_bytes += compressor.flush()
2602-
comp_len = len(comp_bytes)
2603-
2604-
# basic
2605-
bytes_ = comp_bytes + b'\x3f\xf2\xf4\x4f' + struct.pack('<L', comp_len) + b'\x05\x00\x00\x00'
2606-
self.assertEqual(
2607-
repacker._scan_data_descriptor_no_sig_by_decompression(
2608-
io.BytesIO(bytes_), 0, len(bytes_), False, method),
2609-
(0x4ff4f23f, comp_len, 5, 12),
2610-
)
2613+
compressor = zipfile._get_compressor(method)
26112614

2612-
# return None if insufficient data length
2613-
bytes_ = b'\x3f\xf2\xf4\x4f\x05\x00\x00\x00\x05\x00\x00\x00'
2614-
self.assertEqual(
2615-
repacker._scan_data_descriptor_no_sig_by_decompression(
2616-
io.BytesIO(bytes_), 0, len(bytes_) - 1, False, method),
2617-
None,
2618-
)
2615+
comp_bytes = compressor.compress(b'dummy')
2616+
comp_bytes += compressor.flush()
2617+
comp_len = len(comp_bytes)
26192618

2620-
bytes_ = b'\x3f\xf2\xf4\x4f\x05\x00\x00\x00\x05\x00\x00'
2621-
self.assertEqual(
2622-
repacker._scan_data_descriptor_no_sig_by_decompression(
2623-
io.BytesIO(bytes_), 0, len(bytes_) + 1, False, method),
2624-
None,
2625-
)
2619+
# basic
2620+
bytes_ = comp_bytes + b'\x3f\xf2\xf4\x4f' + struct.pack('<L', comp_len) + b'\x05\x00\x00\x00'
2621+
self.assertEqual(
2622+
repacker._scan_data_descriptor_no_sig_by_decompression(
2623+
io.BytesIO(bytes_), 0, len(bytes_), False, method),
2624+
(0x4ff4f23f, comp_len, 5, 12),
2625+
)
26262626

2627-
# return None if compressed size not match
2628-
bytes_ = comp_bytes + b'\x3f\xf2\xf4\x4f' + struct.pack('<L', comp_len - 1) + b'\x05\x00\x00\x00'
2629-
self.assertEqual(
2630-
repacker._scan_data_descriptor_no_sig_by_decompression(
2631-
io.BytesIO(bytes_), 0, len(bytes_), False, method),
2632-
None,
2633-
)
2627+
# return None if insufficient data length
2628+
bytes_ = b'\x3f\xf2\xf4\x4f\x05\x00\x00\x00\x05\x00\x00\x00'
2629+
self.assertEqual(
2630+
repacker._scan_data_descriptor_no_sig_by_decompression(
2631+
io.BytesIO(bytes_), 0, len(bytes_) - 1, False, method),
2632+
None,
2633+
)
26342634

2635-
# zip64
2636-
bytes_ = comp_bytes + b'\x3f\xf2\xf4\x4f' + struct.pack('<Q', comp_len) + b'\x05\x00\x00\x00\x00\x00\x00\x00'
2637-
self.assertEqual(
2638-
repacker._scan_data_descriptor_no_sig_by_decompression(
2639-
io.BytesIO(bytes_), 0, len(bytes_), True, method),
2640-
(0x4ff4f23f, comp_len, 5, 20),
2641-
)
2635+
bytes_ = b'\x3f\xf2\xf4\x4f\x05\x00\x00\x00\x05\x00\x00'
2636+
self.assertEqual(
2637+
repacker._scan_data_descriptor_no_sig_by_decompression(
2638+
io.BytesIO(bytes_), 0, len(bytes_) + 1, False, method),
2639+
None,
2640+
)
26422641

2643-
# offset
2644-
bytes_ = comp_bytes + b'\x3f\xf2\xf4\x4f' + struct.pack('<L', comp_len) + b'\x05\x00\x00\x00'
2645-
self.assertEqual(
2646-
repacker._scan_data_descriptor_no_sig_by_decompression(
2647-
io.BytesIO(bytes_), 1, len(bytes_), False, method),
2648-
None,
2649-
)
2642+
# return None if compressed size not match
2643+
bytes_ = comp_bytes + b'\x3f\xf2\xf4\x4f' + struct.pack('<L', comp_len - 1) + b'\x05\x00\x00\x00'
2644+
self.assertEqual(
2645+
repacker._scan_data_descriptor_no_sig_by_decompression(
2646+
io.BytesIO(bytes_), 0, len(bytes_), False, method),
2647+
None,
2648+
)
26502649

2651-
bytes_ = b'123' + comp_bytes + b'\x3f\xf2\xf4\x4f' + struct.pack('<L', comp_len) + b'\x05\x00\x00\x00'
2652-
self.assertEqual(
2653-
repacker._scan_data_descriptor_no_sig_by_decompression(
2654-
io.BytesIO(bytes_), 3, len(bytes_), False, method),
2655-
(0x4ff4f23f, comp_len, 5, 12),
2656-
)
2650+
# zip64
2651+
bytes_ = comp_bytes + b'\x3f\xf2\xf4\x4f' + struct.pack('<Q', comp_len) + b'\x05\x00\x00\x00\x00\x00\x00\x00'
2652+
self.assertEqual(
2653+
repacker._scan_data_descriptor_no_sig_by_decompression(
2654+
io.BytesIO(bytes_), 0, len(bytes_), True, method),
2655+
(0x4ff4f23f, comp_len, 5, 20),
2656+
)
26572657

2658-
# end_offset
2659-
bytes_ = comp_bytes + b'\x3f\xf2\xf4\x4f' + struct.pack('<L', comp_len) + b'\x05\x00\x00\x00'
2660-
self.assertEqual(
2661-
repacker._scan_data_descriptor_no_sig_by_decompression(
2662-
io.BytesIO(bytes_), 0, len(bytes_) - 2, False, method),
2663-
None,
2664-
)
2658+
# offset
2659+
bytes_ = comp_bytes + b'\x3f\xf2\xf4\x4f' + struct.pack('<L', comp_len) + b'\x05\x00\x00\x00'
2660+
self.assertEqual(
2661+
repacker._scan_data_descriptor_no_sig_by_decompression(
2662+
io.BytesIO(bytes_), 1, len(bytes_), False, method),
2663+
None,
2664+
)
26652665

2666-
bytes_ = comp_bytes + b'\x3f\xf2\xf4\x4f' + struct.pack('<L', comp_len) + b'\x05\x00\x00\x00123'
2667-
self.assertEqual(
2668-
repacker._scan_data_descriptor_no_sig_by_decompression(
2669-
io.BytesIO(bytes_), 0, len(bytes_) - 2, False, method),
2670-
(0x4ff4f23f, comp_len, 5, 12),
2671-
)
2666+
bytes_ = b'123' + comp_bytes + b'\x3f\xf2\xf4\x4f' + struct.pack('<L', comp_len) + b'\x05\x00\x00\x00'
2667+
self.assertEqual(
2668+
repacker._scan_data_descriptor_no_sig_by_decompression(
2669+
io.BytesIO(bytes_), 3, len(bytes_), False, method),
2670+
(0x4ff4f23f, comp_len, 5, 12),
2671+
)
26722672

2673-
def test_scan_data_descriptor_no_sig_by_decompression_invalid(self):
2673+
# end_offset
2674+
bytes_ = comp_bytes + b'\x3f\xf2\xf4\x4f' + struct.pack('<L', comp_len) + b'\x05\x00\x00\x00'
2675+
self.assertEqual(
2676+
repacker._scan_data_descriptor_no_sig_by_decompression(
2677+
io.BytesIO(bytes_), 0, len(bytes_) - 2, False, method),
2678+
None,
2679+
)
2680+
2681+
bytes_ = comp_bytes + b'\x3f\xf2\xf4\x4f' + struct.pack('<L', comp_len) + b'\x05\x00\x00\x00123'
2682+
self.assertEqual(
2683+
repacker._scan_data_descriptor_no_sig_by_decompression(
2684+
io.BytesIO(bytes_), 0, len(bytes_) - 2, False, method),
2685+
(0x4ff4f23f, comp_len, 5, 12),
2686+
)
2687+
2688+
def _test_scan_data_descriptor_no_sig_by_decompression_invalid(self, method):
26742689
repacker = zipfile._ZipRepacker()
26752690

2676-
for method in (
2677-
zipfile.ZIP_STORED,
2678-
zipfile.ZIP_LZMA,
2679-
1024, # simulate an unknown method
2680-
):
2681-
with self.subTest(method=method):
2682-
bytes_ = b'dummy'
2683-
self.assertEqual(
2684-
repacker._scan_data_descriptor_no_sig_by_decompression(
2685-
io.BytesIO(bytes_), 0, len(bytes_), False, method),
2686-
False,
2687-
)
2691+
bytes_ = b'dummy'
2692+
self.assertEqual(
2693+
repacker._scan_data_descriptor_no_sig_by_decompression(
2694+
io.BytesIO(bytes_), 0, len(bytes_), False, method),
2695+
False,
2696+
)
26882697

26892698
@requires_zlib()
2699+
def test_trace_compressed_block_end_zlib(self):
2700+
import zlib
2701+
self._test_trace_compressed_block_end(zipfile.ZIP_DEFLATED, zlib.error)
2702+
26902703
@requires_bz2()
2704+
def test_trace_compressed_block_end_bz2(self):
2705+
self._test_trace_compressed_block_end(zipfile.ZIP_BZIP2, OSError)
2706+
26912707
@requires_zstd()
2692-
def test_trace_compressed_block_end(self):
2693-
import zlib
2708+
def test_trace_compressed_block_end_zstd(self):
26942709
import compression.zstd
2710+
self._test_trace_compressed_block_end(zipfile.ZIP_ZSTANDARD, compression.zstd.ZstdError)
2711+
2712+
def _test_trace_compressed_block_end(self, method, exc_cls):
26952713
repacker = zipfile._ZipRepacker()
26962714

2697-
for method, exc_cls in (
2698-
(zipfile.ZIP_DEFLATED, zlib.error),
2699-
(zipfile.ZIP_BZIP2, OSError),
2700-
(zipfile.ZIP_ZSTANDARD, compression.zstd.ZstdError),
2701-
):
2702-
compressor = zipfile._get_compressor(method)
2703-
with self.subTest(method=method, compressor=compressor):
2704-
comp_bytes = compressor.compress(b'dummy')
2705-
comp_bytes += compressor.flush()
2706-
comp_len = len(comp_bytes)
2707-
2708-
# basic
2709-
decompressor = zipfile._get_decompressor(method)
2710-
bytes_ = comp_bytes
2711-
self.assertEqual(
2712-
repacker._trace_compressed_block_end(io.BytesIO(bytes_), 0, len(bytes_), decompressor),
2713-
comp_len,
2714-
)
2715+
compressor = zipfile._get_compressor(method)
27152716

2716-
# offset
2717-
decompressor = zipfile._get_decompressor(method)
2718-
bytes_ = comp_bytes
2719-
with self.assertRaises(exc_cls):
2720-
repacker._trace_compressed_block_end(io.BytesIO(bytes_), 1, len(bytes_), decompressor)
2717+
comp_bytes = compressor.compress(b'dummy')
2718+
comp_bytes += compressor.flush()
2719+
comp_len = len(comp_bytes)
27212720

2722-
decompressor = zipfile._get_decompressor(method)
2723-
bytes_ = b'123' + comp_bytes
2724-
with self.assertRaises(exc_cls):
2725-
repacker._trace_compressed_block_end(io.BytesIO(bytes_), 0, len(bytes_), decompressor)
2721+
# basic
2722+
decompressor = zipfile._get_decompressor(method)
2723+
bytes_ = comp_bytes
2724+
self.assertEqual(
2725+
repacker._trace_compressed_block_end(io.BytesIO(bytes_), 0, len(bytes_), decompressor),
2726+
comp_len,
2727+
)
27262728

2727-
decompressor = zipfile._get_decompressor(method)
2728-
bytes_ = b'123' + comp_bytes
2729-
self.assertEqual(
2730-
repacker._trace_compressed_block_end(io.BytesIO(bytes_), 3, len(bytes_), decompressor),
2731-
comp_len + 3,
2732-
)
2729+
# offset
2730+
decompressor = zipfile._get_decompressor(method)
2731+
bytes_ = comp_bytes
2732+
with self.assertRaises(exc_cls):
2733+
repacker._trace_compressed_block_end(io.BytesIO(bytes_), 1, len(bytes_), decompressor)
2734+
2735+
decompressor = zipfile._get_decompressor(method)
2736+
bytes_ = b'123' + comp_bytes
2737+
with self.assertRaises(exc_cls):
2738+
repacker._trace_compressed_block_end(io.BytesIO(bytes_), 0, len(bytes_), decompressor)
2739+
2740+
decompressor = zipfile._get_decompressor(method)
2741+
bytes_ = b'123' + comp_bytes
2742+
self.assertEqual(
2743+
repacker._trace_compressed_block_end(io.BytesIO(bytes_), 3, len(bytes_), decompressor),
2744+
comp_len + 3,
2745+
)
27332746

2734-
# end_offset
2735-
decompressor = zipfile._get_decompressor(method)
2736-
bytes_ = comp_bytes
2737-
with self.assertRaises(EOFError):
2738-
repacker._trace_compressed_block_end(io.BytesIO(bytes_), 0, len(bytes_) - 1, decompressor)
2747+
# end_offset
2748+
decompressor = zipfile._get_decompressor(method)
2749+
bytes_ = comp_bytes
2750+
with self.assertRaises(EOFError):
2751+
repacker._trace_compressed_block_end(io.BytesIO(bytes_), 0, len(bytes_) - 1, decompressor)
27392752

2740-
decompressor = zipfile._get_decompressor(method)
2741-
bytes_ = comp_bytes + b'123'
2742-
self.assertEqual(
2743-
repacker._trace_compressed_block_end(io.BytesIO(bytes_), 0, len(bytes_) - 3, decompressor),
2744-
comp_len,
2745-
)
2753+
decompressor = zipfile._get_decompressor(method)
2754+
bytes_ = comp_bytes + b'123'
2755+
self.assertEqual(
2756+
repacker._trace_compressed_block_end(io.BytesIO(bytes_), 0, len(bytes_) - 3, decompressor),
2757+
comp_len,
2758+
)
27462759

2747-
# chunk_size
2748-
decompressor = zipfile._get_decompressor(method)
2749-
bytes_ = comp_bytes
2750-
self.assertEqual(
2751-
repacker._trace_compressed_block_end(io.BytesIO(bytes_), 0, len(bytes_), decompressor, 16),
2752-
comp_len,
2753-
)
2760+
# chunk_size
2761+
decompressor = zipfile._get_decompressor(method)
2762+
bytes_ = comp_bytes
2763+
self.assertEqual(
2764+
repacker._trace_compressed_block_end(io.BytesIO(bytes_), 0, len(bytes_), decompressor, 16),
2765+
comp_len,
2766+
)
27542767

2755-
decompressor = zipfile._get_decompressor(method)
2756-
bytes_ = comp_bytes
2757-
self.assertEqual(
2758-
repacker._trace_compressed_block_end(io.BytesIO(bytes_), 0, len(bytes_), decompressor, 1),
2759-
comp_len,
2760-
)
2768+
decompressor = zipfile._get_decompressor(method)
2769+
bytes_ = comp_bytes
2770+
self.assertEqual(
2771+
repacker._trace_compressed_block_end(io.BytesIO(bytes_), 0, len(bytes_), decompressor, 1),
2772+
comp_len,
2773+
)
27612774

27622775
def test_copy_bytes(self):
27632776
repacker = zipfile._ZipRepacker()

0 commit comments

Comments
 (0)