New test files for rar5
[rarfile.git] / test / test_format.py
blobdb88b639029fcaade5d7d51d6d11d2d85f7c0c9d
1 """Format details.
2 """
4 import sys
5 import io
6 import os
8 from datetime import datetime
9 from nose.tools import *
11 import rarfile
13 def render_date(dt):
14 if isinstance(dt, datetime):
15 return dt.isoformat('T')
16 elif isinstance(dt, tuple):
17 return '%04d-%02d-%02d %02d:%02d:%02d' % dt
18 else:
19 return dt
21 def mkitem(**kwargs):
22 res = {}
23 for k in kwargs:
24 if kwargs[k] is not None:
25 res[k] = kwargs[k]
26 return res
28 def dumparc(rf):
29 res = []
30 for item in rf.infolist():
31 info = mkitem(fn=item.filename,
32 file_size=item.file_size,
33 compress_size=item.compress_size,
34 CRC=item.CRC,
35 date_time=render_date(item.date_time),
36 arctime=render_date(item.arctime),
37 mtime=render_date(item.mtime),
38 atime=render_date(item.atime),
39 ctime=render_date(item.ctime),
40 comment=item.comment,
41 extract_version=item.extract_version,
42 compress_type=item.compress_type,
43 mode=item.mode,
44 host_os=item.host_os)
45 res.append(info)
46 return res
48 def diffs(a, b):
49 if len(a) != len(b):
50 return 'Different lengths'
51 problems = []
52 for i, xa in enumerate(a):
53 xb = b[i]
54 for k in xa:
55 if k not in xb:
56 problems.append('NewKey(%d,%s)=%r' % (i, k, xa[k]))
57 for k in xb:
58 if k not in xa:
59 problems.append('MissingKey(%d,%s)=%r' % (i, k, xb[k]))
60 for k in xa:
61 if k in xb and xa[k] != xb[k]:
62 problems.append('ErrValue(%d,%s):got=%r/exp=%r' % (i, k, xa[k], xb[k]))
63 return '; '.join(problems)
65 def cmp_struct(a, b):
66 eq_(a, b, diffs(a, b))
69 # test start
72 def test_rar3_header_encryption():
73 r = rarfile.RarFile('test/files/rar3-comment-hpsw.rar', 'r')
74 eq_(r.needs_password(), True)
75 eq_(r.comment, None)
76 eq_(r.namelist(), [])
78 try:
79 r.setpassword('password')
80 assert_true(r.needs_password())
81 eq_(r.namelist(), [u'file1.txt', u'file2.txt'])
82 assert_not_equal(r.comment, None)
83 eq_(r.comment, 'RARcomment\n')
84 except rarfile.NoCrypto:
85 pass
87 def test_rar5_header_encryption():
88 r = rarfile.RarFile('test/files/rar5-hpsw.rar')
89 eq_(r.needs_password(), True)
90 eq_(r.comment, None)
91 eq_(r.namelist(), [])
93 try:
94 r.setpassword('password')
95 assert_true(r.needs_password())
96 eq_(r.namelist(), [u'stest1.txt', u'stest2.txt'])
97 assert_not_equal(r.comment, None)
98 eq_(r.comment, 'RAR5 archive - hdr-password\n')
99 except rarfile.NoCrypto:
100 pass
101 r.close()
103 def get_vol_info(extver=20, tz='', hr='11'):
104 return [
105 mkitem(CRC=1352324940,
106 date_time='2016-05-24 %s:42:37%s' % (hr, ''),
107 mtime='2016-05-24T%s:42:37%s' % (hr, tz),
108 compress_type=48,
109 compress_size=205000,
110 extract_version=extver,
111 file_size=205000,
112 mode=33204,
113 host_os=3,
114 fn=u'vols/bigfile.txt'),
115 mkitem(CRC=3498712966,
116 date_time='2016-05-24 %s:42:43%s' % (hr, ''),
117 mtime='2016-05-24T%s:42:43%s' % (hr, tz),
118 extract_version=extver,
119 compress_type=48,
120 compress_size=2050,
121 file_size=2050,
122 mode=33204,
123 host_os=3,
124 fn=u'vols/smallfile.txt')]
126 def test_rar3_vols():
127 r = rarfile.RarFile('test/files/rar3-vols.part1.rar')
128 eq_(r.needs_password(), False)
129 eq_(r.comment, None)
130 eq_(r.strerror(), None)
131 cmp_struct(dumparc(r), get_vol_info())
132 eq_(r.volumelist(), [
133 'test/files/rar3-vols.part1.rar',
134 'test/files/rar3-vols.part2.rar',
135 'test/files/rar3-vols.part3.rar'])
137 def test_rar3_oldvols():
138 r = rarfile.RarFile('test/files/rar3-old.rar')
139 eq_(r.needs_password(), False)
140 eq_(r.comment, None)
141 eq_(r.strerror(), None)
142 cmp_struct(dumparc(r), get_vol_info())
143 eq_(r.volumelist(), [
144 'test/files/rar3-old.rar',
145 'test/files/rar3-old.r00',
146 'test/files/rar3-old.r01'])
148 def test_rar5_vols():
149 r = rarfile.RarFile('test/files/rar5-vols.part1.rar')
150 eq_(r.needs_password(), False)
151 eq_(r.comment, None)
152 eq_(r.strerror(), None)
153 cmp_struct(dumparc(r), get_vol_info(50, '+00:00', '08'))
154 eq_(r.volumelist(), [
155 'test/files/rar5-vols.part1.rar',
156 'test/files/rar5-vols.part2.rar',
157 'test/files/rar5-vols.part3.rar'])
159 def expect_ctime(mtime, ctime):
160 return [mkitem(
161 mtime=mtime,
162 date_time=mtime.split('.')[0].replace('T', ' '),
163 ctime=ctime,
164 compress_size=0,
165 file_size=0,
166 CRC=0,
167 fn=u'afile.txt',
168 extract_version=29,
169 compress_type=48,
170 mode=32,
171 host_os=2)]
173 def test_rar3_ctime0():
174 r = rarfile.RarFile('test/files/ctime0.rar')
175 cmp_struct(dumparc(r), expect_ctime('2011-05-10T21:28:47.899345', None))
177 def test_rar3_ctime1():
178 r = rarfile.RarFile('test/files/ctime1.rar')
179 cmp_struct(dumparc(r), expect_ctime('2011-05-10T21:28:47.899345', '2011-05-10T21:28:47'))
181 def test_rar3_ctime2():
182 r = rarfile.RarFile('test/files/ctime2.rar')
183 cmp_struct(dumparc(r), expect_ctime('2011-05-10T21:28:47.899345', '2011-05-10T21:28:47.897843'))
185 def test_rar3_ctime3():
186 r = rarfile.RarFile('test/files/ctime3.rar')
187 cmp_struct(dumparc(r), expect_ctime('2011-05-10T21:28:47.899345', '2011-05-10T21:28:47.899328'))
189 def test_rar3_ctime4():
190 r = rarfile.RarFile('test/files/ctime4.rar')
191 cmp_struct(dumparc(r), expect_ctime('2011-05-10T21:28:47.899345', '2011-05-10T21:28:47.899345'))
193 def test_rar5_times():
194 r = rarfile.RarFile('test/files/rar5-times.rar')
195 cmp_struct(dumparc(r), [mkitem(
196 fn=u'stest1.txt',
197 file_size=2048,
198 compress_size=55,
199 compress_type=rarfile.RAR_M3,
200 extract_version=50,
201 host_os=rarfile.RAR_OS_UNIX,
202 mode=33188,
203 date_time='2011-06-12 09:53:33',
204 mtime='2011-06-12T09:53:33+00:00',
205 atime='2016-05-22T09:12:36+00:00',
206 CRC=3317163682
209 def test_oldvols():
210 eq_(rarfile._next_oldvol('qq00.part0.rar'), 'qq00.part0.r00')
211 eq_(rarfile._next_oldvol('qq00.part0.r00'), 'qq00.part0.r01')
212 eq_(rarfile._next_oldvol('qq00.part0.r29'), 'qq00.part0.r30')
213 eq_(rarfile._next_oldvol('qq00.part0.r99'), 'qq00.part0.s00')
215 def test_newvols():
216 eq_(rarfile._next_newvol('qq00.part0.rar'), 'qq00.part1.rar')
217 eq_(rarfile._next_newvol('qq00.part09.rar'), 'qq00.part10.rar')
218 eq_(rarfile._next_newvol('qq00.part99.rar'), 'qq00.paru00.rar')
220 @raises(rarfile.BadRarName)
221 def test_newvols_err():
222 rarfile._next_newvol('xx.rar')