diff -r 0b2d4089180c Lib/test/test_tarfile.py --- a/Lib/test/test_tarfile.py Wed Apr 10 17:01:38 2013 -0400 +++ b/Lib/test/test_tarfile.py Thu Apr 11 13:52:24 2013 -0500 @@ -26,6 +26,15 @@ except ImportError: lzma = None +def skipUnlessCompressionModule(name): + """ + Skip if the specified compression module is not available. Must be a + string, currently any of 'gzip', 'bz2', or 'lzma'. + """ + if not globals()[name]: + return unittest.skip('{} not available'.format(name)) + return lambda x:x + def md5sum(data): return md5(data).hexdigest() @@ -173,7 +182,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 +236,7 @@ tar.close() -class MiscReadTest(CommonReadTest): +class MiscReadTest(CommonReadTest, ReadTest): def test_no_name_argument(self): if self.mode.endswith(("bz2", "xz")): @@ -416,7 +425,7 @@ support.unlink(empty) -class StreamReadTest(CommonReadTest): +class StreamReadTest(CommonReadTest, ReadTest): mode="r|" @@ -652,7 +661,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 +700,7 @@ self.assertEqual(tarinfo.type, self.longnametype) -class GNUReadTest(LongnameTest): +class GNUReadTest(ReadTest, LongnameTest): subdir = "gnu" longnametype = tarfile.GNUTYPE_LONGNAME @@ -745,7 +754,7 @@ return False -class PaxReadTest(LongnameTest): +class PaxReadTest(ReadTest, LongnameTest): subdir = "pax" longnametype = tarfile.XHDTYPE @@ -786,7 +795,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 +807,7 @@ self.assertTrue(fobj.closed is False, "external fileobjs must never closed") -class WriteTest(WriteTestBase): +class WriteTest(WriteTestBase, unittest.TestCase): mode = "w:" @@ -1086,7 +1095,7 @@ os.chdir(cwd) -class StreamWriteTest(WriteTestBase): +class StreamWriteTest(WriteTestBase, unittest.TestCase): mode = "w|" @@ -1218,6 +1227,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 +1712,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 @@ -1735,7 +1747,7 @@ def test_symlink_extraction2(self): self._test_link_extraction("./ustar/linktest2/symtype") - +@skipUnlessCompressionModule('gzip') class GzipMiscReadTest(MiscReadTest): tarname = gzipname mode = "r:gz" @@ -1747,32 +1759,42 @@ tarfile.open("xxx", self.mode) self.assertEqual(ex.exception.errno, errno.ENOENT) +@skipUnlessCompressionModule('gzip') class GzipUstarReadTest(UstarReadTest): tarname = gzipname mode = "r:gz" +@skipUnlessCompressionModule('gzip') class GzipStreamReadTest(StreamReadTest): tarname = gzipname mode = "r|gz" +@skipUnlessCompressionModule('gzip') class GzipWriteTest(WriteTest): mode = "w:gz" +@skipUnlessCompressionModule('gzip') class GzipStreamWriteTest(StreamWriteTest): mode = "w|gz" +@skipUnlessCompressionModule('bz2') class Bz2MiscReadTest(MiscReadTest): tarname = bz2name mode = "r:bz2" +@skipUnlessCompressionModule('bz2') class Bz2UstarReadTest(UstarReadTest): tarname = bz2name mode = "r:bz2" +@skipUnlessCompressionModule('bz2') class Bz2StreamReadTest(StreamReadTest): tarname = bz2name mode = "r|bz2" +@skipUnlessCompressionModule('bz2') class Bz2WriteTest(WriteTest): mode = "w:bz2" +@skipUnlessCompressionModule('bz2') class Bz2StreamWriteTest(StreamWriteTest): mode = "w|bz2" +@skipUnlessCompressionModule('bz2') class Bz2PartialReadTest(unittest.TestCase): # Issue5068: The _BZ2Proxy.read() method loops forever # on an empty or partial bzipped file. @@ -1803,102 +1825,58 @@ self._test_partial_input("r:bz2") +@skipUnlessCompressionModule('lzma') class LzmaMiscReadTest(MiscReadTest): tarname = xzname mode = "r:xz" +@skipUnlessCompressionModule('lzma') class LzmaUstarReadTest(UstarReadTest): tarname = xzname mode = "r:xz" +@skipUnlessCompressionModule('lzma') class LzmaStreamReadTest(StreamReadTest): tarname = xzname mode = "r|xz" +@skipUnlessCompressionModule('lzma') class LzmaWriteTest(WriteTest): mode = "w:xz" +@skipUnlessCompressionModule('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()