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