| # We can test part of the module without zlib. | 
 | try: | 
 |     import zlib | 
 | except ImportError: | 
 |     zlib = None | 
 |  | 
 | import zipfile, os, unittest | 
 |  | 
 | from StringIO import StringIO | 
 | from tempfile import TemporaryFile | 
 |  | 
 | from test.test_support import TESTFN, run_unittest | 
 |  | 
 | TESTFN2 = TESTFN + "2" | 
 |  | 
 | class TestsWithSourceFile(unittest.TestCase): | 
 |     def setUp(self): | 
 |         line_gen = ("Test of zipfile line %d." % i for i in range(0, 1000)) | 
 |         self.data = '\n'.join(line_gen) | 
 |  | 
 |         # Make a source file with some lines | 
 |         fp = open(TESTFN, "wb") | 
 |         fp.write(self.data) | 
 |         fp.close() | 
 |  | 
 |     def zipTest(self, f, compression): | 
 |         # Create the ZIP archive | 
 |         zipfp = zipfile.ZipFile(f, "w", compression) | 
 |         zipfp.write(TESTFN, "another"+os.extsep+"name") | 
 |         zipfp.write(TESTFN, TESTFN) | 
 |         zipfp.close() | 
 |  | 
 |         # Read the ZIP archive | 
 |         zipfp = zipfile.ZipFile(f, "r", compression) | 
 |         self.assertEqual(zipfp.read(TESTFN), self.data) | 
 |         self.assertEqual(zipfp.read("another"+os.extsep+"name"), self.data) | 
 |         zipfp.close() | 
 |  | 
 |     def testStored(self): | 
 |         for f in (TESTFN2, TemporaryFile(), StringIO()): | 
 |             self.zipTest(f, zipfile.ZIP_STORED) | 
 |  | 
 |     if zlib: | 
 |         def testDeflated(self): | 
 |             for f in (TESTFN2, TemporaryFile(), StringIO()): | 
 |                 self.zipTest(f, zipfile.ZIP_DEFLATED) | 
 |  | 
 |     def testAbsoluteArcnames(self): | 
 |         zipfp = zipfile.ZipFile(TESTFN2, "w", zipfile.ZIP_STORED) | 
 |         zipfp.write(TESTFN, "/absolute") | 
 |         zipfp.close() | 
 |  | 
 |         zipfp = zipfile.ZipFile(TESTFN2, "r", zipfile.ZIP_STORED) | 
 |         self.assertEqual(zipfp.namelist(), ["absolute"]) | 
 |         zipfp.close() | 
 |  | 
 |  | 
 |     def tearDown(self): | 
 |         os.remove(TESTFN) | 
 |         os.remove(TESTFN2) | 
 |  | 
 | class OtherTests(unittest.TestCase): | 
 |     def testCloseErroneousFile(self): | 
 |         # This test checks that the ZipFile constructor closes the file object | 
 |         # it opens if there's an error in the file.  If it doesn't, the traceback | 
 |         # holds a reference to the ZipFile object and, indirectly, the file object. | 
 |         # On Windows, this causes the os.unlink() call to fail because the | 
 |         # underlying file is still open.  This is SF bug #412214. | 
 |         # | 
 |         fp = open(TESTFN, "w") | 
 |         fp.write("this is not a legal zip file\n") | 
 |         fp.close() | 
 |         try: | 
 |             zf = zipfile.ZipFile(TESTFN) | 
 |         except zipfile.BadZipfile: | 
 |             os.unlink(TESTFN) | 
 |  | 
 |     def testNonExistentFileRaisesIOError(self): | 
 |         # make sure we don't raise an AttributeError when a partially-constructed | 
 |         # ZipFile instance is finalized; this tests for regression on SF tracker | 
 |         # bug #403871. | 
 |  | 
 |         # The bug we're testing for caused an AttributeError to be raised | 
 |         # when a ZipFile instance was created for a file that did not | 
 |         # exist; the .fp member was not initialized but was needed by the | 
 |         # __del__() method.  Since the AttributeError is in the __del__(), | 
 |         # it is ignored, but the user should be sufficiently annoyed by | 
 |         # the message on the output that regression will be noticed | 
 |         # quickly. | 
 |         self.assertRaises(IOError, zipfile.ZipFile, TESTFN) | 
 |  | 
 |     def testClosedZipRaisesRuntimeError(self): | 
 |         # Verify that testzip() doesn't swallow inappropriate exceptions. | 
 |         data = StringIO() | 
 |         zipf = zipfile.ZipFile(data, mode="w") | 
 |         zipf.writestr("foo.txt", "O, for a Muse of Fire!") | 
 |         zipf.close() | 
 |  | 
 |         # This is correct; calling .read on a closed ZipFile should throw | 
 |         # a RuntimeError, and so should calling .testzip.  An earlier | 
 |         # version of .testzip would swallow this exception (and any other) | 
 |         # and report that the first file in the archive was corrupt. | 
 |         self.assertRaises(RuntimeError, zipf.testzip) | 
 |  | 
 | def test_main(): | 
 |     run_unittest(TestsWithSourceFile, OtherTests) | 
 |  | 
 | if __name__ == "__main__": | 
 |     test_main() |