mirror of
https://github.com/python/cpython.git
synced 2025-08-31 05:58:33 +00:00
Issue #14366: Support lzma compression in zip files.
Patch by Serhiy Storchaka.
This commit is contained in:
parent
bb54b33cec
commit
7fb79fcb64
5 changed files with 257 additions and 27 deletions
|
@ -13,7 +13,7 @@ from tempfile import TemporaryFile
|
|||
from random import randint, random
|
||||
from unittest import skipUnless
|
||||
|
||||
from test.support import TESTFN, run_unittest, findfile, unlink, requires_zlib, requires_bz2
|
||||
from test.support import TESTFN, run_unittest, findfile, unlink, requires_zlib, requires_bz2, requires_lzma
|
||||
|
||||
TESTFN2 = TESTFN + "2"
|
||||
TESTFNDIR = TESTFN + "d"
|
||||
|
@ -361,6 +361,55 @@ class TestsWithSourceFile(unittest.TestCase):
|
|||
self.assertEqual(openobj.read(1), b'1')
|
||||
self.assertEqual(openobj.read(1), b'2')
|
||||
|
||||
@requires_lzma
|
||||
def test_lzma(self):
|
||||
for f in (TESTFN2, TemporaryFile(), io.BytesIO()):
|
||||
self.zip_test(f, zipfile.ZIP_LZMA)
|
||||
|
||||
@requires_lzma
|
||||
def test_open_lzma(self):
|
||||
for f in (TESTFN2, TemporaryFile(), io.BytesIO()):
|
||||
self.zip_open_test(f, zipfile.ZIP_LZMA)
|
||||
|
||||
@requires_lzma
|
||||
def test_random_open_lzma(self):
|
||||
for f in (TESTFN2, TemporaryFile(), io.BytesIO()):
|
||||
self.zip_random_open_test(f, zipfile.ZIP_LZMA)
|
||||
|
||||
@requires_lzma
|
||||
def test_readline_read_lzma(self):
|
||||
# Issue #7610: calls to readline() interleaved with calls to read().
|
||||
for f in (TESTFN2, TemporaryFile(), io.BytesIO()):
|
||||
self.zip_readline_read_test(f, zipfile.ZIP_LZMA)
|
||||
|
||||
@requires_lzma
|
||||
def test_readline_lzma(self):
|
||||
for f in (TESTFN2, TemporaryFile(), io.BytesIO()):
|
||||
self.zip_readline_test(f, zipfile.ZIP_LZMA)
|
||||
|
||||
@requires_lzma
|
||||
def test_readlines_lzma(self):
|
||||
for f in (TESTFN2, TemporaryFile(), io.BytesIO()):
|
||||
self.zip_readlines_test(f, zipfile.ZIP_LZMA)
|
||||
|
||||
@requires_lzma
|
||||
def test_iterlines_lzma(self):
|
||||
for f in (TESTFN2, TemporaryFile(), io.BytesIO()):
|
||||
self.zip_iterlines_test(f, zipfile.ZIP_LZMA)
|
||||
|
||||
@requires_lzma
|
||||
def test_low_compression_lzma(self):
|
||||
"""Check for cases where compressed data is larger than original."""
|
||||
# Create the ZIP archive
|
||||
with zipfile.ZipFile(TESTFN2, "w", zipfile.ZIP_LZMA) as zipfp:
|
||||
zipfp.writestr("strfile", '12')
|
||||
|
||||
# Get an open object for strfile
|
||||
with zipfile.ZipFile(TESTFN2, "r", zipfile.ZIP_LZMA) as zipfp:
|
||||
with zipfp.open("strfile") as openobj:
|
||||
self.assertEqual(openobj.read(1), b'1')
|
||||
self.assertEqual(openobj.read(1), b'2')
|
||||
|
||||
def test_absolute_arcnames(self):
|
||||
with zipfile.ZipFile(TESTFN2, "w", zipfile.ZIP_STORED) as zipfp:
|
||||
zipfp.write(TESTFN, "/absolute")
|
||||
|
@ -508,6 +557,13 @@ class TestsWithSourceFile(unittest.TestCase):
|
|||
info = zipfp.getinfo('b.txt')
|
||||
self.assertEqual(info.compress_type, zipfile.ZIP_BZIP2)
|
||||
|
||||
@requires_lzma
|
||||
def test_writestr_compression_lzma(self):
|
||||
zipfp = zipfile.ZipFile(TESTFN2, "w")
|
||||
zipfp.writestr("b.txt", "hello world", compress_type=zipfile.ZIP_LZMA)
|
||||
info = zipfp.getinfo('b.txt')
|
||||
self.assertEqual(info.compress_type, zipfile.ZIP_LZMA)
|
||||
|
||||
def zip_test_writestr_permissions(self, f, compression):
|
||||
# Make sure that writestr creates files with mode 0600,
|
||||
# when it is passed a name rather than a ZipInfo instance.
|
||||
|
@ -686,6 +742,11 @@ class TestZip64InSmallFiles(unittest.TestCase):
|
|||
for f in (TESTFN2, TemporaryFile(), io.BytesIO()):
|
||||
self.zip_test(f, zipfile.ZIP_BZIP2)
|
||||
|
||||
@requires_lzma
|
||||
def test_lzma(self):
|
||||
for f in (TESTFN2, TemporaryFile(), io.BytesIO()):
|
||||
self.zip_test(f, zipfile.ZIP_LZMA)
|
||||
|
||||
def test_absolute_arcnames(self):
|
||||
with zipfile.ZipFile(TESTFN2, "w", zipfile.ZIP_STORED,
|
||||
allowZip64=True) as zipfp:
|
||||
|
@ -826,6 +887,16 @@ class OtherTests(unittest.TestCase):
|
|||
b'\x00 \x80\x80\x81\x00\x00\x00\x00afilePK'
|
||||
b'\x05\x06\x00\x00\x00\x00\x01\x00\x01\x003\x00\x00\x00[\x00'
|
||||
b'\x00\x00\x00\x00'),
|
||||
zipfile.ZIP_LZMA: (
|
||||
b'PK\x03\x04\x14\x03\x00\x00\x0e\x00nu\x0c=FA'
|
||||
b'KE\x1b\x00\x00\x00n\x00\x00\x00\x05\x00\x00\x00af'
|
||||
b'ile\t\x04\x05\x00]\x00\x00\x00\x04\x004\x19I'
|
||||
b'\xee\x8d\xe9\x17\x89:3`\tq!.8\x00PK'
|
||||
b'\x01\x02\x14\x03\x14\x03\x00\x00\x0e\x00nu\x0c=FA'
|
||||
b'KE\x1b\x00\x00\x00n\x00\x00\x00\x05\x00\x00\x00\x00\x00'
|
||||
b'\x00\x00\x00\x00 \x80\x80\x81\x00\x00\x00\x00afil'
|
||||
b'ePK\x05\x06\x00\x00\x00\x00\x01\x00\x01\x003\x00\x00'
|
||||
b'\x00>\x00\x00\x00\x00\x00'),
|
||||
}
|
||||
|
||||
def test_unsupported_version(self):
|
||||
|
@ -1104,6 +1175,10 @@ class OtherTests(unittest.TestCase):
|
|||
def test_testzip_with_bad_crc_bzip2(self):
|
||||
self.check_testzip_with_bad_crc(zipfile.ZIP_BZIP2)
|
||||
|
||||
@requires_lzma
|
||||
def test_testzip_with_bad_crc_lzma(self):
|
||||
self.check_testzip_with_bad_crc(zipfile.ZIP_LZMA)
|
||||
|
||||
def check_read_with_bad_crc(self, compression):
|
||||
"""Tests that files with bad CRCs raise a BadZipFile exception when read."""
|
||||
zipdata = self.zips_with_bad_crc[compression]
|
||||
|
@ -1136,6 +1211,10 @@ class OtherTests(unittest.TestCase):
|
|||
def test_read_with_bad_crc_bzip2(self):
|
||||
self.check_read_with_bad_crc(zipfile.ZIP_BZIP2)
|
||||
|
||||
@requires_lzma
|
||||
def test_read_with_bad_crc_lzma(self):
|
||||
self.check_read_with_bad_crc(zipfile.ZIP_LZMA)
|
||||
|
||||
def check_read_return_size(self, compression):
|
||||
# Issue #9837: ZipExtFile.read() shouldn't return more bytes
|
||||
# than requested.
|
||||
|
@ -1160,6 +1239,10 @@ class OtherTests(unittest.TestCase):
|
|||
def test_read_return_size_bzip2(self):
|
||||
self.check_read_return_size(zipfile.ZIP_BZIP2)
|
||||
|
||||
@requires_lzma
|
||||
def test_read_return_size_lzma(self):
|
||||
self.check_read_return_size(zipfile.ZIP_LZMA)
|
||||
|
||||
def test_empty_zipfile(self):
|
||||
# Check that creating a file in 'w' or 'a' mode and closing without
|
||||
# adding any files to the archives creates a valid empty ZIP file
|
||||
|
@ -1306,6 +1389,11 @@ class TestsWithRandomBinaryFiles(unittest.TestCase):
|
|||
for f in (TESTFN2, TemporaryFile(), io.BytesIO()):
|
||||
self.zip_test(f, zipfile.ZIP_BZIP2)
|
||||
|
||||
@requires_lzma
|
||||
def test_lzma(self):
|
||||
for f in (TESTFN2, TemporaryFile(), io.BytesIO()):
|
||||
self.zip_test(f, zipfile.ZIP_LZMA)
|
||||
|
||||
def zip_open_test(self, f, compression):
|
||||
self.make_test_archive(f, compression)
|
||||
|
||||
|
@ -1351,6 +1439,11 @@ class TestsWithRandomBinaryFiles(unittest.TestCase):
|
|||
for f in (TESTFN2, TemporaryFile(), io.BytesIO()):
|
||||
self.zip_open_test(f, zipfile.ZIP_BZIP2)
|
||||
|
||||
@requires_lzma
|
||||
def test_open_lzma(self):
|
||||
for f in (TESTFN2, TemporaryFile(), io.BytesIO()):
|
||||
self.zip_open_test(f, zipfile.ZIP_LZMA)
|
||||
|
||||
def zip_random_open_test(self, f, compression):
|
||||
self.make_test_archive(f, compression)
|
||||
|
||||
|
@ -1384,6 +1477,11 @@ class TestsWithRandomBinaryFiles(unittest.TestCase):
|
|||
for f in (TESTFN2, TemporaryFile(), io.BytesIO()):
|
||||
self.zip_random_open_test(f, zipfile.ZIP_BZIP2)
|
||||
|
||||
@requires_lzma
|
||||
def test_random_open_lzma(self):
|
||||
for f in (TESTFN2, TemporaryFile(), io.BytesIO()):
|
||||
self.zip_random_open_test(f, zipfile.ZIP_LZMA)
|
||||
|
||||
|
||||
@requires_zlib
|
||||
class TestsWithMultipleOpens(unittest.TestCase):
|
||||
|
@ -1628,6 +1726,31 @@ class UniversalNewlineTests(unittest.TestCase):
|
|||
for f in (TESTFN2, TemporaryFile(), io.BytesIO()):
|
||||
self.iterlines_test(f, zipfile.ZIP_BZIP2)
|
||||
|
||||
@requires_lzma
|
||||
def test_read_lzma(self):
|
||||
for f in (TESTFN2, TemporaryFile(), io.BytesIO()):
|
||||
self.read_test(f, zipfile.ZIP_LZMA)
|
||||
|
||||
@requires_lzma
|
||||
def test_readline_read_lzma(self):
|
||||
for f in (TESTFN2, TemporaryFile(), io.BytesIO()):
|
||||
self.readline_read_test(f, zipfile.ZIP_LZMA)
|
||||
|
||||
@requires_lzma
|
||||
def test_readline_lzma(self):
|
||||
for f in (TESTFN2, TemporaryFile(), io.BytesIO()):
|
||||
self.readline_test(f, zipfile.ZIP_LZMA)
|
||||
|
||||
@requires_lzma
|
||||
def test_readlines_lzma(self):
|
||||
for f in (TESTFN2, TemporaryFile(), io.BytesIO()):
|
||||
self.readlines_test(f, zipfile.ZIP_LZMA)
|
||||
|
||||
@requires_lzma
|
||||
def test_iterlines_lzma(self):
|
||||
for f in (TESTFN2, TemporaryFile(), io.BytesIO()):
|
||||
self.iterlines_test(f, zipfile.ZIP_LZMA)
|
||||
|
||||
def tearDown(self):
|
||||
for sep, fn in self.arcfiles.items():
|
||||
os.remove(fn)
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue