14adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao# We can test part of the module without zlib. 24adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaotry: 34adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao import zlib 44adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaoexcept ImportError: 54adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao zlib = None 64adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao 74adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaoimport os 84adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaoimport io 94adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaoimport sys 104adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaoimport time 114adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaoimport shutil 124adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaoimport struct 134adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaoimport zipfile 144adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaoimport unittest 154adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao 164adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaofrom StringIO import StringIO 174adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaofrom tempfile import TemporaryFile 184adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaofrom random import randint, random 194adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaofrom unittest import skipUnless 204adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao 214adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaofrom test.test_support import TESTFN, TESTFN_UNICODE, TESTFN_ENCODING, \ 224adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao run_unittest, findfile, unlink 234adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaotry: 244adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao TESTFN_UNICODE.encode(TESTFN_ENCODING) 254adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaoexcept (UnicodeError, TypeError): 264adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao # Either the file system encoding is None, or the file name 274adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao # cannot be encoded in the file system encoding. 284adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao TESTFN_UNICODE = None 294adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao 304adfde8bc82dd39f59e0445588c3e599ada477dJosh GaoTESTFN2 = TESTFN + "2" 314adfde8bc82dd39f59e0445588c3e599ada477dJosh GaoTESTFNDIR = TESTFN + "d" 324adfde8bc82dd39f59e0445588c3e599ada477dJosh GaoFIXEDTEST_SIZE = 1000 334adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao 344adfde8bc82dd39f59e0445588c3e599ada477dJosh GaoSMALL_TEST_DATA = [('_ziptest1', '1q2w3e4r5t'), 354adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao ('ziptest2dir/_ziptest2', 'qawsedrftg'), 364adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao ('ziptest2dir/ziptest3dir/_ziptest3', 'azsxdcfvgb'), 374adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao ('ziptest2dir/ziptest3dir/ziptest4dir/_ziptest3', '6y7u8i9o0p')] 384adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao 394adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao 404adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaoclass TestsWithSourceFile(unittest.TestCase): 414adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao def setUp(self): 424adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao self.line_gen = ["Zipfile test line %d. random float: %f" % (i, random()) 434adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao for i in xrange(FIXEDTEST_SIZE)] 444adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao self.data = '\n'.join(self.line_gen) + '\n' 454adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao 464adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao # Make a source file with some lines 474adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao with open(TESTFN, "wb") as fp: 484adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao fp.write(self.data) 494adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao 504adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao def make_test_archive(self, f, compression): 514adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao # Create the ZIP archive 524adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao with zipfile.ZipFile(f, "w", compression) as zipfp: 534adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao zipfp.write(TESTFN, "another.name") 544adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao zipfp.write(TESTFN, TESTFN) 554adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao zipfp.writestr("strfile", self.data) 564adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao 574adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao def zip_test(self, f, compression): 584adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao self.make_test_archive(f, compression) 594adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao 604adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao # Read the ZIP archive 614adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao with zipfile.ZipFile(f, "r", compression) as zipfp: 624adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao self.assertEqual(zipfp.read(TESTFN), self.data) 634adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao self.assertEqual(zipfp.read("another.name"), self.data) 644adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao self.assertEqual(zipfp.read("strfile"), self.data) 654adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao 664adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao # Print the ZIP directory 674adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao fp = StringIO() 684adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao stdout = sys.stdout 694adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao try: 704adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao sys.stdout = fp 714adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao zipfp.printdir() 724adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao finally: 734adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao sys.stdout = stdout 744adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao 754adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao directory = fp.getvalue() 764adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao lines = directory.splitlines() 774adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao self.assertEqual(len(lines), 4) # Number of files + header 784adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao 794adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao self.assertIn('File Name', lines[0]) 804adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao self.assertIn('Modified', lines[0]) 814adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao self.assertIn('Size', lines[0]) 824adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao 834adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao fn, date, time_, size = lines[1].split() 844adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao self.assertEqual(fn, 'another.name') 854adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao self.assertTrue(time.strptime(date, '%Y-%m-%d')) 864adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao self.assertTrue(time.strptime(time_, '%H:%M:%S')) 874adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao self.assertEqual(size, str(len(self.data))) 884adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao 894adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao # Check the namelist 904adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao names = zipfp.namelist() 914adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao self.assertEqual(len(names), 3) 924adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao self.assertIn(TESTFN, names) 934adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao self.assertIn("another.name", names) 944adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao self.assertIn("strfile", names) 954adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao 964adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao # Check infolist 974adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao infos = zipfp.infolist() 984adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao names = [i.filename for i in infos] 994adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao self.assertEqual(len(names), 3) 1004adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao self.assertIn(TESTFN, names) 1014adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao self.assertIn("another.name", names) 1024adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao self.assertIn("strfile", names) 1034adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao for i in infos: 1044adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao self.assertEqual(i.file_size, len(self.data)) 1054adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao 1064adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao # check getinfo 1074adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao for nm in (TESTFN, "another.name", "strfile"): 1084adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao info = zipfp.getinfo(nm) 1094adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao self.assertEqual(info.filename, nm) 1104adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao self.assertEqual(info.file_size, len(self.data)) 1114adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao 1124adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao # Check that testzip doesn't raise an exception 1134adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao zipfp.testzip() 1144adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao 1154adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao def test_stored(self): 1164adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao for f in (TESTFN2, TemporaryFile(), StringIO()): 1174adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao self.zip_test(f, zipfile.ZIP_STORED) 1184adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao 1194adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao def zip_open_test(self, f, compression): 1204adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao self.make_test_archive(f, compression) 1214adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao 1224adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao # Read the ZIP archive 1234adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao with zipfile.ZipFile(f, "r", compression) as zipfp: 1244adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao zipdata1 = [] 1254adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao with zipfp.open(TESTFN) as zipopen1: 1264adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao while True: 1274adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao read_data = zipopen1.read(256) 1284adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao if not read_data: 1294adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao break 1304adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao zipdata1.append(read_data) 1314adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao 1324adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao zipdata2 = [] 1334adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao with zipfp.open("another.name") as zipopen2: 1344adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao while True: 1354adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao read_data = zipopen2.read(256) 1364adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao if not read_data: 1374adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao break 1384adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao zipdata2.append(read_data) 1394adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao 1404adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao self.assertEqual(''.join(zipdata1), self.data) 1414adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao self.assertEqual(''.join(zipdata2), self.data) 1424adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao 1434adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao def test_open_stored(self): 1444adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao for f in (TESTFN2, TemporaryFile(), StringIO()): 1454adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao self.zip_open_test(f, zipfile.ZIP_STORED) 1464adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao 1474adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao def test_open_via_zip_info(self): 1484adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao # Create the ZIP archive 1494adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao with zipfile.ZipFile(TESTFN2, "w", zipfile.ZIP_STORED) as zipfp: 1504adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao zipfp.writestr("name", "foo") 1514adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao zipfp.writestr("name", "bar") 1524adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao 1534adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao with zipfile.ZipFile(TESTFN2, "r") as zipfp: 1544adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao infos = zipfp.infolist() 1554adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao data = "" 1564adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao for info in infos: 1574adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao with zipfp.open(info) as f: 1584adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao data += f.read() 1594adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao self.assertTrue(data == "foobar" or data == "barfoo") 1604adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao data = "" 1614adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao for info in infos: 1624adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao data += zipfp.read(info) 1634adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao self.assertTrue(data == "foobar" or data == "barfoo") 1644adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao 1654adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao def zip_random_open_test(self, f, compression): 1664adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao self.make_test_archive(f, compression) 1674adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao 1684adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao # Read the ZIP archive 1694adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao with zipfile.ZipFile(f, "r", compression) as zipfp: 1704adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao zipdata1 = [] 1714adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao with zipfp.open(TESTFN) as zipopen1: 1724adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao while True: 1734adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao read_data = zipopen1.read(randint(1, 1024)) 1744adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao if not read_data: 1754adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao break 1764adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao zipdata1.append(read_data) 1774adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao 1784adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao self.assertEqual(''.join(zipdata1), self.data) 1794adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao 1804adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao def test_random_open_stored(self): 1814adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao for f in (TESTFN2, TemporaryFile(), StringIO()): 1824adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao self.zip_random_open_test(f, zipfile.ZIP_STORED) 1834adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao 1844adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao def test_univeral_readaheads(self): 1854adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao f = StringIO() 1864adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao 1874adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao data = 'a\r\n' * 16 * 1024 1884adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao with zipfile.ZipFile(f, 'w', zipfile.ZIP_STORED) as zipfp: 1894adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao zipfp.writestr(TESTFN, data) 1904adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao 1914adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao data2 = '' 1924adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao with zipfile.ZipFile(f, 'r') as zipfp: 1934adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao with zipfp.open(TESTFN, 'rU') as zipopen: 1944adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao for line in zipopen: 1954adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao data2 += line 1964adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao 1974adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao self.assertEqual(data, data2.replace('\n', '\r\n')) 1984adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao 1994adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao def zip_readline_read_test(self, f, compression): 2004adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao self.make_test_archive(f, compression) 2014adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao 2024adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao # Read the ZIP archive 2034adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao with zipfile.ZipFile(f, "r") as zipfp: 2044adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao with zipfp.open(TESTFN) as zipopen: 2054adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao data = '' 2064adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao while True: 2074adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao read = zipopen.readline() 2084adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao if not read: 2094adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao break 2104adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao data += read 2114adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao 2124adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao read = zipopen.read(100) 2134adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao if not read: 2144adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao break 2154adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao data += read 2164adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao 2174adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao self.assertEqual(data, self.data) 2184adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao 2194adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao def zip_readline_test(self, f, compression): 2204adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao self.make_test_archive(f, compression) 2214adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao 2224adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao # Read the ZIP archive 2234adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao with zipfile.ZipFile(f, "r") as zipfp: 2244adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao with zipfp.open(TESTFN) as zipopen: 2254adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao for line in self.line_gen: 2264adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao linedata = zipopen.readline() 2274adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao self.assertEqual(linedata, line + '\n') 2284adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao 2294adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao def zip_readlines_test(self, f, compression): 2304adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao self.make_test_archive(f, compression) 2314adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao 2324adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao # Read the ZIP archive 2334adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao with zipfile.ZipFile(f, "r") as zipfp: 2344adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao with zipfp.open(TESTFN) as zo: 2354adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao ziplines = zo.readlines() 2364adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao for line, zipline in zip(self.line_gen, ziplines): 2374adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao self.assertEqual(zipline, line + '\n') 2384adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao 2394adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao def zip_iterlines_test(self, f, compression): 2404adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao self.make_test_archive(f, compression) 2414adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao 2424adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao # Read the ZIP archive 2434adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao with zipfile.ZipFile(f, "r") as zipfp: 2444adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao for line, zipline in zip(self.line_gen, zipfp.open(TESTFN)): 2454adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao self.assertEqual(zipline, line + '\n') 2464adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao 2474adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao def test_readline_read_stored(self): 2484adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao # Issue #7610: calls to readline() interleaved with calls to read(). 2494adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao for f in (TESTFN2, TemporaryFile(), StringIO()): 2504adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao self.zip_readline_read_test(f, zipfile.ZIP_STORED) 2514adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao 2524adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao def test_readline_stored(self): 2534adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao for f in (TESTFN2, TemporaryFile(), StringIO()): 2544adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao self.zip_readline_test(f, zipfile.ZIP_STORED) 2554adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao 2564adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao def test_readlines_stored(self): 2574adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao for f in (TESTFN2, TemporaryFile(), StringIO()): 2584adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao self.zip_readlines_test(f, zipfile.ZIP_STORED) 2594adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao 2604adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao def test_iterlines_stored(self): 2614adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao for f in (TESTFN2, TemporaryFile(), StringIO()): 2624adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao self.zip_iterlines_test(f, zipfile.ZIP_STORED) 2634adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao 2644adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao @skipUnless(zlib, "requires zlib") 2654adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao def test_deflated(self): 2664adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao for f in (TESTFN2, TemporaryFile(), StringIO()): 2674adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao self.zip_test(f, zipfile.ZIP_DEFLATED) 2684adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao 2694adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao @skipUnless(zlib, "requires zlib") 2704adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao def test_open_deflated(self): 2714adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao for f in (TESTFN2, TemporaryFile(), StringIO()): 2724adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao self.zip_open_test(f, zipfile.ZIP_DEFLATED) 2734adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao 2744adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao @skipUnless(zlib, "requires zlib") 2754adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao def test_random_open_deflated(self): 2764adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao for f in (TESTFN2, TemporaryFile(), StringIO()): 2774adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao self.zip_random_open_test(f, zipfile.ZIP_DEFLATED) 2784adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao 2794adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao @skipUnless(zlib, "requires zlib") 2804adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao def test_readline_read_deflated(self): 2814adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao # Issue #7610: calls to readline() interleaved with calls to read(). 2824adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao for f in (TESTFN2, TemporaryFile(), StringIO()): 2834adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao self.zip_readline_read_test(f, zipfile.ZIP_DEFLATED) 2844adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao 2854adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao @skipUnless(zlib, "requires zlib") 2864adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao def test_readline_deflated(self): 2874adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao for f in (TESTFN2, TemporaryFile(), StringIO()): 2884adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao self.zip_readline_test(f, zipfile.ZIP_DEFLATED) 2894adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao 2904adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao @skipUnless(zlib, "requires zlib") 2914adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao def test_readlines_deflated(self): 2924adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao for f in (TESTFN2, TemporaryFile(), StringIO()): 2934adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao self.zip_readlines_test(f, zipfile.ZIP_DEFLATED) 2944adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao 2954adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao @skipUnless(zlib, "requires zlib") 2964adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao def test_iterlines_deflated(self): 2974adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao for f in (TESTFN2, TemporaryFile(), StringIO()): 2984adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao self.zip_iterlines_test(f, zipfile.ZIP_DEFLATED) 2994adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao 3004adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao @skipUnless(zlib, "requires zlib") 3014adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao def test_low_compression(self): 3024adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao """Check for cases where compressed data is larger than original.""" 3034adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao # Create the ZIP archive 3044adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao with zipfile.ZipFile(TESTFN2, "w", zipfile.ZIP_DEFLATED) as zipfp: 3054adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao zipfp.writestr("strfile", '12') 3064adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao 3074adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao # Get an open object for strfile 3084adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao with zipfile.ZipFile(TESTFN2, "r", zipfile.ZIP_DEFLATED) as zipfp: 3094adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao with zipfp.open("strfile") as openobj: 3104adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao self.assertEqual(openobj.read(1), '1') 3114adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao self.assertEqual(openobj.read(1), '2') 3124adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao 3134adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao def test_absolute_arcnames(self): 3144adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao with zipfile.ZipFile(TESTFN2, "w", zipfile.ZIP_STORED) as zipfp: 3154adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao zipfp.write(TESTFN, "/absolute") 3164adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao 3174adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao with zipfile.ZipFile(TESTFN2, "r", zipfile.ZIP_STORED) as zipfp: 3184adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao self.assertEqual(zipfp.namelist(), ["absolute"]) 3194adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao 3204adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao def test_append_to_zip_file(self): 3214adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao """Test appending to an existing zipfile.""" 3224adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao with zipfile.ZipFile(TESTFN2, "w", zipfile.ZIP_STORED) as zipfp: 3234adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao zipfp.write(TESTFN, TESTFN) 3244adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao 3254adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao with zipfile.ZipFile(TESTFN2, "a", zipfile.ZIP_STORED) as zipfp: 3264adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao zipfp.writestr("strfile", self.data) 3274adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao self.assertEqual(zipfp.namelist(), [TESTFN, "strfile"]) 3284adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao 3294adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao def test_append_to_non_zip_file(self): 3304adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao """Test appending to an existing file that is not a zipfile.""" 3314adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao # NOTE: this test fails if len(d) < 22 because of the first 3324adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao # line "fpin.seek(-22, 2)" in _EndRecData 3334adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao data = 'I am not a ZipFile!'*10 3344adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao with open(TESTFN2, 'wb') as f: 3354adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao f.write(data) 3364adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao 3374adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao with zipfile.ZipFile(TESTFN2, "a", zipfile.ZIP_STORED) as zipfp: 3384adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao zipfp.write(TESTFN, TESTFN) 3394adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao 3404adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao with open(TESTFN2, 'rb') as f: 3414adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao f.seek(len(data)) 3424adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao with zipfile.ZipFile(f, "r") as zipfp: 3434adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao self.assertEqual(zipfp.namelist(), [TESTFN]) 3444adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao 3454adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao def test_ignores_newline_at_end(self): 3464adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao with zipfile.ZipFile(TESTFN2, "w", zipfile.ZIP_STORED) as zipfp: 3474adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao zipfp.write(TESTFN, TESTFN) 3484adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao with open(TESTFN2, 'a') as f: 3494adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao f.write("\r\n\00\00\00") 3504adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao with zipfile.ZipFile(TESTFN2, "r") as zipfp: 3514adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao self.assertIsInstance(zipfp, zipfile.ZipFile) 3524adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao 3534adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao def test_ignores_stuff_appended_past_comments(self): 3544adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao with zipfile.ZipFile(TESTFN2, "w", zipfile.ZIP_STORED) as zipfp: 3554adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao zipfp.comment = b"this is a comment" 3564adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao zipfp.write(TESTFN, TESTFN) 3574adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao with open(TESTFN2, 'a') as f: 3584adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao f.write("abcdef\r\n") 3594adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao with zipfile.ZipFile(TESTFN2, "r") as zipfp: 3604adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao self.assertIsInstance(zipfp, zipfile.ZipFile) 3614adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao self.assertEqual(zipfp.comment, b"this is a comment") 3624adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao 3634adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao def test_write_default_name(self): 3644adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao """Check that calling ZipFile.write without arcname specified 3654adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao produces the expected result.""" 3664adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao with zipfile.ZipFile(TESTFN2, "w") as zipfp: 3674adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao zipfp.write(TESTFN) 3684adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao self.assertEqual(zipfp.read(TESTFN), open(TESTFN).read()) 3694adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao 3704adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao @skipUnless(zlib, "requires zlib") 3714adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao def test_per_file_compression(self): 3724adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao """Check that files within a Zip archive can have different 3734adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao compression options.""" 3744adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao with zipfile.ZipFile(TESTFN2, "w") as zipfp: 3754adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao zipfp.write(TESTFN, 'storeme', zipfile.ZIP_STORED) 3764adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao zipfp.write(TESTFN, 'deflateme', zipfile.ZIP_DEFLATED) 3774adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao sinfo = zipfp.getinfo('storeme') 3784adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao dinfo = zipfp.getinfo('deflateme') 3794adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao self.assertEqual(sinfo.compress_type, zipfile.ZIP_STORED) 3804adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao self.assertEqual(dinfo.compress_type, zipfile.ZIP_DEFLATED) 3814adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao 3824adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao def test_write_to_readonly(self): 3834adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao """Check that trying to call write() on a readonly ZipFile object 3844adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao raises a RuntimeError.""" 3854adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao with zipfile.ZipFile(TESTFN2, mode="w") as zipfp: 3864adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao zipfp.writestr("somefile.txt", "bogus") 3874adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao 3884adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao with zipfile.ZipFile(TESTFN2, mode="r") as zipfp: 3894adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao self.assertRaises(RuntimeError, zipfp.write, TESTFN) 3904adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao 3914adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao def test_extract(self): 3924adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao with zipfile.ZipFile(TESTFN2, "w", zipfile.ZIP_STORED) as zipfp: 3934adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao for fpath, fdata in SMALL_TEST_DATA: 3944adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao zipfp.writestr(fpath, fdata) 3954adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao 3964adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao with zipfile.ZipFile(TESTFN2, "r") as zipfp: 3974adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao for fpath, fdata in SMALL_TEST_DATA: 3984adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao writtenfile = zipfp.extract(fpath) 3994adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao 4004adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao # make sure it was written to the right place 4014adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao correctfile = os.path.join(os.getcwd(), fpath) 4024adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao correctfile = os.path.normpath(correctfile) 4034adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao 4044adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao self.assertEqual(writtenfile, correctfile) 4054adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao 4064adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao # make sure correct data is in correct file 4074adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao self.assertEqual(fdata, open(writtenfile, "rb").read()) 4084adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao os.remove(writtenfile) 4094adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao 4104adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao # remove the test file subdirectories 4114adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao shutil.rmtree(os.path.join(os.getcwd(), 'ziptest2dir')) 4124adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao 4134adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao def test_extract_all(self): 4144adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao with zipfile.ZipFile(TESTFN2, "w", zipfile.ZIP_STORED) as zipfp: 4154adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao for fpath, fdata in SMALL_TEST_DATA: 4164adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao zipfp.writestr(fpath, fdata) 4174adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao 4184adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao with zipfile.ZipFile(TESTFN2, "r") as zipfp: 4194adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao zipfp.extractall() 4204adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao for fpath, fdata in SMALL_TEST_DATA: 4214adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao outfile = os.path.join(os.getcwd(), fpath) 4224adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao 4234adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao self.assertEqual(fdata, open(outfile, "rb").read()) 4244adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao os.remove(outfile) 4254adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao 4264adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao # remove the test file subdirectories 4274adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao shutil.rmtree(os.path.join(os.getcwd(), 'ziptest2dir')) 4284adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao 4294adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao def check_file(self, filename, content): 4304adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao self.assertTrue(os.path.isfile(filename)) 4314adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao with open(filename, 'rb') as f: 4324adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao self.assertEqual(f.read(), content) 4334adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao 4344adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao @skipUnless(TESTFN_UNICODE, "No Unicode filesystem semantics on this platform.") 4354adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao def test_extract_unicode_filenames(self): 4364adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao fnames = [u'foo.txt', os.path.basename(TESTFN_UNICODE)] 4374adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao content = 'Test for unicode filename' 4384adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao with zipfile.ZipFile(TESTFN2, "w", zipfile.ZIP_STORED) as zipfp: 4394adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao for fname in fnames: 4404adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao zipfp.writestr(fname, content) 4414adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao 4424adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao with zipfile.ZipFile(TESTFN2, "r") as zipfp: 4434adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao for fname in fnames: 4444adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao writtenfile = zipfp.extract(fname) 4454adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao 4464adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao # make sure it was written to the right place 4474adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao correctfile = os.path.join(os.getcwd(), fname) 4484adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao correctfile = os.path.normpath(correctfile) 4494adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao self.assertEqual(writtenfile, correctfile) 4504adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao 4514adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao self.check_file(writtenfile, content) 4524adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao os.remove(writtenfile) 4534adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao 4544adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao def test_extract_hackers_arcnames(self): 4554adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao hacknames = [ 4564adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao ('../foo/bar', 'foo/bar'), 4574adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao ('foo/../bar', 'foo/bar'), 4584adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao ('foo/../../bar', 'foo/bar'), 4594adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao ('foo/bar/..', 'foo/bar'), 4604adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao ('./../foo/bar', 'foo/bar'), 4614adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao ('/foo/bar', 'foo/bar'), 4624adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao ('/foo/../bar', 'foo/bar'), 4634adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao ('/foo/../../bar', 'foo/bar'), 4644adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao ] 4654adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao if os.path.sep == '\\': 4664adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao hacknames.extend([ 4674adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao (r'..\foo\bar', 'foo/bar'), 4684adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao (r'..\/foo\/bar', 'foo/bar'), 4694adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao (r'foo/\..\/bar', 'foo/bar'), 4704adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao (r'foo\/../\bar', 'foo/bar'), 4714adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao (r'C:foo/bar', 'foo/bar'), 4724adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao (r'C:/foo/bar', 'foo/bar'), 4734adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao (r'C://foo/bar', 'foo/bar'), 4744adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao (r'C:\foo\bar', 'foo/bar'), 4754adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao (r'//conky/mountpoint/foo/bar', 'conky/mountpoint/foo/bar'), 4764adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao (r'\\conky\mountpoint\foo\bar', 'conky/mountpoint/foo/bar'), 4774adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao (r'///conky/mountpoint/foo/bar', 'conky/mountpoint/foo/bar'), 4784adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao (r'\\\conky\mountpoint\foo\bar', 'conky/mountpoint/foo/bar'), 4794adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao (r'//conky//mountpoint/foo/bar', 'conky/mountpoint/foo/bar'), 4804adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao (r'\\conky\\mountpoint\foo\bar', 'conky/mountpoint/foo/bar'), 4814adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao (r'//?/C:/foo/bar', '_/C_/foo/bar'), 4824adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao (r'\\?\C:\foo\bar', '_/C_/foo/bar'), 4834adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao (r'C:/../C:/foo/bar', 'C_/foo/bar'), 4844adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao (r'a:b\c<d>e|f"g?h*i', 'b/c_d_e_f_g_h_i'), 4854adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao ('../../foo../../ba..r', 'foo/ba..r'), 4864adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao ]) 4874adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao else: # Unix 4884adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao hacknames.extend([ 4894adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao ('//foo/bar', 'foo/bar'), 4904adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao ('../../foo../../ba..r', 'foo../ba..r'), 4914adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao (r'foo/..\bar', r'foo/..\bar'), 4924adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao ]) 4934adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao 4944adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao for arcname, fixedname in hacknames: 4954adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao content = b'foobar' + arcname.encode() 4964adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao with zipfile.ZipFile(TESTFN2, 'w', zipfile.ZIP_STORED) as zipfp: 4974adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao zinfo = zipfile.ZipInfo() 4984adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao # preserve backslashes 4994adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao zinfo.filename = arcname 5004adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao zinfo.external_attr = 0o600 << 16 5014adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao zipfp.writestr(zinfo, content) 5024adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao 5034adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao arcname = arcname.replace(os.sep, "/") 5044adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao targetpath = os.path.join('target', 'subdir', 'subsub') 5054adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao correctfile = os.path.join(targetpath, *fixedname.split('/')) 5064adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao 5074adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao with zipfile.ZipFile(TESTFN2, 'r') as zipfp: 5084adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao writtenfile = zipfp.extract(arcname, targetpath) 5094adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao self.assertEqual(writtenfile, correctfile, 5104adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao msg="extract %r" % arcname) 5114adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao self.check_file(correctfile, content) 5124adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao shutil.rmtree('target') 5134adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao 5144adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao with zipfile.ZipFile(TESTFN2, 'r') as zipfp: 5154adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao zipfp.extractall(targetpath) 5164adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao self.check_file(correctfile, content) 5174adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao shutil.rmtree('target') 5184adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao 5194adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao correctfile = os.path.join(os.getcwd(), *fixedname.split('/')) 5204adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao 5214adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao with zipfile.ZipFile(TESTFN2, 'r') as zipfp: 5224adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao writtenfile = zipfp.extract(arcname) 5234adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao self.assertEqual(writtenfile, correctfile, 5244adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao msg="extract %r" % arcname) 5254adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao self.check_file(correctfile, content) 5264adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao shutil.rmtree(fixedname.split('/')[0]) 5274adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao 5284adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao with zipfile.ZipFile(TESTFN2, 'r') as zipfp: 5294adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao zipfp.extractall() 5304adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao self.check_file(correctfile, content) 5314adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao shutil.rmtree(fixedname.split('/')[0]) 5324adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao 5334adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao os.remove(TESTFN2) 5344adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao 5354adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao def test_writestr_compression(self): 5364adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao zipfp = zipfile.ZipFile(TESTFN2, "w") 5374adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao zipfp.writestr("a.txt", "hello world", compress_type=zipfile.ZIP_STORED) 5384adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao if zlib: 5394adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao zipfp.writestr("b.txt", "hello world", compress_type=zipfile.ZIP_DEFLATED) 5404adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao 5414adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao info = zipfp.getinfo('a.txt') 5424adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao self.assertEqual(info.compress_type, zipfile.ZIP_STORED) 5434adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao 5444adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao if zlib: 5454adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao info = zipfp.getinfo('b.txt') 5464adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao self.assertEqual(info.compress_type, zipfile.ZIP_DEFLATED) 5474adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao 5484adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao 5494adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao def zip_test_writestr_permissions(self, f, compression): 5504adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao # Make sure that writestr creates files with mode 0600, 5514adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao # when it is passed a name rather than a ZipInfo instance. 5524adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao 5534adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao self.make_test_archive(f, compression) 5544adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao with zipfile.ZipFile(f, "r") as zipfp: 5554adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao zinfo = zipfp.getinfo('strfile') 5564adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao self.assertEqual(zinfo.external_attr, 0600 << 16) 5574adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao 5584adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao def test_writestr_permissions(self): 5594adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao for f in (TESTFN2, TemporaryFile(), StringIO()): 5604adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao self.zip_test_writestr_permissions(f, zipfile.ZIP_STORED) 5614adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao 5624adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao def test_close(self): 5634adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao """Check that the zipfile is closed after the 'with' block.""" 5644adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao with zipfile.ZipFile(TESTFN2, "w") as zipfp: 5654adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao for fpath, fdata in SMALL_TEST_DATA: 5664adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao zipfp.writestr(fpath, fdata) 5674adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao self.assertTrue(zipfp.fp is not None, 'zipfp is not open') 5684adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao self.assertTrue(zipfp.fp is None, 'zipfp is not closed') 5694adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao 5704adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao with zipfile.ZipFile(TESTFN2, "r") as zipfp: 5714adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao self.assertTrue(zipfp.fp is not None, 'zipfp is not open') 5724adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao self.assertTrue(zipfp.fp is None, 'zipfp is not closed') 5734adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao 5744adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao def test_close_on_exception(self): 5754adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao """Check that the zipfile is closed if an exception is raised in the 5764adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao 'with' block.""" 5774adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao with zipfile.ZipFile(TESTFN2, "w") as zipfp: 5784adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao for fpath, fdata in SMALL_TEST_DATA: 5794adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao zipfp.writestr(fpath, fdata) 5804adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao 5814adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao try: 5824adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao with zipfile.ZipFile(TESTFN2, "r") as zipfp2: 5834adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao raise zipfile.BadZipfile() 5844adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao except zipfile.BadZipfile: 5854adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao self.assertTrue(zipfp2.fp is None, 'zipfp is not closed') 5864adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao 5874adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao def test_add_file_before_1980(self): 5884adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao # Set atime and mtime to 1970-01-01 5894adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao os.utime(TESTFN, (0, 0)) 5904adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao with zipfile.ZipFile(TESTFN2, "w") as zipfp: 5914adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao self.assertRaises(ValueError, zipfp.write, TESTFN) 5924adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao 5934adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao def tearDown(self): 5944adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao unlink(TESTFN) 5954adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao unlink(TESTFN2) 5964adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao 5974adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao 5984adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaoclass TestZip64InSmallFiles(unittest.TestCase): 5994adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao # These tests test the ZIP64 functionality without using large files, 6004adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao # see test_zipfile64 for proper tests. 6014adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao 6024adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao def setUp(self): 6034adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao self._limit = zipfile.ZIP64_LIMIT 6044adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao zipfile.ZIP64_LIMIT = 5 6054adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao 6064adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao line_gen = ("Test of zipfile line %d." % i 6074adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao for i in range(0, FIXEDTEST_SIZE)) 6084adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao self.data = '\n'.join(line_gen) 6094adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao 6104adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao # Make a source file with some lines 6114adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao with open(TESTFN, "wb") as fp: 6124adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao fp.write(self.data) 6134adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao 6144adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao def large_file_exception_test(self, f, compression): 6154adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao with zipfile.ZipFile(f, "w", compression) as zipfp: 6164adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao self.assertRaises(zipfile.LargeZipFile, 6174adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao zipfp.write, TESTFN, "another.name") 6184adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao 6194adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao def large_file_exception_test2(self, f, compression): 6204adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao with zipfile.ZipFile(f, "w", compression) as zipfp: 6214adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao self.assertRaises(zipfile.LargeZipFile, 6224adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao zipfp.writestr, "another.name", self.data) 6234adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao 6244adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao def test_large_file_exception(self): 6254adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao for f in (TESTFN2, TemporaryFile(), StringIO()): 6264adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao self.large_file_exception_test(f, zipfile.ZIP_STORED) 6274adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao self.large_file_exception_test2(f, zipfile.ZIP_STORED) 6284adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao 6294adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao def zip_test(self, f, compression): 6304adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao # Create the ZIP archive 6314adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao with zipfile.ZipFile(f, "w", compression, allowZip64=True) as zipfp: 6324adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao zipfp.write(TESTFN, "another.name") 6334adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao zipfp.write(TESTFN, TESTFN) 6344adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao zipfp.writestr("strfile", self.data) 6354adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao 6364adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao # Read the ZIP archive 6374adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao with zipfile.ZipFile(f, "r", compression) as zipfp: 6384adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao self.assertEqual(zipfp.read(TESTFN), self.data) 6394adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao self.assertEqual(zipfp.read("another.name"), self.data) 6404adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao self.assertEqual(zipfp.read("strfile"), self.data) 6414adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao 6424adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao # Print the ZIP directory 6434adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao fp = StringIO() 6444adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao stdout = sys.stdout 6454adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao try: 6464adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao sys.stdout = fp 6474adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao zipfp.printdir() 6484adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao finally: 6494adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao sys.stdout = stdout 6504adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao 6514adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao directory = fp.getvalue() 6524adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao lines = directory.splitlines() 6534adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao self.assertEqual(len(lines), 4) # Number of files + header 6544adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao 6554adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao self.assertIn('File Name', lines[0]) 6564adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao self.assertIn('Modified', lines[0]) 6574adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao self.assertIn('Size', lines[0]) 6584adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao 6594adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao fn, date, time_, size = lines[1].split() 6604adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao self.assertEqual(fn, 'another.name') 6614adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao self.assertTrue(time.strptime(date, '%Y-%m-%d')) 6624adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao self.assertTrue(time.strptime(time_, '%H:%M:%S')) 6634adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao self.assertEqual(size, str(len(self.data))) 6644adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao 6654adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao # Check the namelist 6664adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao names = zipfp.namelist() 6674adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao self.assertEqual(len(names), 3) 6684adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao self.assertIn(TESTFN, names) 6694adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao self.assertIn("another.name", names) 6704adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao self.assertIn("strfile", names) 6714adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao 6724adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao # Check infolist 6734adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao infos = zipfp.infolist() 6744adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao names = [i.filename for i in infos] 6754adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao self.assertEqual(len(names), 3) 6764adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao self.assertIn(TESTFN, names) 6774adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao self.assertIn("another.name", names) 6784adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao self.assertIn("strfile", names) 6794adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao for i in infos: 6804adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao self.assertEqual(i.file_size, len(self.data)) 6814adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao 6824adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao # check getinfo 6834adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao for nm in (TESTFN, "another.name", "strfile"): 6844adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao info = zipfp.getinfo(nm) 6854adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao self.assertEqual(info.filename, nm) 6864adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao self.assertEqual(info.file_size, len(self.data)) 6874adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao 6884adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao # Check that testzip doesn't raise an exception 6894adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao zipfp.testzip() 6904adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao 6914adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao def test_stored(self): 6924adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao for f in (TESTFN2, TemporaryFile(), StringIO()): 6934adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao self.zip_test(f, zipfile.ZIP_STORED) 6944adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao 6954adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao @skipUnless(zlib, "requires zlib") 6964adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao def test_deflated(self): 6974adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao for f in (TESTFN2, TemporaryFile(), StringIO()): 6984adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao self.zip_test(f, zipfile.ZIP_DEFLATED) 6994adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao 7004adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao def test_absolute_arcnames(self): 7014adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao with zipfile.ZipFile(TESTFN2, "w", zipfile.ZIP_STORED, 7024adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao allowZip64=True) as zipfp: 7034adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao zipfp.write(TESTFN, "/absolute") 7044adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao 7054adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao with zipfile.ZipFile(TESTFN2, "r", zipfile.ZIP_STORED) as zipfp: 7064adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao self.assertEqual(zipfp.namelist(), ["absolute"]) 7074adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao 7084adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao def tearDown(self): 7094adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao zipfile.ZIP64_LIMIT = self._limit 7104adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao unlink(TESTFN) 7114adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao unlink(TESTFN2) 7124adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao 7134adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao 7144adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaoclass PyZipFileTests(unittest.TestCase): 7154adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao def test_write_pyfile(self): 7164adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao with zipfile.PyZipFile(TemporaryFile(), "w") as zipfp: 7174adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao fn = __file__ 7184adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao if fn.endswith('.pyc') or fn.endswith('.pyo'): 7194adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao fn = fn[:-1] 7204adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao 7214adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao zipfp.writepy(fn) 7224adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao 7234adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao bn = os.path.basename(fn) 7244adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao self.assertNotIn(bn, zipfp.namelist()) 7254adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao self.assertTrue(bn + 'o' in zipfp.namelist() or 7264adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao bn + 'c' in zipfp.namelist()) 7274adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao 7284adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao with zipfile.PyZipFile(TemporaryFile(), "w") as zipfp: 7294adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao fn = __file__ 7304adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao if fn.endswith(('.pyc', '.pyo')): 7314adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao fn = fn[:-1] 7324adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao 7334adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao zipfp.writepy(fn, "testpackage") 7344adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao 7354adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao bn = "%s/%s" % ("testpackage", os.path.basename(fn)) 7364adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao self.assertNotIn(bn, zipfp.namelist()) 7374adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao self.assertTrue(bn + 'o' in zipfp.namelist() or 7384adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao bn + 'c' in zipfp.namelist()) 7394adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao 7404adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao def test_write_python_package(self): 7414adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao import email 7424adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao packagedir = os.path.dirname(email.__file__) 7434adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao 7444adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao with zipfile.PyZipFile(TemporaryFile(), "w") as zipfp: 7454adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao zipfp.writepy(packagedir) 7464adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao 7474adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao # Check for a couple of modules at different levels of the 7484adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao # hierarchy 7494adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao names = zipfp.namelist() 7504adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao self.assertTrue('email/__init__.pyo' in names or 7514adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao 'email/__init__.pyc' in names) 7524adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao self.assertTrue('email/mime/text.pyo' in names or 7534adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao 'email/mime/text.pyc' in names) 7544adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao 7554adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao def test_write_python_directory(self): 7564adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao os.mkdir(TESTFN2) 7574adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao try: 7584adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao with open(os.path.join(TESTFN2, "mod1.py"), "w") as fp: 7594adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao fp.write("print(42)\n") 7604adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao 7614adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao with open(os.path.join(TESTFN2, "mod2.py"), "w") as fp: 7624adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao fp.write("print(42 * 42)\n") 7634adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao 7644adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao with open(os.path.join(TESTFN2, "mod2.txt"), "w") as fp: 7654adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao fp.write("bla bla bla\n") 7664adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao 7674adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao zipfp = zipfile.PyZipFile(TemporaryFile(), "w") 7684adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao zipfp.writepy(TESTFN2) 7694adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao 7704adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao names = zipfp.namelist() 7714adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao self.assertTrue('mod1.pyc' in names or 'mod1.pyo' in names) 7724adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao self.assertTrue('mod2.pyc' in names or 'mod2.pyo' in names) 7734adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao self.assertNotIn('mod2.txt', names) 7744adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao 7754adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao finally: 7764adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao shutil.rmtree(TESTFN2) 7774adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao 7784adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao def test_write_non_pyfile(self): 7794adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao with zipfile.PyZipFile(TemporaryFile(), "w") as zipfp: 7804adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao open(TESTFN, 'w').write('most definitely not a python file') 7814adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao self.assertRaises(RuntimeError, zipfp.writepy, TESTFN) 7824adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao os.remove(TESTFN) 7834adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao 7844adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao 7854adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaoclass OtherTests(unittest.TestCase): 7864adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao zips_with_bad_crc = { 7874adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao zipfile.ZIP_STORED: ( 7884adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao b'PK\003\004\024\0\0\0\0\0 \213\212;:r' 7894adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao b'\253\377\f\0\0\0\f\0\0\0\005\0\0\000af' 7904adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao b'ilehello,AworldP' 7914adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao b'K\001\002\024\003\024\0\0\0\0\0 \213\212;:' 7924adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao b'r\253\377\f\0\0\0\f\0\0\0\005\0\0\0\0' 7934adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao b'\0\0\0\0\0\0\0\200\001\0\0\0\000afi' 7944adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao b'lePK\005\006\0\0\0\0\001\0\001\0003\000' 7954adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao b'\0\0/\0\0\0\0\0'), 7964adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao zipfile.ZIP_DEFLATED: ( 7974adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao b'PK\x03\x04\x14\x00\x00\x00\x08\x00n}\x0c=FA' 7984adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao b'KE\x10\x00\x00\x00n\x00\x00\x00\x05\x00\x00\x00af' 7994adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao b'ile\xcbH\xcd\xc9\xc9W(\xcf/\xcaI\xc9\xa0' 8004adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao b'=\x13\x00PK\x01\x02\x14\x03\x14\x00\x00\x00\x08\x00n' 8014adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao b'}\x0c=FAKE\x10\x00\x00\x00n\x00\x00\x00\x05' 8024adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x80\x01\x00\x00\x00' 8034adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao b'\x00afilePK\x05\x06\x00\x00\x00\x00\x01\x00' 8044adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao b'\x01\x003\x00\x00\x003\x00\x00\x00\x00\x00'), 8054adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao } 8064adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao 8074adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao def test_unicode_filenames(self): 8084adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao with zipfile.ZipFile(TESTFN, "w") as zf: 8094adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao zf.writestr(u"foo.txt", "Test for unicode filename") 8104adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao zf.writestr(u"\xf6.txt", "Test for unicode filename") 8114adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao self.assertIsInstance(zf.infolist()[0].filename, unicode) 8124adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao 8134adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao with zipfile.ZipFile(TESTFN, "r") as zf: 8144adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao self.assertEqual(zf.filelist[0].filename, "foo.txt") 8154adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao self.assertEqual(zf.filelist[1].filename, u"\xf6.txt") 8164adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao 8174adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao def test_create_non_existent_file_for_append(self): 8184adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao if os.path.exists(TESTFN): 8194adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao os.unlink(TESTFN) 8204adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao 8214adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao filename = 'testfile.txt' 8224adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao content = 'hello, world. this is some content.' 8234adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao 8244adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao try: 8254adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao with zipfile.ZipFile(TESTFN, 'a') as zf: 8264adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao zf.writestr(filename, content) 8274adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao except IOError: 8284adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao self.fail('Could not append data to a non-existent zip file.') 8294adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao 8304adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao self.assertTrue(os.path.exists(TESTFN)) 8314adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao 8324adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao with zipfile.ZipFile(TESTFN, 'r') as zf: 8334adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao self.assertEqual(zf.read(filename), content) 8344adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao 8354adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao def test_close_erroneous_file(self): 8364adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao # This test checks that the ZipFile constructor closes the file object 8374adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao # it opens if there's an error in the file. If it doesn't, the 8384adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao # traceback holds a reference to the ZipFile object and, indirectly, 8394adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao # the file object. 8404adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao # On Windows, this causes the os.unlink() call to fail because the 8414adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao # underlying file is still open. This is SF bug #412214. 8424adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao # 8434adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao with open(TESTFN, "w") as fp: 8444adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao fp.write("this is not a legal zip file\n") 8454adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao try: 8464adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao zf = zipfile.ZipFile(TESTFN) 8474adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao except zipfile.BadZipfile: 8484adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao pass 8494adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao 8504adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao def test_is_zip_erroneous_file(self): 8514adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao """Check that is_zipfile() correctly identifies non-zip files.""" 8524adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao # - passing a filename 8534adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao with open(TESTFN, "w") as fp: 8544adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao fp.write("this is not a legal zip file\n") 8554adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao chk = zipfile.is_zipfile(TESTFN) 8564adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao self.assertFalse(chk) 8574adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao # - passing a file object 8584adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao with open(TESTFN, "rb") as fp: 8594adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao chk = zipfile.is_zipfile(fp) 8604adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao self.assertTrue(not chk) 8614adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao # - passing a file-like object 8624adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao fp = StringIO() 8634adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao fp.write("this is not a legal zip file\n") 8644adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao chk = zipfile.is_zipfile(fp) 8654adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao self.assertTrue(not chk) 8664adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao fp.seek(0, 0) 8674adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao chk = zipfile.is_zipfile(fp) 8684adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao self.assertTrue(not chk) 8694adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao 8704adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao def test_damaged_zipfile(self): 8714adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao """Check that zipfiles with missing bytes at the end raise BadZipFile.""" 8724adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao # - Create a valid zip file 8734adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao fp = io.BytesIO() 8744adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao with zipfile.ZipFile(fp, mode="w") as zipf: 8754adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao zipf.writestr("foo.txt", b"O, for a Muse of Fire!") 8764adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao zipfiledata = fp.getvalue() 8774adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao 8784adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao # - Now create copies of it missing the last N bytes and make sure 8794adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao # a BadZipFile exception is raised when we try to open it 8804adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao for N in range(len(zipfiledata)): 8814adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao fp = io.BytesIO(zipfiledata[:N]) 8824adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao self.assertRaises(zipfile.BadZipfile, zipfile.ZipFile, fp) 8834adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao 8844adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao def test_is_zip_valid_file(self): 8854adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao """Check that is_zipfile() correctly identifies zip files.""" 8864adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao # - passing a filename 8874adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao with zipfile.ZipFile(TESTFN, mode="w") as zipf: 8884adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao zipf.writestr("foo.txt", "O, for a Muse of Fire!") 8894adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao chk = zipfile.is_zipfile(TESTFN) 8904adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao self.assertTrue(chk) 8914adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao # - passing a file object 8924adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao with open(TESTFN, "rb") as fp: 8934adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao chk = zipfile.is_zipfile(fp) 8944adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao self.assertTrue(chk) 8954adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao fp.seek(0, 0) 8964adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao zip_contents = fp.read() 8974adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao # - passing a file-like object 8984adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao fp = StringIO() 8994adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao fp.write(zip_contents) 9004adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao chk = zipfile.is_zipfile(fp) 9014adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao self.assertTrue(chk) 9024adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao fp.seek(0, 0) 9034adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao chk = zipfile.is_zipfile(fp) 9044adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao self.assertTrue(chk) 9054adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao 9064adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao def test_non_existent_file_raises_IOError(self): 9074adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao # make sure we don't raise an AttributeError when a partially-constructed 9084adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao # ZipFile instance is finalized; this tests for regression on SF tracker 9094adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao # bug #403871. 9104adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao 9114adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao # The bug we're testing for caused an AttributeError to be raised 9124adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao # when a ZipFile instance was created for a file that did not 9134adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao # exist; the .fp member was not initialized but was needed by the 9144adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao # __del__() method. Since the AttributeError is in the __del__(), 9154adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao # it is ignored, but the user should be sufficiently annoyed by 9164adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao # the message on the output that regression will be noticed 9174adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao # quickly. 9184adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao self.assertRaises(IOError, zipfile.ZipFile, TESTFN) 9194adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao 9204adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao def test_empty_file_raises_BadZipFile(self): 9214adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao with open(TESTFN, 'w') as f: 9224adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao pass 9234adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao self.assertRaises(zipfile.BadZipfile, zipfile.ZipFile, TESTFN) 9244adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao 9254adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao with open(TESTFN, 'w') as fp: 9264adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao fp.write("short file") 9274adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao self.assertRaises(zipfile.BadZipfile, zipfile.ZipFile, TESTFN) 9284adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao 9294adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao def test_closed_zip_raises_RuntimeError(self): 9304adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao """Verify that testzip() doesn't swallow inappropriate exceptions.""" 9314adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao data = StringIO() 9324adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao with zipfile.ZipFile(data, mode="w") as zipf: 9334adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao zipf.writestr("foo.txt", "O, for a Muse of Fire!") 9344adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao 9354adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao # This is correct; calling .read on a closed ZipFile should raise 9364adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao # a RuntimeError, and so should calling .testzip. An earlier 9374adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao # version of .testzip would swallow this exception (and any other) 9384adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao # and report that the first file in the archive was corrupt. 9394adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao self.assertRaises(RuntimeError, zipf.read, "foo.txt") 9404adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao self.assertRaises(RuntimeError, zipf.open, "foo.txt") 9414adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao self.assertRaises(RuntimeError, zipf.testzip) 9424adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao self.assertRaises(RuntimeError, zipf.writestr, "bogus.txt", "bogus") 9434adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao open(TESTFN, 'w').write('zipfile test data') 9444adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao self.assertRaises(RuntimeError, zipf.write, TESTFN) 9454adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao 9464adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao def test_bad_constructor_mode(self): 9474adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao """Check that bad modes passed to ZipFile constructor are caught.""" 9484adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao self.assertRaises(RuntimeError, zipfile.ZipFile, TESTFN, "q") 9494adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao 9504adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao def test_bad_open_mode(self): 9514adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao """Check that bad modes passed to ZipFile.open are caught.""" 9524adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao with zipfile.ZipFile(TESTFN, mode="w") as zipf: 9534adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao zipf.writestr("foo.txt", "O, for a Muse of Fire!") 9544adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao 9554adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao with zipfile.ZipFile(TESTFN, mode="r") as zipf: 9564adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao # read the data to make sure the file is there 9574adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao zipf.read("foo.txt") 9584adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao self.assertRaises(RuntimeError, zipf.open, "foo.txt", "q") 9594adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao 9604adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao def test_read0(self): 9614adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao """Check that calling read(0) on a ZipExtFile object returns an empty 9624adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao string and doesn't advance file pointer.""" 9634adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao with zipfile.ZipFile(TESTFN, mode="w") as zipf: 9644adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao zipf.writestr("foo.txt", "O, for a Muse of Fire!") 9654adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao # read the data to make sure the file is there 9664adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao with zipf.open("foo.txt") as f: 9674adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao for i in xrange(FIXEDTEST_SIZE): 9684adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao self.assertEqual(f.read(0), '') 9694adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao 9704adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao self.assertEqual(f.read(), "O, for a Muse of Fire!") 9714adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao 9724adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao def test_open_non_existent_item(self): 9734adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao """Check that attempting to call open() for an item that doesn't 9744adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao exist in the archive raises a RuntimeError.""" 9754adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao with zipfile.ZipFile(TESTFN, mode="w") as zipf: 9764adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao self.assertRaises(KeyError, zipf.open, "foo.txt", "r") 9774adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao 9784adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao def test_bad_compression_mode(self): 9794adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao """Check that bad compression methods passed to ZipFile.open are 9804adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao caught.""" 9814adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao self.assertRaises(RuntimeError, zipfile.ZipFile, TESTFN, "w", -1) 9824adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao 9834adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao def test_unsupported_compression(self): 9844adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao # data is declared as shrunk, but actually deflated 9854adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao data = (b'PK\x03\x04.\x00\x00\x00\x01\x00\xe4C\xa1@\x00\x00\x00' 9864adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao b'\x00\x02\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00x\x03\x00PK\x01' 9874adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao b'\x02.\x03.\x00\x00\x00\x01\x00\xe4C\xa1@\x00\x00\x00\x00\x02\x00\x00' 9884adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao b'\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00' 9894adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao b'\x80\x01\x00\x00\x00\x00xPK\x05\x06\x00\x00\x00\x00\x01\x00\x01\x00' 9904adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao b'/\x00\x00\x00!\x00\x00\x00\x00\x00') 9914adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao with zipfile.ZipFile(io.BytesIO(data), 'r') as zipf: 9924adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao self.assertRaises(NotImplementedError, zipf.open, 'x') 9934adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao 9944adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao def test_null_byte_in_filename(self): 9954adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao """Check that a filename containing a null byte is properly 9964adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao terminated.""" 9974adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao with zipfile.ZipFile(TESTFN, mode="w") as zipf: 9984adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao zipf.writestr("foo.txt\x00qqq", "O, for a Muse of Fire!") 9994adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao self.assertEqual(zipf.namelist(), ['foo.txt']) 10004adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao 10014adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao def test_struct_sizes(self): 10024adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao """Check that ZIP internal structure sizes are calculated correctly.""" 10034adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao self.assertEqual(zipfile.sizeEndCentDir, 22) 10044adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao self.assertEqual(zipfile.sizeCentralDir, 46) 10054adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao self.assertEqual(zipfile.sizeEndCentDir64, 56) 10064adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao self.assertEqual(zipfile.sizeEndCentDir64Locator, 20) 10074adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao 10084adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao def test_comments(self): 10094adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao """Check that comments on the archive are handled properly.""" 10104adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao 10114adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao # check default comment is empty 10124adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao with zipfile.ZipFile(TESTFN, mode="w") as zipf: 10134adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao self.assertEqual(zipf.comment, '') 10144adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao zipf.writestr("foo.txt", "O, for a Muse of Fire!") 10154adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao 10164adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao with zipfile.ZipFile(TESTFN, mode="r") as zipf: 10174adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao self.assertEqual(zipf.comment, '') 10184adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao 10194adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao # check a simple short comment 10204adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao comment = 'Bravely taking to his feet, he beat a very brave retreat.' 10214adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao with zipfile.ZipFile(TESTFN, mode="w") as zipf: 10224adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao zipf.comment = comment 10234adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao zipf.writestr("foo.txt", "O, for a Muse of Fire!") 10244adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao with zipfile.ZipFile(TESTFN, mode="r") as zipf: 10254adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao self.assertEqual(zipf.comment, comment) 10264adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao 10274adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao # check a comment of max length 10284adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao comment2 = ''.join(['%d' % (i**3 % 10) for i in xrange((1 << 16)-1)]) 10294adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao with zipfile.ZipFile(TESTFN, mode="w") as zipf: 10304adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao zipf.comment = comment2 10314adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao zipf.writestr("foo.txt", "O, for a Muse of Fire!") 10324adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao 10334adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao with zipfile.ZipFile(TESTFN, mode="r") as zipf: 10344adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao self.assertEqual(zipf.comment, comment2) 10354adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao 10364adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao # check a comment that is too long is truncated 10374adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao with zipfile.ZipFile(TESTFN, mode="w") as zipf: 10384adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao zipf.comment = comment2 + 'oops' 10394adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao zipf.writestr("foo.txt", "O, for a Muse of Fire!") 10404adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao with zipfile.ZipFile(TESTFN, mode="r") as zipf: 10414adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao self.assertEqual(zipf.comment, comment2) 10424adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao 10434adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao def test_change_comment_in_empty_archive(self): 10444adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao with zipfile.ZipFile(TESTFN, "a", zipfile.ZIP_STORED) as zipf: 10454adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao self.assertFalse(zipf.filelist) 10464adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao zipf.comment = b"this is a comment" 10474adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao with zipfile.ZipFile(TESTFN, "r") as zipf: 10484adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao self.assertEqual(zipf.comment, b"this is a comment") 10494adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao 10504adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao def test_change_comment_in_nonempty_archive(self): 10514adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao with zipfile.ZipFile(TESTFN, "w", zipfile.ZIP_STORED) as zipf: 10524adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao zipf.writestr("foo.txt", "O, for a Muse of Fire!") 10534adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao with zipfile.ZipFile(TESTFN, "a", zipfile.ZIP_STORED) as zipf: 10544adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao self.assertTrue(zipf.filelist) 10554adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao zipf.comment = b"this is a comment" 10564adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao with zipfile.ZipFile(TESTFN, "r") as zipf: 10574adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao self.assertEqual(zipf.comment, b"this is a comment") 10584adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao 10594adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao def check_testzip_with_bad_crc(self, compression): 10604adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao """Tests that files with bad CRCs return their name from testzip.""" 10614adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao zipdata = self.zips_with_bad_crc[compression] 10624adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao 10634adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao with zipfile.ZipFile(io.BytesIO(zipdata), mode="r") as zipf: 10644adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao # testzip returns the name of the first corrupt file, or None 10654adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao self.assertEqual('afile', zipf.testzip()) 10664adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao 10674adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao def test_testzip_with_bad_crc_stored(self): 10684adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao self.check_testzip_with_bad_crc(zipfile.ZIP_STORED) 10694adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao 10704adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao @skipUnless(zlib, "requires zlib") 10714adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao def test_testzip_with_bad_crc_deflated(self): 10724adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao self.check_testzip_with_bad_crc(zipfile.ZIP_DEFLATED) 10734adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao 10744adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao def check_read_with_bad_crc(self, compression): 10754adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao """Tests that files with bad CRCs raise a BadZipfile exception when read.""" 10764adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao zipdata = self.zips_with_bad_crc[compression] 10774adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao 10784adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao # Using ZipFile.read() 10794adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao with zipfile.ZipFile(io.BytesIO(zipdata), mode="r") as zipf: 10804adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao self.assertRaises(zipfile.BadZipfile, zipf.read, 'afile') 10814adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao 10824adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao # Using ZipExtFile.read() 10834adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao with zipfile.ZipFile(io.BytesIO(zipdata), mode="r") as zipf: 10844adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao with zipf.open('afile', 'r') as corrupt_file: 10854adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao self.assertRaises(zipfile.BadZipfile, corrupt_file.read) 10864adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao 10874adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao # Same with small reads (in order to exercise the buffering logic) 10884adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao with zipfile.ZipFile(io.BytesIO(zipdata), mode="r") as zipf: 10894adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao with zipf.open('afile', 'r') as corrupt_file: 10904adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao corrupt_file.MIN_READ_SIZE = 2 10914adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao with self.assertRaises(zipfile.BadZipfile): 10924adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao while corrupt_file.read(2): 10934adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao pass 10944adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao 10954adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao def test_read_with_bad_crc_stored(self): 10964adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao self.check_read_with_bad_crc(zipfile.ZIP_STORED) 10974adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao 10984adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao @skipUnless(zlib, "requires zlib") 10994adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao def test_read_with_bad_crc_deflated(self): 11004adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao self.check_read_with_bad_crc(zipfile.ZIP_DEFLATED) 11014adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao 11024adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao def check_read_return_size(self, compression): 11034adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao # Issue #9837: ZipExtFile.read() shouldn't return more bytes 11044adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao # than requested. 11054adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao for test_size in (1, 4095, 4096, 4097, 16384): 11064adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao file_size = test_size + 1 11074adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao junk = b''.join(struct.pack('B', randint(0, 255)) 11084adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao for x in range(file_size)) 11094adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao with zipfile.ZipFile(io.BytesIO(), "w", compression) as zipf: 11104adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao zipf.writestr('foo', junk) 11114adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao with zipf.open('foo', 'r') as fp: 11124adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao buf = fp.read(test_size) 11134adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao self.assertEqual(len(buf), test_size) 11144adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao 11154adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao def test_read_return_size_stored(self): 11164adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao self.check_read_return_size(zipfile.ZIP_STORED) 11174adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao 11184adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao @skipUnless(zlib, "requires zlib") 11194adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao def test_read_return_size_deflated(self): 11204adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao self.check_read_return_size(zipfile.ZIP_DEFLATED) 11214adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao 11224adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao def test_empty_zipfile(self): 11234adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao # Check that creating a file in 'w' or 'a' mode and closing without 11244adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao # adding any files to the archives creates a valid empty ZIP file 11254adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao with zipfile.ZipFile(TESTFN, mode="w") as zipf: 11264adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao pass 11274adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao try: 11284adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao zipf = zipfile.ZipFile(TESTFN, mode="r") 11294adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao except zipfile.BadZipfile: 11304adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao self.fail("Unable to create empty ZIP file in 'w' mode") 11314adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao 11324adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao with zipfile.ZipFile(TESTFN, mode="a") as zipf: 11334adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao pass 11344adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao try: 11354adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao zipf = zipfile.ZipFile(TESTFN, mode="r") 11364adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao except: 11374adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao self.fail("Unable to create empty ZIP file in 'a' mode") 11384adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao 11394adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao def test_open_empty_file(self): 11404adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao # Issue 1710703: Check that opening a file with less than 22 bytes 11414adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao # raises a BadZipfile exception (rather than the previously unhelpful 11424adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao # IOError) 11434adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao with open(TESTFN, 'w') as f: 11444adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao pass 11454adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao self.assertRaises(zipfile.BadZipfile, zipfile.ZipFile, TESTFN, 'r') 11464adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao 11474adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao def test_create_zipinfo_before_1980(self): 11484adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao self.assertRaises(ValueError, 11494adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao zipfile.ZipInfo, 'seventies', (1979, 1, 1, 0, 0, 0)) 11504adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao 11514adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao def tearDown(self): 11524adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao unlink(TESTFN) 11534adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao unlink(TESTFN2) 11544adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao 11554adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao 11564adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaoclass DecryptionTests(unittest.TestCase): 11574adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao """Check that ZIP decryption works. Since the library does not 11584adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao support encryption at the moment, we use a pre-generated encrypted 11594adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao ZIP file.""" 11604adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao 11614adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao data = ( 11624adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao 'PK\x03\x04\x14\x00\x01\x00\x00\x00n\x92i.#y\xef?&\x00\x00\x00\x1a\x00' 11634adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao '\x00\x00\x08\x00\x00\x00test.txt\xfa\x10\xa0gly|\xfa-\xc5\xc0=\xf9y' 11644adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao '\x18\xe0\xa8r\xb3Z}Lg\xbc\xae\xf9|\x9b\x19\xe4\x8b\xba\xbb)\x8c\xb0\xdbl' 11654adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao 'PK\x01\x02\x14\x00\x14\x00\x01\x00\x00\x00n\x92i.#y\xef?&\x00\x00\x00' 11664adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao '\x1a\x00\x00\x00\x08\x00\x00\x00\x00\x00\x00\x00\x01\x00 \x00\xb6\x81' 11674adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao '\x00\x00\x00\x00test.txtPK\x05\x06\x00\x00\x00\x00\x01\x00\x01\x006\x00' 11684adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao '\x00\x00L\x00\x00\x00\x00\x00' ) 11694adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao data2 = ( 11704adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao 'PK\x03\x04\x14\x00\t\x00\x08\x00\xcf}38xu\xaa\xb2\x14\x00\x00\x00\x00\x02' 11714adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao '\x00\x00\x04\x00\x15\x00zeroUT\t\x00\x03\xd6\x8b\x92G\xda\x8b\x92GUx\x04' 11724adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao '\x00\xe8\x03\xe8\x03\xc7<M\xb5a\xceX\xa3Y&\x8b{oE\xd7\x9d\x8c\x98\x02\xc0' 11734adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao 'PK\x07\x08xu\xaa\xb2\x14\x00\x00\x00\x00\x02\x00\x00PK\x01\x02\x17\x03' 11744adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao '\x14\x00\t\x00\x08\x00\xcf}38xu\xaa\xb2\x14\x00\x00\x00\x00\x02\x00\x00' 11754adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao '\x04\x00\r\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\x00\x00\x00\x00ze' 11764adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao 'roUT\x05\x00\x03\xd6\x8b\x92GUx\x00\x00PK\x05\x06\x00\x00\x00\x00\x01' 11774adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao '\x00\x01\x00?\x00\x00\x00[\x00\x00\x00\x00\x00' ) 11784adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao 11794adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao plain = 'zipfile.py encryption test' 11804adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao plain2 = '\x00'*512 11814adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao 11824adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao def setUp(self): 11834adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao with open(TESTFN, "wb") as fp: 11844adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao fp.write(self.data) 11854adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao self.zip = zipfile.ZipFile(TESTFN, "r") 11864adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao with open(TESTFN2, "wb") as fp: 11874adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao fp.write(self.data2) 11884adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao self.zip2 = zipfile.ZipFile(TESTFN2, "r") 11894adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao 11904adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao def tearDown(self): 11914adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao self.zip.close() 11924adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao os.unlink(TESTFN) 11934adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao self.zip2.close() 11944adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao os.unlink(TESTFN2) 11954adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao 11964adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao def test_no_password(self): 11974adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao # Reading the encrypted file without password 11984adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao # must generate a RunTime exception 11994adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao self.assertRaises(RuntimeError, self.zip.read, "test.txt") 12004adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao self.assertRaises(RuntimeError, self.zip2.read, "zero") 12014adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao 12024adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao def test_bad_password(self): 12034adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao self.zip.setpassword("perl") 12044adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao self.assertRaises(RuntimeError, self.zip.read, "test.txt") 12054adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao self.zip2.setpassword("perl") 12064adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao self.assertRaises(RuntimeError, self.zip2.read, "zero") 12074adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao 12084adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao @skipUnless(zlib, "requires zlib") 12094adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao def test_good_password(self): 12104adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao self.zip.setpassword("python") 12114adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao self.assertEqual(self.zip.read("test.txt"), self.plain) 12124adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao self.zip2.setpassword("12345") 12134adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao self.assertEqual(self.zip2.read("zero"), self.plain2) 12144adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao 12154adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao 12164adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaoclass TestsWithRandomBinaryFiles(unittest.TestCase): 12174adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao def setUp(self): 12184adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao datacount = randint(16, 64)*1024 + randint(1, 1024) 12194adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao self.data = ''.join(struct.pack('<f', random()*randint(-1000, 1000)) 12204adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao for i in xrange(datacount)) 12214adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao 12224adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao # Make a source file with some lines 12234adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao with open(TESTFN, "wb") as fp: 12244adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao fp.write(self.data) 12254adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao 12264adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao def tearDown(self): 12274adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao unlink(TESTFN) 12284adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao unlink(TESTFN2) 12294adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao 12304adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao def make_test_archive(self, f, compression): 12314adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao # Create the ZIP archive 12324adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao with zipfile.ZipFile(f, "w", compression) as zipfp: 12334adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao zipfp.write(TESTFN, "another.name") 12344adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao zipfp.write(TESTFN, TESTFN) 12354adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao 12364adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao def zip_test(self, f, compression): 12374adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao self.make_test_archive(f, compression) 12384adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao 12394adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao # Read the ZIP archive 12404adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao with zipfile.ZipFile(f, "r", compression) as zipfp: 12414adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao testdata = zipfp.read(TESTFN) 12424adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao self.assertEqual(len(testdata), len(self.data)) 12434adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao self.assertEqual(testdata, self.data) 12444adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao self.assertEqual(zipfp.read("another.name"), self.data) 12454adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao 12464adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao def test_stored(self): 12474adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao for f in (TESTFN2, TemporaryFile(), StringIO()): 12484adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao self.zip_test(f, zipfile.ZIP_STORED) 12494adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao 12504adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao @skipUnless(zlib, "requires zlib") 12514adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao def test_deflated(self): 12524adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao for f in (TESTFN2, TemporaryFile(), io.BytesIO()): 12534adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao self.zip_test(f, zipfile.ZIP_DEFLATED) 12544adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao 12554adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao def zip_open_test(self, f, compression): 12564adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao self.make_test_archive(f, compression) 12574adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao 12584adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao # Read the ZIP archive 12594adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao with zipfile.ZipFile(f, "r", compression) as zipfp: 12604adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao zipdata1 = [] 12614adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao with zipfp.open(TESTFN) as zipopen1: 12624adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao while True: 12634adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao read_data = zipopen1.read(256) 12644adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao if not read_data: 12654adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao break 12664adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao zipdata1.append(read_data) 12674adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao 12684adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao zipdata2 = [] 12694adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao with zipfp.open("another.name") as zipopen2: 12704adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao while True: 12714adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao read_data = zipopen2.read(256) 12724adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao if not read_data: 12734adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao break 12744adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao zipdata2.append(read_data) 12754adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao 12764adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao testdata1 = ''.join(zipdata1) 12774adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao self.assertEqual(len(testdata1), len(self.data)) 12784adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao self.assertEqual(testdata1, self.data) 12794adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao 12804adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao testdata2 = ''.join(zipdata2) 12814adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao self.assertEqual(len(testdata2), len(self.data)) 12824adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao self.assertEqual(testdata2, self.data) 12834adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao 12844adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao def test_open_stored(self): 12854adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao for f in (TESTFN2, TemporaryFile(), StringIO()): 12864adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao self.zip_open_test(f, zipfile.ZIP_STORED) 12874adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao 12884adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao @skipUnless(zlib, "requires zlib") 12894adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao def test_open_deflated(self): 12904adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao for f in (TESTFN2, TemporaryFile(), io.BytesIO()): 12914adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao self.zip_open_test(f, zipfile.ZIP_DEFLATED) 12924adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao 12934adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao def zip_random_open_test(self, f, compression): 12944adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao self.make_test_archive(f, compression) 12954adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao 12964adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao # Read the ZIP archive 12974adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao with zipfile.ZipFile(f, "r", compression) as zipfp: 12984adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao zipdata1 = [] 12994adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao with zipfp.open(TESTFN) as zipopen1: 13004adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao while True: 13014adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao read_data = zipopen1.read(randint(1, 1024)) 13024adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao if not read_data: 13034adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao break 13044adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao zipdata1.append(read_data) 13054adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao 13064adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao testdata = ''.join(zipdata1) 13074adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao self.assertEqual(len(testdata), len(self.data)) 13084adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao self.assertEqual(testdata, self.data) 13094adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao 13104adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao def test_random_open_stored(self): 13114adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao for f in (TESTFN2, TemporaryFile(), StringIO()): 13124adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao self.zip_random_open_test(f, zipfile.ZIP_STORED) 13134adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao 13144adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao @skipUnless(zlib, "requires zlib") 13154adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao def test_random_open_deflated(self): 13164adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao for f in (TESTFN2, TemporaryFile(), io.BytesIO()): 13174adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao self.zip_random_open_test(f, zipfile.ZIP_DEFLATED) 13184adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao 13194adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao 13204adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao@skipUnless(zlib, "requires zlib") 13214adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaoclass TestsWithMultipleOpens(unittest.TestCase): 13224adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao def setUp(self): 13234adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao # Create the ZIP archive 13244adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao with zipfile.ZipFile(TESTFN2, "w", zipfile.ZIP_DEFLATED) as zipfp: 13254adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao zipfp.writestr('ones', '1'*FIXEDTEST_SIZE) 13264adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao zipfp.writestr('twos', '2'*FIXEDTEST_SIZE) 13274adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao 13284adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao def test_same_file(self): 13294adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao # Verify that (when the ZipFile is in control of creating file objects) 13304adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao # multiple open() calls can be made without interfering with each other. 13314adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao with zipfile.ZipFile(TESTFN2, mode="r") as zipf: 13324adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao zopen1 = zipf.open('ones') 13334adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao zopen2 = zipf.open('ones') 13344adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao data1 = zopen1.read(500) 13354adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao data2 = zopen2.read(500) 13364adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao data1 += zopen1.read(500) 13374adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao data2 += zopen2.read(500) 13384adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao self.assertEqual(data1, data2) 13394adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao 13404adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao def test_different_file(self): 13414adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao # Verify that (when the ZipFile is in control of creating file objects) 13424adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao # multiple open() calls can be made without interfering with each other. 13434adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao with zipfile.ZipFile(TESTFN2, mode="r") as zipf: 13444adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao with zipf.open('ones') as zopen1, zipf.open('twos') as zopen2: 13454adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao data1 = zopen1.read(500) 13464adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao data2 = zopen2.read(500) 13474adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao data1 += zopen1.read(500) 13484adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao data2 += zopen2.read(500) 13494adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao self.assertEqual(data1, '1'*FIXEDTEST_SIZE) 13504adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao self.assertEqual(data2, '2'*FIXEDTEST_SIZE) 13514adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao 13524adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao def test_interleaved(self): 13534adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao # Verify that (when the ZipFile is in control of creating file objects) 13544adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao # multiple open() calls can be made without interfering with each other. 13554adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao with zipfile.ZipFile(TESTFN2, mode="r") as zipf: 13564adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao with zipf.open('ones') as zopen1, zipf.open('twos') as zopen2: 13574adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao data1 = zopen1.read(500) 13584adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao data2 = zopen2.read(500) 13594adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao data1 += zopen1.read(500) 13604adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao data2 += zopen2.read(500) 13614adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao self.assertEqual(data1, '1'*FIXEDTEST_SIZE) 13624adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao self.assertEqual(data2, '2'*FIXEDTEST_SIZE) 13634adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao 13644adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao def tearDown(self): 13654adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao unlink(TESTFN2) 13664adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao 13674adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao 13684adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaoclass TestWithDirectory(unittest.TestCase): 13694adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao def setUp(self): 13704adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao os.mkdir(TESTFN2) 13714adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao 13724adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao def test_extract_dir(self): 13734adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao with zipfile.ZipFile(findfile("zipdir.zip")) as zipf: 13744adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao zipf.extractall(TESTFN2) 13754adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao self.assertTrue(os.path.isdir(os.path.join(TESTFN2, "a"))) 13764adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao self.assertTrue(os.path.isdir(os.path.join(TESTFN2, "a", "b"))) 13774adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao self.assertTrue(os.path.exists(os.path.join(TESTFN2, "a", "b", "c"))) 13784adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao 13794adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao def test_bug_6050(self): 13804adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao # Extraction should succeed if directories already exist 13814adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao os.mkdir(os.path.join(TESTFN2, "a")) 13824adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao self.test_extract_dir() 13834adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao 13844adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao def test_store_dir(self): 13854adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao os.mkdir(os.path.join(TESTFN2, "x")) 13864adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao zipf = zipfile.ZipFile(TESTFN, "w") 13874adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao zipf.write(os.path.join(TESTFN2, "x"), "x") 13884adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao self.assertTrue(zipf.filelist[0].filename.endswith("x/")) 13894adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao 13904adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao def tearDown(self): 13914adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao shutil.rmtree(TESTFN2) 13924adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao if os.path.exists(TESTFN): 13934adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao unlink(TESTFN) 13944adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao 13954adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao 13964adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaoclass UniversalNewlineTests(unittest.TestCase): 13974adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao def setUp(self): 13984adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao self.line_gen = ["Test of zipfile line %d." % i 13994adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao for i in xrange(FIXEDTEST_SIZE)] 14004adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao self.seps = ('\r', '\r\n', '\n') 14014adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao self.arcdata, self.arcfiles = {}, {} 14024adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao for n, s in enumerate(self.seps): 14034adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao self.arcdata[s] = s.join(self.line_gen) + s 14044adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao self.arcfiles[s] = '%s-%d' % (TESTFN, n) 14054adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao open(self.arcfiles[s], "wb").write(self.arcdata[s]) 14064adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao 14074adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao def make_test_archive(self, f, compression): 14084adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao # Create the ZIP archive 14094adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao with zipfile.ZipFile(f, "w", compression) as zipfp: 14104adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao for fn in self.arcfiles.values(): 14114adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao zipfp.write(fn, fn) 14124adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao 14134adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao def read_test(self, f, compression): 14144adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao self.make_test_archive(f, compression) 14154adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao 14164adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao # Read the ZIP archive 14174adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao with zipfile.ZipFile(f, "r") as zipfp: 14184adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao for sep, fn in self.arcfiles.items(): 14194adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao with zipfp.open(fn, "rU") as fp: 14204adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao zipdata = fp.read() 14214adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao self.assertEqual(self.arcdata[sep], zipdata) 14224adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao 14234adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao def readline_read_test(self, f, compression): 14244adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao self.make_test_archive(f, compression) 14254adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao 14264adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao # Read the ZIP archive 14274adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao zipfp = zipfile.ZipFile(f, "r") 14284adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao for sep, fn in self.arcfiles.items(): 14294adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao with zipfp.open(fn, "rU") as zipopen: 14304adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao data = '' 14314adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao while True: 14324adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao read = zipopen.readline() 14334adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao if not read: 14344adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao break 14354adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao data += read 14364adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao 14374adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao read = zipopen.read(5) 14384adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao if not read: 14394adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao break 14404adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao data += read 14414adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao 14424adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao self.assertEqual(data, self.arcdata['\n']) 14434adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao 14444adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao zipfp.close() 14454adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao 14464adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao def readline_test(self, f, compression): 14474adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao self.make_test_archive(f, compression) 14484adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao 14494adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao # Read the ZIP archive 14504adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao with zipfile.ZipFile(f, "r") as zipfp: 14514adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao for sep, fn in self.arcfiles.items(): 14524adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao with zipfp.open(fn, "rU") as zipopen: 14534adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao for line in self.line_gen: 14544adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao linedata = zipopen.readline() 14554adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao self.assertEqual(linedata, line + '\n') 14564adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao 14574adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao def readlines_test(self, f, compression): 14584adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao self.make_test_archive(f, compression) 14594adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao 14604adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao # Read the ZIP archive 14614adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao with zipfile.ZipFile(f, "r") as zipfp: 14624adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao for sep, fn in self.arcfiles.items(): 14634adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao with zipfp.open(fn, "rU") as fp: 14644adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao ziplines = fp.readlines() 14654adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao for line, zipline in zip(self.line_gen, ziplines): 14664adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao self.assertEqual(zipline, line + '\n') 14674adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao 14684adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao def iterlines_test(self, f, compression): 14694adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao self.make_test_archive(f, compression) 14704adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao 14714adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao # Read the ZIP archive 14724adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao with zipfile.ZipFile(f, "r") as zipfp: 14734adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao for sep, fn in self.arcfiles.items(): 14744adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao for line, zipline in zip(self.line_gen, zipfp.open(fn, "rU")): 14754adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao self.assertEqual(zipline, line + '\n') 14764adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao 14774adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao def test_read_stored(self): 14784adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao for f in (TESTFN2, TemporaryFile(), StringIO()): 14794adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao self.read_test(f, zipfile.ZIP_STORED) 14804adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao 14814adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao def test_readline_read_stored(self): 14824adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao # Issue #7610: calls to readline() interleaved with calls to read(). 14834adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao for f in (TESTFN2, TemporaryFile(), StringIO()): 14844adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao self.readline_read_test(f, zipfile.ZIP_STORED) 14854adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao 14864adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao def test_readline_stored(self): 14874adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao for f in (TESTFN2, TemporaryFile(), StringIO()): 14884adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao self.readline_test(f, zipfile.ZIP_STORED) 14894adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao 14904adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao def test_readlines_stored(self): 14914adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao for f in (TESTFN2, TemporaryFile(), StringIO()): 14924adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao self.readlines_test(f, zipfile.ZIP_STORED) 14934adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao 14944adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao def test_iterlines_stored(self): 14954adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao for f in (TESTFN2, TemporaryFile(), StringIO()): 14964adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao self.iterlines_test(f, zipfile.ZIP_STORED) 14974adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao 14984adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao @skipUnless(zlib, "requires zlib") 14994adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao def test_read_deflated(self): 15004adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao for f in (TESTFN2, TemporaryFile(), StringIO()): 15014adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao self.read_test(f, zipfile.ZIP_DEFLATED) 15024adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao 15034adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao @skipUnless(zlib, "requires zlib") 15044adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao def test_readline_read_deflated(self): 15054adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao # Issue #7610: calls to readline() interleaved with calls to read(). 15064adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao for f in (TESTFN2, TemporaryFile(), StringIO()): 15074adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao self.readline_read_test(f, zipfile.ZIP_DEFLATED) 15084adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao 15094adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao @skipUnless(zlib, "requires zlib") 15104adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao def test_readline_deflated(self): 15114adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao for f in (TESTFN2, TemporaryFile(), StringIO()): 15124adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao self.readline_test(f, zipfile.ZIP_DEFLATED) 15134adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao 15144adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao @skipUnless(zlib, "requires zlib") 15154adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao def test_readlines_deflated(self): 15164adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao for f in (TESTFN2, TemporaryFile(), StringIO()): 15174adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao self.readlines_test(f, zipfile.ZIP_DEFLATED) 15184adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao 15194adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao @skipUnless(zlib, "requires zlib") 15204adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao def test_iterlines_deflated(self): 15214adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao for f in (TESTFN2, TemporaryFile(), StringIO()): 15224adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao self.iterlines_test(f, zipfile.ZIP_DEFLATED) 15234adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao 15244adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao def tearDown(self): 15254adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao for sep, fn in self.arcfiles.items(): 15264adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao os.remove(fn) 15274adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao unlink(TESTFN) 15284adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao unlink(TESTFN2) 15294adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao 15304adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao 15314adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaodef test_main(): 15324adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao run_unittest(TestsWithSourceFile, TestZip64InSmallFiles, OtherTests, 15334adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao PyZipFileTests, DecryptionTests, TestsWithMultipleOpens, 15344adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao TestWithDirectory, UniversalNewlineTests, 15354adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao TestsWithRandomBinaryFiles) 15364adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao 15374adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaoif __name__ == "__main__": 15384adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao test_main() 1539