diff options
author | Miss Islington (bot) <31488909+miss-islington@users.noreply.github.com> | 2023-06-19 17:42:23 (GMT) |
---|---|---|
committer | GitHub <noreply@github.com> | 2023-06-19 17:42:23 (GMT) |
commit | 225cc4c043aca472f0c7c78bed1a7524fae5c278 (patch) | |
tree | e0c6b01b347b088988df12206e432ebf0a89aadd /Lib/test | |
parent | 5e524ef34687899ed09b5a4c56568346e20f789e (diff) | |
download | cpython-225cc4c043aca472f0c7c78bed1a7524fae5c278.zip cpython-225cc4c043aca472f0c7c78bed1a7524fae5c278.tar.gz cpython-225cc4c043aca472f0c7c78bed1a7524fae5c278.tar.bz2 |
[3.12] GH-105808: Fix a regression introduced in GH-101251 (GH-105910) (#105920)
GH-105808: Fix a regression introduced in GH-101251 (GH-105910)
Fix a regression introduced in pythonGH-101251, causing GzipFile.flush() to
not flush the compressor (nor pass along the zip_mode argument).
(cherry picked from commit 1858db7cbdbf41aa600c954c15224307bf81a258)
Co-authored-by: T. Wouters <thomas@python.org>
Diffstat (limited to 'Lib/test')
-rw-r--r-- | Lib/test/test_gzip.py | 49 |
1 files changed, 49 insertions, 0 deletions
diff --git a/Lib/test/test_gzip.py b/Lib/test/test_gzip.py index 6de413e..c7ac7c6 100644 --- a/Lib/test/test_gzip.py +++ b/Lib/test/test_gzip.py @@ -9,6 +9,7 @@ import pathlib import struct import sys import unittest +import zlib from subprocess import PIPE, Popen from test.support import import_helper from test.support import os_helper @@ -616,6 +617,54 @@ class TestGzip(BaseTest): self.assertEqual(f.write(q), LENGTH) self.assertEqual(f.tell(), LENGTH) + def test_flush_flushes_compressor(self): + # See issue GH-105808. + b = io.BytesIO() + message = b"important message here." + with gzip.GzipFile(fileobj=b, mode='w') as f: + f.write(message) + f.flush() + partial_data = b.getvalue() + full_data = b.getvalue() + self.assertEqual(gzip.decompress(full_data), message) + # The partial data should contain the gzip header and the complete + # message, but not the end-of-stream markers (so we can't just + # decompress it directly). + with self.assertRaises(EOFError): + gzip.decompress(partial_data) + d = zlib.decompressobj(wbits=-zlib.MAX_WBITS) + f = io.BytesIO(partial_data) + gzip._read_gzip_header(f) + read_message = d.decompress(f.read()) + self.assertEqual(read_message, message) + + def test_flush_modes(self): + # Make sure the argument to flush is properly passed to the + # zlib.compressobj; see issue GH-105808. + class FakeCompressor: + def __init__(self): + self.modes = [] + def compress(self, data): + return b'' + def flush(self, mode=-1): + self.modes.append(mode) + return b'' + b = io.BytesIO() + fc = FakeCompressor() + with gzip.GzipFile(fileobj=b, mode='w') as f: + f.compress = fc + f.flush() + f.flush(50) + f.flush(zlib_mode=100) + # The implicit close will also flush the compressor. + expected_modes = [ + zlib.Z_SYNC_FLUSH, + 50, + 100, + -1, + ] + self.assertEqual(fc.modes, expected_modes) + class TestOpen(BaseTest): def test_binary_modes(self): |