summaryrefslogtreecommitdiffstats
path: root/Lib/test/test_gzip.py
diff options
context:
space:
mode:
authorWilliam Chargin <wchargin@gmail.com>2020-01-21 11:25:24 (GMT)
committerSerhiy Storchaka <storchaka@gmail.com>2020-01-21 11:25:24 (GMT)
commiteab3b3f1c60afecfb4db3c3619109684cb04bd60 (patch)
tree311e513af209b2fa14f0d46720801aa4e1f02462 /Lib/test/test_gzip.py
parent85ead4fc62829cb7ef2eb0af1a2933282f58c629 (diff)
downloadcpython-eab3b3f1c60afecfb4db3c3619109684cb04bd60.zip
cpython-eab3b3f1c60afecfb4db3c3619109684cb04bd60.tar.gz
cpython-eab3b3f1c60afecfb4db3c3619109684cb04bd60.tar.bz2
bpo-39389: gzip: fix compression level metadata (GH-18077)
As described in RFC 1952, section 2.3.1, the XFL (eXtra FLags) byte of a gzip member header should indicate whether the DEFLATE algorithm was tuned for speed or compression ratio. Prior to this patch, archives emitted by the `gzip` module always indicated maximum compression.
Diffstat (limited to 'Lib/test/test_gzip.py')
-rw-r--r--Lib/test/test_gzip.py20
1 files changed, 20 insertions, 0 deletions
diff --git a/Lib/test/test_gzip.py b/Lib/test/test_gzip.py
index 57d851c..7833421 100644
--- a/Lib/test/test_gzip.py
+++ b/Lib/test/test_gzip.py
@@ -358,6 +358,26 @@ class TestGzip(BaseTest):
isizeBytes = fRead.read(4)
self.assertEqual(isizeBytes, struct.pack('<i', len(data1)))
+ def test_compresslevel_metadata(self):
+ # see RFC 1952: http://www.faqs.org/rfcs/rfc1952.html
+ # specifically, discussion of XFL in section 2.3.1
+ cases = [
+ ('fast', 1, b'\x04'),
+ ('best', 9, b'\x02'),
+ ('tradeoff', 6, b'\x00'),
+ ]
+ xflOffset = 8
+
+ for (name, level, expectedXflByte) in cases:
+ with self.subTest(name):
+ fWrite = gzip.GzipFile(self.filename, 'w', compresslevel=level)
+ with fWrite:
+ fWrite.write(data1)
+ with open(self.filename, 'rb') as fRead:
+ fRead.seek(xflOffset)
+ xflByte = fRead.read(1)
+ self.assertEqual(xflByte, expectedXflByte)
+
def test_with_open(self):
# GzipFile supports the context management protocol
with gzip.GzipFile(self.filename, "wb") as f: