[Python-checkins] python/dist/src/Lib/test test_tarfile.py, 1.11, 1.12

nnorwitz at users.sourceforge.net nnorwitz at users.sourceforge.net
Tue Jul 20 23:54:20 CEST 2004


Update of /cvsroot/python/python/dist/src/Lib/test
In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv9308/Lib/test

Modified Files:
	test_tarfile.py 
Log Message:
SF #846659, fix bufsize violation and GNU longname/longlink extensions

Index: test_tarfile.py
===================================================================
RCS file: /cvsroot/python/python/dist/src/Lib/test/test_tarfile.py,v
retrieving revision 1.11
retrieving revision 1.12
diff -C2 -d -r1.11 -r1.12
*** test_tarfile.py	12 Jun 2003 19:16:58 -0000	1.11
--- test_tarfile.py	20 Jul 2004 21:54:18 -0000	1.12
***************
*** 206,209 ****
--- 206,297 ----
      sep = '|'
  
+ class WriteGNULongTest(unittest.TestCase):
+     """This testcase checks for correct creation of GNU Longname
+        and Longlink extensions.
+ 
+        It creates a tarfile and adds empty members with either
+        long names, long linknames or both and compares the size
+        of the tarfile with the expected size.
+ 
+        It checks for SF bug #812325 in TarFile._create_gnulong().
+ 
+        While I was writing this testcase, I noticed a second bug
+        in the same method:
+        Long{names,links} weren't null-terminated which lead to
+        bad tarfiles when their length was a multiple of 512. This
+        is tested as well.
+     """
+ 
+     def setUp(self):
+         self.tar = tarfile.open(tmpname(), "w")
+         self.tar.posix = False
+ 
+     def tearDown(self):
+         self.tar.close()
+ 
+     def _length(self, s):
+         blocks, remainder = divmod(len(s) + 1, 512)
+         if remainder:
+             blocks += 1
+         return blocks * 512
+ 
+     def _calc_size(self, name, link=None):
+         # initial tar header
+         count = 512
+ 
+         if len(name) > tarfile.LENGTH_NAME:
+             # gnu longname extended header + longname
+             count += 512
+             count += self._length(name)
+ 
+         if link is not None and len(link) > tarfile.LENGTH_LINK:
+             # gnu longlink extended header + longlink
+             count += 512
+             count += self._length(link)
+ 
+         return count
+ 
+     def _test(self, name, link=None):
+         tarinfo = tarfile.TarInfo(name)
+         if link:
+             tarinfo.linkname = link
+             tarinfo.type = tarfile.LNKTYPE
+ 
+         self.tar.addfile(tarinfo)
+ 
+         v1 = self._calc_size(name, link)
+         v2 = self.tar.offset
+         self.assertEqual(v1, v2, "GNU longname/longlink creation failed")
+ 
+     def test_longname_1023(self):
+         self._test(("longnam/" * 127) + "longnam")
+ 
+     def test_longname_1024(self):
+         self._test(("longnam/" * 127) + "longname")
+ 
+     def test_longname_1025(self):
+         self._test(("longnam/" * 127) + "longname_")
+ 
+     def test_longlink_1023(self):
+         self._test("name", ("longlnk/" * 127) + "longlnk")
+ 
+     def test_longlink_1024(self):
+         self._test("name", ("longlnk/" * 127) + "longlink")
+ 
+     def test_longlink_1025(self):
+         self._test("name", ("longlnk/" * 127) + "longlink_")
+ 
+     def test_longnamelink_1023(self):
+         self._test(("longnam/" * 127) + "longnam",
+                    ("longlnk/" * 127) + "longlnk")
+ 
+     def test_longnamelink_1024(self):
+         self._test(("longnam/" * 127) + "longname",
+                    ("longlnk/" * 127) + "longlink")
+ 
+     def test_longnamelink_1025(self):
+         self._test(("longnam/" * 127) + "longname_",
+                    ("longlnk/" * 127) + "longlink_")
+ 
  # Gzip TestCases
  class ReadTestGzip(ReadTest):
***************
*** 246,250 ****
          ReadStreamTest,
          WriteTest,
!         WriteStreamTest
      ]
  
--- 334,339 ----
          ReadStreamTest,
          WriteTest,
!         WriteStreamTest,
!         WriteGNULongTest,
      ]
  



More information about the Python-checkins mailing list