| import zlib # implied prerequisite |
| import zipfile, os, StringIO, tempfile |
| from test.test_support import TestFailed |
| |
| srcname = "junk9630"+os.extsep+"tmp" |
| zipname = "junk9708"+os.extsep+"tmp" |
| |
| |
| def zipTest(f, compression, srccontents): |
| zip = zipfile.ZipFile(f, "w", compression) # Create the ZIP archive |
| zip.write(srcname, "another"+os.extsep+"name") |
| zip.write(srcname, srcname) |
| zip.close() |
| |
| zip = zipfile.ZipFile(f, "r", compression) # Read the ZIP archive |
| readData2 = zip.read(srcname) |
| readData1 = zip.read("another"+os.extsep+"name") |
| zip.close() |
| |
| if readData1 != srccontents or readData2 != srccontents: |
| raise TestFailed, "Written data doesn't equal read data." |
| |
| |
| try: |
| fp = open(srcname, "wb") # Make a source file with some lines |
| for i in range(0, 1000): |
| fp.write("Test of zipfile line %d.\n" % i) |
| fp.close() |
| |
| fp = open(srcname, "rb") |
| writtenData = fp.read() |
| fp.close() |
| |
| for file in (zipname, tempfile.TemporaryFile(), StringIO.StringIO()): |
| zipTest(file, zipfile.ZIP_STORED, writtenData) |
| |
| for file in (zipname, tempfile.TemporaryFile(), StringIO.StringIO()): |
| zipTest(file, zipfile.ZIP_DEFLATED, writtenData) |
| |
| finally: |
| if os.path.isfile(srcname): # Remove temporary files |
| os.unlink(srcname) |
| if os.path.isfile(zipname): |
| os.unlink(zipname) |
| |
| |
| # 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(srcname, "w") |
| fp.write("this is not a legal zip file\n") |
| fp.close() |
| try: |
| zf = zipfile.ZipFile(srcname) |
| except zipfile.BadZipfile: |
| os.unlink(srcname) |
| |
| |
| # 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. |
| try: |
| zipfile.ZipFile(srcname) |
| except IOError: |
| # 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. |
| pass |
| else: |
| raise TestFailed("expected creation of readable ZipFile without\n" |
| " a file to raise an IOError.") |
| |
| |
| # Verify that testzip() doesn't swallow inappropriate exceptions. |
| data = StringIO.StringIO() |
| zipf = zipfile.ZipFile(data, mode="w") |
| zipf.writestr("foo.txt", "O, for a Muse of Fire!") |
| zipf.close() |
| zipf = zipfile.ZipFile(data, mode="r") |
| zipf.close() |
| try: |
| zipf.testzip() |
| except RuntimeError: |
| # 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. |
| pass |
| else: |
| raise TestFailed("expected calling .testzip on a closed ZipFile" |
| " to raise a RuntimeError") |
| del data, zipf |