8 from test
import test_support
10 # Check for our compression modules.
14 except (ImportError, AttributeError):
22 return test_support
.findfile(path
)
24 testtar
= path("testtar.tar")
25 tempdir
= path("testtar.dir")
26 tempname
= path("testtar.tmp")
32 return "%s.%s" % (testtar
, comp
)
35 if not os
.path
.exists(tempdir
):
43 class BaseTest(unittest
.TestCase
):
49 mode
= self
.mode
+ self
.sep
+ self
.comp
50 self
.tar
= tarfile
.open(tarname(self
.comp
), mode
)
55 class ReadTest(BaseTest
):
58 """Test member extraction.
61 for tarinfo
in self
.tar
:
63 if not tarinfo
.isreg():
65 f
= self
.tar
.extractfile(tarinfo
)
66 self
.assert_(len(f
.read()) == tarinfo
.size
,
67 "size read does not match expected size")
70 self
.assert_(members
== membercount
,
71 "could not find all members")
73 def test_sparse(self
):
74 """Test sparse member extraction.
77 f1
= self
.tar
.extractfile("S-SPARSE")
78 f2
= self
.tar
.extractfile("S-SPARSE-WITH-NULLS")
79 self
.assert_(f1
.read() == f2
.read(),
80 "_FileObject failed on sparse file member")
82 def test_readlines(self
):
83 """Test readlines() method of _FileObject.
86 filename
= "0-REGTYPE-TEXT"
87 self
.tar
.extract(filename
, dirname())
88 lines1
= file(os
.path
.join(dirname(), filename
), "rU").readlines()
89 lines2
= self
.tar
.extractfile(filename
).readlines()
90 self
.assert_(lines1
== lines2
,
91 "_FileObject.readline() does not work correctly")
94 """Test seek() method of _FileObject, incl. random reading.
97 filename
= "0-REGTYPE"
98 self
.tar
.extract(filename
, dirname())
99 data
= file(os
.path
.join(dirname(), filename
), "rb").read()
101 tarinfo
= self
.tar
.getmember(filename
)
102 fobj
= self
.tar
.extractfile(tarinfo
)
106 self
.assert_(0 == fobj
.tell(),
107 "seek() to file's start failed")
109 self
.assert_(2048 == fobj
.tell(),
110 "seek() to absolute position failed")
112 self
.assert_(1024 == fobj
.tell(),
113 "seek() to negative relative position failed")
115 self
.assert_(2048 == fobj
.tell(),
116 "seek() to positive relative position failed")
118 self
.assert_(s
== data
[2048:2058],
119 "read() after seek failed")
121 self
.assert_(tarinfo
.size
== fobj
.tell(),
122 "seek() to file's end failed")
123 self
.assert_(fobj
.read() == "",
124 "read() at file's end did not return empty string")
125 fobj
.seek(-tarinfo
.size
, 2)
126 self
.assert_(0 == fobj
.tell(),
127 "relative seek() to file's start failed")
129 s1
= fobj
.readlines()
131 s2
= fobj
.readlines()
132 self
.assert_(s1
== s2
,
133 "readlines() after seek failed")
136 class ReadStreamTest(ReadTest
):
140 """Test member extraction, and for StreamError when
144 tarinfo
= self
.tar
.getmembers()[0]
145 f
= self
.tar
.extractfile(tarinfo
)
146 self
.assertRaises(tarfile
.StreamError
, f
.read
)
148 def test_stream(self
):
149 """Compare the normal tar and the stream tar.
152 tar
= tarfile
.open(tarname(), 'r')
159 self
.assert_(t2
is not None, "stream.next() failed.")
161 if t2
.islnk() or t2
.issym():
162 self
.assertRaises(tarfile
.StreamError
, stream
.extractfile
, t2
)
164 v1
= tar
.extractfile(t1
)
165 v2
= stream
.extractfile(t2
)
168 self
.assert_(v2
is not None, "stream.extractfile() failed")
169 self
.assert_(v1
.read() == v2
.read(), "stream extraction failed")
173 class WriteTest(BaseTest
):
177 mode
= self
.mode
+ self
.sep
+ self
.comp
178 self
.src
= tarfile
.open(tarname(self
.comp
), 'r')
179 self
.dst
= tarfile
.open(tmpname(), mode
)
185 def test_posix(self
):
189 def test_nonposix(self
):
194 for tarinfo
in self
.src
:
195 if not tarinfo
.isreg():
197 f
= self
.src
.extractfile(tarinfo
)
198 if self
.dst
.posix
and len(tarinfo
.name
) > tarfile
.LENGTH_NAME
:
199 self
.assertRaises(ValueError, self
.dst
.addfile
,
202 self
.dst
.addfile(tarinfo
, f
)
204 class WriteStreamTest(WriteTest
):
208 class ReadTestGzip(ReadTest
):
210 class ReadStreamTestGzip(ReadStreamTest
):
212 class WriteTestGzip(WriteTest
):
214 class WriteStreamTestGzip(WriteStreamTest
):
219 class ReadTestBzip2(ReadTestGzip
):
221 class ReadStreamTestBzip2(ReadStreamTestGzip
):
223 class WriteTestBzip2(WriteTest
):
225 class WriteStreamTestBzip2(WriteStreamTestGzip
):
228 # If importing gzip failed, discard the Gzip TestCases.
231 del ReadStreamTestGzip
233 del WriteStreamTestGzip
237 # create testtar.tar.gz
238 gzip
.open(tarname("gz"), "wb").write(file(tarname(), "rb").read())
240 # create testtar.tar.bz2
241 bz2
.BZ2File(tarname("bz2"), "wb").write(file(tarname(), "rb").read())
244 suite
= unittest
.TestSuite()
246 suite
.addTest(unittest
.makeSuite(ReadTest
))
247 suite
.addTest(unittest
.makeSuite(ReadStreamTest
))
248 suite
.addTest(unittest
.makeSuite(WriteTest
))
249 suite
.addTest(unittest
.makeSuite(WriteStreamTest
))
252 suite
.addTest(unittest
.makeSuite(ReadTestGzip
))
253 suite
.addTest(unittest
.makeSuite(ReadStreamTestGzip
))
254 suite
.addTest(unittest
.makeSuite(WriteTestGzip
))
255 suite
.addTest(unittest
.makeSuite(WriteStreamTestGzip
))
258 suite
.addTest(unittest
.makeSuite(ReadTestBzip2
))
259 suite
.addTest(unittest
.makeSuite(ReadStreamTestBzip2
))
260 suite
.addTest(unittest
.makeSuite(WriteTestBzip2
))
261 suite
.addTest(unittest
.makeSuite(WriteStreamTestBzip2
))
263 test_support
.run_suite(suite
)
266 os
.remove(tarname("gz"))
268 os
.remove(tarname("bz2"))
269 if os
.path
.exists(tempdir
):
270 shutil
.rmtree(tempdir
)
271 if os
.path
.exists(tempname
):
274 if __name__
== "__main__":