diff --git a/Lib/test/support.py b/Lib/test/support.py --- a/Lib/test/support.py +++ b/Lib/test/support.py @@ -52,6 +52,11 @@ except ImportError: lzma = None +try: + import gzip +except ImportError: + gzip = None + __all__ = [ "Error", "TestFailed", "ResourceDenied", "import_module", "verbose", "use_resources", "max_memuse", "record_original_stdout", @@ -71,7 +76,7 @@ "TestHandler", "Matcher", "can_symlink", "skip_unless_symlink", "skip_unless_xattr", "import_fresh_module", "requires_zlib", "PIPE_MAX_SIZE", "failfast", "anticipate_failure", "run_with_tz", - "requires_bz2", "requires_lzma", "suppress_crash_popup", + "requires_bz2", "requires_lzma", "requires_gzip", "suppress_crash_popup", ] class Error(Exception): @@ -592,6 +597,8 @@ requires_lzma = unittest.skipUnless(lzma, 'requires lzma') +requires_gzip = unittest.skipUnless(gzip, 'requires gzip') + is_jython = sys.platform.startswith('java') # Filename used for testing diff --git a/Lib/test/test_tarfile.py b/Lib/test/test_tarfile.py --- a/Lib/test/test_tarfile.py +++ b/Lib/test/test_tarfile.py @@ -173,7 +173,7 @@ self._test_fileobj_link("symtype2", "ustar/regtype") -class CommonReadTest(ReadTest): +class CommonReadTest: def test_empty_tarfile(self): # Test for issue6123: Allow opening empty archives. @@ -227,7 +227,7 @@ tar.close() -class MiscReadTest(CommonReadTest): +class MiscReadTest(CommonReadTest, ReadTest): def test_no_name_argument(self): if self.mode.endswith(("bz2", "xz")): @@ -416,7 +416,7 @@ support.unlink(empty) -class StreamReadTest(CommonReadTest): +class StreamReadTest(CommonReadTest, ReadTest): mode="r|" @@ -652,7 +652,7 @@ self._test_member(tarinfo, size=7011, chksum=md5_regtype) -class LongnameTest(ReadTest): +class LongnameTest: def test_read_longname(self): # Test reading of longname (bug #1471427). @@ -691,7 +691,7 @@ self.assertEqual(tarinfo.type, self.longnametype) -class GNUReadTest(LongnameTest): +class GNUReadTest(ReadTest, LongnameTest): subdir = "gnu" longnametype = tarfile.GNUTYPE_LONGNAME @@ -745,7 +745,7 @@ return False -class PaxReadTest(LongnameTest): +class PaxReadTest(ReadTest, LongnameTest): subdir = "pax" longnametype = tarfile.XHDTYPE @@ -786,7 +786,7 @@ tar.close() -class WriteTestBase(unittest.TestCase): +class WriteTestBase: # Put all write tests in here that are supposed to be tested # in all possible mode combinations. @@ -798,7 +798,7 @@ self.assertTrue(fobj.closed is False, "external fileobjs must never closed") -class WriteTest(WriteTestBase): +class WriteTest(WriteTestBase, unittest.TestCase): mode = "w:" @@ -1086,7 +1086,7 @@ os.chdir(cwd) -class StreamWriteTest(WriteTestBase): +class StreamWriteTest(WriteTestBase, unittest.TestCase): mode = "w|" @@ -1218,6 +1218,7 @@ ("longlnk/" * 127) + "longlink_") +@unittest.skipUnless(hasattr(os, 'link'), 'os.link not available') class HardlinkTest(unittest.TestCase): # Test the creation of LNKTYPE (hardlink) members in an archive. @@ -1702,6 +1703,8 @@ self.assertTrue(tar.closed, "context manager failed") +@unittest.skipIf(hasattr(os, 'link'), + 'link emulation is disabled when os.link is available') class LinkEmulationTest(ReadTest): # Test for issue #8741 regression. On platforms that do not support @@ -1709,12 +1712,11 @@ # the regular files they point to. def _test_link_extraction(self, name): self.tar.extract(name, TEMPDIR) - data = open(os.path.join(TEMPDIR, name), "rb").read() + with open(os.path.join(TEMPDIR, name), "rb") as file: + data = file.read() self.assertEqual(md5sum(data), md5_regtype) - # When 8879 gets fixed, this will need to change. Currently on Windows - # we have os.path.islink but no os.link, so these tests fail without the - # following skip until link is completed. + # See issues #1578269, #8879, and #17689 for some history on these skips @unittest.skipIf(hasattr(os.path, "islink"), "Skip emulation - has os.path.islink but not os.link") def test_hardlink_extraction1(self): @@ -1736,6 +1738,7 @@ self._test_link_extraction("./ustar/linktest2/symtype") +@support.requires_gzip class GzipMiscReadTest(MiscReadTest): tarname = gzipname mode = "r:gz" @@ -1747,32 +1750,42 @@ tarfile.open("xxx", self.mode) self.assertEqual(ex.exception.errno, errno.ENOENT) +@support.requires_gzip class GzipUstarReadTest(UstarReadTest): tarname = gzipname mode = "r:gz" +@support.requires_gzip class GzipStreamReadTest(StreamReadTest): tarname = gzipname mode = "r|gz" +@support.requires_gzip class GzipWriteTest(WriteTest): mode = "w:gz" +@support.requires_gzip class GzipStreamWriteTest(StreamWriteTest): mode = "w|gz" +@support.requires_bz2 class Bz2MiscReadTest(MiscReadTest): tarname = bz2name mode = "r:bz2" +@support.requires_bz2 class Bz2UstarReadTest(UstarReadTest): tarname = bz2name mode = "r:bz2" +@support.requires_bz2 class Bz2StreamReadTest(StreamReadTest): tarname = bz2name mode = "r|bz2" +@support.requires_bz2 class Bz2WriteTest(WriteTest): mode = "w:bz2" +@support.requires_bz2 class Bz2StreamWriteTest(StreamWriteTest): mode = "w|bz2" +@support.requires_bz2 class Bz2PartialReadTest(unittest.TestCase): # Issue5068: The _BZ2Proxy.read() method loops forever # on an empty or partial bzipped file. @@ -1803,102 +1816,58 @@ self._test_partial_input("r:bz2") +@support.requires_lzma class LzmaMiscReadTest(MiscReadTest): tarname = xzname mode = "r:xz" +@support.requires_lzma class LzmaUstarReadTest(UstarReadTest): tarname = xzname mode = "r:xz" +@support.requires_lzma class LzmaStreamReadTest(StreamReadTest): tarname = xzname mode = "r|xz" +@support.requires_lzma class LzmaWriteTest(WriteTest): mode = "w:xz" +@support.requires_lzma class LzmaStreamWriteTest(StreamWriteTest): mode = "w|xz" -def test_main(): +def setUpModule(): support.unlink(TEMPDIR) os.makedirs(TEMPDIR) - tests = [ - UstarReadTest, - MiscReadTest, - StreamReadTest, - DetectReadTest, - MemberReadTest, - GNUReadTest, - PaxReadTest, - WriteTest, - StreamWriteTest, - GNUWriteTest, - PaxWriteTest, - UstarUnicodeTest, - GNUUnicodeTest, - PAXUnicodeTest, - AppendTest, - LimitsTest, - MiscTest, - ContextManagerTest, - ] - - if hasattr(os, "link"): - tests.append(HardlinkTest) + if any((gzip, bz2, lzma)): + with open(tarname, "rb") as fobj: + data = fobj.read() else: - tests.append(LinkEmulationTest) - - with open(tarname, "rb") as fobj: - data = fobj.read() + return if gzip: - # Create testtar.tar.gz and add gzip-specific tests. + # Create testtar.tar.gz support.unlink(gzipname) with gzip.open(gzipname, "wb") as tar: tar.write(data) - tests += [ - GzipMiscReadTest, - GzipUstarReadTest, - GzipStreamReadTest, - GzipWriteTest, - GzipStreamWriteTest, - ] - if bz2: - # Create testtar.tar.bz2 and add bz2-specific tests. + # Create testtar.tar.bz2 support.unlink(bz2name) with bz2.BZ2File(bz2name, "wb") as tar: tar.write(data) - tests += [ - Bz2MiscReadTest, - Bz2UstarReadTest, - Bz2StreamReadTest, - Bz2WriteTest, - Bz2StreamWriteTest, - Bz2PartialReadTest, - ] - if lzma: - # Create testtar.tar.xz and add lzma-specific tests. + # Create testtar.tar.xz support.unlink(xzname) with lzma.LZMAFile(xzname, "w") as tar: tar.write(data) - tests += [ - LzmaMiscReadTest, - LzmaUstarReadTest, - LzmaStreamReadTest, - LzmaWriteTest, - LzmaStreamWriteTest, - ] - try: - support.run_unittest(*tests) - finally: - if os.path.exists(TEMPDIR): - shutil.rmtree(TEMPDIR) +def tearDownModule(): + if os.path.exists(TEMPDIR): + shutil.rmtree(TEMPDIR) if __name__ == "__main__": - test_main() + unittest.main()