diff options
Diffstat (limited to 'lib-python/2.7/test/test_zipfile64.py')
-rw-r--r-- | lib-python/2.7/test/test_zipfile64.py | 124 |
1 files changed, 124 insertions, 0 deletions
diff --git a/lib-python/2.7/test/test_zipfile64.py b/lib-python/2.7/test/test_zipfile64.py new file mode 100644 index 0000000000..a6f3dca4b9 --- /dev/null +++ b/lib-python/2.7/test/test_zipfile64.py @@ -0,0 +1,124 @@ +# Tests of the full ZIP64 functionality of zipfile +# The test_support.requires call is the only reason for keeping this separate +# from test_zipfile +from test import test_support + +# XXX(nnorwitz): disable this test by looking for extra largfile resource +# which doesn't exist. This test takes over 30 minutes to run in general +# and requires more disk space than most of the buildbots. +test_support.requires( + 'extralargefile', + 'test requires loads of disk-space bytes and a long time to run' + ) + +# We can test part of the module without zlib. +try: + import zlib +except ImportError: + zlib = None + +import zipfile, os, unittest +import time +import sys + +from tempfile import TemporaryFile + +from test.test_support import TESTFN, run_unittest + +TESTFN2 = TESTFN + "2" + +# How much time in seconds can pass before we print a 'Still working' message. +_PRINT_WORKING_MSG_INTERVAL = 5 * 60 + +class TestsWithSourceFile(unittest.TestCase): + def setUp(self): + # Create test data. + # xrange() is important here -- don't want to create immortal space + # for a million ints. + line_gen = ("Test of zipfile line %d." % i for i in xrange(1000000)) + self.data = '\n'.join(line_gen) + + # And write it to a file. + fp = open(TESTFN, "wb") + fp.write(self.data) + fp.close() + + def zipTest(self, f, compression): + # Create the ZIP archive. + zipfp = zipfile.ZipFile(f, "w", compression, allowZip64=True) + + # It will contain enough copies of self.data to reach about 6GB of + # raw data to store. + filecount = 6*1024**3 // len(self.data) + + next_time = time.time() + _PRINT_WORKING_MSG_INTERVAL + for num in range(filecount): + zipfp.writestr("testfn%d" % num, self.data) + # Print still working message since this test can be really slow + if next_time <= time.time(): + next_time = time.time() + _PRINT_WORKING_MSG_INTERVAL + print >>sys.__stdout__, ( + ' zipTest still writing %d of %d, be patient...' % + (num, filecount)) + sys.__stdout__.flush() + zipfp.close() + + # Read the ZIP archive + zipfp = zipfile.ZipFile(f, "r", compression) + for num in range(filecount): + self.assertEqual(zipfp.read("testfn%d" % num), self.data) + # Print still working message since this test can be really slow + if next_time <= time.time(): + next_time = time.time() + _PRINT_WORKING_MSG_INTERVAL + print >>sys.__stdout__, ( + ' zipTest still reading %d of %d, be patient...' % + (num, filecount)) + sys.__stdout__.flush() + zipfp.close() + + def testStored(self): + # Try the temp file first. If we do TESTFN2 first, then it hogs + # gigabytes of disk space for the duration of the test. + for f in TemporaryFile(), TESTFN2: + self.zipTest(f, zipfile.ZIP_STORED) + + if zlib: + def testDeflated(self): + # Try the temp file first. If we do TESTFN2 first, then it hogs + # gigabytes of disk space for the duration of the test. + for f in TemporaryFile(), TESTFN2: + self.zipTest(f, zipfile.ZIP_DEFLATED) + + def tearDown(self): + for fname in TESTFN, TESTFN2: + if os.path.exists(fname): + os.remove(fname) + + +class OtherTests(unittest.TestCase): + def testMoreThan64kFiles(self): + # This test checks that more than 64k files can be added to an archive, + # and that the resulting archive can be read properly by ZipFile + zipf = zipfile.ZipFile(TESTFN, mode="w") + zipf.debug = 100 + numfiles = (1 << 16) * 3/2 + for i in xrange(numfiles): + zipf.writestr("foo%08d" % i, "%d" % (i**3 % 57)) + self.assertEqual(len(zipf.namelist()), numfiles) + zipf.close() + + zipf2 = zipfile.ZipFile(TESTFN, mode="r") + self.assertEqual(len(zipf2.namelist()), numfiles) + for i in xrange(numfiles): + self.assertEqual(zipf2.read("foo%08d" % i), "%d" % (i**3 % 57)) + zipf.close() + + def tearDown(self): + test_support.unlink(TESTFN) + test_support.unlink(TESTFN2) + +def test_main(): + run_unittest(TestsWithSourceFile, OtherTests) + +if __name__ == "__main__": + test_main() |