diff --git a/Lib/test/test_gzip.py b/Lib/test/test_gzip.py index 295d4d4a8fd..b072ce4682c 100644 --- a/Lib/test/test_gzip.py +++ b/Lib/test/test_gzip.py @@ -1,14 +1,19 @@ """Test script for the gzip module. """ -import unittest -from test import support -from test.support import bigmemtest, _4G +import array +import functools +import io import os import pathlib -import io 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') data1 = b""" int length=DEFAULTALLOC, err = Z_OK; @@ -24,6 +29,9 @@ data2 = b"""/* zlibmodule.c -- gzip-compatible data compression */ """ +TEMPDIR = os.path.abspath(support.TESTFN) + '-gzdir' + + class UnseekableIO(io.BytesIO): def seekable(self): return False @@ -665,8 +673,87 @@ class TestOpen(BaseTest): with gzip.open(self.filename, "rt", newline="\r") as f: 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): - support.run_unittest(TestGzip, TestOpen) + support.run_unittest(TestGzip, TestOpen, TestCommandLine) + if __name__ == "__main__": test_main(verbose=True)