test_zipfile.py 2.62 KB
Newer Older
1
import zlib # implied prerequisite
2
import zipfile, os, StringIO, tempfile
3
from test.test_support import TestFailed
4

5 6
srcname = "junk9630"+os.extsep+"tmp"
zipname = "junk9708"+os.extsep+"tmp"
7

8 9 10

def zipTest(f, compression, srccontents):
    zip = zipfile.ZipFile(f, "w", compression)   # Create the ZIP archive
11
    zip.write(srcname, "another"+os.extsep+"name")
12 13
    zip.write(srcname, srcname)
    zip.close()
Tim Peters's avatar
Tim Peters committed
14

15 16
    zip = zipfile.ZipFile(f, "r", compression)   # Read the ZIP archive
    readData2 = zip.read(srcname)
17
    readData1 = zip.read("another"+os.extsep+"name")
18
    zip.close()
Tim Peters's avatar
Tim Peters committed
19

20 21 22 23
    if readData1 != srccontents or readData2 != srccontents:
        raise TestFailed, "Written data doesn't equal read data."


24
try:
25
    fp = open(srcname, "wb")               # Make a source file with some lines
26 27 28
    for i in range(0, 1000):
        fp.write("Test of zipfile line %d.\n" % i)
    fp.close()
Tim Peters's avatar
Tim Peters committed
29

30 31 32
    fp = open(srcname, "rb")
    writtenData = fp.read()
    fp.close()
Tim Peters's avatar
Tim Peters committed
33

34 35
    for file in (zipname, tempfile.TemporaryFile(), StringIO.StringIO()):
        zipTest(file, zipfile.ZIP_STORED, writtenData)
36

37 38
    for file in (zipname, tempfile.TemporaryFile(), StringIO.StringIO()):
        zipTest(file, zipfile.ZIP_DEFLATED, writtenData)
39 40

finally:
41 42 43 44
    if os.path.isfile(srcname):           # Remove temporary files
        os.unlink(srcname)
    if os.path.isfile(zipname):
        os.unlink(zipname)
45

46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61

# 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)


62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78
# 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.")