| 
									
										
										
										
											2003-01-05 23:19:43 +00:00
										 |  |  | import sys | 
					
						
							|  |  |  | import os | 
					
						
							|  |  |  | import shutil | 
					
						
							| 
									
										
										
										
											2003-06-12 08:01:06 +00:00
										 |  |  | import tempfile | 
					
						
							| 
									
										
										
										
											2006-05-10 16:26:03 +00:00
										 |  |  | import StringIO | 
					
						
							| 
									
										
										
										
											2003-01-05 23:19:43 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | import unittest | 
					
						
							|  |  |  | import tarfile | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | from test import test_support | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | # Check for our compression modules. | 
					
						
							|  |  |  | try: | 
					
						
							|  |  |  |     import gzip | 
					
						
							| 
									
										
										
										
											2003-04-14 01:18:32 +00:00
										 |  |  |     gzip.GzipFile | 
					
						
							|  |  |  | except (ImportError, AttributeError): | 
					
						
							| 
									
										
										
										
											2003-01-05 23:19:43 +00:00
										 |  |  |     gzip = None | 
					
						
							|  |  |  | try: | 
					
						
							|  |  |  |     import bz2 | 
					
						
							|  |  |  | except ImportError: | 
					
						
							|  |  |  |     bz2 = None | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | def path(path): | 
					
						
							|  |  |  |     return test_support.findfile(path) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2003-06-12 08:01:06 +00:00
										 |  |  | testtar = path("testtar.tar") | 
					
						
							|  |  |  | tempdir = os.path.join(tempfile.gettempdir(), "testtar" + os.extsep + "dir") | 
					
						
							|  |  |  | tempname = test_support.TESTFN | 
					
						
							| 
									
										
										
										
											2006-05-10 16:26:03 +00:00
										 |  |  | membercount = 12 | 
					
						
							| 
									
										
										
										
											2003-01-05 23:19:43 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | def tarname(comp=""): | 
					
						
							|  |  |  |     if not comp: | 
					
						
							|  |  |  |         return testtar | 
					
						
							| 
									
										
										
										
											2003-06-12 19:16:58 +00:00
										 |  |  |     return os.path.join(tempdir, "%s%s%s" % (testtar, os.extsep, comp)) | 
					
						
							| 
									
										
										
										
											2003-01-05 23:19:43 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | def dirname(): | 
					
						
							|  |  |  |     if not os.path.exists(tempdir): | 
					
						
							|  |  |  |         os.mkdir(tempdir) | 
					
						
							|  |  |  |     return tempdir | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | def tmpname(): | 
					
						
							|  |  |  |     return tempname | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | class BaseTest(unittest.TestCase): | 
					
						
							|  |  |  |     comp = '' | 
					
						
							|  |  |  |     mode = 'r' | 
					
						
							|  |  |  |     sep = ':' | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     def setUp(self): | 
					
						
							|  |  |  |         mode = self.mode + self.sep + self.comp | 
					
						
							|  |  |  |         self.tar = tarfile.open(tarname(self.comp), mode) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     def tearDown(self): | 
					
						
							|  |  |  |         self.tar.close() | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | class ReadTest(BaseTest): | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     def test(self): | 
					
						
							|  |  |  |         """Test member extraction.
 | 
					
						
							|  |  |  |         """
 | 
					
						
							|  |  |  |         members = 0 | 
					
						
							|  |  |  |         for tarinfo in self.tar: | 
					
						
							|  |  |  |             members += 1 | 
					
						
							|  |  |  |             if not tarinfo.isreg(): | 
					
						
							|  |  |  |                 continue | 
					
						
							|  |  |  |             f = self.tar.extractfile(tarinfo) | 
					
						
							|  |  |  |             self.assert_(len(f.read()) == tarinfo.size, | 
					
						
							|  |  |  |                          "size read does not match expected size") | 
					
						
							|  |  |  |             f.close() | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         self.assert_(members == membercount, | 
					
						
							|  |  |  |                      "could not find all members") | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     def test_sparse(self): | 
					
						
							|  |  |  |         """Test sparse member extraction.
 | 
					
						
							|  |  |  |         """
 | 
					
						
							|  |  |  |         if self.sep != "|": | 
					
						
							|  |  |  |             f1 = self.tar.extractfile("S-SPARSE") | 
					
						
							| 
									
										
										
										
											2003-03-07 13:27:53 +00:00
										 |  |  |             f2 = self.tar.extractfile("S-SPARSE-WITH-NULLS") | 
					
						
							| 
									
										
										
										
											2003-01-05 23:19:43 +00:00
										 |  |  |             self.assert_(f1.read() == f2.read(), | 
					
						
							|  |  |  |                          "_FileObject failed on sparse file member") | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     def test_readlines(self): | 
					
						
							|  |  |  |         """Test readlines() method of _FileObject.
 | 
					
						
							|  |  |  |         """
 | 
					
						
							|  |  |  |         if self.sep != "|": | 
					
						
							| 
									
										
										
										
											2003-03-07 13:27:53 +00:00
										 |  |  |             filename = "0-REGTYPE-TEXT" | 
					
						
							| 
									
										
										
										
											2003-01-05 23:19:43 +00:00
										 |  |  |             self.tar.extract(filename, dirname()) | 
					
						
							| 
									
										
										
										
											2006-05-26 14:02:05 +00:00
										 |  |  |             f = open(os.path.join(dirname(), filename), "rU") | 
					
						
							|  |  |  |             lines1 = f.readlines() | 
					
						
							|  |  |  |             f.close() | 
					
						
							| 
									
										
										
										
											2003-01-05 23:19:43 +00:00
										 |  |  |             lines2 = self.tar.extractfile(filename).readlines() | 
					
						
							|  |  |  |             self.assert_(lines1 == lines2, | 
					
						
							|  |  |  |                          "_FileObject.readline() does not work correctly") | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2005-03-03 08:17:42 +00:00
										 |  |  |     def test_iter(self): | 
					
						
							|  |  |  |         # Test iteration over ExFileObject. | 
					
						
							|  |  |  |         if self.sep != "|": | 
					
						
							|  |  |  |             filename = "0-REGTYPE-TEXT" | 
					
						
							|  |  |  |             self.tar.extract(filename, dirname()) | 
					
						
							| 
									
										
										
										
											2006-05-26 14:02:05 +00:00
										 |  |  |             f = open(os.path.join(dirname(), filename), "rU") | 
					
						
							|  |  |  |             lines1 = f.readlines() | 
					
						
							|  |  |  |             f.close() | 
					
						
							| 
									
										
										
										
											2005-03-03 08:17:42 +00:00
										 |  |  |             lines2 = [line for line in self.tar.extractfile(filename)] | 
					
						
							|  |  |  |             self.assert_(lines1 == lines2, | 
					
						
							|  |  |  |                          "ExFileObject iteration does not work correctly") | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2003-01-05 23:19:43 +00:00
										 |  |  |     def test_seek(self): | 
					
						
							|  |  |  |         """Test seek() method of _FileObject, incl. random reading.
 | 
					
						
							|  |  |  |         """
 | 
					
						
							|  |  |  |         if self.sep != "|": | 
					
						
							| 
									
										
										
										
											2006-12-23 16:40:13 +00:00
										 |  |  |             filename = "0-REGTYPE-TEXT" | 
					
						
							| 
									
										
										
										
											2003-01-05 23:19:43 +00:00
										 |  |  |             self.tar.extract(filename, dirname()) | 
					
						
							| 
									
										
										
										
											2006-05-26 14:02:05 +00:00
										 |  |  |             f = open(os.path.join(dirname(), filename), "rb") | 
					
						
							|  |  |  |             data = f.read() | 
					
						
							|  |  |  |             f.close() | 
					
						
							| 
									
										
										
										
											2003-01-05 23:19:43 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  |             tarinfo = self.tar.getmember(filename) | 
					
						
							|  |  |  |             fobj = self.tar.extractfile(tarinfo) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |             text = fobj.read() | 
					
						
							|  |  |  |             fobj.seek(0) | 
					
						
							|  |  |  |             self.assert_(0 == fobj.tell(), | 
					
						
							|  |  |  |                          "seek() to file's start failed") | 
					
						
							|  |  |  |             fobj.seek(2048, 0) | 
					
						
							|  |  |  |             self.assert_(2048 == fobj.tell(), | 
					
						
							|  |  |  |                          "seek() to absolute position failed") | 
					
						
							|  |  |  |             fobj.seek(-1024, 1) | 
					
						
							|  |  |  |             self.assert_(1024 == fobj.tell(), | 
					
						
							|  |  |  |                          "seek() to negative relative position failed") | 
					
						
							|  |  |  |             fobj.seek(1024, 1) | 
					
						
							|  |  |  |             self.assert_(2048 == fobj.tell(), | 
					
						
							|  |  |  |                          "seek() to positive relative position failed") | 
					
						
							|  |  |  |             s = fobj.read(10) | 
					
						
							|  |  |  |             self.assert_(s == data[2048:2058], | 
					
						
							|  |  |  |                          "read() after seek failed") | 
					
						
							|  |  |  |             fobj.seek(0, 2) | 
					
						
							|  |  |  |             self.assert_(tarinfo.size == fobj.tell(), | 
					
						
							|  |  |  |                          "seek() to file's end failed") | 
					
						
							|  |  |  |             self.assert_(fobj.read() == "", | 
					
						
							|  |  |  |                          "read() at file's end did not return empty string") | 
					
						
							|  |  |  |             fobj.seek(-tarinfo.size, 2) | 
					
						
							|  |  |  |             self.assert_(0 == fobj.tell(), | 
					
						
							|  |  |  |                          "relative seek() to file's start failed") | 
					
						
							|  |  |  |             fobj.seek(512) | 
					
						
							|  |  |  |             s1 = fobj.readlines() | 
					
						
							|  |  |  |             fobj.seek(512) | 
					
						
							|  |  |  |             s2 = fobj.readlines() | 
					
						
							|  |  |  |             self.assert_(s1 == s2, | 
					
						
							|  |  |  |                          "readlines() after seek failed") | 
					
						
							| 
									
										
										
										
											2006-12-23 16:40:13 +00:00
										 |  |  |             fobj.seek(0) | 
					
						
							|  |  |  |             self.assert_(len(fobj.readline()) == fobj.tell(), | 
					
						
							|  |  |  |                          "tell() after readline() failed") | 
					
						
							|  |  |  |             fobj.seek(512) | 
					
						
							|  |  |  |             self.assert_(len(fobj.readline()) + 512 == fobj.tell(), | 
					
						
							|  |  |  |                          "tell() after seek() and readline() failed") | 
					
						
							|  |  |  |             fobj.seek(0) | 
					
						
							|  |  |  |             line = fobj.readline() | 
					
						
							|  |  |  |             self.assert_(fobj.read() == data[len(line):], | 
					
						
							|  |  |  |                          "read() after readline() failed") | 
					
						
							| 
									
										
										
										
											2003-01-05 23:19:43 +00:00
										 |  |  |             fobj.close() | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2005-10-28 05:52:22 +00:00
										 |  |  |     def test_old_dirtype(self): | 
					
						
							|  |  |  |         """Test old style dirtype member (bug #1336623).
 | 
					
						
							|  |  |  |         """
 | 
					
						
							|  |  |  |         # Old tars create directory members using a REGTYPE | 
					
						
							|  |  |  |         # header with a "/" appended to the filename field. | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         # Create an old tar style directory entry. | 
					
						
							|  |  |  |         filename = tmpname() | 
					
						
							|  |  |  |         tarinfo = tarfile.TarInfo("directory/") | 
					
						
							|  |  |  |         tarinfo.type = tarfile.REGTYPE | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2006-05-26 13:39:17 +00:00
										 |  |  |         fobj = open(filename, "w") | 
					
						
							| 
									
										
										
										
											2005-10-28 05:52:22 +00:00
										 |  |  |         fobj.write(tarinfo.tobuf()) | 
					
						
							|  |  |  |         fobj.close() | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         try: | 
					
						
							|  |  |  |             # Test if it is still a directory entry when | 
					
						
							|  |  |  |             # read back. | 
					
						
							|  |  |  |             tar = tarfile.open(filename) | 
					
						
							|  |  |  |             tarinfo = tar.getmembers()[0] | 
					
						
							|  |  |  |             tar.close() | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |             self.assert_(tarinfo.type == tarfile.DIRTYPE) | 
					
						
							|  |  |  |             self.assert_(tarinfo.name.endswith("/")) | 
					
						
							|  |  |  |         finally: | 
					
						
							|  |  |  |             try: | 
					
						
							|  |  |  |                 os.unlink(filename) | 
					
						
							|  |  |  |             except: | 
					
						
							|  |  |  |                 pass | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2003-01-05 23:19:43 +00:00
										 |  |  | class ReadStreamTest(ReadTest): | 
					
						
							|  |  |  |     sep = "|" | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     def test(self): | 
					
						
							|  |  |  |         """Test member extraction, and for StreamError when
 | 
					
						
							|  |  |  |            seeking backwards. | 
					
						
							|  |  |  |         """
 | 
					
						
							|  |  |  |         ReadTest.test(self) | 
					
						
							|  |  |  |         tarinfo = self.tar.getmembers()[0] | 
					
						
							|  |  |  |         f = self.tar.extractfile(tarinfo) | 
					
						
							|  |  |  |         self.assertRaises(tarfile.StreamError, f.read) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     def test_stream(self): | 
					
						
							|  |  |  |         """Compare the normal tar and the stream tar.
 | 
					
						
							|  |  |  |         """
 | 
					
						
							|  |  |  |         stream = self.tar | 
					
						
							|  |  |  |         tar = tarfile.open(tarname(), 'r') | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         while 1: | 
					
						
							|  |  |  |             t1 = tar.next() | 
					
						
							|  |  |  |             t2 = stream.next() | 
					
						
							|  |  |  |             if t1 is None: | 
					
						
							|  |  |  |                 break | 
					
						
							|  |  |  |             self.assert_(t2 is not None, "stream.next() failed.") | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |             if t2.islnk() or t2.issym(): | 
					
						
							|  |  |  |                 self.assertRaises(tarfile.StreamError, stream.extractfile, t2) | 
					
						
							|  |  |  |                 continue | 
					
						
							|  |  |  |             v1 = tar.extractfile(t1) | 
					
						
							|  |  |  |             v2 = stream.extractfile(t2) | 
					
						
							|  |  |  |             if v1 is None: | 
					
						
							|  |  |  |                 continue | 
					
						
							|  |  |  |             self.assert_(v2 is not None, "stream.extractfile() failed") | 
					
						
							|  |  |  |             self.assert_(v1.read() == v2.read(), "stream extraction failed") | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2006-05-26 14:02:05 +00:00
										 |  |  |         tar.close() | 
					
						
							| 
									
										
										
										
											2003-01-05 23:19:43 +00:00
										 |  |  |         stream.close() | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2006-05-15 19:30:35 +00:00
										 |  |  | class ReadDetectTest(ReadTest): | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     def setUp(self): | 
					
						
							|  |  |  |         self.tar = tarfile.open(tarname(self.comp), self.mode) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | class ReadDetectFileobjTest(ReadTest): | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     def setUp(self): | 
					
						
							|  |  |  |         name = tarname(self.comp) | 
					
						
							| 
									
										
										
										
											2006-05-15 20:44:10 +00:00
										 |  |  |         self.tar = tarfile.open(name, mode=self.mode, | 
					
						
							|  |  |  |                                 fileobj=open(name, "rb")) | 
					
						
							| 
									
										
										
										
											2006-05-15 19:30:35 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2005-03-05 12:47:42 +00:00
										 |  |  | class ReadAsteriskTest(ReadTest): | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     def setUp(self): | 
					
						
							|  |  |  |         mode = self.mode + self.sep + "*" | 
					
						
							|  |  |  |         self.tar = tarfile.open(tarname(self.comp), mode) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | class ReadStreamAsteriskTest(ReadStreamTest): | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     def setUp(self): | 
					
						
							|  |  |  |         mode = self.mode + self.sep + "*" | 
					
						
							|  |  |  |         self.tar = tarfile.open(tarname(self.comp), mode) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2003-01-05 23:19:43 +00:00
										 |  |  | class WriteTest(BaseTest): | 
					
						
							|  |  |  |     mode = 'w' | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     def setUp(self): | 
					
						
							|  |  |  |         mode = self.mode + self.sep + self.comp | 
					
						
							|  |  |  |         self.src = tarfile.open(tarname(self.comp), 'r') | 
					
						
							| 
									
										
										
										
											2004-08-22 21:28:33 +00:00
										 |  |  |         self.dstname = tmpname() | 
					
						
							|  |  |  |         self.dst = tarfile.open(self.dstname, mode) | 
					
						
							| 
									
										
										
										
											2003-01-05 23:19:43 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  |     def tearDown(self): | 
					
						
							|  |  |  |         self.src.close() | 
					
						
							|  |  |  |         self.dst.close() | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     def test_posix(self): | 
					
						
							|  |  |  |         self.dst.posix = 1 | 
					
						
							|  |  |  |         self._test() | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     def test_nonposix(self): | 
					
						
							|  |  |  |         self.dst.posix = 0 | 
					
						
							|  |  |  |         self._test() | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2004-08-22 21:28:33 +00:00
										 |  |  |     def test_small(self): | 
					
						
							|  |  |  |         self.dst.add(os.path.join(os.path.dirname(__file__),"cfgparser.1")) | 
					
						
							|  |  |  |         self.dst.close() | 
					
						
							|  |  |  |         self.assertNotEqual(os.stat(self.dstname).st_size, 0) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2003-01-05 23:19:43 +00:00
										 |  |  |     def _test(self): | 
					
						
							|  |  |  |         for tarinfo in self.src: | 
					
						
							|  |  |  |             if not tarinfo.isreg(): | 
					
						
							|  |  |  |                 continue | 
					
						
							|  |  |  |             f = self.src.extractfile(tarinfo) | 
					
						
							| 
									
										
										
										
											2006-05-10 16:26:03 +00:00
										 |  |  |             if self.dst.posix and len(tarinfo.name) > tarfile.LENGTH_NAME and "/" not in tarinfo.name: | 
					
						
							| 
									
										
										
										
											2003-01-05 23:19:43 +00:00
										 |  |  |                 self.assertRaises(ValueError, self.dst.addfile, | 
					
						
							|  |  |  |                                  tarinfo, f) | 
					
						
							|  |  |  |             else: | 
					
						
							|  |  |  |                 self.dst.addfile(tarinfo, f) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2006-10-24 16:54:16 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | class Write100Test(BaseTest): | 
					
						
							|  |  |  |     # The name field in a tar header stores strings of at most 100 chars. | 
					
						
							|  |  |  |     # If a string is shorter than 100 chars it has to be padded with '\0', | 
					
						
							|  |  |  |     # which implies that a string of exactly 100 chars is stored without | 
					
						
							|  |  |  |     # a trailing '\0'. | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     def setUp(self): | 
					
						
							|  |  |  |         self.name = "01234567890123456789012345678901234567890123456789" | 
					
						
							|  |  |  |         self.name += "01234567890123456789012345678901234567890123456789" | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         self.tar = tarfile.open(tmpname(), "w") | 
					
						
							|  |  |  |         t = tarfile.TarInfo(self.name) | 
					
						
							|  |  |  |         self.tar.addfile(t) | 
					
						
							|  |  |  |         self.tar.close() | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         self.tar = tarfile.open(tmpname()) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     def tearDown(self): | 
					
						
							|  |  |  |         self.tar.close() | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     def test(self): | 
					
						
							|  |  |  |         self.assertEqual(self.tar.getnames()[0], self.name, | 
					
						
							|  |  |  |                 "failed to store 100 char filename") | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2005-08-27 10:07:56 +00:00
										 |  |  | class WriteSize0Test(BaseTest): | 
					
						
							|  |  |  |     mode = 'w' | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     def setUp(self): | 
					
						
							|  |  |  |         self.tmpdir = dirname() | 
					
						
							|  |  |  |         self.dstname = tmpname() | 
					
						
							|  |  |  |         self.dst = tarfile.open(self.dstname, "w") | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     def tearDown(self): | 
					
						
							|  |  |  |         self.dst.close() | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     def test_file(self): | 
					
						
							|  |  |  |         path = os.path.join(self.tmpdir, "file") | 
					
						
							| 
									
										
										
										
											2006-05-26 14:02:05 +00:00
										 |  |  |         f = open(path, "w") | 
					
						
							|  |  |  |         f.close() | 
					
						
							| 
									
										
										
										
											2005-08-27 10:07:56 +00:00
										 |  |  |         tarinfo = self.dst.gettarinfo(path) | 
					
						
							|  |  |  |         self.assertEqual(tarinfo.size, 0) | 
					
						
							| 
									
										
										
										
											2006-05-26 14:02:05 +00:00
										 |  |  |         f = open(path, "w") | 
					
						
							|  |  |  |         f.write("aaa") | 
					
						
							|  |  |  |         f.close() | 
					
						
							| 
									
										
										
										
											2005-08-27 10:07:56 +00:00
										 |  |  |         tarinfo = self.dst.gettarinfo(path) | 
					
						
							|  |  |  |         self.assertEqual(tarinfo.size, 3) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     def test_directory(self): | 
					
						
							|  |  |  |         path = os.path.join(self.tmpdir, "directory") | 
					
						
							| 
									
										
										
										
											2006-05-15 21:32:25 +00:00
										 |  |  |         if os.path.exists(path): | 
					
						
							|  |  |  |             # This shouldn't be necessary, but is <wink> if a previous | 
					
						
							|  |  |  |             # run was killed in mid-stream. | 
					
						
							|  |  |  |             shutil.rmtree(path) | 
					
						
							| 
									
										
										
										
											2005-08-27 10:07:56 +00:00
										 |  |  |         os.mkdir(path) | 
					
						
							|  |  |  |         tarinfo = self.dst.gettarinfo(path) | 
					
						
							|  |  |  |         self.assertEqual(tarinfo.size, 0) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     def test_symlink(self): | 
					
						
							|  |  |  |         if hasattr(os, "symlink"): | 
					
						
							|  |  |  |             path = os.path.join(self.tmpdir, "symlink") | 
					
						
							|  |  |  |             os.symlink("link_target", path) | 
					
						
							|  |  |  |             tarinfo = self.dst.gettarinfo(path) | 
					
						
							|  |  |  |             self.assertEqual(tarinfo.size, 0) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2003-01-05 23:19:43 +00:00
										 |  |  | class WriteStreamTest(WriteTest): | 
					
						
							|  |  |  |     sep = '|' | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2006-08-21 17:59:46 +00:00
										 |  |  |     def test_padding(self): | 
					
						
							|  |  |  |         self.dst.close() | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         if self.comp == "gz": | 
					
						
							|  |  |  |             f = gzip.GzipFile(self.dstname) | 
					
						
							|  |  |  |             s = f.read() | 
					
						
							|  |  |  |             f.close() | 
					
						
							|  |  |  |         elif self.comp == "bz2": | 
					
						
							|  |  |  |             f = bz2.BZ2Decompressor() | 
					
						
							|  |  |  |             s = file(self.dstname).read() | 
					
						
							|  |  |  |             s = f.decompress(s) | 
					
						
							|  |  |  |             self.assertEqual(len(f.unused_data), 0, "trailing data") | 
					
						
							|  |  |  |         else: | 
					
						
							|  |  |  |             f = file(self.dstname) | 
					
						
							|  |  |  |             s = f.read() | 
					
						
							|  |  |  |             f.close() | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         self.assertEqual(s.count("\0"), tarfile.RECORDSIZE, | 
					
						
							|  |  |  |                          "incorrect zero padding") | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2004-07-20 21:54:18 +00:00
										 |  |  | 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 _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 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2006-12-06 22:21:18 +00:00
										 |  |  |         tar = tarfile.open(tmpname(), "w") | 
					
						
							|  |  |  |         tar.posix = False | 
					
						
							|  |  |  |         tar.addfile(tarinfo) | 
					
						
							| 
									
										
										
										
											2004-07-20 21:54:18 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  |         v1 = self._calc_size(name, link) | 
					
						
							| 
									
										
										
										
											2006-12-06 22:21:18 +00:00
										 |  |  |         v2 = tar.offset | 
					
						
							| 
									
										
										
										
											2004-07-20 21:54:18 +00:00
										 |  |  |         self.assertEqual(v1, v2, "GNU longname/longlink creation failed") | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2006-12-06 22:21:18 +00:00
										 |  |  |         tar.close() | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         tar = tarfile.open(tmpname()) | 
					
						
							|  |  |  |         member = tar.next() | 
					
						
							|  |  |  |         self.failIf(member is None, "unable to read longname member") | 
					
						
							|  |  |  |         self.assert_(tarinfo.name == member.name and \ | 
					
						
							|  |  |  |                      tarinfo.linkname == member.linkname, \ | 
					
						
							|  |  |  |                      "unable to read longname member") | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2004-07-20 21:54:18 +00:00
										 |  |  |     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_") | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2006-05-10 16:26:03 +00:00
										 |  |  | class ReadGNULongTest(unittest.TestCase): | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     def setUp(self): | 
					
						
							|  |  |  |         self.tar = tarfile.open(tarname()) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     def tearDown(self): | 
					
						
							|  |  |  |         self.tar.close() | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     def test_1471427(self): | 
					
						
							|  |  |  |         """Test reading of longname (bug #1471427).
 | 
					
						
							|  |  |  |         """
 | 
					
						
							|  |  |  |         name = "test/" * 20 + "0-REGTYPE" | 
					
						
							|  |  |  |         try: | 
					
						
							|  |  |  |             tarinfo = self.tar.getmember(name) | 
					
						
							|  |  |  |         except KeyError: | 
					
						
							|  |  |  |             tarinfo = None | 
					
						
							|  |  |  |         self.assert_(tarinfo is not None, "longname not found") | 
					
						
							|  |  |  |         self.assert_(tarinfo.type != tarfile.DIRTYPE, "read longname as dirtype") | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     def test_read_name(self): | 
					
						
							|  |  |  |         name = ("0-LONGNAME-" * 10)[:101] | 
					
						
							|  |  |  |         try: | 
					
						
							|  |  |  |             tarinfo = self.tar.getmember(name) | 
					
						
							|  |  |  |         except KeyError: | 
					
						
							|  |  |  |             tarinfo = None | 
					
						
							|  |  |  |         self.assert_(tarinfo is not None, "longname not found") | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     def test_read_link(self): | 
					
						
							|  |  |  |         link = ("1-LONGLINK-" * 10)[:101] | 
					
						
							|  |  |  |         name = ("0-LONGNAME-" * 10)[:101] | 
					
						
							|  |  |  |         try: | 
					
						
							|  |  |  |             tarinfo = self.tar.getmember(link) | 
					
						
							|  |  |  |         except KeyError: | 
					
						
							|  |  |  |             tarinfo = None | 
					
						
							|  |  |  |         self.assert_(tarinfo is not None, "longlink not found") | 
					
						
							|  |  |  |         self.assert_(tarinfo.linkname == name, "linkname wrong") | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     def test_truncated_longname(self): | 
					
						
							| 
									
										
										
										
											2006-05-26 14:02:05 +00:00
										 |  |  |         f = open(tarname()) | 
					
						
							|  |  |  |         fobj = StringIO.StringIO(f.read(1024)) | 
					
						
							|  |  |  |         f.close() | 
					
						
							| 
									
										
										
										
											2006-05-10 16:26:03 +00:00
										 |  |  |         tar = tarfile.open(name="foo.tar", fileobj=fobj) | 
					
						
							|  |  |  |         self.assert_(len(tar.getmembers()) == 0, "") | 
					
						
							| 
									
										
										
										
											2006-05-26 14:02:05 +00:00
										 |  |  |         tar.close() | 
					
						
							| 
									
										
										
										
											2006-05-10 16:26:03 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2004-07-20 22:07:44 +00:00
										 |  |  | class ExtractHardlinkTest(BaseTest): | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     def test_hardlink(self): | 
					
						
							|  |  |  |         """Test hardlink extraction (bug #857297)
 | 
					
						
							|  |  |  |         """
 | 
					
						
							|  |  |  |         # Prevent errors from being caught | 
					
						
							|  |  |  |         self.tar.errorlevel = 1 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         self.tar.extract("0-REGTYPE", dirname()) | 
					
						
							|  |  |  |         try: | 
					
						
							|  |  |  |             # Extract 1-LNKTYPE which is a hardlink to 0-REGTYPE | 
					
						
							|  |  |  |             self.tar.extract("1-LNKTYPE", dirname()) | 
					
						
							|  |  |  |         except EnvironmentError, e: | 
					
						
							|  |  |  |             import errno | 
					
						
							|  |  |  |             if e.errno == errno.ENOENT: | 
					
						
							|  |  |  |                 self.fail("hardlink not extracted properly") | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2005-10-20 04:50:13 +00:00
										 |  |  | class CreateHardlinkTest(BaseTest): | 
					
						
							|  |  |  |     """Test the creation of LNKTYPE (hardlink) members in an archive.
 | 
					
						
							|  |  |  |        In this respect tarfile.py mimics the behaviour of GNU tar: If | 
					
						
							|  |  |  |        a file has a st_nlink > 1, it will be added a REGTYPE member | 
					
						
							|  |  |  |        only the first time. | 
					
						
							|  |  |  |     """
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     def setUp(self): | 
					
						
							|  |  |  |         self.tar = tarfile.open(tmpname(), "w") | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         self.foo = os.path.join(dirname(), "foo") | 
					
						
							|  |  |  |         self.bar = os.path.join(dirname(), "bar") | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         if os.path.exists(self.foo): | 
					
						
							|  |  |  |             os.remove(self.foo) | 
					
						
							|  |  |  |         if os.path.exists(self.bar): | 
					
						
							|  |  |  |             os.remove(self.bar) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2006-05-26 14:02:05 +00:00
										 |  |  |         f = open(self.foo, "w") | 
					
						
							|  |  |  |         f.write("foo") | 
					
						
							|  |  |  |         f.close() | 
					
						
							| 
									
										
										
										
											2005-10-20 04:50:13 +00:00
										 |  |  |         self.tar.add(self.foo) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     def test_add_twice(self): | 
					
						
							|  |  |  |         # If st_nlink == 1 then the same file will be added as | 
					
						
							|  |  |  |         # REGTYPE every time. | 
					
						
							|  |  |  |         tarinfo = self.tar.gettarinfo(self.foo) | 
					
						
							|  |  |  |         self.assertEqual(tarinfo.type, tarfile.REGTYPE, | 
					
						
							|  |  |  |                 "add file as regular failed") | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     def test_add_hardlink(self): | 
					
						
							|  |  |  |         # If st_nlink > 1 then the same file will be added as | 
					
						
							|  |  |  |         # LNKTYPE. | 
					
						
							|  |  |  |         os.link(self.foo, self.bar) | 
					
						
							|  |  |  |         tarinfo = self.tar.gettarinfo(self.foo) | 
					
						
							|  |  |  |         self.assertEqual(tarinfo.type, tarfile.LNKTYPE, | 
					
						
							|  |  |  |                 "add file as hardlink failed") | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         tarinfo = self.tar.gettarinfo(self.bar) | 
					
						
							|  |  |  |         self.assertEqual(tarinfo.type, tarfile.LNKTYPE, | 
					
						
							|  |  |  |                 "add file as hardlink failed") | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     def test_dereference_hardlink(self): | 
					
						
							|  |  |  |         self.tar.dereference = True | 
					
						
							|  |  |  |         os.link(self.foo, self.bar) | 
					
						
							|  |  |  |         tarinfo = self.tar.gettarinfo(self.bar) | 
					
						
							|  |  |  |         self.assertEqual(tarinfo.type, tarfile.REGTYPE, | 
					
						
							|  |  |  |                 "dereferencing hardlink failed") | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2004-07-20 22:07:44 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2003-01-05 23:19:43 +00:00
										 |  |  | # Gzip TestCases | 
					
						
							|  |  |  | class ReadTestGzip(ReadTest): | 
					
						
							|  |  |  |     comp = "gz" | 
					
						
							|  |  |  | class ReadStreamTestGzip(ReadStreamTest): | 
					
						
							|  |  |  |     comp = "gz" | 
					
						
							|  |  |  | class WriteTestGzip(WriteTest): | 
					
						
							|  |  |  |     comp = "gz" | 
					
						
							|  |  |  | class WriteStreamTestGzip(WriteStreamTest): | 
					
						
							|  |  |  |     comp = "gz" | 
					
						
							| 
									
										
										
										
											2006-05-15 19:30:35 +00:00
										 |  |  | class ReadDetectTestGzip(ReadDetectTest): | 
					
						
							|  |  |  |     comp = "gz" | 
					
						
							|  |  |  | class ReadDetectFileobjTestGzip(ReadDetectFileobjTest): | 
					
						
							|  |  |  |     comp = "gz" | 
					
						
							| 
									
										
										
										
											2005-03-05 12:47:42 +00:00
										 |  |  | class ReadAsteriskTestGzip(ReadAsteriskTest): | 
					
						
							|  |  |  |     comp = "gz" | 
					
						
							|  |  |  | class ReadStreamAsteriskTestGzip(ReadStreamAsteriskTest): | 
					
						
							|  |  |  |     comp = "gz" | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2004-10-20 11:47:01 +00:00
										 |  |  | # Filemode test cases | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | class FileModeTest(unittest.TestCase): | 
					
						
							|  |  |  |     def test_modes(self): | 
					
						
							|  |  |  |         self.assertEqual(tarfile.filemode(0755), '-rwxr-xr-x') | 
					
						
							|  |  |  |         self.assertEqual(tarfile.filemode(07111), '---s--s--t') | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2006-12-20 11:55:16 +00:00
										 |  |  | class HeaderErrorTest(unittest.TestCase): | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     def test_truncated_header(self): | 
					
						
							|  |  |  |         self.assertRaises(tarfile.HeaderError, tarfile.TarInfo.frombuf, "") | 
					
						
							|  |  |  |         self.assertRaises(tarfile.HeaderError, tarfile.TarInfo.frombuf, "filename\0") | 
					
						
							|  |  |  |         self.assertRaises(tarfile.HeaderError, tarfile.TarInfo.frombuf, "\0" * 511) | 
					
						
							|  |  |  |         self.assertRaises(tarfile.HeaderError, tarfile.TarInfo.frombuf, "\0" * 513) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     def test_empty_header(self): | 
					
						
							|  |  |  |         self.assertRaises(tarfile.HeaderError, tarfile.TarInfo.frombuf, "\0" * 512) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     def test_invalid_header(self): | 
					
						
							|  |  |  |         buf = tarfile.TarInfo("filename").tobuf() | 
					
						
							|  |  |  |         buf = buf[:148] + "foo\0\0\0\0\0" + buf[156:] # invalid number field. | 
					
						
							|  |  |  |         self.assertRaises(tarfile.HeaderError, tarfile.TarInfo.frombuf, buf) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     def test_bad_checksum(self): | 
					
						
							|  |  |  |         buf = tarfile.TarInfo("filename").tobuf() | 
					
						
							|  |  |  |         b = buf[:148] + "        " + buf[156:] # clear the checksum field. | 
					
						
							|  |  |  |         self.assertRaises(tarfile.HeaderError, tarfile.TarInfo.frombuf, b) | 
					
						
							|  |  |  |         b = "a" + buf[1:] # manipulate the buffer, so checksum won't match. | 
					
						
							|  |  |  |         self.assertRaises(tarfile.HeaderError, tarfile.TarInfo.frombuf, b) | 
					
						
							| 
									
										
										
										
											2004-10-25 03:19:41 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2003-01-05 23:19:43 +00:00
										 |  |  | if bz2: | 
					
						
							|  |  |  |     # Bzip2 TestCases | 
					
						
							|  |  |  |     class ReadTestBzip2(ReadTestGzip): | 
					
						
							|  |  |  |         comp = "bz2" | 
					
						
							|  |  |  |     class ReadStreamTestBzip2(ReadStreamTestGzip): | 
					
						
							|  |  |  |         comp = "bz2" | 
					
						
							|  |  |  |     class WriteTestBzip2(WriteTest): | 
					
						
							|  |  |  |         comp = "bz2" | 
					
						
							|  |  |  |     class WriteStreamTestBzip2(WriteStreamTestGzip): | 
					
						
							|  |  |  |         comp = "bz2" | 
					
						
							| 
									
										
										
										
											2006-05-15 19:30:35 +00:00
										 |  |  |     class ReadDetectTestBzip2(ReadDetectTest): | 
					
						
							|  |  |  |         comp = "bz2" | 
					
						
							|  |  |  |     class ReadDetectFileobjTestBzip2(ReadDetectFileobjTest): | 
					
						
							|  |  |  |         comp = "bz2" | 
					
						
							| 
									
										
										
										
											2005-03-05 12:47:42 +00:00
										 |  |  |     class ReadAsteriskTestBzip2(ReadAsteriskTest): | 
					
						
							|  |  |  |         comp = "bz2" | 
					
						
							|  |  |  |     class ReadStreamAsteriskTestBzip2(ReadStreamAsteriskTest): | 
					
						
							|  |  |  |         comp = "bz2" | 
					
						
							| 
									
										
										
										
											2003-01-05 23:19:43 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | # If importing gzip failed, discard the Gzip TestCases. | 
					
						
							|  |  |  | if not gzip: | 
					
						
							|  |  |  |     del ReadTestGzip | 
					
						
							|  |  |  |     del ReadStreamTestGzip | 
					
						
							|  |  |  |     del WriteTestGzip | 
					
						
							|  |  |  |     del WriteStreamTestGzip | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2003-02-17 14:51:41 +00:00
										 |  |  | def test_main(): | 
					
						
							| 
									
										
										
										
											2006-05-26 14:02:05 +00:00
										 |  |  |     # Create archive. | 
					
						
							|  |  |  |     f = open(tarname(), "rb") | 
					
						
							|  |  |  |     fguts = f.read() | 
					
						
							|  |  |  |     f.close() | 
					
						
							| 
									
										
										
										
											2003-01-05 23:19:43 +00:00
										 |  |  |     if gzip: | 
					
						
							|  |  |  |         # create testtar.tar.gz | 
					
						
							| 
									
										
										
										
											2006-05-26 14:02:05 +00:00
										 |  |  |         tar = gzip.open(tarname("gz"), "wb") | 
					
						
							|  |  |  |         tar.write(fguts) | 
					
						
							|  |  |  |         tar.close() | 
					
						
							| 
									
										
										
										
											2003-01-05 23:19:43 +00:00
										 |  |  |     if bz2: | 
					
						
							|  |  |  |         # create testtar.tar.bz2 | 
					
						
							| 
									
										
										
										
											2006-05-26 14:02:05 +00:00
										 |  |  |         tar = bz2.BZ2File(tarname("bz2"), "wb") | 
					
						
							|  |  |  |         tar.write(fguts) | 
					
						
							|  |  |  |         tar.close() | 
					
						
							| 
									
										
										
										
											2003-01-05 23:19:43 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2003-05-01 17:45:56 +00:00
										 |  |  |     tests = [ | 
					
						
							| 
									
										
										
										
											2004-10-20 11:47:01 +00:00
										 |  |  |         FileModeTest, | 
					
						
							| 
									
										
										
										
											2006-12-20 11:55:16 +00:00
										 |  |  |         HeaderErrorTest, | 
					
						
							| 
									
										
										
										
											2003-05-01 17:45:56 +00:00
										 |  |  |         ReadTest, | 
					
						
							|  |  |  |         ReadStreamTest, | 
					
						
							| 
									
										
										
										
											2006-05-15 19:30:35 +00:00
										 |  |  |         ReadDetectTest, | 
					
						
							|  |  |  |         ReadDetectFileobjTest, | 
					
						
							| 
									
										
										
										
											2005-03-05 12:47:42 +00:00
										 |  |  |         ReadAsteriskTest, | 
					
						
							|  |  |  |         ReadStreamAsteriskTest, | 
					
						
							| 
									
										
										
										
											2003-05-01 17:45:56 +00:00
										 |  |  |         WriteTest, | 
					
						
							| 
									
										
										
										
											2006-10-24 16:54:16 +00:00
										 |  |  |         Write100Test, | 
					
						
							| 
									
										
										
										
											2005-08-27 10:07:56 +00:00
										 |  |  |         WriteSize0Test, | 
					
						
							| 
									
										
										
										
											2004-07-20 21:54:18 +00:00
										 |  |  |         WriteStreamTest, | 
					
						
							|  |  |  |         WriteGNULongTest, | 
					
						
							| 
									
										
										
										
											2006-05-10 16:26:03 +00:00
										 |  |  |         ReadGNULongTest, | 
					
						
							| 
									
										
										
										
											2003-05-01 17:45:56 +00:00
										 |  |  |     ] | 
					
						
							| 
									
										
										
										
											2003-02-17 14:51:41 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2004-07-20 22:07:44 +00:00
										 |  |  |     if hasattr(os, "link"): | 
					
						
							|  |  |  |         tests.append(ExtractHardlinkTest) | 
					
						
							| 
									
										
										
										
											2005-10-20 04:50:13 +00:00
										 |  |  |         tests.append(CreateHardlinkTest) | 
					
						
							| 
									
										
										
										
											2004-07-20 22:07:44 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2003-05-01 17:45:56 +00:00
										 |  |  |     if gzip: | 
					
						
							|  |  |  |         tests.extend([ | 
					
						
							|  |  |  |             ReadTestGzip, ReadStreamTestGzip, | 
					
						
							| 
									
										
										
										
											2005-03-05 12:47:42 +00:00
										 |  |  |             WriteTestGzip, WriteStreamTestGzip, | 
					
						
							| 
									
										
										
										
											2006-05-15 19:30:35 +00:00
										 |  |  |             ReadDetectTestGzip, ReadDetectFileobjTestGzip, | 
					
						
							| 
									
										
										
										
											2005-03-05 12:47:42 +00:00
										 |  |  |             ReadAsteriskTestGzip, ReadStreamAsteriskTestGzip | 
					
						
							| 
									
										
										
										
											2003-05-01 17:45:56 +00:00
										 |  |  |         ]) | 
					
						
							| 
									
										
										
										
											2003-02-17 14:51:41 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2003-05-01 17:45:56 +00:00
										 |  |  |     if bz2: | 
					
						
							|  |  |  |         tests.extend([ | 
					
						
							|  |  |  |             ReadTestBzip2, ReadStreamTestBzip2, | 
					
						
							| 
									
										
										
										
											2005-03-05 12:47:42 +00:00
										 |  |  |             WriteTestBzip2, WriteStreamTestBzip2, | 
					
						
							| 
									
										
										
										
											2006-05-15 19:30:35 +00:00
										 |  |  |             ReadDetectTestBzip2, ReadDetectFileobjTestBzip2, | 
					
						
							| 
									
										
										
										
											2005-03-05 12:47:42 +00:00
										 |  |  |             ReadAsteriskTestBzip2, ReadStreamAsteriskTestBzip2 | 
					
						
							| 
									
										
										
										
											2003-05-01 17:45:56 +00:00
										 |  |  |         ]) | 
					
						
							|  |  |  |     try: | 
					
						
							|  |  |  |         test_support.run_unittest(*tests) | 
					
						
							| 
									
										
										
										
											2003-01-05 23:19:43 +00:00
										 |  |  |     finally: | 
					
						
							|  |  |  |         if gzip: | 
					
						
							|  |  |  |             os.remove(tarname("gz")) | 
					
						
							|  |  |  |         if bz2: | 
					
						
							| 
									
										
										
										
											2006-05-27 14:13:13 +00:00
										 |  |  |             os.remove(tarname("bz2")) | 
					
						
							| 
									
										
										
										
											2003-06-12 08:01:06 +00:00
										 |  |  |         if os.path.exists(dirname()): | 
					
						
							|  |  |  |             shutil.rmtree(dirname()) | 
					
						
							|  |  |  |         if os.path.exists(tmpname()): | 
					
						
							|  |  |  |             os.remove(tmpname()) | 
					
						
							| 
									
										
										
										
											2003-01-05 23:19:43 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2003-02-17 14:51:41 +00:00
										 |  |  | if __name__ == "__main__": | 
					
						
							|  |  |  |     test_main() |