gh-132983: Add the compression.zstd pacakge and tests (#133365)

Co-authored-by: Adam Turner <9087854+AA-Turner@users.noreply.github.com>
Co-authored-by: Gregory P. Smith <greg@krypto.org>
Co-authored-by: Tomas R. <tomas.roun8@gmail.com>
Co-authored-by: Rogdham <contact@rogdham.net>
This commit is contained in:
Emma Smith 2025-05-05 17:38:08 -07:00 committed by GitHub
parent 793402e217
commit c273f59fb3
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
15 changed files with 3358 additions and 100 deletions

View file

@ -38,6 +38,10 @@ try:
import lzma
except ImportError:
lzma = None
try:
from compression import zstd
except ImportError:
zstd = None
def sha256sum(data):
return sha256(data).hexdigest()
@ -48,6 +52,7 @@ tarname = support.findfile("testtar.tar", subdir="archivetestdata")
gzipname = os.path.join(TEMPDIR, "testtar.tar.gz")
bz2name = os.path.join(TEMPDIR, "testtar.tar.bz2")
xzname = os.path.join(TEMPDIR, "testtar.tar.xz")
zstname = os.path.join(TEMPDIR, "testtar.tar.zst")
tmpname = os.path.join(TEMPDIR, "tmp.tar")
dotlessname = os.path.join(TEMPDIR, "testtar")
@ -90,6 +95,12 @@ class LzmaTest:
open = lzma.LZMAFile if lzma else None
taropen = tarfile.TarFile.xzopen
@support.requires_zstd()
class ZstdTest:
tarname = zstname
suffix = 'zst'
open = zstd.ZstdFile if zstd else None
taropen = tarfile.TarFile.zstopen
class ReadTest(TarTest):
@ -271,6 +282,8 @@ class Bz2UstarReadTest(Bz2Test, UstarReadTest):
class LzmaUstarReadTest(LzmaTest, UstarReadTest):
pass
class ZstdUstarReadTest(ZstdTest, UstarReadTest):
pass
class ListTest(ReadTest, unittest.TestCase):
@ -375,6 +388,8 @@ class Bz2ListTest(Bz2Test, ListTest):
class LzmaListTest(LzmaTest, ListTest):
pass
class ZstdListTest(ZstdTest, ListTest):
pass
class CommonReadTest(ReadTest):
@ -837,6 +852,8 @@ class Bz2MiscReadTest(Bz2Test, MiscReadTestBase, unittest.TestCase):
class LzmaMiscReadTest(LzmaTest, MiscReadTestBase, unittest.TestCase):
pass
class ZstdMiscReadTest(ZstdTest, MiscReadTestBase, unittest.TestCase):
pass
class StreamReadTest(CommonReadTest, unittest.TestCase):
@ -909,6 +926,9 @@ class Bz2StreamReadTest(Bz2Test, StreamReadTest):
class LzmaStreamReadTest(LzmaTest, StreamReadTest):
pass
class ZstdStreamReadTest(ZstdTest, StreamReadTest):
pass
class TarStreamModeReadTest(StreamModeTest, unittest.TestCase):
def test_stream_mode_no_cache(self):
@ -925,6 +945,9 @@ class Bz2StreamModeReadTest(Bz2Test, TarStreamModeReadTest):
class LzmaStreamModeReadTest(LzmaTest, TarStreamModeReadTest):
pass
class ZstdStreamModeReadTest(ZstdTest, TarStreamModeReadTest):
pass
class DetectReadTest(TarTest, unittest.TestCase):
def _testfunc_file(self, name, mode):
try:
@ -986,6 +1009,8 @@ class Bz2DetectReadTest(Bz2Test, DetectReadTest):
class LzmaDetectReadTest(LzmaTest, DetectReadTest):
pass
class ZstdDetectReadTest(ZstdTest, DetectReadTest):
pass
class GzipBrokenHeaderCorrectException(GzipTest, unittest.TestCase):
"""
@ -1666,6 +1691,8 @@ class Bz2WriteTest(Bz2Test, WriteTest):
class LzmaWriteTest(LzmaTest, WriteTest):
pass
class ZstdWriteTest(ZstdTest, WriteTest):
pass
class StreamWriteTest(WriteTestBase, unittest.TestCase):
@ -1727,6 +1754,9 @@ class Bz2StreamWriteTest(Bz2Test, StreamWriteTest):
class LzmaStreamWriteTest(LzmaTest, StreamWriteTest):
decompressor = lzma.LZMADecompressor if lzma else None
class ZstdStreamWriteTest(ZstdTest, StreamWriteTest):
decompressor = zstd.ZstdDecompressor if zstd else None
class _CompressedWriteTest(TarTest):
# This is not actually a standalone test.
# It does not inherit WriteTest because it only makes sense with gz,bz2
@ -2042,6 +2072,14 @@ class LzmaCreateTest(LzmaTest, CreateTest):
tobj.add(self.file_path)
class ZstdCreateTest(ZstdTest, CreateTest):
# Unlike gz and bz2, zstd uses the level keyword instead of compresslevel.
# It does not allow for level to be specified when reading.
def test_create_with_level(self):
with tarfile.open(tmpname, self.mode, level=1) as tobj:
tobj.add(self.file_path)
class CreateWithXModeTest(CreateTest):
prefix = "x"
@ -2523,6 +2561,8 @@ class Bz2AppendTest(Bz2Test, AppendTestBase, unittest.TestCase):
class LzmaAppendTest(LzmaTest, AppendTestBase, unittest.TestCase):
pass
class ZstdAppendTest(ZstdTest, AppendTestBase, unittest.TestCase):
pass
class LimitsTest(unittest.TestCase):
@ -2835,7 +2875,7 @@ class CommandLineTest(unittest.TestCase):
support.findfile('tokenize_tests-no-coding-cookie-'
'and-utf8-bom-sig-only.txt',
subdir='tokenizedata')]
for filetype in (GzipTest, Bz2Test, LzmaTest):
for filetype in (GzipTest, Bz2Test, LzmaTest, ZstdTest):
if not filetype.open:
continue
try:
@ -4257,7 +4297,7 @@ def setUpModule():
data = fobj.read()
# Create compressed tarfiles.
for c in GzipTest, Bz2Test, LzmaTest:
for c in GzipTest, Bz2Test, LzmaTest, ZstdTest:
if c.open:
os_helper.unlink(c.tarname)
testtarnames.append(c.tarname)