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