Commit 84eec119 authored by Stéphane Wirtel's avatar Stéphane Wirtel Committed by Julien Palard

bpo-23596: Add unit tests for the command line for the gzip module (GH-9775)

Add unit tests for the command line for the gzip module
parent c880ffe7
"""Test script for the gzip module. """Test script for the gzip module.
""" """
import unittest import array
from test import support import functools
from test.support import bigmemtest, _4G import io
import os import os
import pathlib import pathlib
import io
import struct import struct
import array import sys
import unittest
from subprocess import PIPE, Popen
from test import support
from test.support import _4G, bigmemtest
from test.support.script_helper import assert_python_ok
gzip = support.import_module('gzip') gzip = support.import_module('gzip')
data1 = b""" int length=DEFAULTALLOC, err = Z_OK; data1 = b""" int length=DEFAULTALLOC, err = Z_OK;
...@@ -24,6 +29,9 @@ data2 = b"""/* zlibmodule.c -- gzip-compatible data compression */ ...@@ -24,6 +29,9 @@ data2 = b"""/* zlibmodule.c -- gzip-compatible data compression */
""" """
TEMPDIR = os.path.abspath(support.TESTFN) + '-gzdir'
class UnseekableIO(io.BytesIO): class UnseekableIO(io.BytesIO):
def seekable(self): def seekable(self):
return False return False
...@@ -665,8 +673,87 @@ class TestOpen(BaseTest): ...@@ -665,8 +673,87 @@ class TestOpen(BaseTest):
with gzip.open(self.filename, "rt", newline="\r") as f: with gzip.open(self.filename, "rt", newline="\r") as f:
self.assertEqual(f.readlines(), [uncompressed]) self.assertEqual(f.readlines(), [uncompressed])
def create_and_remove_directory(directory):
def decorator(function):
@functools.wraps(function)
def wrapper(*args, **kwargs):
os.makedirs(directory)
try:
return function(*args, **kwargs)
finally:
support.rmtree(directory)
return wrapper
return decorator
class TestCommandLine(unittest.TestCase):
data = b'This is a simple test with gzip'
def test_decompress_stdin_stdout(self):
with io.BytesIO() as bytes_io:
with gzip.GzipFile(fileobj=bytes_io, mode='wb') as gzip_file:
gzip_file.write(self.data)
args = sys.executable, '-m', 'gzip', '-d'
with Popen(args, stdin=PIPE, stdout=PIPE, stderr=PIPE) as proc:
out, err = proc.communicate(bytes_io.getvalue())
self.assertEqual(err, b'')
self.assertEqual(out, self.data)
@create_and_remove_directory(TEMPDIR)
def test_decompress_infile_outfile(self):
gzipname = os.path.join(TEMPDIR, 'testgzip.gz')
self.assertFalse(os.path.exists(gzipname))
with gzip.open(gzipname, mode='wb') as fp:
fp.write(self.data)
rc, out, err = assert_python_ok('-m', 'gzip', '-d', gzipname)
with open(os.path.join(TEMPDIR, "testgzip"), "rb") as gunziped:
self.assertEqual(gunziped.read(), self.data)
self.assertTrue(os.path.exists(gzipname))
self.assertEqual(rc, 0)
self.assertEqual(out, b'')
self.assertEqual(err, b'')
def test_decompress_infile_outfile_error(self):
rc, out, err = assert_python_ok('-m', 'gzip', '-d', 'thisisatest.out')
self.assertIn(b"filename doesn't end in .gz:", out)
self.assertEqual(rc, 0)
self.assertEqual(err, b'')
@create_and_remove_directory(TEMPDIR)
def test_compress_stdin_outfile(self):
args = sys.executable, '-m', 'gzip'
with Popen(args, stdin=PIPE, stdout=PIPE, stderr=PIPE) as proc:
out, err = proc.communicate(self.data)
self.assertEqual(err, b'')
self.assertEqual(out[:2], b"\x1f\x8b")
@create_and_remove_directory(TEMPDIR)
def test_compress_infile_outfile(self):
local_testgzip = os.path.join(TEMPDIR, 'testgzip')
gzipname = local_testgzip + '.gz'
self.assertFalse(os.path.exists(gzipname))
with open(local_testgzip, 'wb') as fp:
fp.write(self.data)
rc, out, err = assert_python_ok('-m', 'gzip', local_testgzip)
self.assertTrue(os.path.exists(gzipname))
self.assertEqual(rc, 0)
self.assertEqual(out, b'')
self.assertEqual(err, b'')
def test_main(verbose=None): def test_main(verbose=None):
support.run_unittest(TestGzip, TestOpen) support.run_unittest(TestGzip, TestOpen, TestCommandLine)
if __name__ == "__main__": if __name__ == "__main__":
test_main(verbose=True) test_main(verbose=True)
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment