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