Skip to content

Commit c217360

Browse files
committed
bpo-26253: tarfile: add compresslevel unit tests
Check outcoming file headers when writing a compressed file.
1 parent 31b9835 commit c217360

File tree

1 file changed

+68
-0
lines changed

1 file changed

+68
-0
lines changed

Lib/test/test_tarfile.py

+68
Original file line numberDiff line numberDiff line change
@@ -1532,6 +1532,74 @@ class Bz2StreamWriteTest(Bz2Test, StreamWriteTest):
15321532
class LzmaStreamWriteTest(LzmaTest, StreamWriteTest):
15331533
decompressor = lzma.LZMADecompressor if lzma else None
15341534

1535+
class _CompressedWriteTest(TarTest):
1536+
# This is not actually a standalone test.
1537+
# It does not inherit WriteTest because it only makes sense with gz,bz2
1538+
source = (b"And we move to Bristol where they have a special, " +
1539+
b"Very Silly candidate")
1540+
1541+
def _compressed_tar(self, compresslevel):
1542+
fobj = io.BytesIO()
1543+
with tarfile.open(tmpname, self.mode, fobj,
1544+
compresslevel=compresslevel) as tarfl:
1545+
tarfl.addfile(tarfile.TarInfo("foo"), io.BytesIO(self.source))
1546+
return fobj
1547+
1548+
def _test_bz2_header(self, compresslevel):
1549+
fobj = self._compressed_tar(compresslevel)
1550+
self.assertEqual(fobj.getvalue()[0:10],
1551+
b"BZh%d1AY&SY" % compresslevel)
1552+
1553+
def _test_gz_header(self, compresslevel):
1554+
fobj = self._compressed_tar(compresslevel)
1555+
self.assertEqual(fobj.getvalue()[:3], b"\x1f\x8b\x08")
1556+
1557+
class Bz2CompressWriteTest(Bz2Test, _CompressedWriteTest, unittest.TestCase):
1558+
prefix = "w:"
1559+
def test_compression_levels(self):
1560+
self._test_bz2_header(1)
1561+
self._test_bz2_header(5)
1562+
self._test_bz2_header(9)
1563+
1564+
class Bz2CompressStreamWriteTest(Bz2Test, _CompressedWriteTest,
1565+
unittest.TestCase):
1566+
prefix = "w|"
1567+
def test_compression_levels(self):
1568+
self._test_bz2_header(1)
1569+
self._test_bz2_header(5)
1570+
self._test_bz2_header(9)
1571+
1572+
class GzCompressWriteTest(GzipTest, _CompressedWriteTest, unittest.TestCase):
1573+
prefix = "w:"
1574+
def test_compression_levels(self):
1575+
self._test_gz_header(1)
1576+
self._test_gz_header(5)
1577+
self._test_gz_header(9)
1578+
1579+
class GzCompressStreamWriteTest(GzipTest, _CompressedWriteTest,
1580+
unittest.TestCase):
1581+
prefix = "w|"
1582+
def test_compression_levels(self):
1583+
self._test_gz_header(1)
1584+
self._test_gz_header(5)
1585+
self._test_gz_header(9)
1586+
1587+
class CompressLevelRaises(unittest.TestCase):
1588+
def test_compresslevel_wrong_modes(self):
1589+
compresslevel = 5
1590+
fobj = io.BytesIO()
1591+
with self.assertRaises(TypeError):
1592+
tarfile.open(tmpname, "w:", fobj, compresslevel=compresslevel)
1593+
1594+
def test_wrong_compresslevels(self):
1595+
# BZ2 checks that the compresslevel is in [1,9]. gz does not
1596+
fobj = io.BytesIO()
1597+
with self.assertRaises(ValueError):
1598+
tarfile.open(tmpname, "w:bz2", fobj, compresslevel=0)
1599+
with self.assertRaises(ValueError):
1600+
tarfile.open(tmpname, "w:bz2", fobj, compresslevel=10)
1601+
with self.assertRaises(ValueError):
1602+
tarfile.open(tmpname, "w|bz2", fobj, compresslevel=10)
15351603

15361604
class GNUWriteTest(unittest.TestCase):
15371605
# This testcase checks for correct creation of GNU Longname

0 commit comments

Comments
 (0)