diff options
author | William Chargin <wchargin@gmail.com> | 2020-01-21 11:25:24 (GMT) |
---|---|---|
committer | Serhiy Storchaka <storchaka@gmail.com> | 2020-01-21 11:25:24 (GMT) |
commit | eab3b3f1c60afecfb4db3c3619109684cb04bd60 (patch) | |
tree | 311e513af209b2fa14f0d46720801aa4e1f02462 /Lib/test/test_gzip.py | |
parent | 85ead4fc62829cb7ef2eb0af1a2933282f58c629 (diff) | |
download | cpython-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.py | 20 |
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: |