@@ -1102,6 +1102,62 @@ class DeflateCompressedZipImportTestCase(UncompressedZipImportTestCase):
11021102class ZStdCompressedZipImportTestCase (UncompressedZipImportTestCase ):
11031103 compression = ZIP_ZSTANDARD
11041104
1105+ def test_concatenated_frames (self ):
1106+ from compression import zstd
1107+ import zipfile
1108+
1109+ class ConcatenatedFrameCompressor :
1110+ def compress (self , data ):
1111+ return b"" .join (zstd .compress (bytes ([byte ])) for byte in data )
1112+
1113+ def flush (self ):
1114+ return b""
1115+
1116+ with unittest .mock .patch .object (
1117+ zipfile ,
1118+ "_get_compressor" ,
1119+ return_value = ConcatenatedFrameCompressor (),
1120+ ):
1121+ self .doTest (".py" , {TESTMOD + ".py" : test_src }, TESTMOD )
1122+
1123+ def test_concatenated_frames_linear_input (self ):
1124+ from compression import zstd
1125+
1126+ frame_count = 100
1127+ frame = zstd .compress (b"x" )
1128+ compressed = frame * frame_count
1129+ input_sizes = []
1130+ decompressor_class = zipimport ._get_zstd_decompressor_class ()
1131+
1132+ class RecordingDecompressor :
1133+ def __init__ (self ):
1134+ self ._decompressor = decompressor_class ()
1135+
1136+ def __getattr__ (self , name ):
1137+ return getattr (self ._decompressor , name )
1138+
1139+ def decompress (self , data , max_length = - 1 ):
1140+ input_sizes .append (memoryview (data ).nbytes )
1141+ return self ._decompressor .decompress (data , max_length )
1142+
1143+ with unittest .mock .patch .object (
1144+ zipimport , "_zstd_decompressor_class" , RecordingDecompressor
1145+ ):
1146+ self .assertEqual (
1147+ zipimport ._zstd_decompress (compressed ), b"x" * frame_count
1148+ )
1149+
1150+ self .assertEqual (sum (input_sizes ), len (compressed ))
1151+
1152+ def test_truncated_frame (self ):
1153+ from compression import zstd
1154+
1155+ compressed = zstd .compress (b"x" )
1156+ for data in (b"" , compressed [:- 1 ]):
1157+ with self .subTest (data = data ):
1158+ with self .assertRaises (zipimport .ZipImportError ):
1159+ zipimport ._zstd_decompress (data )
1160+
11051161
11061162class BadFileZipImportTestCase (unittest .TestCase ):
11071163 def assertZipFailure (self , filename ):
0 commit comments