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