blob: 56cc919e93c5a0431c73d724b6581dbbc92c5a67 [file] [log] [blame]
Neal Norwitzb9ef4ae2003-01-05 23:19:43 +00001import sys
2import os
3import shutil
Brett Cannon455ea532003-06-12 08:01:06 +00004import tempfile
Georg Brandl38c6a222006-05-10 16:26:03 +00005import StringIO
Neal Norwitzb9ef4ae2003-01-05 23:19:43 +00006
7import unittest
8import tarfile
9
10from test import test_support
11
12# Check for our compression modules.
13try:
14 import gzip
Neal Norwitzae323192003-04-14 01:18:32 +000015 gzip.GzipFile
16except (ImportError, AttributeError):
Neal Norwitzb9ef4ae2003-01-05 23:19:43 +000017 gzip = None
18try:
19 import bz2
20except ImportError:
21 bz2 = None
22
23def path(path):
24 return test_support.findfile(path)
25
Brett Cannon455ea532003-06-12 08:01:06 +000026testtar = path("testtar.tar")
27tempdir = os.path.join(tempfile.gettempdir(), "testtar" + os.extsep + "dir")
28tempname = test_support.TESTFN
Georg Brandl38c6a222006-05-10 16:26:03 +000029membercount = 12
Neal Norwitzb9ef4ae2003-01-05 23:19:43 +000030
31def tarname(comp=""):
32 if not comp:
33 return testtar
Brett Cannon43e559a2003-06-12 19:16:58 +000034 return os.path.join(tempdir, "%s%s%s" % (testtar, os.extsep, comp))
Neal Norwitzb9ef4ae2003-01-05 23:19:43 +000035
36def dirname():
37 if not os.path.exists(tempdir):
38 os.mkdir(tempdir)
39 return tempdir
40
41def tmpname():
42 return tempname
43
44
45class BaseTest(unittest.TestCase):
46 comp = ''
47 mode = 'r'
48 sep = ':'
49
50 def setUp(self):
51 mode = self.mode + self.sep + self.comp
52 self.tar = tarfile.open(tarname(self.comp), mode)
53
54 def tearDown(self):
55 self.tar.close()
56
57class ReadTest(BaseTest):
58
59 def test(self):
60 """Test member extraction.
61 """
62 members = 0
63 for tarinfo in self.tar:
64 members += 1
65 if not tarinfo.isreg():
66 continue
67 f = self.tar.extractfile(tarinfo)
68 self.assert_(len(f.read()) == tarinfo.size,
69 "size read does not match expected size")
70 f.close()
71
72 self.assert_(members == membercount,
73 "could not find all members")
74
75 def test_sparse(self):
76 """Test sparse member extraction.
77 """
78 if self.sep != "|":
79 f1 = self.tar.extractfile("S-SPARSE")
Jack Jansen149a8992003-03-07 13:27:53 +000080 f2 = self.tar.extractfile("S-SPARSE-WITH-NULLS")
Neal Norwitzb9ef4ae2003-01-05 23:19:43 +000081 self.assert_(f1.read() == f2.read(),
82 "_FileObject failed on sparse file member")
83
84 def test_readlines(self):
85 """Test readlines() method of _FileObject.
86 """
87 if self.sep != "|":
Jack Jansen149a8992003-03-07 13:27:53 +000088 filename = "0-REGTYPE-TEXT"
Neal Norwitzb9ef4ae2003-01-05 23:19:43 +000089 self.tar.extract(filename, dirname())
Tim Peters02494762006-05-26 14:02:05 +000090 f = open(os.path.join(dirname(), filename), "rU")
91 lines1 = f.readlines()
92 f.close()
Neal Norwitzb9ef4ae2003-01-05 23:19:43 +000093 lines2 = self.tar.extractfile(filename).readlines()
94 self.assert_(lines1 == lines2,
95 "_FileObject.readline() does not work correctly")
96
Martin v. Löwisdf241532005-03-03 08:17:42 +000097 def test_iter(self):
98 # Test iteration over ExFileObject.
99 if self.sep != "|":
100 filename = "0-REGTYPE-TEXT"
101 self.tar.extract(filename, dirname())
Tim Peters02494762006-05-26 14:02:05 +0000102 f = open(os.path.join(dirname(), filename), "rU")
103 lines1 = f.readlines()
104 f.close()
Martin v. Löwisdf241532005-03-03 08:17:42 +0000105 lines2 = [line for line in self.tar.extractfile(filename)]
106 self.assert_(lines1 == lines2,
107 "ExFileObject iteration does not work correctly")
108
Neal Norwitzb9ef4ae2003-01-05 23:19:43 +0000109 def test_seek(self):
110 """Test seek() method of _FileObject, incl. random reading.
111 """
112 if self.sep != "|":
Jack Jansen149a8992003-03-07 13:27:53 +0000113 filename = "0-REGTYPE"
Neal Norwitzb9ef4ae2003-01-05 23:19:43 +0000114 self.tar.extract(filename, dirname())
Tim Peters02494762006-05-26 14:02:05 +0000115 f = open(os.path.join(dirname(), filename), "rb")
116 data = f.read()
117 f.close()
Neal Norwitzb9ef4ae2003-01-05 23:19:43 +0000118
119 tarinfo = self.tar.getmember(filename)
120 fobj = self.tar.extractfile(tarinfo)
121
122 text = fobj.read()
123 fobj.seek(0)
124 self.assert_(0 == fobj.tell(),
125 "seek() to file's start failed")
126 fobj.seek(2048, 0)
127 self.assert_(2048 == fobj.tell(),
128 "seek() to absolute position failed")
129 fobj.seek(-1024, 1)
130 self.assert_(1024 == fobj.tell(),
131 "seek() to negative relative position failed")
132 fobj.seek(1024, 1)
133 self.assert_(2048 == fobj.tell(),
134 "seek() to positive relative position failed")
135 s = fobj.read(10)
136 self.assert_(s == data[2048:2058],
137 "read() after seek failed")
138 fobj.seek(0, 2)
139 self.assert_(tarinfo.size == fobj.tell(),
140 "seek() to file's end failed")
141 self.assert_(fobj.read() == "",
142 "read() at file's end did not return empty string")
143 fobj.seek(-tarinfo.size, 2)
144 self.assert_(0 == fobj.tell(),
145 "relative seek() to file's start failed")
146 fobj.seek(512)
147 s1 = fobj.readlines()
148 fobj.seek(512)
149 s2 = fobj.readlines()
150 self.assert_(s1 == s2,
151 "readlines() after seek failed")
152 fobj.close()
153
Neal Norwitzf3396542005-10-28 05:52:22 +0000154 def test_old_dirtype(self):
155 """Test old style dirtype member (bug #1336623).
156 """
157 # Old tars create directory members using a REGTYPE
158 # header with a "/" appended to the filename field.
159
160 # Create an old tar style directory entry.
161 filename = tmpname()
162 tarinfo = tarfile.TarInfo("directory/")
163 tarinfo.type = tarfile.REGTYPE
164
Tim Petersb1f32512006-05-26 13:39:17 +0000165 fobj = open(filename, "w")
Neal Norwitzf3396542005-10-28 05:52:22 +0000166 fobj.write(tarinfo.tobuf())
167 fobj.close()
168
169 try:
170 # Test if it is still a directory entry when
171 # read back.
172 tar = tarfile.open(filename)
173 tarinfo = tar.getmembers()[0]
174 tar.close()
175
176 self.assert_(tarinfo.type == tarfile.DIRTYPE)
177 self.assert_(tarinfo.name.endswith("/"))
178 finally:
179 try:
180 os.unlink(filename)
181 except:
182 pass
183
Neal Norwitzb9ef4ae2003-01-05 23:19:43 +0000184class ReadStreamTest(ReadTest):
185 sep = "|"
186
187 def test(self):
188 """Test member extraction, and for StreamError when
189 seeking backwards.
190 """
191 ReadTest.test(self)
192 tarinfo = self.tar.getmembers()[0]
193 f = self.tar.extractfile(tarinfo)
194 self.assertRaises(tarfile.StreamError, f.read)
195
196 def test_stream(self):
197 """Compare the normal tar and the stream tar.
198 """
199 stream = self.tar
200 tar = tarfile.open(tarname(), 'r')
201
202 while 1:
203 t1 = tar.next()
204 t2 = stream.next()
205 if t1 is None:
206 break
207 self.assert_(t2 is not None, "stream.next() failed.")
208
209 if t2.islnk() or t2.issym():
210 self.assertRaises(tarfile.StreamError, stream.extractfile, t2)
211 continue
212 v1 = tar.extractfile(t1)
213 v2 = stream.extractfile(t2)
214 if v1 is None:
215 continue
216 self.assert_(v2 is not None, "stream.extractfile() failed")
217 self.assert_(v1.read() == v2.read(), "stream extraction failed")
218
Tim Peters02494762006-05-26 14:02:05 +0000219 tar.close()
Neal Norwitzb9ef4ae2003-01-05 23:19:43 +0000220 stream.close()
221
Georg Brandl49c8f4c2006-05-15 19:30:35 +0000222class ReadDetectTest(ReadTest):
223
224 def setUp(self):
225 self.tar = tarfile.open(tarname(self.comp), self.mode)
226
227class ReadDetectFileobjTest(ReadTest):
228
229 def setUp(self):
230 name = tarname(self.comp)
Tim Peters12087ba2006-05-15 20:44:10 +0000231 self.tar = tarfile.open(name, mode=self.mode,
232 fileobj=open(name, "rb"))
Georg Brandl49c8f4c2006-05-15 19:30:35 +0000233
Martin v. Löwis78be7df2005-03-05 12:47:42 +0000234class ReadAsteriskTest(ReadTest):
235
236 def setUp(self):
237 mode = self.mode + self.sep + "*"
238 self.tar = tarfile.open(tarname(self.comp), mode)
239
240class ReadStreamAsteriskTest(ReadStreamTest):
241
242 def setUp(self):
243 mode = self.mode + self.sep + "*"
244 self.tar = tarfile.open(tarname(self.comp), mode)
245
Neal Norwitzb9ef4ae2003-01-05 23:19:43 +0000246class WriteTest(BaseTest):
247 mode = 'w'
248
249 def setUp(self):
250 mode = self.mode + self.sep + self.comp
251 self.src = tarfile.open(tarname(self.comp), 'r')
Martin v. Löwisc234a522004-08-22 21:28:33 +0000252 self.dstname = tmpname()
253 self.dst = tarfile.open(self.dstname, mode)
Neal Norwitzb9ef4ae2003-01-05 23:19:43 +0000254
255 def tearDown(self):
256 self.src.close()
257 self.dst.close()
258
259 def test_posix(self):
260 self.dst.posix = 1
261 self._test()
262
263 def test_nonposix(self):
264 self.dst.posix = 0
265 self._test()
266
Martin v. Löwisc234a522004-08-22 21:28:33 +0000267 def test_small(self):
268 self.dst.add(os.path.join(os.path.dirname(__file__),"cfgparser.1"))
269 self.dst.close()
270 self.assertNotEqual(os.stat(self.dstname).st_size, 0)
271
Neal Norwitzb9ef4ae2003-01-05 23:19:43 +0000272 def _test(self):
273 for tarinfo in self.src:
274 if not tarinfo.isreg():
275 continue
276 f = self.src.extractfile(tarinfo)
Georg Brandl38c6a222006-05-10 16:26:03 +0000277 if self.dst.posix and len(tarinfo.name) > tarfile.LENGTH_NAME and "/" not in tarinfo.name:
Neal Norwitzb9ef4ae2003-01-05 23:19:43 +0000278 self.assertRaises(ValueError, self.dst.addfile,
279 tarinfo, f)
280 else:
281 self.dst.addfile(tarinfo, f)
282
Georg Brandla32e0a02006-10-24 16:54:16 +0000283
284class Write100Test(BaseTest):
285 # The name field in a tar header stores strings of at most 100 chars.
286 # If a string is shorter than 100 chars it has to be padded with '\0',
287 # which implies that a string of exactly 100 chars is stored without
288 # a trailing '\0'.
289
290 def setUp(self):
291 self.name = "01234567890123456789012345678901234567890123456789"
292 self.name += "01234567890123456789012345678901234567890123456789"
293
294 self.tar = tarfile.open(tmpname(), "w")
295 t = tarfile.TarInfo(self.name)
296 self.tar.addfile(t)
297 self.tar.close()
298
299 self.tar = tarfile.open(tmpname())
300
301 def tearDown(self):
302 self.tar.close()
303
304 def test(self):
305 self.assertEqual(self.tar.getnames()[0], self.name,
306 "failed to store 100 char filename")
307
308
Martin v. Löwis5dbdc592005-08-27 10:07:56 +0000309class WriteSize0Test(BaseTest):
310 mode = 'w'
311
312 def setUp(self):
313 self.tmpdir = dirname()
314 self.dstname = tmpname()
315 self.dst = tarfile.open(self.dstname, "w")
316
317 def tearDown(self):
318 self.dst.close()
319
320 def test_file(self):
321 path = os.path.join(self.tmpdir, "file")
Tim Peters02494762006-05-26 14:02:05 +0000322 f = open(path, "w")
323 f.close()
Martin v. Löwis5dbdc592005-08-27 10:07:56 +0000324 tarinfo = self.dst.gettarinfo(path)
325 self.assertEqual(tarinfo.size, 0)
Tim Peters02494762006-05-26 14:02:05 +0000326 f = open(path, "w")
327 f.write("aaa")
328 f.close()
Martin v. Löwis5dbdc592005-08-27 10:07:56 +0000329 tarinfo = self.dst.gettarinfo(path)
330 self.assertEqual(tarinfo.size, 3)
331
332 def test_directory(self):
333 path = os.path.join(self.tmpdir, "directory")
Tim Peters4ccc0b72006-05-15 21:32:25 +0000334 if os.path.exists(path):
335 # This shouldn't be necessary, but is <wink> if a previous
336 # run was killed in mid-stream.
337 shutil.rmtree(path)
Martin v. Löwis5dbdc592005-08-27 10:07:56 +0000338 os.mkdir(path)
339 tarinfo = self.dst.gettarinfo(path)
340 self.assertEqual(tarinfo.size, 0)
341
342 def test_symlink(self):
343 if hasattr(os, "symlink"):
344 path = os.path.join(self.tmpdir, "symlink")
345 os.symlink("link_target", path)
346 tarinfo = self.dst.gettarinfo(path)
347 self.assertEqual(tarinfo.size, 0)
348
349
Neal Norwitzb9ef4ae2003-01-05 23:19:43 +0000350class WriteStreamTest(WriteTest):
351 sep = '|'
352
Neal Norwitz8a519392006-08-21 17:59:46 +0000353 def test_padding(self):
354 self.dst.close()
355
356 if self.comp == "gz":
357 f = gzip.GzipFile(self.dstname)
358 s = f.read()
359 f.close()
360 elif self.comp == "bz2":
361 f = bz2.BZ2Decompressor()
362 s = file(self.dstname).read()
363 s = f.decompress(s)
364 self.assertEqual(len(f.unused_data), 0, "trailing data")
365 else:
366 f = file(self.dstname)
367 s = f.read()
368 f.close()
369
370 self.assertEqual(s.count("\0"), tarfile.RECORDSIZE,
371 "incorrect zero padding")
372
373
Neal Norwitz0662f8a2004-07-20 21:54:18 +0000374class WriteGNULongTest(unittest.TestCase):
375 """This testcase checks for correct creation of GNU Longname
376 and Longlink extensions.
377
378 It creates a tarfile and adds empty members with either
379 long names, long linknames or both and compares the size
380 of the tarfile with the expected size.
381
382 It checks for SF bug #812325 in TarFile._create_gnulong().
383
384 While I was writing this testcase, I noticed a second bug
385 in the same method:
386 Long{names,links} weren't null-terminated which lead to
387 bad tarfiles when their length was a multiple of 512. This
388 is tested as well.
389 """
390
Neal Norwitz0662f8a2004-07-20 21:54:18 +0000391 def _length(self, s):
392 blocks, remainder = divmod(len(s) + 1, 512)
393 if remainder:
394 blocks += 1
395 return blocks * 512
396
397 def _calc_size(self, name, link=None):
398 # initial tar header
399 count = 512
400
401 if len(name) > tarfile.LENGTH_NAME:
402 # gnu longname extended header + longname
403 count += 512
404 count += self._length(name)
405
406 if link is not None and len(link) > tarfile.LENGTH_LINK:
407 # gnu longlink extended header + longlink
408 count += 512
409 count += self._length(link)
410
411 return count
412
413 def _test(self, name, link=None):
414 tarinfo = tarfile.TarInfo(name)
415 if link:
416 tarinfo.linkname = link
417 tarinfo.type = tarfile.LNKTYPE
418
Georg Brandl87fa5592006-12-06 22:21:18 +0000419 tar = tarfile.open(tmpname(), "w")
420 tar.posix = False
421 tar.addfile(tarinfo)
Neal Norwitz0662f8a2004-07-20 21:54:18 +0000422
423 v1 = self._calc_size(name, link)
Georg Brandl87fa5592006-12-06 22:21:18 +0000424 v2 = tar.offset
Neal Norwitz0662f8a2004-07-20 21:54:18 +0000425 self.assertEqual(v1, v2, "GNU longname/longlink creation failed")
426
Georg Brandl87fa5592006-12-06 22:21:18 +0000427 tar.close()
428
429 tar = tarfile.open(tmpname())
430 member = tar.next()
431 self.failIf(member is None, "unable to read longname member")
432 self.assert_(tarinfo.name == member.name and \
433 tarinfo.linkname == member.linkname, \
434 "unable to read longname member")
435
Neal Norwitz0662f8a2004-07-20 21:54:18 +0000436 def test_longname_1023(self):
437 self._test(("longnam/" * 127) + "longnam")
438
439 def test_longname_1024(self):
440 self._test(("longnam/" * 127) + "longname")
441
442 def test_longname_1025(self):
443 self._test(("longnam/" * 127) + "longname_")
444
445 def test_longlink_1023(self):
446 self._test("name", ("longlnk/" * 127) + "longlnk")
447
448 def test_longlink_1024(self):
449 self._test("name", ("longlnk/" * 127) + "longlink")
450
451 def test_longlink_1025(self):
452 self._test("name", ("longlnk/" * 127) + "longlink_")
453
454 def test_longnamelink_1023(self):
455 self._test(("longnam/" * 127) + "longnam",
456 ("longlnk/" * 127) + "longlnk")
457
458 def test_longnamelink_1024(self):
459 self._test(("longnam/" * 127) + "longname",
460 ("longlnk/" * 127) + "longlink")
461
462 def test_longnamelink_1025(self):
463 self._test(("longnam/" * 127) + "longname_",
464 ("longlnk/" * 127) + "longlink_")
465
Georg Brandl38c6a222006-05-10 16:26:03 +0000466class ReadGNULongTest(unittest.TestCase):
467
468 def setUp(self):
469 self.tar = tarfile.open(tarname())
470
471 def tearDown(self):
472 self.tar.close()
473
474 def test_1471427(self):
475 """Test reading of longname (bug #1471427).
476 """
477 name = "test/" * 20 + "0-REGTYPE"
478 try:
479 tarinfo = self.tar.getmember(name)
480 except KeyError:
481 tarinfo = None
482 self.assert_(tarinfo is not None, "longname not found")
483 self.assert_(tarinfo.type != tarfile.DIRTYPE, "read longname as dirtype")
484
485 def test_read_name(self):
486 name = ("0-LONGNAME-" * 10)[:101]
487 try:
488 tarinfo = self.tar.getmember(name)
489 except KeyError:
490 tarinfo = None
491 self.assert_(tarinfo is not None, "longname not found")
492
493 def test_read_link(self):
494 link = ("1-LONGLINK-" * 10)[:101]
495 name = ("0-LONGNAME-" * 10)[:101]
496 try:
497 tarinfo = self.tar.getmember(link)
498 except KeyError:
499 tarinfo = None
500 self.assert_(tarinfo is not None, "longlink not found")
501 self.assert_(tarinfo.linkname == name, "linkname wrong")
502
503 def test_truncated_longname(self):
Tim Peters02494762006-05-26 14:02:05 +0000504 f = open(tarname())
505 fobj = StringIO.StringIO(f.read(1024))
506 f.close()
Georg Brandl38c6a222006-05-10 16:26:03 +0000507 tar = tarfile.open(name="foo.tar", fileobj=fobj)
508 self.assert_(len(tar.getmembers()) == 0, "")
Tim Peters02494762006-05-26 14:02:05 +0000509 tar.close()
Georg Brandl38c6a222006-05-10 16:26:03 +0000510
511
Neal Norwitza4f651a2004-07-20 22:07:44 +0000512class ExtractHardlinkTest(BaseTest):
513
514 def test_hardlink(self):
515 """Test hardlink extraction (bug #857297)
516 """
517 # Prevent errors from being caught
518 self.tar.errorlevel = 1
519
520 self.tar.extract("0-REGTYPE", dirname())
521 try:
522 # Extract 1-LNKTYPE which is a hardlink to 0-REGTYPE
523 self.tar.extract("1-LNKTYPE", dirname())
524 except EnvironmentError, e:
525 import errno
526 if e.errno == errno.ENOENT:
527 self.fail("hardlink not extracted properly")
528
Neal Norwitzb0e32e22005-10-20 04:50:13 +0000529class CreateHardlinkTest(BaseTest):
530 """Test the creation of LNKTYPE (hardlink) members in an archive.
531 In this respect tarfile.py mimics the behaviour of GNU tar: If
532 a file has a st_nlink > 1, it will be added a REGTYPE member
533 only the first time.
534 """
535
536 def setUp(self):
537 self.tar = tarfile.open(tmpname(), "w")
538
539 self.foo = os.path.join(dirname(), "foo")
540 self.bar = os.path.join(dirname(), "bar")
541
542 if os.path.exists(self.foo):
543 os.remove(self.foo)
544 if os.path.exists(self.bar):
545 os.remove(self.bar)
546
Tim Peters02494762006-05-26 14:02:05 +0000547 f = open(self.foo, "w")
548 f.write("foo")
549 f.close()
Neal Norwitzb0e32e22005-10-20 04:50:13 +0000550 self.tar.add(self.foo)
551
552 def test_add_twice(self):
553 # If st_nlink == 1 then the same file will be added as
554 # REGTYPE every time.
555 tarinfo = self.tar.gettarinfo(self.foo)
556 self.assertEqual(tarinfo.type, tarfile.REGTYPE,
557 "add file as regular failed")
558
559 def test_add_hardlink(self):
560 # If st_nlink > 1 then the same file will be added as
561 # LNKTYPE.
562 os.link(self.foo, self.bar)
563 tarinfo = self.tar.gettarinfo(self.foo)
564 self.assertEqual(tarinfo.type, tarfile.LNKTYPE,
565 "add file as hardlink failed")
566
567 tarinfo = self.tar.gettarinfo(self.bar)
568 self.assertEqual(tarinfo.type, tarfile.LNKTYPE,
569 "add file as hardlink failed")
570
571 def test_dereference_hardlink(self):
572 self.tar.dereference = True
573 os.link(self.foo, self.bar)
574 tarinfo = self.tar.gettarinfo(self.bar)
575 self.assertEqual(tarinfo.type, tarfile.REGTYPE,
576 "dereferencing hardlink failed")
577
Neal Norwitza4f651a2004-07-20 22:07:44 +0000578
Neal Norwitzb9ef4ae2003-01-05 23:19:43 +0000579# Gzip TestCases
580class ReadTestGzip(ReadTest):
581 comp = "gz"
582class ReadStreamTestGzip(ReadStreamTest):
583 comp = "gz"
584class WriteTestGzip(WriteTest):
585 comp = "gz"
586class WriteStreamTestGzip(WriteStreamTest):
587 comp = "gz"
Georg Brandl49c8f4c2006-05-15 19:30:35 +0000588class ReadDetectTestGzip(ReadDetectTest):
589 comp = "gz"
590class ReadDetectFileobjTestGzip(ReadDetectFileobjTest):
591 comp = "gz"
Martin v. Löwis78be7df2005-03-05 12:47:42 +0000592class ReadAsteriskTestGzip(ReadAsteriskTest):
593 comp = "gz"
594class ReadStreamAsteriskTestGzip(ReadStreamAsteriskTest):
595 comp = "gz"
596
Andrew M. Kuchlingd4f25522004-10-20 11:47:01 +0000597# Filemode test cases
598
599class FileModeTest(unittest.TestCase):
600 def test_modes(self):
601 self.assertEqual(tarfile.filemode(0755), '-rwxr-xr-x')
602 self.assertEqual(tarfile.filemode(07111), '---s--s--t')
603
Georg Brandlded1c4d2006-12-20 11:55:16 +0000604class HeaderErrorTest(unittest.TestCase):
605
606 def test_truncated_header(self):
607 self.assertRaises(tarfile.HeaderError, tarfile.TarInfo.frombuf, "")
608 self.assertRaises(tarfile.HeaderError, tarfile.TarInfo.frombuf, "filename\0")
609 self.assertRaises(tarfile.HeaderError, tarfile.TarInfo.frombuf, "\0" * 511)
610 self.assertRaises(tarfile.HeaderError, tarfile.TarInfo.frombuf, "\0" * 513)
611
612 def test_empty_header(self):
613 self.assertRaises(tarfile.HeaderError, tarfile.TarInfo.frombuf, "\0" * 512)
614
615 def test_invalid_header(self):
616 buf = tarfile.TarInfo("filename").tobuf()
617 buf = buf[:148] + "foo\0\0\0\0\0" + buf[156:] # invalid number field.
618 self.assertRaises(tarfile.HeaderError, tarfile.TarInfo.frombuf, buf)
619
620 def test_bad_checksum(self):
621 buf = tarfile.TarInfo("filename").tobuf()
622 b = buf[:148] + " " + buf[156:] # clear the checksum field.
623 self.assertRaises(tarfile.HeaderError, tarfile.TarInfo.frombuf, b)
624 b = "a" + buf[1:] # manipulate the buffer, so checksum won't match.
625 self.assertRaises(tarfile.HeaderError, tarfile.TarInfo.frombuf, b)
Tim Peters8ceefc52004-10-25 03:19:41 +0000626
Neal Norwitzb9ef4ae2003-01-05 23:19:43 +0000627if bz2:
628 # Bzip2 TestCases
629 class ReadTestBzip2(ReadTestGzip):
630 comp = "bz2"
631 class ReadStreamTestBzip2(ReadStreamTestGzip):
632 comp = "bz2"
633 class WriteTestBzip2(WriteTest):
634 comp = "bz2"
635 class WriteStreamTestBzip2(WriteStreamTestGzip):
636 comp = "bz2"
Georg Brandl49c8f4c2006-05-15 19:30:35 +0000637 class ReadDetectTestBzip2(ReadDetectTest):
638 comp = "bz2"
639 class ReadDetectFileobjTestBzip2(ReadDetectFileobjTest):
640 comp = "bz2"
Martin v. Löwis78be7df2005-03-05 12:47:42 +0000641 class ReadAsteriskTestBzip2(ReadAsteriskTest):
642 comp = "bz2"
643 class ReadStreamAsteriskTestBzip2(ReadStreamAsteriskTest):
644 comp = "bz2"
Neal Norwitzb9ef4ae2003-01-05 23:19:43 +0000645
646# If importing gzip failed, discard the Gzip TestCases.
647if not gzip:
648 del ReadTestGzip
649 del ReadStreamTestGzip
650 del WriteTestGzip
651 del WriteStreamTestGzip
652
Neal Norwitz996acf12003-02-17 14:51:41 +0000653def test_main():
Tim Peters02494762006-05-26 14:02:05 +0000654 # Create archive.
655 f = open(tarname(), "rb")
656 fguts = f.read()
657 f.close()
Neal Norwitzb9ef4ae2003-01-05 23:19:43 +0000658 if gzip:
659 # create testtar.tar.gz
Tim Peters02494762006-05-26 14:02:05 +0000660 tar = gzip.open(tarname("gz"), "wb")
661 tar.write(fguts)
662 tar.close()
Neal Norwitzb9ef4ae2003-01-05 23:19:43 +0000663 if bz2:
664 # create testtar.tar.bz2
Tim Peters02494762006-05-26 14:02:05 +0000665 tar = bz2.BZ2File(tarname("bz2"), "wb")
666 tar.write(fguts)
667 tar.close()
Neal Norwitzb9ef4ae2003-01-05 23:19:43 +0000668
Walter Dörwald21d3a322003-05-01 17:45:56 +0000669 tests = [
Andrew M. Kuchlingd4f25522004-10-20 11:47:01 +0000670 FileModeTest,
Georg Brandlded1c4d2006-12-20 11:55:16 +0000671 HeaderErrorTest,
Walter Dörwald21d3a322003-05-01 17:45:56 +0000672 ReadTest,
673 ReadStreamTest,
Georg Brandl49c8f4c2006-05-15 19:30:35 +0000674 ReadDetectTest,
675 ReadDetectFileobjTest,
Martin v. Löwis78be7df2005-03-05 12:47:42 +0000676 ReadAsteriskTest,
677 ReadStreamAsteriskTest,
Walter Dörwald21d3a322003-05-01 17:45:56 +0000678 WriteTest,
Georg Brandla32e0a02006-10-24 16:54:16 +0000679 Write100Test,
Martin v. Löwis5dbdc592005-08-27 10:07:56 +0000680 WriteSize0Test,
Neal Norwitz0662f8a2004-07-20 21:54:18 +0000681 WriteStreamTest,
682 WriteGNULongTest,
Georg Brandl38c6a222006-05-10 16:26:03 +0000683 ReadGNULongTest,
Walter Dörwald21d3a322003-05-01 17:45:56 +0000684 ]
685
Neal Norwitza4f651a2004-07-20 22:07:44 +0000686 if hasattr(os, "link"):
687 tests.append(ExtractHardlinkTest)
Neal Norwitzb0e32e22005-10-20 04:50:13 +0000688 tests.append(CreateHardlinkTest)
Neal Norwitza4f651a2004-07-20 22:07:44 +0000689
Walter Dörwald21d3a322003-05-01 17:45:56 +0000690 if gzip:
691 tests.extend([
692 ReadTestGzip, ReadStreamTestGzip,
Martin v. Löwis78be7df2005-03-05 12:47:42 +0000693 WriteTestGzip, WriteStreamTestGzip,
Georg Brandl49c8f4c2006-05-15 19:30:35 +0000694 ReadDetectTestGzip, ReadDetectFileobjTestGzip,
Martin v. Löwis78be7df2005-03-05 12:47:42 +0000695 ReadAsteriskTestGzip, ReadStreamAsteriskTestGzip
Walter Dörwald21d3a322003-05-01 17:45:56 +0000696 ])
697
698 if bz2:
699 tests.extend([
700 ReadTestBzip2, ReadStreamTestBzip2,
Martin v. Löwis78be7df2005-03-05 12:47:42 +0000701 WriteTestBzip2, WriteStreamTestBzip2,
Georg Brandl49c8f4c2006-05-15 19:30:35 +0000702 ReadDetectTestBzip2, ReadDetectFileobjTestBzip2,
Martin v. Löwis78be7df2005-03-05 12:47:42 +0000703 ReadAsteriskTestBzip2, ReadStreamAsteriskTestBzip2
Walter Dörwald21d3a322003-05-01 17:45:56 +0000704 ])
Neal Norwitzb9ef4ae2003-01-05 23:19:43 +0000705 try:
Walter Dörwald21d3a322003-05-01 17:45:56 +0000706 test_support.run_unittest(*tests)
Neal Norwitzb9ef4ae2003-01-05 23:19:43 +0000707 finally:
708 if gzip:
709 os.remove(tarname("gz"))
710 if bz2:
Tim Peters4e306172006-05-27 14:13:13 +0000711 os.remove(tarname("bz2"))
Brett Cannon455ea532003-06-12 08:01:06 +0000712 if os.path.exists(dirname()):
713 shutil.rmtree(dirname())
714 if os.path.exists(tmpname()):
715 os.remove(tmpname())
Neal Norwitzb9ef4ae2003-01-05 23:19:43 +0000716
Neal Norwitz996acf12003-02-17 14:51:41 +0000717if __name__ == "__main__":
718 test_main()