summaryrefslogtreecommitdiffstats
path: root/Lib/test/test_zipfile.py
blob: 8da74f58bd0821e08ecb29ec6efca71f9f87259d (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
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)

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