import zipfile, os, StringIO, tempfile from test_support import TestFailed srcname = "junk9630.tmp" zipname = "junk9708.tmp" def zipTest(f, compression, srccontents): zip = zipfile.ZipFile(f, "w", compression) # Create the ZIP archive zip.write(srcname, "another.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.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.")