# We can test part of the module without zlib.
import zipfile
, os
, unittest
from StringIO
import StringIO
from tempfile
import TemporaryFile
from test
.test_support
import TESTFN
, run_unittest
class TestsWithSourceFile(unittest
.TestCase
):
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
def zipTest(self
, f
, compression
):
zipfp
= zipfile
.ZipFile(f
, "w", compression
)
zipfp
.write(TESTFN
, "another"+os
.extsep
+"name")
zipfp
.write(TESTFN
, TESTFN
)
zipfp
= zipfile
.ZipFile(f
, "r", compression
)
self
.assertEqual(zipfp
.read(TESTFN
), self
.data
)
self
.assertEqual(zipfp
.read("another"+os
.extsep
+"name"), self
.data
)
for f
in (TESTFN2
, TemporaryFile(), StringIO()):
self
.zipTest(f
, zipfile
.ZIP_STORED
)
for f
in (TESTFN2
, TemporaryFile(), StringIO()):
self
.zipTest(f
, zipfile
.ZIP_DEFLATED
)
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
.write("this is not a legal zip file\n")
zf
= zipfile
.ZipFile(TESTFN
)
except zipfile
.BadZipfile
:
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
# 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
self
.assertRaises(IOError, zipfile
.ZipFile
, TESTFN
)
def testClosedZipRaisesRuntimeError(self
):
# Verify that testzip() doesn't swallow inappropriate exceptions.
zipf
= zipfile
.ZipFile(data
, mode
="w")
zipf
.writestr("foo.txt", "O, for a Muse of Fire!")
# 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
)
run_unittest(TestsWithSourceFile
, OtherTests
)
if __name__
== "__main__":