New test files for rar5
[rarfile.git] / test / test_api.py
blobb3a60524104e996d79f16aba3bc80af54f729608
1 """API tests.
2 """
4 import sys
5 import io
6 import os
8 from nose.tools import *
10 import rarfile
13 # test start
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')
24 @raises(ValueError)
25 def test_bad_errs():
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')
31 rf.open('qwe', 'w')
33 @raises(rarfile.PasswordRequired)
34 def test_bad_open_psw():
35 rf = rarfile.RarFile('test/files/rar3-comment-psw.rar')
36 rf.open('file1.txt')
38 @raises(ValueError)
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')
67 def test_detection():
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)
79 rarfile.RarFile(data)
81 def test_with():
82 with rarfile.RarFile('test/files/rar5-crc.rar') as rf:
83 with rf.open('stest1.txt') as f:
84 while 1:
85 buf = f.read(7)
86 if not buf:
87 break
89 def test_readline():
90 def load_readline(rf, fn):
91 with rf.open(fn) as f:
92 tr = io.TextIOWrapper(io.BufferedReader(f))
93 res = []
94 while 1:
95 ln = tr.readline()
96 if not ln:
97 break
98 res.append(ln)
99 return res
101 rf = rarfile.RarFile('test/files/seektest.rar')
102 v1 = load_readline(rf, 'stest1.txt')
103 v2 = load_readline(rf, 'stest2.txt')
104 eq_(len(v1), 512)
105 eq_(v1, v2)
107 _old_stdout = None
108 _buf_stdout = None
110 def install_buf():
111 global _old_stdout, _buf_stdout
112 _buf_stdout = io.StringIO()
113 _old_stdout = sys.stdout
114 sys.stdout = _buf_stdout
116 def uninstall_buf():
117 sys.stdout = _old_stdout
119 @with_setup(install_buf, uninstall_buf)
120 def test_printdir():
121 rf = rarfile.RarFile('test/files/seektest.rar')
122 rf.printdir()
123 eq_(_buf_stdout.getvalue(), u'stest1.txt\nstest2.txt\n')
125 def test_testrar():
126 rf = rarfile.RarFile('test/files/seektest.rar')
127 rf.testrar()
129 def test_testrar_mem():
130 arc = open('test/files/seektest.rar', 'rb').read()
131 rf = rarfile.RarFile(io.BytesIO(arc))
132 rf.testrar()
134 def clean_extract_dirs():
135 for dn in ['tmp/extract1', 'tmp/extract2', 'tmp/extract3']:
136 for fn in ['stest1.txt', 'stest2.txt']:
137 try:
138 os.unlink(os.path.join(dn, fn))
139 except OSError:
140 pass
141 try:
142 os.rmdir(dn)
143 except OSError:
144 pass
146 @with_setup(clean_extract_dirs, clean_extract_dirs)
147 def test_extract():
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'))
193 def test_infocb():
194 infos = []
195 def info_cb(info):
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)
199 eq_(infos, [
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)])
205 infos = []
206 rf = rarfile.RarFile('test/files/rar5-solid-qo.rar', info_callback=info_cb)
207 eq_(infos, [
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():
227 rf.read(fn)
229 @with_setup(install_alt_tool, uninstall_alt_tool)
230 def test_alt_tool():
231 #test_read_rar3()
232 pass