4 from datetime
import datetime
9 if isinstance(dt
, datetime
):
10 return dt
.isoformat('T')
11 elif isinstance(dt
, tuple):
12 return '%04d-%02d-%02d %02d:%02d:%02d' % dt
19 if kwargs
[k
] is not None:
25 for item
in rf
.infolist():
26 info
= mkitem(fn
=item
.filename
,
27 file_size
=item
.file_size
,
28 compress_size
=item
.compress_size
,
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
),
36 extract_version
=item
.extract_version
,
37 compress_type
=item
.compress_type
,
45 return 'Different lengths'
47 for i
, xa
in enumerate(a
):
51 problems
.append('NewKey(%d,%s)=%r' % (i
, k
, xa
[k
]))
54 problems
.append('MissingKey(%d,%s)=%r' % (i
, k
, xb
[k
]))
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
)
61 assert a
== b
, diffs(a
, b
)
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'
94 def get_vol_info(extver
=20, tz
='', hr
='11'):
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
),
100 compress_size
=205000,
101 extract_version
=extver
,
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
,
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
):
153 date_time
=mtime
.split('.')[0].replace('T', ' '),
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(
190 compress_type
=rarfile
.RAR_M3
,
192 host_os
=rarfile
.RAR_OS_UNIX
,
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',
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'
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')