1ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh# We can test part of the module without zlib. 2ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsiehtry: 3ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh import zlib 4ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsiehexcept ImportError: 5ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh zlib = None 6ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 7ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsiehimport os 8ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsiehimport io 9ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsiehimport sys 10ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsiehimport time 11ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsiehimport shutil 12ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsiehimport struct 13ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsiehimport zipfile 14ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsiehimport unittest 15ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 16ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsiehfrom StringIO import StringIO 17ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsiehfrom tempfile import TemporaryFile 18ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsiehfrom random import randint, random 19ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsiehfrom unittest import skipUnless 20ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 21ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsiehfrom test.test_support import TESTFN, TESTFN_UNICODE, TESTFN_ENCODING, \ 22ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh run_unittest, findfile, unlink 23ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsiehtry: 24ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh TESTFN_UNICODE.encode(TESTFN_ENCODING) 25ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsiehexcept (UnicodeError, TypeError): 26ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh # Either the file system encoding is None, or the file name 27ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh # cannot be encoded in the file system encoding. 28ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh TESTFN_UNICODE = None 29ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 30ffab958fd8d42ed7227d83007350e61555a1fa36Andrew HsiehTESTFN2 = TESTFN + "2" 31ffab958fd8d42ed7227d83007350e61555a1fa36Andrew HsiehTESTFNDIR = TESTFN + "d" 32ffab958fd8d42ed7227d83007350e61555a1fa36Andrew HsiehFIXEDTEST_SIZE = 1000 33ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 34ffab958fd8d42ed7227d83007350e61555a1fa36Andrew HsiehSMALL_TEST_DATA = [('_ziptest1', '1q2w3e4r5t'), 35ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh ('ziptest2dir/_ziptest2', 'qawsedrftg'), 36ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh ('ziptest2dir/ziptest3dir/_ziptest3', 'azsxdcfvgb'), 37ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh ('ziptest2dir/ziptest3dir/ziptest4dir/_ziptest3', '6y7u8i9o0p')] 38ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 39ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 40ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsiehclass TestsWithSourceFile(unittest.TestCase): 41ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh def setUp(self): 42ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.line_gen = ["Zipfile test line %d. random float: %f" % (i, random()) 43ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh for i in xrange(FIXEDTEST_SIZE)] 44ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.data = '\n'.join(self.line_gen) + '\n' 45ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 46ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh # Make a source file with some lines 47ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh with open(TESTFN, "wb") as fp: 48ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh fp.write(self.data) 49ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 50ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh def make_test_archive(self, f, compression): 51ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh # Create the ZIP archive 52ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh with zipfile.ZipFile(f, "w", compression) as zipfp: 53ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh zipfp.write(TESTFN, "another.name") 54ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh zipfp.write(TESTFN, TESTFN) 55ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh zipfp.writestr("strfile", self.data) 56ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 57ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh def zip_test(self, f, compression): 58ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.make_test_archive(f, compression) 59ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 60ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh # Read the ZIP archive 61ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh with zipfile.ZipFile(f, "r", compression) as zipfp: 62ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertEqual(zipfp.read(TESTFN), self.data) 63ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertEqual(zipfp.read("another.name"), self.data) 64ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertEqual(zipfp.read("strfile"), self.data) 65ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 66ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh # Print the ZIP directory 67ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh fp = StringIO() 68ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh stdout = sys.stdout 69ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh try: 70ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh sys.stdout = fp 71ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh zipfp.printdir() 72ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh finally: 73ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh sys.stdout = stdout 74ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 75ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh directory = fp.getvalue() 76ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh lines = directory.splitlines() 77ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertEqual(len(lines), 4) # Number of files + header 78ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 79ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertIn('File Name', lines[0]) 80ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertIn('Modified', lines[0]) 81ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertIn('Size', lines[0]) 82ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 83ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh fn, date, time_, size = lines[1].split() 84ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertEqual(fn, 'another.name') 85ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertTrue(time.strptime(date, '%Y-%m-%d')) 86ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertTrue(time.strptime(time_, '%H:%M:%S')) 87ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertEqual(size, str(len(self.data))) 88ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 89ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh # Check the namelist 90ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh names = zipfp.namelist() 91ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertEqual(len(names), 3) 92ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertIn(TESTFN, names) 93ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertIn("another.name", names) 94ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertIn("strfile", names) 95ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 96ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh # Check infolist 97ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh infos = zipfp.infolist() 98ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh names = [i.filename for i in infos] 99ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertEqual(len(names), 3) 100ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertIn(TESTFN, names) 101ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertIn("another.name", names) 102ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertIn("strfile", names) 103ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh for i in infos: 104ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertEqual(i.file_size, len(self.data)) 105ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 106ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh # check getinfo 107ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh for nm in (TESTFN, "another.name", "strfile"): 108ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh info = zipfp.getinfo(nm) 109ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertEqual(info.filename, nm) 110ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertEqual(info.file_size, len(self.data)) 111ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 112ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh # Check that testzip doesn't raise an exception 113ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh zipfp.testzip() 114ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 115ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh def test_stored(self): 116ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh for f in (TESTFN2, TemporaryFile(), StringIO()): 117ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.zip_test(f, zipfile.ZIP_STORED) 118ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 119ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh def zip_open_test(self, f, compression): 120ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.make_test_archive(f, compression) 121ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 122ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh # Read the ZIP archive 123ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh with zipfile.ZipFile(f, "r", compression) as zipfp: 124ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh zipdata1 = [] 125ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh with zipfp.open(TESTFN) as zipopen1: 126ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh while True: 127ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh read_data = zipopen1.read(256) 128ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh if not read_data: 129ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh break 130ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh zipdata1.append(read_data) 131ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 132ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh zipdata2 = [] 133ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh with zipfp.open("another.name") as zipopen2: 134ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh while True: 135ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh read_data = zipopen2.read(256) 136ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh if not read_data: 137ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh break 138ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh zipdata2.append(read_data) 139ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 140ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertEqual(''.join(zipdata1), self.data) 141ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertEqual(''.join(zipdata2), self.data) 142ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 143ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh def test_open_stored(self): 144ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh for f in (TESTFN2, TemporaryFile(), StringIO()): 145ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.zip_open_test(f, zipfile.ZIP_STORED) 146ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 147ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh def test_open_via_zip_info(self): 148ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh # Create the ZIP archive 149ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh with zipfile.ZipFile(TESTFN2, "w", zipfile.ZIP_STORED) as zipfp: 150ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh zipfp.writestr("name", "foo") 151ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh zipfp.writestr("name", "bar") 152ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 153ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh with zipfile.ZipFile(TESTFN2, "r") as zipfp: 154ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh infos = zipfp.infolist() 155ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh data = "" 156ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh for info in infos: 157ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh with zipfp.open(info) as f: 158ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh data += f.read() 159ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertTrue(data == "foobar" or data == "barfoo") 160ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh data = "" 161ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh for info in infos: 162ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh data += zipfp.read(info) 163ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertTrue(data == "foobar" or data == "barfoo") 164ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 165ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh def zip_random_open_test(self, f, compression): 166ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.make_test_archive(f, compression) 167ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 168ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh # Read the ZIP archive 169ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh with zipfile.ZipFile(f, "r", compression) as zipfp: 170ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh zipdata1 = [] 171ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh with zipfp.open(TESTFN) as zipopen1: 172ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh while True: 173ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh read_data = zipopen1.read(randint(1, 1024)) 174ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh if not read_data: 175ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh break 176ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh zipdata1.append(read_data) 177ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 178ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertEqual(''.join(zipdata1), self.data) 179ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 180ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh def test_random_open_stored(self): 181ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh for f in (TESTFN2, TemporaryFile(), StringIO()): 182ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.zip_random_open_test(f, zipfile.ZIP_STORED) 183ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 184ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh def test_univeral_readaheads(self): 185ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh f = StringIO() 186ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 187ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh data = 'a\r\n' * 16 * 1024 188ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh with zipfile.ZipFile(f, 'w', zipfile.ZIP_STORED) as zipfp: 189ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh zipfp.writestr(TESTFN, data) 190ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 191ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh data2 = '' 192ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh with zipfile.ZipFile(f, 'r') as zipfp: 193ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh with zipfp.open(TESTFN, 'rU') as zipopen: 194ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh for line in zipopen: 195ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh data2 += line 196ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 197ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertEqual(data, data2.replace('\n', '\r\n')) 198ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 199ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh def zip_readline_read_test(self, f, compression): 200ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.make_test_archive(f, compression) 201ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 202ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh # Read the ZIP archive 203ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh with zipfile.ZipFile(f, "r") as zipfp: 204ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh with zipfp.open(TESTFN) as zipopen: 205ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh data = '' 206ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh while True: 207ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh read = zipopen.readline() 208ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh if not read: 209ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh break 210ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh data += read 211ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 212ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh read = zipopen.read(100) 213ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh if not read: 214ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh break 215ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh data += read 216ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 217ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertEqual(data, self.data) 218ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 219ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh def zip_readline_test(self, f, compression): 220ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.make_test_archive(f, compression) 221ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 222ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh # Read the ZIP archive 223ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh with zipfile.ZipFile(f, "r") as zipfp: 224ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh with zipfp.open(TESTFN) as zipopen: 225ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh for line in self.line_gen: 226ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh linedata = zipopen.readline() 227ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertEqual(linedata, line + '\n') 228ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 229ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh def zip_readlines_test(self, f, compression): 230ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.make_test_archive(f, compression) 231ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 232ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh # Read the ZIP archive 233ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh with zipfile.ZipFile(f, "r") as zipfp: 234ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh with zipfp.open(TESTFN) as zo: 235ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh ziplines = zo.readlines() 236ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh for line, zipline in zip(self.line_gen, ziplines): 237ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertEqual(zipline, line + '\n') 238ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 239ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh def zip_iterlines_test(self, f, compression): 240ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.make_test_archive(f, compression) 241ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 242ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh # Read the ZIP archive 243ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh with zipfile.ZipFile(f, "r") as zipfp: 244ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh for line, zipline in zip(self.line_gen, zipfp.open(TESTFN)): 245ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertEqual(zipline, line + '\n') 246ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 247ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh def test_readline_read_stored(self): 248ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh # Issue #7610: calls to readline() interleaved with calls to read(). 249ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh for f in (TESTFN2, TemporaryFile(), StringIO()): 250ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.zip_readline_read_test(f, zipfile.ZIP_STORED) 251ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 252ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh def test_readline_stored(self): 253ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh for f in (TESTFN2, TemporaryFile(), StringIO()): 254ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.zip_readline_test(f, zipfile.ZIP_STORED) 255ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 256ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh def test_readlines_stored(self): 257ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh for f in (TESTFN2, TemporaryFile(), StringIO()): 258ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.zip_readlines_test(f, zipfile.ZIP_STORED) 259ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 260ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh def test_iterlines_stored(self): 261ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh for f in (TESTFN2, TemporaryFile(), StringIO()): 262ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.zip_iterlines_test(f, zipfile.ZIP_STORED) 263ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 264ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh @skipUnless(zlib, "requires zlib") 265ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh def test_deflated(self): 266ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh for f in (TESTFN2, TemporaryFile(), StringIO()): 267ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.zip_test(f, zipfile.ZIP_DEFLATED) 268ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 269ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh @skipUnless(zlib, "requires zlib") 270ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh def test_open_deflated(self): 271ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh for f in (TESTFN2, TemporaryFile(), StringIO()): 272ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.zip_open_test(f, zipfile.ZIP_DEFLATED) 273ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 274ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh @skipUnless(zlib, "requires zlib") 275ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh def test_random_open_deflated(self): 276ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh for f in (TESTFN2, TemporaryFile(), StringIO()): 277ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.zip_random_open_test(f, zipfile.ZIP_DEFLATED) 278ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 279ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh @skipUnless(zlib, "requires zlib") 280ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh def test_readline_read_deflated(self): 281ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh # Issue #7610: calls to readline() interleaved with calls to read(). 282ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh for f in (TESTFN2, TemporaryFile(), StringIO()): 283ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.zip_readline_read_test(f, zipfile.ZIP_DEFLATED) 284ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 285ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh @skipUnless(zlib, "requires zlib") 286ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh def test_readline_deflated(self): 287ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh for f in (TESTFN2, TemporaryFile(), StringIO()): 288ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.zip_readline_test(f, zipfile.ZIP_DEFLATED) 289ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 290ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh @skipUnless(zlib, "requires zlib") 291ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh def test_readlines_deflated(self): 292ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh for f in (TESTFN2, TemporaryFile(), StringIO()): 293ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.zip_readlines_test(f, zipfile.ZIP_DEFLATED) 294ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 295ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh @skipUnless(zlib, "requires zlib") 296ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh def test_iterlines_deflated(self): 297ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh for f in (TESTFN2, TemporaryFile(), StringIO()): 298ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.zip_iterlines_test(f, zipfile.ZIP_DEFLATED) 299ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 300ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh @skipUnless(zlib, "requires zlib") 301ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh def test_low_compression(self): 302ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh """Check for cases where compressed data is larger than original.""" 303ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh # Create the ZIP archive 304ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh with zipfile.ZipFile(TESTFN2, "w", zipfile.ZIP_DEFLATED) as zipfp: 305ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh zipfp.writestr("strfile", '12') 306ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 307ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh # Get an open object for strfile 308ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh with zipfile.ZipFile(TESTFN2, "r", zipfile.ZIP_DEFLATED) as zipfp: 309ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh with zipfp.open("strfile") as openobj: 310ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertEqual(openobj.read(1), '1') 311ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertEqual(openobj.read(1), '2') 312ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 313ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh def test_absolute_arcnames(self): 314ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh with zipfile.ZipFile(TESTFN2, "w", zipfile.ZIP_STORED) as zipfp: 315ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh zipfp.write(TESTFN, "/absolute") 316ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 317ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh with zipfile.ZipFile(TESTFN2, "r", zipfile.ZIP_STORED) as zipfp: 318ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertEqual(zipfp.namelist(), ["absolute"]) 319ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 320ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh def test_append_to_zip_file(self): 321ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh """Test appending to an existing zipfile.""" 322ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh with zipfile.ZipFile(TESTFN2, "w", zipfile.ZIP_STORED) as zipfp: 323ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh zipfp.write(TESTFN, TESTFN) 324ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 325ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh with zipfile.ZipFile(TESTFN2, "a", zipfile.ZIP_STORED) as zipfp: 326ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh zipfp.writestr("strfile", self.data) 327ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertEqual(zipfp.namelist(), [TESTFN, "strfile"]) 328ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 329ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh def test_append_to_non_zip_file(self): 330ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh """Test appending to an existing file that is not a zipfile.""" 331ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh # NOTE: this test fails if len(d) < 22 because of the first 332ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh # line "fpin.seek(-22, 2)" in _EndRecData 333ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh data = 'I am not a ZipFile!'*10 334ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh with open(TESTFN2, 'wb') as f: 335ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh f.write(data) 336ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 337ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh with zipfile.ZipFile(TESTFN2, "a", zipfile.ZIP_STORED) as zipfp: 338ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh zipfp.write(TESTFN, TESTFN) 339ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 340ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh with open(TESTFN2, 'rb') as f: 341ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh f.seek(len(data)) 342ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh with zipfile.ZipFile(f, "r") as zipfp: 343ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertEqual(zipfp.namelist(), [TESTFN]) 344ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 345ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh def test_ignores_newline_at_end(self): 346ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh with zipfile.ZipFile(TESTFN2, "w", zipfile.ZIP_STORED) as zipfp: 347ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh zipfp.write(TESTFN, TESTFN) 348ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh with open(TESTFN2, 'a') as f: 349ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh f.write("\r\n\00\00\00") 350ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh with zipfile.ZipFile(TESTFN2, "r") as zipfp: 351ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertIsInstance(zipfp, zipfile.ZipFile) 352ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 353ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh def test_ignores_stuff_appended_past_comments(self): 354ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh with zipfile.ZipFile(TESTFN2, "w", zipfile.ZIP_STORED) as zipfp: 355ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh zipfp.comment = b"this is a comment" 356ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh zipfp.write(TESTFN, TESTFN) 357ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh with open(TESTFN2, 'a') as f: 358ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh f.write("abcdef\r\n") 359ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh with zipfile.ZipFile(TESTFN2, "r") as zipfp: 360ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertIsInstance(zipfp, zipfile.ZipFile) 361ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertEqual(zipfp.comment, b"this is a comment") 362ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 363ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh def test_write_default_name(self): 364ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh """Check that calling ZipFile.write without arcname specified 365ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh produces the expected result.""" 366ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh with zipfile.ZipFile(TESTFN2, "w") as zipfp: 367ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh zipfp.write(TESTFN) 368ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertEqual(zipfp.read(TESTFN), open(TESTFN).read()) 369ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 370ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh @skipUnless(zlib, "requires zlib") 371ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh def test_per_file_compression(self): 372ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh """Check that files within a Zip archive can have different 373ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh compression options.""" 374ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh with zipfile.ZipFile(TESTFN2, "w") as zipfp: 375ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh zipfp.write(TESTFN, 'storeme', zipfile.ZIP_STORED) 376ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh zipfp.write(TESTFN, 'deflateme', zipfile.ZIP_DEFLATED) 377ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh sinfo = zipfp.getinfo('storeme') 378ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh dinfo = zipfp.getinfo('deflateme') 379ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertEqual(sinfo.compress_type, zipfile.ZIP_STORED) 380ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertEqual(dinfo.compress_type, zipfile.ZIP_DEFLATED) 381ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 382ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh def test_write_to_readonly(self): 383ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh """Check that trying to call write() on a readonly ZipFile object 384ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh raises a RuntimeError.""" 385ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh with zipfile.ZipFile(TESTFN2, mode="w") as zipfp: 386ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh zipfp.writestr("somefile.txt", "bogus") 387ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 388ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh with zipfile.ZipFile(TESTFN2, mode="r") as zipfp: 389ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertRaises(RuntimeError, zipfp.write, TESTFN) 390ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 391ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh def test_extract(self): 392ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh with zipfile.ZipFile(TESTFN2, "w", zipfile.ZIP_STORED) as zipfp: 393ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh for fpath, fdata in SMALL_TEST_DATA: 394ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh zipfp.writestr(fpath, fdata) 395ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 396ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh with zipfile.ZipFile(TESTFN2, "r") as zipfp: 397ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh for fpath, fdata in SMALL_TEST_DATA: 398ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh writtenfile = zipfp.extract(fpath) 399ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 400ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh # make sure it was written to the right place 401ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh correctfile = os.path.join(os.getcwd(), fpath) 402ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh correctfile = os.path.normpath(correctfile) 403ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 404ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertEqual(writtenfile, correctfile) 405ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 406ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh # make sure correct data is in correct file 407ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertEqual(fdata, open(writtenfile, "rb").read()) 408ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh os.remove(writtenfile) 409ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 410ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh # remove the test file subdirectories 411ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh shutil.rmtree(os.path.join(os.getcwd(), 'ziptest2dir')) 412ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 413ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh def test_extract_all(self): 414ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh with zipfile.ZipFile(TESTFN2, "w", zipfile.ZIP_STORED) as zipfp: 415ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh for fpath, fdata in SMALL_TEST_DATA: 416ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh zipfp.writestr(fpath, fdata) 417ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 418ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh with zipfile.ZipFile(TESTFN2, "r") as zipfp: 419ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh zipfp.extractall() 420ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh for fpath, fdata in SMALL_TEST_DATA: 421ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh outfile = os.path.join(os.getcwd(), fpath) 422ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 423ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertEqual(fdata, open(outfile, "rb").read()) 424ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh os.remove(outfile) 425ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 426ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh # remove the test file subdirectories 427ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh shutil.rmtree(os.path.join(os.getcwd(), 'ziptest2dir')) 428ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 429ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh def check_file(self, filename, content): 430ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertTrue(os.path.isfile(filename)) 431ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh with open(filename, 'rb') as f: 432ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertEqual(f.read(), content) 433ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 434ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh @skipUnless(TESTFN_UNICODE, "No Unicode filesystem semantics on this platform.") 435ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh def test_extract_unicode_filenames(self): 436ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh fnames = [u'foo.txt', os.path.basename(TESTFN_UNICODE)] 437ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh content = 'Test for unicode filename' 438ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh with zipfile.ZipFile(TESTFN2, "w", zipfile.ZIP_STORED) as zipfp: 439ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh for fname in fnames: 440ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh zipfp.writestr(fname, content) 441ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 442ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh with zipfile.ZipFile(TESTFN2, "r") as zipfp: 443ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh for fname in fnames: 444ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh writtenfile = zipfp.extract(fname) 445ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 446ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh # make sure it was written to the right place 447ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh correctfile = os.path.join(os.getcwd(), fname) 448ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh correctfile = os.path.normpath(correctfile) 449ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertEqual(writtenfile, correctfile) 450ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 451ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.check_file(writtenfile, content) 452ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh os.remove(writtenfile) 453ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 454ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh def test_extract_hackers_arcnames(self): 455ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh hacknames = [ 456ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh ('../foo/bar', 'foo/bar'), 457ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh ('foo/../bar', 'foo/bar'), 458ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh ('foo/../../bar', 'foo/bar'), 459ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh ('foo/bar/..', 'foo/bar'), 460ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh ('./../foo/bar', 'foo/bar'), 461ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh ('/foo/bar', 'foo/bar'), 462ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh ('/foo/../bar', 'foo/bar'), 463ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh ('/foo/../../bar', 'foo/bar'), 464ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh ] 465ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh if os.path.sep == '\\': 466ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh hacknames.extend([ 467ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh (r'..\foo\bar', 'foo/bar'), 468ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh (r'..\/foo\/bar', 'foo/bar'), 469ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh (r'foo/\..\/bar', 'foo/bar'), 470ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh (r'foo\/../\bar', 'foo/bar'), 471ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh (r'C:foo/bar', 'foo/bar'), 472ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh (r'C:/foo/bar', 'foo/bar'), 473ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh (r'C://foo/bar', 'foo/bar'), 474ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh (r'C:\foo\bar', 'foo/bar'), 475ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh (r'//conky/mountpoint/foo/bar', 'conky/mountpoint/foo/bar'), 476ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh (r'\\conky\mountpoint\foo\bar', 'conky/mountpoint/foo/bar'), 477ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh (r'///conky/mountpoint/foo/bar', 'conky/mountpoint/foo/bar'), 478ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh (r'\\\conky\mountpoint\foo\bar', 'conky/mountpoint/foo/bar'), 479ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh (r'//conky//mountpoint/foo/bar', 'conky/mountpoint/foo/bar'), 480ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh (r'\\conky\\mountpoint\foo\bar', 'conky/mountpoint/foo/bar'), 481ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh (r'//?/C:/foo/bar', '_/C_/foo/bar'), 482ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh (r'\\?\C:\foo\bar', '_/C_/foo/bar'), 483ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh (r'C:/../C:/foo/bar', 'C_/foo/bar'), 484ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh (r'a:b\c<d>e|f"g?h*i', 'b/c_d_e_f_g_h_i'), 485ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh ('../../foo../../ba..r', 'foo/ba..r'), 486ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh ]) 487ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh else: # Unix 488ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh hacknames.extend([ 489ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh ('//foo/bar', 'foo/bar'), 490ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh ('../../foo../../ba..r', 'foo../ba..r'), 491ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh (r'foo/..\bar', r'foo/..\bar'), 492ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh ]) 493ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 494ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh for arcname, fixedname in hacknames: 495ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh content = b'foobar' + arcname.encode() 496ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh with zipfile.ZipFile(TESTFN2, 'w', zipfile.ZIP_STORED) as zipfp: 497ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh zinfo = zipfile.ZipInfo() 498ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh # preserve backslashes 499ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh zinfo.filename = arcname 500ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh zinfo.external_attr = 0o600 << 16 501ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh zipfp.writestr(zinfo, content) 502ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 503ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh arcname = arcname.replace(os.sep, "/") 504ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh targetpath = os.path.join('target', 'subdir', 'subsub') 505ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh correctfile = os.path.join(targetpath, *fixedname.split('/')) 506ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 507ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh with zipfile.ZipFile(TESTFN2, 'r') as zipfp: 508ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh writtenfile = zipfp.extract(arcname, targetpath) 509ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertEqual(writtenfile, correctfile, 510ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh msg="extract %r" % arcname) 511ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.check_file(correctfile, content) 512ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh shutil.rmtree('target') 513ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 514ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh with zipfile.ZipFile(TESTFN2, 'r') as zipfp: 515ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh zipfp.extractall(targetpath) 516ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.check_file(correctfile, content) 517ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh shutil.rmtree('target') 518ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 519ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh correctfile = os.path.join(os.getcwd(), *fixedname.split('/')) 520ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 521ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh with zipfile.ZipFile(TESTFN2, 'r') as zipfp: 522ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh writtenfile = zipfp.extract(arcname) 523ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertEqual(writtenfile, correctfile, 524ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh msg="extract %r" % arcname) 525ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.check_file(correctfile, content) 526ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh shutil.rmtree(fixedname.split('/')[0]) 527ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 528ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh with zipfile.ZipFile(TESTFN2, 'r') as zipfp: 529ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh zipfp.extractall() 530ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.check_file(correctfile, content) 531ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh shutil.rmtree(fixedname.split('/')[0]) 532ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 533ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh os.remove(TESTFN2) 534ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 535ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh def test_writestr_compression(self): 536ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh zipfp = zipfile.ZipFile(TESTFN2, "w") 537ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh zipfp.writestr("a.txt", "hello world", compress_type=zipfile.ZIP_STORED) 538ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh if zlib: 539ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh zipfp.writestr("b.txt", "hello world", compress_type=zipfile.ZIP_DEFLATED) 540ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 541ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh info = zipfp.getinfo('a.txt') 542ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertEqual(info.compress_type, zipfile.ZIP_STORED) 543ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 544ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh if zlib: 545ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh info = zipfp.getinfo('b.txt') 546ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertEqual(info.compress_type, zipfile.ZIP_DEFLATED) 547ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 548ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 549ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh def zip_test_writestr_permissions(self, f, compression): 550ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh # Make sure that writestr creates files with mode 0600, 551ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh # when it is passed a name rather than a ZipInfo instance. 552ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 553ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.make_test_archive(f, compression) 554ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh with zipfile.ZipFile(f, "r") as zipfp: 555ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh zinfo = zipfp.getinfo('strfile') 556ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertEqual(zinfo.external_attr, 0600 << 16) 557ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 558ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh def test_writestr_permissions(self): 559ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh for f in (TESTFN2, TemporaryFile(), StringIO()): 560ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.zip_test_writestr_permissions(f, zipfile.ZIP_STORED) 561ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 562ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh def test_close(self): 563ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh """Check that the zipfile is closed after the 'with' block.""" 564ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh with zipfile.ZipFile(TESTFN2, "w") as zipfp: 565ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh for fpath, fdata in SMALL_TEST_DATA: 566ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh zipfp.writestr(fpath, fdata) 567ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertTrue(zipfp.fp is not None, 'zipfp is not open') 568ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertTrue(zipfp.fp is None, 'zipfp is not closed') 569ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 570ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh with zipfile.ZipFile(TESTFN2, "r") as zipfp: 571ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertTrue(zipfp.fp is not None, 'zipfp is not open') 572ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertTrue(zipfp.fp is None, 'zipfp is not closed') 573ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 574ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh def test_close_on_exception(self): 575ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh """Check that the zipfile is closed if an exception is raised in the 576ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 'with' block.""" 577ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh with zipfile.ZipFile(TESTFN2, "w") as zipfp: 578ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh for fpath, fdata in SMALL_TEST_DATA: 579ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh zipfp.writestr(fpath, fdata) 580ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 581ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh try: 582ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh with zipfile.ZipFile(TESTFN2, "r") as zipfp2: 583ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh raise zipfile.BadZipfile() 584ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh except zipfile.BadZipfile: 585ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertTrue(zipfp2.fp is None, 'zipfp is not closed') 586ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 587ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh def test_add_file_before_1980(self): 588ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh # Set atime and mtime to 1970-01-01 589ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh os.utime(TESTFN, (0, 0)) 590ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh with zipfile.ZipFile(TESTFN2, "w") as zipfp: 591ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertRaises(ValueError, zipfp.write, TESTFN) 592ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 593ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh def tearDown(self): 594ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh unlink(TESTFN) 595ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh unlink(TESTFN2) 596ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 597ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 598ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsiehclass TestZip64InSmallFiles(unittest.TestCase): 599ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh # These tests test the ZIP64 functionality without using large files, 600ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh # see test_zipfile64 for proper tests. 601ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 602ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh def setUp(self): 603ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self._limit = zipfile.ZIP64_LIMIT 604ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh zipfile.ZIP64_LIMIT = 5 605ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 606ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh line_gen = ("Test of zipfile line %d." % i 607ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh for i in range(0, FIXEDTEST_SIZE)) 608ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.data = '\n'.join(line_gen) 609ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 610ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh # Make a source file with some lines 611ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh with open(TESTFN, "wb") as fp: 612ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh fp.write(self.data) 613ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 614ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh def large_file_exception_test(self, f, compression): 615ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh with zipfile.ZipFile(f, "w", compression) as zipfp: 616ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertRaises(zipfile.LargeZipFile, 617ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh zipfp.write, TESTFN, "another.name") 618ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 619ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh def large_file_exception_test2(self, f, compression): 620ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh with zipfile.ZipFile(f, "w", compression) as zipfp: 621ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertRaises(zipfile.LargeZipFile, 622ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh zipfp.writestr, "another.name", self.data) 623ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 624ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh def test_large_file_exception(self): 625ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh for f in (TESTFN2, TemporaryFile(), StringIO()): 626ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.large_file_exception_test(f, zipfile.ZIP_STORED) 627ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.large_file_exception_test2(f, zipfile.ZIP_STORED) 628ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 629ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh def zip_test(self, f, compression): 630ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh # Create the ZIP archive 631ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh with zipfile.ZipFile(f, "w", compression, allowZip64=True) as zipfp: 632ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh zipfp.write(TESTFN, "another.name") 633ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh zipfp.write(TESTFN, TESTFN) 634ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh zipfp.writestr("strfile", self.data) 635ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 636ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh # Read the ZIP archive 637ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh with zipfile.ZipFile(f, "r", compression) as zipfp: 638ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertEqual(zipfp.read(TESTFN), self.data) 639ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertEqual(zipfp.read("another.name"), self.data) 640ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertEqual(zipfp.read("strfile"), self.data) 641ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 642ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh # Print the ZIP directory 643ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh fp = StringIO() 644ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh stdout = sys.stdout 645ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh try: 646ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh sys.stdout = fp 647ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh zipfp.printdir() 648ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh finally: 649ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh sys.stdout = stdout 650ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 651ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh directory = fp.getvalue() 652ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh lines = directory.splitlines() 653ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertEqual(len(lines), 4) # Number of files + header 654ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 655ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertIn('File Name', lines[0]) 656ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertIn('Modified', lines[0]) 657ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertIn('Size', lines[0]) 658ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 659ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh fn, date, time_, size = lines[1].split() 660ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertEqual(fn, 'another.name') 661ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertTrue(time.strptime(date, '%Y-%m-%d')) 662ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertTrue(time.strptime(time_, '%H:%M:%S')) 663ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertEqual(size, str(len(self.data))) 664ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 665ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh # Check the namelist 666ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh names = zipfp.namelist() 667ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertEqual(len(names), 3) 668ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertIn(TESTFN, names) 669ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertIn("another.name", names) 670ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertIn("strfile", names) 671ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 672ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh # Check infolist 673ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh infos = zipfp.infolist() 674ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh names = [i.filename for i in infos] 675ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertEqual(len(names), 3) 676ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertIn(TESTFN, names) 677ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertIn("another.name", names) 678ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertIn("strfile", names) 679ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh for i in infos: 680ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertEqual(i.file_size, len(self.data)) 681ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 682ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh # check getinfo 683ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh for nm in (TESTFN, "another.name", "strfile"): 684ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh info = zipfp.getinfo(nm) 685ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertEqual(info.filename, nm) 686ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertEqual(info.file_size, len(self.data)) 687ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 688ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh # Check that testzip doesn't raise an exception 689ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh zipfp.testzip() 690ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 691ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh def test_stored(self): 692ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh for f in (TESTFN2, TemporaryFile(), StringIO()): 693ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.zip_test(f, zipfile.ZIP_STORED) 694ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 695ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh @skipUnless(zlib, "requires zlib") 696ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh def test_deflated(self): 697ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh for f in (TESTFN2, TemporaryFile(), StringIO()): 698ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.zip_test(f, zipfile.ZIP_DEFLATED) 699ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 700ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh def test_absolute_arcnames(self): 701ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh with zipfile.ZipFile(TESTFN2, "w", zipfile.ZIP_STORED, 702ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh allowZip64=True) as zipfp: 703ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh zipfp.write(TESTFN, "/absolute") 704ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 705ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh with zipfile.ZipFile(TESTFN2, "r", zipfile.ZIP_STORED) as zipfp: 706ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertEqual(zipfp.namelist(), ["absolute"]) 707ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 708ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh def tearDown(self): 709ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh zipfile.ZIP64_LIMIT = self._limit 710ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh unlink(TESTFN) 711ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh unlink(TESTFN2) 712ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 713ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 714ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsiehclass PyZipFileTests(unittest.TestCase): 715ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh def test_write_pyfile(self): 716ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh with zipfile.PyZipFile(TemporaryFile(), "w") as zipfp: 717ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh fn = __file__ 718ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh if fn.endswith('.pyc') or fn.endswith('.pyo'): 719ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh fn = fn[:-1] 720ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 721ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh zipfp.writepy(fn) 722ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 723ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh bn = os.path.basename(fn) 724ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertNotIn(bn, zipfp.namelist()) 725ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertTrue(bn + 'o' in zipfp.namelist() or 726ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh bn + 'c' in zipfp.namelist()) 727ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 728ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh with zipfile.PyZipFile(TemporaryFile(), "w") as zipfp: 729ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh fn = __file__ 730ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh if fn.endswith(('.pyc', '.pyo')): 731ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh fn = fn[:-1] 732ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 733ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh zipfp.writepy(fn, "testpackage") 734ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 735ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh bn = "%s/%s" % ("testpackage", os.path.basename(fn)) 736ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertNotIn(bn, zipfp.namelist()) 737ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertTrue(bn + 'o' in zipfp.namelist() or 738ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh bn + 'c' in zipfp.namelist()) 739ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 740ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh def test_write_python_package(self): 741ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh import email 742ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh packagedir = os.path.dirname(email.__file__) 743ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 744ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh with zipfile.PyZipFile(TemporaryFile(), "w") as zipfp: 745ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh zipfp.writepy(packagedir) 746ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 747ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh # Check for a couple of modules at different levels of the 748ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh # hierarchy 749ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh names = zipfp.namelist() 750ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertTrue('email/__init__.pyo' in names or 751ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 'email/__init__.pyc' in names) 752ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertTrue('email/mime/text.pyo' in names or 753ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 'email/mime/text.pyc' in names) 754ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 755ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh def test_write_python_directory(self): 756ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh os.mkdir(TESTFN2) 757ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh try: 758ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh with open(os.path.join(TESTFN2, "mod1.py"), "w") as fp: 759ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh fp.write("print(42)\n") 760ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 761ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh with open(os.path.join(TESTFN2, "mod2.py"), "w") as fp: 762ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh fp.write("print(42 * 42)\n") 763ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 764ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh with open(os.path.join(TESTFN2, "mod2.txt"), "w") as fp: 765ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh fp.write("bla bla bla\n") 766ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 767ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh zipfp = zipfile.PyZipFile(TemporaryFile(), "w") 768ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh zipfp.writepy(TESTFN2) 769ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 770ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh names = zipfp.namelist() 771ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertTrue('mod1.pyc' in names or 'mod1.pyo' in names) 772ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertTrue('mod2.pyc' in names or 'mod2.pyo' in names) 773ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertNotIn('mod2.txt', names) 774ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 775ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh finally: 776ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh shutil.rmtree(TESTFN2) 777ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 778ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh def test_write_non_pyfile(self): 779ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh with zipfile.PyZipFile(TemporaryFile(), "w") as zipfp: 780ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh open(TESTFN, 'w').write('most definitely not a python file') 781ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertRaises(RuntimeError, zipfp.writepy, TESTFN) 782ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh os.remove(TESTFN) 783ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 784ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 785ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsiehclass OtherTests(unittest.TestCase): 786ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh zips_with_bad_crc = { 787ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh zipfile.ZIP_STORED: ( 788ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh b'PK\003\004\024\0\0\0\0\0 \213\212;:r' 789ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh b'\253\377\f\0\0\0\f\0\0\0\005\0\0\000af' 790ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh b'ilehello,AworldP' 791ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh b'K\001\002\024\003\024\0\0\0\0\0 \213\212;:' 792ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh b'r\253\377\f\0\0\0\f\0\0\0\005\0\0\0\0' 793ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh b'\0\0\0\0\0\0\0\200\001\0\0\0\000afi' 794ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh b'lePK\005\006\0\0\0\0\001\0\001\0003\000' 795ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh b'\0\0/\0\0\0\0\0'), 796ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh zipfile.ZIP_DEFLATED: ( 797ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh b'PK\x03\x04\x14\x00\x00\x00\x08\x00n}\x0c=FA' 798ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh b'KE\x10\x00\x00\x00n\x00\x00\x00\x05\x00\x00\x00af' 799ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh b'ile\xcbH\xcd\xc9\xc9W(\xcf/\xcaI\xc9\xa0' 800ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh b'=\x13\x00PK\x01\x02\x14\x03\x14\x00\x00\x00\x08\x00n' 801ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh b'}\x0c=FAKE\x10\x00\x00\x00n\x00\x00\x00\x05' 802ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x80\x01\x00\x00\x00' 803ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh b'\x00afilePK\x05\x06\x00\x00\x00\x00\x01\x00' 804ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh b'\x01\x003\x00\x00\x003\x00\x00\x00\x00\x00'), 805ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh } 806ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 807ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh def test_unicode_filenames(self): 808ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh with zipfile.ZipFile(TESTFN, "w") as zf: 809ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh zf.writestr(u"foo.txt", "Test for unicode filename") 810ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh zf.writestr(u"\xf6.txt", "Test for unicode filename") 811ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertIsInstance(zf.infolist()[0].filename, unicode) 812ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 813ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh with zipfile.ZipFile(TESTFN, "r") as zf: 814ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertEqual(zf.filelist[0].filename, "foo.txt") 815ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertEqual(zf.filelist[1].filename, u"\xf6.txt") 816ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 817ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh def test_create_non_existent_file_for_append(self): 818ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh if os.path.exists(TESTFN): 819ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh os.unlink(TESTFN) 820ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 821ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh filename = 'testfile.txt' 822ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh content = 'hello, world. this is some content.' 823ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 824ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh try: 825ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh with zipfile.ZipFile(TESTFN, 'a') as zf: 826ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh zf.writestr(filename, content) 827ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh except IOError: 828ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.fail('Could not append data to a non-existent zip file.') 829ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 830ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertTrue(os.path.exists(TESTFN)) 831ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 832ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh with zipfile.ZipFile(TESTFN, 'r') as zf: 833ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertEqual(zf.read(filename), content) 834ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 835ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh def test_close_erroneous_file(self): 836ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh # This test checks that the ZipFile constructor closes the file object 837ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh # it opens if there's an error in the file. If it doesn't, the 838ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh # traceback holds a reference to the ZipFile object and, indirectly, 839ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh # the file object. 840ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh # On Windows, this causes the os.unlink() call to fail because the 841ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh # underlying file is still open. This is SF bug #412214. 842ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh # 843ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh with open(TESTFN, "w") as fp: 844ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh fp.write("this is not a legal zip file\n") 845ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh try: 846ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh zf = zipfile.ZipFile(TESTFN) 847ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh except zipfile.BadZipfile: 848ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh pass 849ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 850ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh def test_is_zip_erroneous_file(self): 851ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh """Check that is_zipfile() correctly identifies non-zip files.""" 852ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh # - passing a filename 853ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh with open(TESTFN, "w") as fp: 854ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh fp.write("this is not a legal zip file\n") 855ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh chk = zipfile.is_zipfile(TESTFN) 856ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertFalse(chk) 857ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh # - passing a file object 858ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh with open(TESTFN, "rb") as fp: 859ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh chk = zipfile.is_zipfile(fp) 860ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertTrue(not chk) 861ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh # - passing a file-like object 862ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh fp = StringIO() 863ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh fp.write("this is not a legal zip file\n") 864ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh chk = zipfile.is_zipfile(fp) 865ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertTrue(not chk) 866ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh fp.seek(0, 0) 867ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh chk = zipfile.is_zipfile(fp) 868ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertTrue(not chk) 869ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 870ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh def test_damaged_zipfile(self): 871ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh """Check that zipfiles with missing bytes at the end raise BadZipFile.""" 872ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh # - Create a valid zip file 873ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh fp = io.BytesIO() 874ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh with zipfile.ZipFile(fp, mode="w") as zipf: 875ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh zipf.writestr("foo.txt", b"O, for a Muse of Fire!") 876ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh zipfiledata = fp.getvalue() 877ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 878ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh # - Now create copies of it missing the last N bytes and make sure 879ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh # a BadZipFile exception is raised when we try to open it 880ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh for N in range(len(zipfiledata)): 881ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh fp = io.BytesIO(zipfiledata[:N]) 882ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertRaises(zipfile.BadZipfile, zipfile.ZipFile, fp) 883ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 884ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh def test_is_zip_valid_file(self): 885ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh """Check that is_zipfile() correctly identifies zip files.""" 886ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh # - passing a filename 887ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh with zipfile.ZipFile(TESTFN, mode="w") as zipf: 888ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh zipf.writestr("foo.txt", "O, for a Muse of Fire!") 889ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh chk = zipfile.is_zipfile(TESTFN) 890ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertTrue(chk) 891ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh # - passing a file object 892ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh with open(TESTFN, "rb") as fp: 893ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh chk = zipfile.is_zipfile(fp) 894ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertTrue(chk) 895ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh fp.seek(0, 0) 896ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh zip_contents = fp.read() 897ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh # - passing a file-like object 898ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh fp = StringIO() 899ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh fp.write(zip_contents) 900ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh chk = zipfile.is_zipfile(fp) 901ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertTrue(chk) 902ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh fp.seek(0, 0) 903ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh chk = zipfile.is_zipfile(fp) 904ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertTrue(chk) 905ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 906ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh def test_non_existent_file_raises_IOError(self): 907ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh # make sure we don't raise an AttributeError when a partially-constructed 908ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh # ZipFile instance is finalized; this tests for regression on SF tracker 909ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh # bug #403871. 910ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 911ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh # The bug we're testing for caused an AttributeError to be raised 912ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh # when a ZipFile instance was created for a file that did not 913ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh # exist; the .fp member was not initialized but was needed by the 914ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh # __del__() method. Since the AttributeError is in the __del__(), 915ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh # it is ignored, but the user should be sufficiently annoyed by 916ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh # the message on the output that regression will be noticed 917ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh # quickly. 918ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertRaises(IOError, zipfile.ZipFile, TESTFN) 919ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 920ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh def test_empty_file_raises_BadZipFile(self): 921ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh with open(TESTFN, 'w') as f: 922ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh pass 923ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertRaises(zipfile.BadZipfile, zipfile.ZipFile, TESTFN) 924ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 925ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh with open(TESTFN, 'w') as fp: 926ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh fp.write("short file") 927ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertRaises(zipfile.BadZipfile, zipfile.ZipFile, TESTFN) 928ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 929ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh def test_closed_zip_raises_RuntimeError(self): 930ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh """Verify that testzip() doesn't swallow inappropriate exceptions.""" 931ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh data = StringIO() 932ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh with zipfile.ZipFile(data, mode="w") as zipf: 933ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh zipf.writestr("foo.txt", "O, for a Muse of Fire!") 934ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 935ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh # This is correct; calling .read on a closed ZipFile should raise 936ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh # a RuntimeError, and so should calling .testzip. An earlier 937ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh # version of .testzip would swallow this exception (and any other) 938ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh # and report that the first file in the archive was corrupt. 939ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertRaises(RuntimeError, zipf.read, "foo.txt") 940ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertRaises(RuntimeError, zipf.open, "foo.txt") 941ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertRaises(RuntimeError, zipf.testzip) 942ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertRaises(RuntimeError, zipf.writestr, "bogus.txt", "bogus") 943ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh open(TESTFN, 'w').write('zipfile test data') 944ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertRaises(RuntimeError, zipf.write, TESTFN) 945ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 946ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh def test_bad_constructor_mode(self): 947ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh """Check that bad modes passed to ZipFile constructor are caught.""" 948ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertRaises(RuntimeError, zipfile.ZipFile, TESTFN, "q") 949ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 950ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh def test_bad_open_mode(self): 951ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh """Check that bad modes passed to ZipFile.open are caught.""" 952ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh with zipfile.ZipFile(TESTFN, mode="w") as zipf: 953ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh zipf.writestr("foo.txt", "O, for a Muse of Fire!") 954ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 955ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh with zipfile.ZipFile(TESTFN, mode="r") as zipf: 956ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh # read the data to make sure the file is there 957ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh zipf.read("foo.txt") 958ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertRaises(RuntimeError, zipf.open, "foo.txt", "q") 959ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 960ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh def test_read0(self): 961ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh """Check that calling read(0) on a ZipExtFile object returns an empty 962ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh string and doesn't advance file pointer.""" 963ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh with zipfile.ZipFile(TESTFN, mode="w") as zipf: 964ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh zipf.writestr("foo.txt", "O, for a Muse of Fire!") 965ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh # read the data to make sure the file is there 966ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh with zipf.open("foo.txt") as f: 967ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh for i in xrange(FIXEDTEST_SIZE): 968ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertEqual(f.read(0), '') 969ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 970ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertEqual(f.read(), "O, for a Muse of Fire!") 971ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 972ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh def test_open_non_existent_item(self): 973ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh """Check that attempting to call open() for an item that doesn't 974ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh exist in the archive raises a RuntimeError.""" 975ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh with zipfile.ZipFile(TESTFN, mode="w") as zipf: 976ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertRaises(KeyError, zipf.open, "foo.txt", "r") 977ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 978ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh def test_bad_compression_mode(self): 979ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh """Check that bad compression methods passed to ZipFile.open are 980ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh caught.""" 981ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertRaises(RuntimeError, zipfile.ZipFile, TESTFN, "w", -1) 982ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 983ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh def test_unsupported_compression(self): 984ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh # data is declared as shrunk, but actually deflated 985ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh data = (b'PK\x03\x04.\x00\x00\x00\x01\x00\xe4C\xa1@\x00\x00\x00' 986ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh b'\x00\x02\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00x\x03\x00PK\x01' 987ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh b'\x02.\x03.\x00\x00\x00\x01\x00\xe4C\xa1@\x00\x00\x00\x00\x02\x00\x00' 988ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh b'\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00' 989ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh b'\x80\x01\x00\x00\x00\x00xPK\x05\x06\x00\x00\x00\x00\x01\x00\x01\x00' 990ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh b'/\x00\x00\x00!\x00\x00\x00\x00\x00') 991ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh with zipfile.ZipFile(io.BytesIO(data), 'r') as zipf: 992ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertRaises(NotImplementedError, zipf.open, 'x') 993ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 994ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh def test_null_byte_in_filename(self): 995ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh """Check that a filename containing a null byte is properly 996ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh terminated.""" 997ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh with zipfile.ZipFile(TESTFN, mode="w") as zipf: 998ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh zipf.writestr("foo.txt\x00qqq", "O, for a Muse of Fire!") 999ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertEqual(zipf.namelist(), ['foo.txt']) 1000ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 1001ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh def test_struct_sizes(self): 1002ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh """Check that ZIP internal structure sizes are calculated correctly.""" 1003ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertEqual(zipfile.sizeEndCentDir, 22) 1004ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertEqual(zipfile.sizeCentralDir, 46) 1005ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertEqual(zipfile.sizeEndCentDir64, 56) 1006ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertEqual(zipfile.sizeEndCentDir64Locator, 20) 1007ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 1008ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh def test_comments(self): 1009ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh """Check that comments on the archive are handled properly.""" 1010ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 1011ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh # check default comment is empty 1012ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh with zipfile.ZipFile(TESTFN, mode="w") as zipf: 1013ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertEqual(zipf.comment, '') 1014ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh zipf.writestr("foo.txt", "O, for a Muse of Fire!") 1015ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 1016ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh with zipfile.ZipFile(TESTFN, mode="r") as zipf: 1017ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertEqual(zipf.comment, '') 1018ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 1019ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh # check a simple short comment 1020ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh comment = 'Bravely taking to his feet, he beat a very brave retreat.' 1021ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh with zipfile.ZipFile(TESTFN, mode="w") as zipf: 1022ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh zipf.comment = comment 1023ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh zipf.writestr("foo.txt", "O, for a Muse of Fire!") 1024ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh with zipfile.ZipFile(TESTFN, mode="r") as zipf: 1025ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertEqual(zipf.comment, comment) 1026ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 1027ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh # check a comment of max length 1028ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh comment2 = ''.join(['%d' % (i**3 % 10) for i in xrange((1 << 16)-1)]) 1029ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh with zipfile.ZipFile(TESTFN, mode="w") as zipf: 1030ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh zipf.comment = comment2 1031ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh zipf.writestr("foo.txt", "O, for a Muse of Fire!") 1032ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 1033ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh with zipfile.ZipFile(TESTFN, mode="r") as zipf: 1034ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertEqual(zipf.comment, comment2) 1035ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 1036ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh # check a comment that is too long is truncated 1037ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh with zipfile.ZipFile(TESTFN, mode="w") as zipf: 1038ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh zipf.comment = comment2 + 'oops' 1039ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh zipf.writestr("foo.txt", "O, for a Muse of Fire!") 1040ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh with zipfile.ZipFile(TESTFN, mode="r") as zipf: 1041ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertEqual(zipf.comment, comment2) 1042ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 1043ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh def test_change_comment_in_empty_archive(self): 1044ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh with zipfile.ZipFile(TESTFN, "a", zipfile.ZIP_STORED) as zipf: 1045ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertFalse(zipf.filelist) 1046ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh zipf.comment = b"this is a comment" 1047ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh with zipfile.ZipFile(TESTFN, "r") as zipf: 1048ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertEqual(zipf.comment, b"this is a comment") 1049ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 1050ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh def test_change_comment_in_nonempty_archive(self): 1051ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh with zipfile.ZipFile(TESTFN, "w", zipfile.ZIP_STORED) as zipf: 1052ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh zipf.writestr("foo.txt", "O, for a Muse of Fire!") 1053ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh with zipfile.ZipFile(TESTFN, "a", zipfile.ZIP_STORED) as zipf: 1054ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertTrue(zipf.filelist) 1055ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh zipf.comment = b"this is a comment" 1056ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh with zipfile.ZipFile(TESTFN, "r") as zipf: 1057ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertEqual(zipf.comment, b"this is a comment") 1058ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 1059ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh def check_testzip_with_bad_crc(self, compression): 1060ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh """Tests that files with bad CRCs return their name from testzip.""" 1061ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh zipdata = self.zips_with_bad_crc[compression] 1062ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 1063ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh with zipfile.ZipFile(io.BytesIO(zipdata), mode="r") as zipf: 1064ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh # testzip returns the name of the first corrupt file, or None 1065ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertEqual('afile', zipf.testzip()) 1066ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 1067ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh def test_testzip_with_bad_crc_stored(self): 1068ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.check_testzip_with_bad_crc(zipfile.ZIP_STORED) 1069ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 1070ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh @skipUnless(zlib, "requires zlib") 1071ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh def test_testzip_with_bad_crc_deflated(self): 1072ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.check_testzip_with_bad_crc(zipfile.ZIP_DEFLATED) 1073ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 1074ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh def check_read_with_bad_crc(self, compression): 1075ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh """Tests that files with bad CRCs raise a BadZipfile exception when read.""" 1076ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh zipdata = self.zips_with_bad_crc[compression] 1077ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 1078ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh # Using ZipFile.read() 1079ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh with zipfile.ZipFile(io.BytesIO(zipdata), mode="r") as zipf: 1080ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertRaises(zipfile.BadZipfile, zipf.read, 'afile') 1081ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 1082ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh # Using ZipExtFile.read() 1083ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh with zipfile.ZipFile(io.BytesIO(zipdata), mode="r") as zipf: 1084ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh with zipf.open('afile', 'r') as corrupt_file: 1085ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertRaises(zipfile.BadZipfile, corrupt_file.read) 1086ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 1087ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh # Same with small reads (in order to exercise the buffering logic) 1088ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh with zipfile.ZipFile(io.BytesIO(zipdata), mode="r") as zipf: 1089ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh with zipf.open('afile', 'r') as corrupt_file: 1090ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh corrupt_file.MIN_READ_SIZE = 2 1091ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh with self.assertRaises(zipfile.BadZipfile): 1092ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh while corrupt_file.read(2): 1093ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh pass 1094ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 1095ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh def test_read_with_bad_crc_stored(self): 1096ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.check_read_with_bad_crc(zipfile.ZIP_STORED) 1097ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 1098ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh @skipUnless(zlib, "requires zlib") 1099ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh def test_read_with_bad_crc_deflated(self): 1100ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.check_read_with_bad_crc(zipfile.ZIP_DEFLATED) 1101ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 1102ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh def check_read_return_size(self, compression): 1103ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh # Issue #9837: ZipExtFile.read() shouldn't return more bytes 1104ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh # than requested. 1105ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh for test_size in (1, 4095, 4096, 4097, 16384): 1106ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh file_size = test_size + 1 1107ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh junk = b''.join(struct.pack('B', randint(0, 255)) 1108ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh for x in range(file_size)) 1109ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh with zipfile.ZipFile(io.BytesIO(), "w", compression) as zipf: 1110ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh zipf.writestr('foo', junk) 1111ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh with zipf.open('foo', 'r') as fp: 1112ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh buf = fp.read(test_size) 1113ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertEqual(len(buf), test_size) 1114ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 1115ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh def test_read_return_size_stored(self): 1116ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.check_read_return_size(zipfile.ZIP_STORED) 1117ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 1118ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh @skipUnless(zlib, "requires zlib") 1119ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh def test_read_return_size_deflated(self): 1120ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.check_read_return_size(zipfile.ZIP_DEFLATED) 1121ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 1122ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh def test_empty_zipfile(self): 1123ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh # Check that creating a file in 'w' or 'a' mode and closing without 1124ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh # adding any files to the archives creates a valid empty ZIP file 1125ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh with zipfile.ZipFile(TESTFN, mode="w") as zipf: 1126ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh pass 1127ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh try: 1128ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh zipf = zipfile.ZipFile(TESTFN, mode="r") 1129ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh except zipfile.BadZipfile: 1130ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.fail("Unable to create empty ZIP file in 'w' mode") 1131ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 1132ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh with zipfile.ZipFile(TESTFN, mode="a") as zipf: 1133ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh pass 1134ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh try: 1135ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh zipf = zipfile.ZipFile(TESTFN, mode="r") 1136ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh except: 1137ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.fail("Unable to create empty ZIP file in 'a' mode") 1138ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 1139ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh def test_open_empty_file(self): 1140ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh # Issue 1710703: Check that opening a file with less than 22 bytes 1141ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh # raises a BadZipfile exception (rather than the previously unhelpful 1142ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh # IOError) 1143ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh with open(TESTFN, 'w') as f: 1144ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh pass 1145ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertRaises(zipfile.BadZipfile, zipfile.ZipFile, TESTFN, 'r') 1146ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 1147ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh def test_create_zipinfo_before_1980(self): 1148ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertRaises(ValueError, 1149ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh zipfile.ZipInfo, 'seventies', (1979, 1, 1, 0, 0, 0)) 1150ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 1151ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh def tearDown(self): 1152ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh unlink(TESTFN) 1153ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh unlink(TESTFN2) 1154ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 1155ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 1156ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsiehclass DecryptionTests(unittest.TestCase): 1157ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh """Check that ZIP decryption works. Since the library does not 1158ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh support encryption at the moment, we use a pre-generated encrypted 1159ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh ZIP file.""" 1160ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 1161ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh data = ( 1162ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 'PK\x03\x04\x14\x00\x01\x00\x00\x00n\x92i.#y\xef?&\x00\x00\x00\x1a\x00' 1163ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh '\x00\x00\x08\x00\x00\x00test.txt\xfa\x10\xa0gly|\xfa-\xc5\xc0=\xf9y' 1164ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh '\x18\xe0\xa8r\xb3Z}Lg\xbc\xae\xf9|\x9b\x19\xe4\x8b\xba\xbb)\x8c\xb0\xdbl' 1165ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 'PK\x01\x02\x14\x00\x14\x00\x01\x00\x00\x00n\x92i.#y\xef?&\x00\x00\x00' 1166ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh '\x1a\x00\x00\x00\x08\x00\x00\x00\x00\x00\x00\x00\x01\x00 \x00\xb6\x81' 1167ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh '\x00\x00\x00\x00test.txtPK\x05\x06\x00\x00\x00\x00\x01\x00\x01\x006\x00' 1168ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh '\x00\x00L\x00\x00\x00\x00\x00' ) 1169ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh data2 = ( 1170ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 'PK\x03\x04\x14\x00\t\x00\x08\x00\xcf}38xu\xaa\xb2\x14\x00\x00\x00\x00\x02' 1171ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh '\x00\x00\x04\x00\x15\x00zeroUT\t\x00\x03\xd6\x8b\x92G\xda\x8b\x92GUx\x04' 1172ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh '\x00\xe8\x03\xe8\x03\xc7<M\xb5a\xceX\xa3Y&\x8b{oE\xd7\x9d\x8c\x98\x02\xc0' 1173ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 'PK\x07\x08xu\xaa\xb2\x14\x00\x00\x00\x00\x02\x00\x00PK\x01\x02\x17\x03' 1174ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh '\x14\x00\t\x00\x08\x00\xcf}38xu\xaa\xb2\x14\x00\x00\x00\x00\x02\x00\x00' 1175ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh '\x04\x00\r\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\x00\x00\x00\x00ze' 1176ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 'roUT\x05\x00\x03\xd6\x8b\x92GUx\x00\x00PK\x05\x06\x00\x00\x00\x00\x01' 1177ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh '\x00\x01\x00?\x00\x00\x00[\x00\x00\x00\x00\x00' ) 1178ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 1179ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh plain = 'zipfile.py encryption test' 1180ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh plain2 = '\x00'*512 1181ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 1182ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh def setUp(self): 1183ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh with open(TESTFN, "wb") as fp: 1184ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh fp.write(self.data) 1185ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.zip = zipfile.ZipFile(TESTFN, "r") 1186ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh with open(TESTFN2, "wb") as fp: 1187ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh fp.write(self.data2) 1188ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.zip2 = zipfile.ZipFile(TESTFN2, "r") 1189ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 1190ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh def tearDown(self): 1191ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.zip.close() 1192ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh os.unlink(TESTFN) 1193ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.zip2.close() 1194ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh os.unlink(TESTFN2) 1195ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 1196ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh def test_no_password(self): 1197ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh # Reading the encrypted file without password 1198ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh # must generate a RunTime exception 1199ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertRaises(RuntimeError, self.zip.read, "test.txt") 1200ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertRaises(RuntimeError, self.zip2.read, "zero") 1201ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 1202ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh def test_bad_password(self): 1203ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.zip.setpassword("perl") 1204ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertRaises(RuntimeError, self.zip.read, "test.txt") 1205ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.zip2.setpassword("perl") 1206ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertRaises(RuntimeError, self.zip2.read, "zero") 1207ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 1208ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh @skipUnless(zlib, "requires zlib") 1209ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh def test_good_password(self): 1210ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.zip.setpassword("python") 1211ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertEqual(self.zip.read("test.txt"), self.plain) 1212ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.zip2.setpassword("12345") 1213ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertEqual(self.zip2.read("zero"), self.plain2) 1214ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 1215ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 1216ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsiehclass TestsWithRandomBinaryFiles(unittest.TestCase): 1217ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh def setUp(self): 1218ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh datacount = randint(16, 64)*1024 + randint(1, 1024) 1219ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.data = ''.join(struct.pack('<f', random()*randint(-1000, 1000)) 1220ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh for i in xrange(datacount)) 1221ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 1222ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh # Make a source file with some lines 1223ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh with open(TESTFN, "wb") as fp: 1224ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh fp.write(self.data) 1225ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 1226ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh def tearDown(self): 1227ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh unlink(TESTFN) 1228ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh unlink(TESTFN2) 1229ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 1230ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh def make_test_archive(self, f, compression): 1231ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh # Create the ZIP archive 1232ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh with zipfile.ZipFile(f, "w", compression) as zipfp: 1233ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh zipfp.write(TESTFN, "another.name") 1234ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh zipfp.write(TESTFN, TESTFN) 1235ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 1236ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh def zip_test(self, f, compression): 1237ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.make_test_archive(f, compression) 1238ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 1239ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh # Read the ZIP archive 1240ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh with zipfile.ZipFile(f, "r", compression) as zipfp: 1241ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh testdata = zipfp.read(TESTFN) 1242ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertEqual(len(testdata), len(self.data)) 1243ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertEqual(testdata, self.data) 1244ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertEqual(zipfp.read("another.name"), self.data) 1245ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 1246ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh def test_stored(self): 1247ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh for f in (TESTFN2, TemporaryFile(), StringIO()): 1248ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.zip_test(f, zipfile.ZIP_STORED) 1249ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 1250ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh @skipUnless(zlib, "requires zlib") 1251ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh def test_deflated(self): 1252ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh for f in (TESTFN2, TemporaryFile(), io.BytesIO()): 1253ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.zip_test(f, zipfile.ZIP_DEFLATED) 1254ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 1255ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh def zip_open_test(self, f, compression): 1256ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.make_test_archive(f, compression) 1257ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 1258ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh # Read the ZIP archive 1259ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh with zipfile.ZipFile(f, "r", compression) as zipfp: 1260ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh zipdata1 = [] 1261ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh with zipfp.open(TESTFN) as zipopen1: 1262ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh while True: 1263ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh read_data = zipopen1.read(256) 1264ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh if not read_data: 1265ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh break 1266ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh zipdata1.append(read_data) 1267ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 1268ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh zipdata2 = [] 1269ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh with zipfp.open("another.name") as zipopen2: 1270ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh while True: 1271ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh read_data = zipopen2.read(256) 1272ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh if not read_data: 1273ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh break 1274ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh zipdata2.append(read_data) 1275ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 1276ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh testdata1 = ''.join(zipdata1) 1277ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertEqual(len(testdata1), len(self.data)) 1278ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertEqual(testdata1, self.data) 1279ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 1280ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh testdata2 = ''.join(zipdata2) 1281ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertEqual(len(testdata2), len(self.data)) 1282ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertEqual(testdata2, self.data) 1283ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 1284ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh def test_open_stored(self): 1285ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh for f in (TESTFN2, TemporaryFile(), StringIO()): 1286ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.zip_open_test(f, zipfile.ZIP_STORED) 1287ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 1288ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh @skipUnless(zlib, "requires zlib") 1289ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh def test_open_deflated(self): 1290ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh for f in (TESTFN2, TemporaryFile(), io.BytesIO()): 1291ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.zip_open_test(f, zipfile.ZIP_DEFLATED) 1292ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 1293ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh def zip_random_open_test(self, f, compression): 1294ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.make_test_archive(f, compression) 1295ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 1296ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh # Read the ZIP archive 1297ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh with zipfile.ZipFile(f, "r", compression) as zipfp: 1298ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh zipdata1 = [] 1299ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh with zipfp.open(TESTFN) as zipopen1: 1300ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh while True: 1301ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh read_data = zipopen1.read(randint(1, 1024)) 1302ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh if not read_data: 1303ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh break 1304ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh zipdata1.append(read_data) 1305ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 1306ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh testdata = ''.join(zipdata1) 1307ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertEqual(len(testdata), len(self.data)) 1308ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertEqual(testdata, self.data) 1309ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 1310ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh def test_random_open_stored(self): 1311ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh for f in (TESTFN2, TemporaryFile(), StringIO()): 1312ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.zip_random_open_test(f, zipfile.ZIP_STORED) 1313ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 1314ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh @skipUnless(zlib, "requires zlib") 1315ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh def test_random_open_deflated(self): 1316ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh for f in (TESTFN2, TemporaryFile(), io.BytesIO()): 1317ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.zip_random_open_test(f, zipfile.ZIP_DEFLATED) 1318ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 1319ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 1320ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh@skipUnless(zlib, "requires zlib") 1321ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsiehclass TestsWithMultipleOpens(unittest.TestCase): 1322ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh def setUp(self): 1323ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh # Create the ZIP archive 1324ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh with zipfile.ZipFile(TESTFN2, "w", zipfile.ZIP_DEFLATED) as zipfp: 1325ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh zipfp.writestr('ones', '1'*FIXEDTEST_SIZE) 1326ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh zipfp.writestr('twos', '2'*FIXEDTEST_SIZE) 1327ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 1328ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh def test_same_file(self): 1329ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh # Verify that (when the ZipFile is in control of creating file objects) 1330ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh # multiple open() calls can be made without interfering with each other. 1331ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh with zipfile.ZipFile(TESTFN2, mode="r") as zipf: 1332ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh zopen1 = zipf.open('ones') 1333ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh zopen2 = zipf.open('ones') 1334ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh data1 = zopen1.read(500) 1335ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh data2 = zopen2.read(500) 1336ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh data1 += zopen1.read(500) 1337ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh data2 += zopen2.read(500) 1338ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertEqual(data1, data2) 1339ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 1340ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh def test_different_file(self): 1341ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh # Verify that (when the ZipFile is in control of creating file objects) 1342ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh # multiple open() calls can be made without interfering with each other. 1343ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh with zipfile.ZipFile(TESTFN2, mode="r") as zipf: 1344ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh with zipf.open('ones') as zopen1, zipf.open('twos') as zopen2: 1345ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh data1 = zopen1.read(500) 1346ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh data2 = zopen2.read(500) 1347ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh data1 += zopen1.read(500) 1348ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh data2 += zopen2.read(500) 1349ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertEqual(data1, '1'*FIXEDTEST_SIZE) 1350ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertEqual(data2, '2'*FIXEDTEST_SIZE) 1351ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 1352ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh def test_interleaved(self): 1353ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh # Verify that (when the ZipFile is in control of creating file objects) 1354ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh # multiple open() calls can be made without interfering with each other. 1355ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh with zipfile.ZipFile(TESTFN2, mode="r") as zipf: 1356ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh with zipf.open('ones') as zopen1, zipf.open('twos') as zopen2: 1357ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh data1 = zopen1.read(500) 1358ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh data2 = zopen2.read(500) 1359ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh data1 += zopen1.read(500) 1360ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh data2 += zopen2.read(500) 1361ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertEqual(data1, '1'*FIXEDTEST_SIZE) 1362ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertEqual(data2, '2'*FIXEDTEST_SIZE) 1363ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 1364ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh def tearDown(self): 1365ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh unlink(TESTFN2) 1366ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 1367ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 1368ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsiehclass TestWithDirectory(unittest.TestCase): 1369ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh def setUp(self): 1370ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh os.mkdir(TESTFN2) 1371ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 1372ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh def test_extract_dir(self): 1373ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh with zipfile.ZipFile(findfile("zipdir.zip")) as zipf: 1374ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh zipf.extractall(TESTFN2) 1375ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertTrue(os.path.isdir(os.path.join(TESTFN2, "a"))) 1376ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertTrue(os.path.isdir(os.path.join(TESTFN2, "a", "b"))) 1377ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertTrue(os.path.exists(os.path.join(TESTFN2, "a", "b", "c"))) 1378ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 1379ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh def test_bug_6050(self): 1380ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh # Extraction should succeed if directories already exist 1381ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh os.mkdir(os.path.join(TESTFN2, "a")) 1382ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.test_extract_dir() 1383ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 1384ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh def test_store_dir(self): 1385ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh os.mkdir(os.path.join(TESTFN2, "x")) 1386ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh zipf = zipfile.ZipFile(TESTFN, "w") 1387ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh zipf.write(os.path.join(TESTFN2, "x"), "x") 1388ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertTrue(zipf.filelist[0].filename.endswith("x/")) 1389ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 1390ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh def tearDown(self): 1391ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh shutil.rmtree(TESTFN2) 1392ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh if os.path.exists(TESTFN): 1393ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh unlink(TESTFN) 1394ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 1395ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 1396ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsiehclass UniversalNewlineTests(unittest.TestCase): 1397ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh def setUp(self): 1398ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.line_gen = ["Test of zipfile line %d." % i 1399ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh for i in xrange(FIXEDTEST_SIZE)] 1400ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.seps = ('\r', '\r\n', '\n') 1401ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.arcdata, self.arcfiles = {}, {} 1402ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh for n, s in enumerate(self.seps): 1403ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.arcdata[s] = s.join(self.line_gen) + s 1404ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.arcfiles[s] = '%s-%d' % (TESTFN, n) 1405ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh open(self.arcfiles[s], "wb").write(self.arcdata[s]) 1406ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 1407ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh def make_test_archive(self, f, compression): 1408ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh # Create the ZIP archive 1409ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh with zipfile.ZipFile(f, "w", compression) as zipfp: 1410ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh for fn in self.arcfiles.values(): 1411ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh zipfp.write(fn, fn) 1412ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 1413ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh def read_test(self, f, compression): 1414ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.make_test_archive(f, compression) 1415ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 1416ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh # Read the ZIP archive 1417ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh with zipfile.ZipFile(f, "r") as zipfp: 1418ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh for sep, fn in self.arcfiles.items(): 1419ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh with zipfp.open(fn, "rU") as fp: 1420ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh zipdata = fp.read() 1421ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertEqual(self.arcdata[sep], zipdata) 1422ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 1423ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh def readline_read_test(self, f, compression): 1424ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.make_test_archive(f, compression) 1425ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 1426ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh # Read the ZIP archive 1427ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh zipfp = zipfile.ZipFile(f, "r") 1428ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh for sep, fn in self.arcfiles.items(): 1429ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh with zipfp.open(fn, "rU") as zipopen: 1430ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh data = '' 1431ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh while True: 1432ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh read = zipopen.readline() 1433ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh if not read: 1434ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh break 1435ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh data += read 1436ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 1437ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh read = zipopen.read(5) 1438ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh if not read: 1439ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh break 1440ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh data += read 1441ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 1442ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertEqual(data, self.arcdata['\n']) 1443ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 1444ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh zipfp.close() 1445ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 1446ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh def readline_test(self, f, compression): 1447ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.make_test_archive(f, compression) 1448ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 1449ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh # Read the ZIP archive 1450ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh with zipfile.ZipFile(f, "r") as zipfp: 1451ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh for sep, fn in self.arcfiles.items(): 1452ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh with zipfp.open(fn, "rU") as zipopen: 1453ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh for line in self.line_gen: 1454ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh linedata = zipopen.readline() 1455ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertEqual(linedata, line + '\n') 1456ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 1457ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh def readlines_test(self, f, compression): 1458ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.make_test_archive(f, compression) 1459ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 1460ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh # Read the ZIP archive 1461ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh with zipfile.ZipFile(f, "r") as zipfp: 1462ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh for sep, fn in self.arcfiles.items(): 1463ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh with zipfp.open(fn, "rU") as fp: 1464ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh ziplines = fp.readlines() 1465ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh for line, zipline in zip(self.line_gen, ziplines): 1466ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertEqual(zipline, line + '\n') 1467ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 1468ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh def iterlines_test(self, f, compression): 1469ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.make_test_archive(f, compression) 1470ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 1471ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh # Read the ZIP archive 1472ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh with zipfile.ZipFile(f, "r") as zipfp: 1473ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh for sep, fn in self.arcfiles.items(): 1474ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh for line, zipline in zip(self.line_gen, zipfp.open(fn, "rU")): 1475ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertEqual(zipline, line + '\n') 1476ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 1477ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh def test_read_stored(self): 1478ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh for f in (TESTFN2, TemporaryFile(), StringIO()): 1479ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.read_test(f, zipfile.ZIP_STORED) 1480ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 1481ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh def test_readline_read_stored(self): 1482ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh # Issue #7610: calls to readline() interleaved with calls to read(). 1483ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh for f in (TESTFN2, TemporaryFile(), StringIO()): 1484ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.readline_read_test(f, zipfile.ZIP_STORED) 1485ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 1486ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh def test_readline_stored(self): 1487ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh for f in (TESTFN2, TemporaryFile(), StringIO()): 1488ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.readline_test(f, zipfile.ZIP_STORED) 1489ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 1490ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh def test_readlines_stored(self): 1491ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh for f in (TESTFN2, TemporaryFile(), StringIO()): 1492ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.readlines_test(f, zipfile.ZIP_STORED) 1493ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 1494ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh def test_iterlines_stored(self): 1495ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh for f in (TESTFN2, TemporaryFile(), StringIO()): 1496ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.iterlines_test(f, zipfile.ZIP_STORED) 1497ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 1498ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh @skipUnless(zlib, "requires zlib") 1499ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh def test_read_deflated(self): 1500ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh for f in (TESTFN2, TemporaryFile(), StringIO()): 1501ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.read_test(f, zipfile.ZIP_DEFLATED) 1502ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 1503ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh @skipUnless(zlib, "requires zlib") 1504ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh def test_readline_read_deflated(self): 1505ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh # Issue #7610: calls to readline() interleaved with calls to read(). 1506ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh for f in (TESTFN2, TemporaryFile(), StringIO()): 1507ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.readline_read_test(f, zipfile.ZIP_DEFLATED) 1508ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 1509ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh @skipUnless(zlib, "requires zlib") 1510ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh def test_readline_deflated(self): 1511ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh for f in (TESTFN2, TemporaryFile(), StringIO()): 1512ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.readline_test(f, zipfile.ZIP_DEFLATED) 1513ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 1514ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh @skipUnless(zlib, "requires zlib") 1515ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh def test_readlines_deflated(self): 1516ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh for f in (TESTFN2, TemporaryFile(), StringIO()): 1517ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.readlines_test(f, zipfile.ZIP_DEFLATED) 1518ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 1519ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh @skipUnless(zlib, "requires zlib") 1520ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh def test_iterlines_deflated(self): 1521ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh for f in (TESTFN2, TemporaryFile(), StringIO()): 1522ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.iterlines_test(f, zipfile.ZIP_DEFLATED) 1523ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 1524ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh def tearDown(self): 1525ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh for sep, fn in self.arcfiles.items(): 1526ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh os.remove(fn) 1527ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh unlink(TESTFN) 1528ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh unlink(TESTFN2) 1529ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 1530ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 1531ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsiehdef test_main(): 1532ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh run_unittest(TestsWithSourceFile, TestZip64InSmallFiles, OtherTests, 1533ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh PyZipFileTests, DecryptionTests, TestsWithMultipleOpens, 1534ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh TestWithDirectory, UniversalNewlineTests, 1535ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh TestsWithRandomBinaryFiles) 1536ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 1537ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsiehif __name__ == "__main__": 1538ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh test_main() 1539