8 from nose
.tools
import *
16 @raises(NotImplementedError)
17 def test_bad_arc_mode_w():
18 rarfile
.RarFile('test/files/rar3-comment-plain.rar', 'w')
20 @raises(NotImplementedError)
21 def test_bad_arc_mode_rb():
22 rarfile
.RarFile('test/files/rar3-comment-plain.rar', 'rb')
26 rarfile
.RarFile('test/files/rar3-comment-plain.rar', 'r', errors
='foo')
28 @raises(NotImplementedError)
29 def test_bad_open_mode_w():
30 rf
= rarfile
.RarFile('test/files/rar3-comment-plain.rar')
33 @raises(rarfile
.PasswordRequired
)
34 def test_bad_open_psw():
35 rf
= rarfile
.RarFile('test/files/rar3-comment-psw.rar')
39 def test_bad_filelike():
40 rarfile
.is_rarfile(bytearray(10))
42 def test_open_psw_late_rar3():
43 rf
= rarfile
.RarFile('test/files/rar3-comment-psw.rar')
44 rf
.open('file1.txt', 'r', 'password').read()
45 rf
.open('file1.txt', 'r', u
'password').read()
47 def test_open_psw_late_rar5():
48 rf
= rarfile
.RarFile('test/files/rar5-psw.rar')
49 rf
.open('stest1.txt', 'r', 'password').read()
50 rf
.open('stest1.txt', 'r', u
'password').read()
52 def test_read_psw_late_rar3():
53 rf
= rarfile
.RarFile('test/files/rar3-comment-psw.rar')
54 rf
.read('file1.txt', 'password')
55 rf
.read('file1.txt', u
'password')
57 def test_read_psw_late_rar5():
58 rf
= rarfile
.RarFile('test/files/rar5-psw.rar')
59 rf
.read('stest1.txt', 'password')
60 rf
.read('stest1.txt', u
'password')
62 @raises(rarfile
.BadRarFile
) # needs better error
63 def test_open_psw_late():
64 rf
= rarfile
.RarFile('test/files/rar5-psw.rar')
65 rf
.read('stest1.txt', 'password222')
68 eq_(rarfile
.is_rarfile('test/files/ctime4.rar.exp'), False)
69 eq_(rarfile
.is_rarfile('test/files/ctime4.rar'), True)
70 eq_(rarfile
.is_rarfile('test/files/rar5-crc.rar'), True)
72 @raises(rarfile
.BadRarFile
)
73 def test_signature_error():
74 rarfile
.RarFile('test/files/ctime4.rar.exp')
76 @raises(rarfile
.BadRarFile
)
77 def test_signature_error_mem():
78 data
= io
.BytesIO(b
'x'*40)
82 with rarfile
.RarFile('test/files/rar5-crc.rar') as rf
:
83 with rf
.open('stest1.txt') as f
:
90 def load_readline(rf
, fn
):
91 with rf
.open(fn
) as f
:
92 tr
= io
.TextIOWrapper(io
.BufferedReader(f
))
101 rf
= rarfile
.RarFile('test/files/seektest.rar')
102 v1
= load_readline(rf
, 'stest1.txt')
103 v2
= load_readline(rf
, 'stest2.txt')
111 global _old_stdout
, _buf_stdout
112 _buf_stdout
= io
.StringIO()
113 _old_stdout
= sys
.stdout
114 sys
.stdout
= _buf_stdout
117 sys
.stdout
= _old_stdout
119 @with_setup(install_buf
, uninstall_buf
)
121 rf
= rarfile
.RarFile('test/files/seektest.rar')
123 eq_(_buf_stdout
.getvalue(), u
'stest1.txt\nstest2.txt\n')
126 rf
= rarfile
.RarFile('test/files/seektest.rar')
129 def test_testrar_mem():
130 arc
= open('test/files/seektest.rar', 'rb').read()
131 rf
= rarfile
.RarFile(io
.BytesIO(arc
))
134 def clean_extract_dirs():
135 for dn
in ['tmp/extract1', 'tmp/extract2', 'tmp/extract3']:
136 for fn
in ['stest1.txt', 'stest2.txt']:
138 os
.unlink(os
.path
.join(dn
, fn
))
146 @with_setup(clean_extract_dirs
, clean_extract_dirs
)
148 os
.makedirs('tmp/extract1')
149 os
.makedirs('tmp/extract2')
150 os
.makedirs('tmp/extract3')
151 rf
= rarfile
.RarFile('test/files/seektest.rar')
153 rf
.extractall('tmp/extract1')
154 assert_true(os
.path
.isfile('tmp/extract1/stest1.txt'))
155 assert_true(os
.path
.isfile('tmp/extract1/stest2.txt'))
157 rf
.extract('stest1.txt', 'tmp/extract2')
158 assert_true(os
.path
.isfile('tmp/extract2/stest1.txt'))
159 assert_false(os
.path
.isfile('tmp/extract2/stest2.txt'))
161 inf
= rf
.getinfo('stest2.txt')
162 rf
.extract(inf
, 'tmp/extract3')
163 assert_false(os
.path
.isfile('tmp/extract3/stest1.txt'))
164 assert_true(os
.path
.isfile('tmp/extract3/stest2.txt'))
166 rf
.extractall('tmp/extract2', ['stest1.txt'])
167 assert_true(os
.path
.isfile('tmp/extract2/stest1.txt'))
169 rf
.extractall('tmp/extract3', [rf
.getinfo('stest2.txt')])
170 assert_true(os
.path
.isfile('tmp/extract3/stest2.txt'))
172 @with_setup(clean_extract_dirs
, clean_extract_dirs
)
173 def test_extract_mem():
174 os
.makedirs('tmp/extract1')
175 os
.makedirs('tmp/extract2')
176 os
.makedirs('tmp/extract3')
177 arc
= open('test/files/seektest.rar', 'rb').read()
178 rf
= rarfile
.RarFile(io
.BytesIO(arc
))
180 rf
.extractall('tmp/extract1')
181 assert_true(os
.path
.isfile('tmp/extract1/stest1.txt'))
182 assert_true(os
.path
.isfile('tmp/extract1/stest2.txt'))
184 rf
.extract('stest1.txt', 'tmp/extract2')
185 assert_true(os
.path
.isfile('tmp/extract2/stest1.txt'))
186 assert_false(os
.path
.isfile('tmp/extract2/stest2.txt'))
188 inf
= rf
.getinfo('stest2.txt')
189 rf
.extract(inf
, 'tmp/extract3')
190 assert_false(os
.path
.isfile('tmp/extract3/stest1.txt'))
191 assert_true(os
.path
.isfile('tmp/extract3/stest2.txt'))
196 infos
.append( (info
.type, info
.needs_password(), info
.isdir(), info
._must
_disable
_hack
()) )
198 rf
= rarfile
.RarFile('test/files/seektest.rar', info_callback
=info_cb
)
200 (rarfile
.RAR_BLOCK_MAIN
, False, False, False),
201 (rarfile
.RAR_BLOCK_FILE
, False, False, False),
202 (rarfile
.RAR_BLOCK_FILE
, False, False, False),
203 (rarfile
.RAR_BLOCK_ENDARC
, False, False, False)])
206 rf
= rarfile
.RarFile('test/files/rar5-solid-qo.rar', info_callback
=info_cb
)
208 (rarfile
.RAR_BLOCK_MAIN
, False, False, True),
209 (rarfile
.RAR_BLOCK_FILE
, False, False, False),
210 (rarfile
.RAR_BLOCK_FILE
, False, False, True),
211 (rarfile
.RAR_BLOCK_FILE
, False, False, True),
212 (rarfile
.RAR_BLOCK_FILE
, False, False, True),
213 (rarfile
.RAR_BLOCK_SUB
, False, False, False),
214 (rarfile
.RAR_BLOCK_ENDARC
, False, False, False)])
216 def install_alt_tool():
217 rarfile
.ORIG_UNRAR_TOOL
= 'x_unrar_missing'
218 rarfile
._check
_unrar
_tool
()
220 def uninstall_alt_tool():
221 rarfile
.ORIG_UNRAR_TOOL
= 'unrar'
222 rarfile
._check
_unrar
_tool
()
224 def test_read_rar3():
225 with rarfile
.RarFile('test/files/seektest.rar') as rf
:
226 for fn
in rf
.namelist():
229 @with_setup(install_alt_tool
, uninstall_alt_tool
)