diff options
| author | Martin v. Löwis <martin@v.loewis.de> | 2008-07-03 12:51:14 (GMT) |
|---|---|---|
| committer | Martin v. Löwis <martin@v.loewis.de> | 2008-07-03 12:51:14 (GMT) |
| commit | 8c4364127193100d0c3e267f5a49aadd096732a6 (patch) | |
| tree | f7e0f461e58fa5cd6d923b9d09e4010aa767bc8b /Lib/test | |
| parent | f5d2b4ce930666c9f58c9c7da1744388143860df (diff) | |
| download | cpython-8c4364127193100d0c3e267f5a49aadd096732a6.zip cpython-8c4364127193100d0c3e267f5a49aadd096732a6.tar.gz cpython-8c4364127193100d0c3e267f5a49aadd096732a6.tar.bz2 | |
Patch #1622: Correct interpretation of various ZIP header fields.
Also fixes
- Issue #1526: Allow more than 64k files to be added to Zip64 file.
- Issue #1746: Correct handling of zipfile archive comments (previously
archives with comments over 4k were flagged as invalid). Allow writing
Zip files with archives by setting the 'comment' attribute of a ZipFile.
Diffstat (limited to 'Lib/test')
| -rw-r--r-- | Lib/test/test_zipfile.py | 48 | ||||
| -rw-r--r-- | Lib/test/test_zipfile64.py | 26 |
2 files changed, 73 insertions, 1 deletions
diff --git a/Lib/test/test_zipfile.py b/Lib/test/test_zipfile.py index 4bc2104..90ac4f6 100644 --- a/Lib/test/test_zipfile.py +++ b/Lib/test/test_zipfile.py @@ -712,6 +712,54 @@ class OtherTests(unittest.TestCase): zipf.writestr("foo.txt\x00qqq", "O, for a Muse of Fire!") self.assertEqual(zipf.namelist(), ['foo.txt']) + def test_StructSizes(self): + # check that ZIP internal structure sizes are calculated correctly + self.assertEqual(zipfile.sizeEndCentDir, 22) + self.assertEqual(zipfile.sizeCentralDir, 46) + self.assertEqual(zipfile.sizeEndCentDir64, 56) + self.assertEqual(zipfile.sizeEndCentDir64Locator, 20) + + def testComments(self): + # This test checks that comments on the archive are handled properly + + # check default comment is empty + zipf = zipfile.ZipFile(TESTFN, mode="w") + self.assertEqual(zipf.comment, '') + zipf.writestr("foo.txt", "O, for a Muse of Fire!") + zipf.close() + zipfr = zipfile.ZipFile(TESTFN, mode="r") + self.assertEqual(zipfr.comment, '') + zipfr.close() + + # check a simple short comment + comment = 'Bravely taking to his feet, he beat a very brave retreat.' + zipf = zipfile.ZipFile(TESTFN, mode="w") + zipf.comment = comment + zipf.writestr("foo.txt", "O, for a Muse of Fire!") + zipf.close() + zipfr = zipfile.ZipFile(TESTFN, mode="r") + self.assertEqual(zipfr.comment, comment) + zipfr.close() + + # check a comment of max length + comment2 = ''.join(['%d' % (i**3 % 10) for i in xrange((1 << 16)-1)]) + zipf = zipfile.ZipFile(TESTFN, mode="w") + zipf.comment = comment2 + zipf.writestr("foo.txt", "O, for a Muse of Fire!") + zipf.close() + zipfr = zipfile.ZipFile(TESTFN, mode="r") + self.assertEqual(zipfr.comment, comment2) + zipfr.close() + + # check a comment that is too long is truncated + zipf = zipfile.ZipFile(TESTFN, mode="w") + zipf.comment = comment2 + 'oops' + zipf.writestr("foo.txt", "O, for a Muse of Fire!") + zipf.close() + zipfr = zipfile.ZipFile(TESTFN, mode="r") + self.assertEqual(zipfr.comment, comment2) + zipfr.close() + def tearDown(self): support.unlink(TESTFN) support.unlink(TESTFN2) diff --git a/Lib/test/test_zipfile64.py b/Lib/test/test_zipfile64.py index 6ce2ae5..a6f3dca 100644 --- a/Lib/test/test_zipfile64.py +++ b/Lib/test/test_zipfile64.py @@ -2,6 +2,7 @@ # 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. @@ -93,8 +94,31 @@ class TestsWithSourceFile(unittest.TestCase): 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) + run_unittest(TestsWithSourceFile, OtherTests) if __name__ == "__main__": test_main() |
