blob: a13cf3bd09aa66d35011cf3a1c6f95b4cb4333df [file] [log] [blame]
Nadeem Vawda3ff069e2011-11-30 00:25:06 +02001from io import BytesIO, UnsupportedOperation
2import os
3import random
4import unittest
5
6from test.support import (
7 _4G, TESTFN, import_module, bigmemtest, run_unittest, unlink
8)
9
10lzma = import_module("lzma")
11from lzma import LZMACompressor, LZMADecompressor, LZMAError, LZMAFile
12
13
14class CompressorDecompressorTestCase(unittest.TestCase):
15
16 # Test error cases.
17
18 def test_simple_bad_args(self):
19 self.assertRaises(TypeError, LZMACompressor, [])
20 self.assertRaises(TypeError, LZMACompressor, format=3.45)
21 self.assertRaises(TypeError, LZMACompressor, check="")
22 self.assertRaises(TypeError, LZMACompressor, preset="asdf")
23 self.assertRaises(TypeError, LZMACompressor, filters=3)
24 # Can't specify FORMAT_AUTO when compressing.
25 self.assertRaises(ValueError, LZMACompressor, format=lzma.FORMAT_AUTO)
26 # Can't specify a preset and a custom filter chain at the same time.
27 with self.assertRaises(ValueError):
28 LZMACompressor(preset=7, filters=[{"id": lzma.FILTER_LZMA2}])
29
30 self.assertRaises(TypeError, LZMADecompressor, ())
31 self.assertRaises(TypeError, LZMADecompressor, memlimit=b"qw")
32 with self.assertRaises(TypeError):
33 LZMADecompressor(lzma.FORMAT_RAW, filters="zzz")
34 # Cannot specify a memory limit with FILTER_RAW.
35 with self.assertRaises(ValueError):
36 LZMADecompressor(lzma.FORMAT_RAW, memlimit=0x1000000)
37 # Can only specify a custom filter chain with FILTER_RAW.
38 self.assertRaises(ValueError, LZMADecompressor, filters=FILTERS_RAW_1)
39 with self.assertRaises(ValueError):
40 LZMADecompressor(format=lzma.FORMAT_XZ, filters=FILTERS_RAW_1)
41 with self.assertRaises(ValueError):
42 LZMADecompressor(format=lzma.FORMAT_ALONE, filters=FILTERS_RAW_1)
43
44 lzc = LZMACompressor()
45 self.assertRaises(TypeError, lzc.compress)
46 self.assertRaises(TypeError, lzc.compress, b"foo", b"bar")
47 self.assertRaises(TypeError, lzc.flush, b"blah")
48 empty = lzc.flush()
49 self.assertRaises(ValueError, lzc.compress, b"quux")
50 self.assertRaises(ValueError, lzc.flush)
51
52 lzd = LZMADecompressor()
53 self.assertRaises(TypeError, lzd.decompress)
54 self.assertRaises(TypeError, lzd.decompress, b"foo", b"bar")
55 lzd.decompress(empty)
56 self.assertRaises(EOFError, lzd.decompress, b"quux")
57
58 def test_bad_filter_spec(self):
59 self.assertRaises(TypeError, LZMACompressor, filters=[b"wobsite"])
60 self.assertRaises(ValueError, LZMACompressor, filters=[{"xyzzy": 3}])
61 self.assertRaises(ValueError, LZMACompressor, filters=[{"id": 98765}])
62 with self.assertRaises(ValueError):
63 LZMACompressor(filters=[{"id": lzma.FILTER_LZMA2, "foo": 0}])
64 with self.assertRaises(ValueError):
65 LZMACompressor(filters=[{"id": lzma.FILTER_DELTA, "foo": 0}])
66 with self.assertRaises(ValueError):
67 LZMACompressor(filters=[{"id": lzma.FILTER_X86, "foo": 0}])
68
69 def test_decompressor_after_eof(self):
70 lzd = LZMADecompressor()
71 lzd.decompress(COMPRESSED_XZ)
72 self.assertRaises(EOFError, lzd.decompress, b"nyan")
73
74 def test_decompressor_memlimit(self):
75 lzd = LZMADecompressor(memlimit=1024)
76 self.assertRaises(LZMAError, lzd.decompress, COMPRESSED_XZ)
77
78 lzd = LZMADecompressor(lzma.FORMAT_XZ, memlimit=1024)
79 self.assertRaises(LZMAError, lzd.decompress, COMPRESSED_XZ)
80
81 lzd = LZMADecompressor(lzma.FORMAT_ALONE, memlimit=1024)
82 self.assertRaises(LZMAError, lzd.decompress, COMPRESSED_ALONE)
83
84 # Test LZMADecompressor on known-good input data.
85
86 def _test_decompressor(self, lzd, data, check, unused_data=b""):
87 self.assertFalse(lzd.eof)
88 out = lzd.decompress(data)
89 self.assertEqual(out, INPUT)
90 self.assertEqual(lzd.check, check)
91 self.assertTrue(lzd.eof)
92 self.assertEqual(lzd.unused_data, unused_data)
93
94 def test_decompressor_auto(self):
95 lzd = LZMADecompressor()
96 self._test_decompressor(lzd, COMPRESSED_XZ, lzma.CHECK_CRC64)
97
98 lzd = LZMADecompressor()
99 self._test_decompressor(lzd, COMPRESSED_ALONE, lzma.CHECK_NONE)
100
101 def test_decompressor_xz(self):
102 lzd = LZMADecompressor(lzma.FORMAT_XZ)
103 self._test_decompressor(lzd, COMPRESSED_XZ, lzma.CHECK_CRC64)
104
105 def test_decompressor_alone(self):
106 lzd = LZMADecompressor(lzma.FORMAT_ALONE)
107 self._test_decompressor(lzd, COMPRESSED_ALONE, lzma.CHECK_NONE)
108
109 def test_decompressor_raw_1(self):
110 lzd = LZMADecompressor(lzma.FORMAT_RAW, filters=FILTERS_RAW_1)
111 self._test_decompressor(lzd, COMPRESSED_RAW_1, lzma.CHECK_NONE)
112
113 def test_decompressor_raw_2(self):
114 lzd = LZMADecompressor(lzma.FORMAT_RAW, filters=FILTERS_RAW_2)
115 self._test_decompressor(lzd, COMPRESSED_RAW_2, lzma.CHECK_NONE)
116
117 def test_decompressor_raw_3(self):
118 lzd = LZMADecompressor(lzma.FORMAT_RAW, filters=FILTERS_RAW_3)
119 self._test_decompressor(lzd, COMPRESSED_RAW_3, lzma.CHECK_NONE)
120
121 def test_decompressor_raw_4(self):
122 lzd = LZMADecompressor(lzma.FORMAT_RAW, filters=FILTERS_RAW_4)
123 self._test_decompressor(lzd, COMPRESSED_RAW_4, lzma.CHECK_NONE)
124
125 def test_decompressor_chunks(self):
126 lzd = LZMADecompressor()
127 out = []
128 for i in range(0, len(COMPRESSED_XZ), 10):
129 self.assertFalse(lzd.eof)
130 out.append(lzd.decompress(COMPRESSED_XZ[i:i+10]))
131 out = b"".join(out)
132 self.assertEqual(out, INPUT)
133 self.assertEqual(lzd.check, lzma.CHECK_CRC64)
134 self.assertTrue(lzd.eof)
135 self.assertEqual(lzd.unused_data, b"")
136
137 def test_decompressor_unused_data(self):
138 lzd = LZMADecompressor()
139 extra = b"fooblibar"
140 self._test_decompressor(lzd, COMPRESSED_XZ + extra, lzma.CHECK_CRC64,
141 unused_data=extra)
142
143 def test_decompressor_bad_input(self):
144 lzd = LZMADecompressor()
145 self.assertRaises(LZMAError, lzd.decompress, COMPRESSED_RAW_1)
146
147 lzd = LZMADecompressor(lzma.FORMAT_XZ)
148 self.assertRaises(LZMAError, lzd.decompress, COMPRESSED_ALONE)
149
150 lzd = LZMADecompressor(lzma.FORMAT_ALONE)
151 self.assertRaises(LZMAError, lzd.decompress, COMPRESSED_XZ)
152
153 lzd = LZMADecompressor(lzma.FORMAT_RAW, filters=FILTERS_RAW_1)
154 self.assertRaises(LZMAError, lzd.decompress, COMPRESSED_XZ)
155
156 # Test that LZMACompressor->LZMADecompressor preserves the input data.
157
158 def test_roundtrip_xz(self):
159 lzc = LZMACompressor()
160 cdata = lzc.compress(INPUT) + lzc.flush()
161 lzd = LZMADecompressor()
162 self._test_decompressor(lzd, cdata, lzma.CHECK_CRC64)
163
164 def test_roundtrip_alone(self):
165 lzc = LZMACompressor(lzma.FORMAT_ALONE)
166 cdata = lzc.compress(INPUT) + lzc.flush()
167 lzd = LZMADecompressor()
168 self._test_decompressor(lzd, cdata, lzma.CHECK_NONE)
169
170 def test_roundtrip_raw(self):
171 lzc = LZMACompressor(lzma.FORMAT_RAW, filters=FILTERS_RAW_4)
172 cdata = lzc.compress(INPUT) + lzc.flush()
173 lzd = LZMADecompressor(lzma.FORMAT_RAW, filters=FILTERS_RAW_4)
174 self._test_decompressor(lzd, cdata, lzma.CHECK_NONE)
175
176 def test_roundtrip_chunks(self):
177 lzc = LZMACompressor()
178 cdata = []
179 for i in range(0, len(INPUT), 10):
180 cdata.append(lzc.compress(INPUT[i:i+10]))
181 cdata.append(lzc.flush())
182 cdata = b"".join(cdata)
183 lzd = LZMADecompressor()
184 self._test_decompressor(lzd, cdata, lzma.CHECK_CRC64)
185
186 # LZMADecompressor intentionally does not handle concatenated streams.
187
188 def test_decompressor_multistream(self):
189 lzd = LZMADecompressor()
190 self._test_decompressor(lzd, COMPRESSED_XZ + COMPRESSED_ALONE,
191 lzma.CHECK_CRC64, unused_data=COMPRESSED_ALONE)
192
193 # Test with inputs larger than 4GiB.
194
195 @bigmemtest(size=_4G + 100, memuse=2)
196 def test_compressor_bigmem(self, size):
197 lzc = LZMACompressor()
198 cdata = lzc.compress(b"x" * size) + lzc.flush()
199 ddata = lzma.decompress(cdata)
200 try:
201 self.assertEqual(len(ddata), size)
202 self.assertEqual(len(ddata.strip(b"x")), 0)
203 finally:
204 ddata = None
205
206 @bigmemtest(size=_4G + 100, memuse=3)
207 def test_decompressor_bigmem(self, size):
208 lzd = LZMADecompressor()
209 blocksize = 10 * 1024 * 1024
210 block = random.getrandbits(blocksize * 8).to_bytes(blocksize, "little")
211 try:
212 input = block * (size // blocksize + 1)
213 cdata = lzma.compress(input)
214 ddata = lzd.decompress(cdata)
215 self.assertEqual(ddata, input)
216 finally:
217 input = cdata = ddata = None
218
219
220class CompressDecompressFunctionTestCase(unittest.TestCase):
221
222 # Test error cases:
223
224 def test_bad_args(self):
225 self.assertRaises(TypeError, lzma.compress)
226 self.assertRaises(TypeError, lzma.compress, [])
227 self.assertRaises(TypeError, lzma.compress, b"", format="xz")
228 self.assertRaises(TypeError, lzma.compress, b"", check="none")
229 self.assertRaises(TypeError, lzma.compress, b"", preset="blah")
230 self.assertRaises(TypeError, lzma.compress, b"", filters=1024)
231 # Can't specify a preset and a custom filter chain at the same time.
232 with self.assertRaises(ValueError):
233 lzma.compress(b"", preset=3, filters=[{"id": lzma.FILTER_LZMA2}])
234
235 self.assertRaises(TypeError, lzma.decompress)
236 self.assertRaises(TypeError, lzma.decompress, [])
237 self.assertRaises(TypeError, lzma.decompress, b"", format="lzma")
238 self.assertRaises(TypeError, lzma.decompress, b"", memlimit=7.3e9)
239 with self.assertRaises(TypeError):
240 lzma.decompress(b"", format=lzma.FORMAT_RAW, filters={})
241 # Cannot specify a memory limit with FILTER_RAW.
242 with self.assertRaises(ValueError):
243 lzma.decompress(b"", format=lzma.FORMAT_RAW, memlimit=0x1000000)
244 # Can only specify a custom filter chain with FILTER_RAW.
245 with self.assertRaises(ValueError):
246 lzma.decompress(b"", filters=FILTERS_RAW_1)
247 with self.assertRaises(ValueError):
248 lzma.decompress(b"", format=lzma.FORMAT_XZ, filters=FILTERS_RAW_1)
249 with self.assertRaises(ValueError):
250 lzma.decompress(
251 b"", format=lzma.FORMAT_ALONE, filters=FILTERS_RAW_1)
252
253 def test_decompress_memlimit(self):
254 with self.assertRaises(LZMAError):
255 lzma.decompress(COMPRESSED_XZ, memlimit=1024)
256 with self.assertRaises(LZMAError):
257 lzma.decompress(
258 COMPRESSED_XZ, format=lzma.FORMAT_XZ, memlimit=1024)
259 with self.assertRaises(LZMAError):
260 lzma.decompress(
261 COMPRESSED_ALONE, format=lzma.FORMAT_ALONE, memlimit=1024)
262
263 # Test LZMADecompressor on known-good input data.
264
265 def test_decompress_good_input(self):
266 ddata = lzma.decompress(COMPRESSED_XZ)
267 self.assertEqual(ddata, INPUT)
268
269 ddata = lzma.decompress(COMPRESSED_ALONE)
270 self.assertEqual(ddata, INPUT)
271
272 ddata = lzma.decompress(COMPRESSED_XZ, lzma.FORMAT_XZ)
273 self.assertEqual(ddata, INPUT)
274
275 ddata = lzma.decompress(COMPRESSED_ALONE, lzma.FORMAT_ALONE)
276 self.assertEqual(ddata, INPUT)
277
278 ddata = lzma.decompress(
279 COMPRESSED_RAW_1, lzma.FORMAT_RAW, filters=FILTERS_RAW_1)
280 self.assertEqual(ddata, INPUT)
281
282 ddata = lzma.decompress(
283 COMPRESSED_RAW_2, lzma.FORMAT_RAW, filters=FILTERS_RAW_2)
284 self.assertEqual(ddata, INPUT)
285
286 ddata = lzma.decompress(
287 COMPRESSED_RAW_3, lzma.FORMAT_RAW, filters=FILTERS_RAW_3)
288 self.assertEqual(ddata, INPUT)
289
290 ddata = lzma.decompress(
291 COMPRESSED_RAW_4, lzma.FORMAT_RAW, filters=FILTERS_RAW_4)
292 self.assertEqual(ddata, INPUT)
293
294 def test_decompress_incomplete_input(self):
295 self.assertRaises(LZMAError, lzma.decompress, COMPRESSED_XZ[:128])
296 self.assertRaises(LZMAError, lzma.decompress, COMPRESSED_ALONE[:128])
297 self.assertRaises(LZMAError, lzma.decompress, COMPRESSED_RAW_1[:128],
298 format=lzma.FORMAT_RAW, filters=FILTERS_RAW_1)
299 self.assertRaises(LZMAError, lzma.decompress, COMPRESSED_RAW_2[:128],
300 format=lzma.FORMAT_RAW, filters=FILTERS_RAW_2)
301 self.assertRaises(LZMAError, lzma.decompress, COMPRESSED_RAW_3[:128],
302 format=lzma.FORMAT_RAW, filters=FILTERS_RAW_3)
303 self.assertRaises(LZMAError, lzma.decompress, COMPRESSED_RAW_4[:128],
304 format=lzma.FORMAT_RAW, filters=FILTERS_RAW_4)
305
306 def test_decompress_bad_input(self):
307 with self.assertRaises(LZMAError):
308 lzma.decompress(COMPRESSED_RAW_1)
309 with self.assertRaises(LZMAError):
310 lzma.decompress(COMPRESSED_ALONE, format=lzma.FORMAT_XZ)
311 with self.assertRaises(LZMAError):
312 lzma.decompress(COMPRESSED_XZ, format=lzma.FORMAT_ALONE)
313 with self.assertRaises(LZMAError):
314 lzma.decompress(COMPRESSED_XZ, format=lzma.FORMAT_RAW,
315 filters=FILTERS_RAW_1)
316
317 # Test that compress()->decompress() preserves the input data.
318
319 def test_roundtrip(self):
320 cdata = lzma.compress(INPUT)
321 ddata = lzma.decompress(cdata)
322 self.assertEqual(ddata, INPUT)
323
324 cdata = lzma.compress(INPUT, lzma.FORMAT_XZ)
325 ddata = lzma.decompress(cdata)
326 self.assertEqual(ddata, INPUT)
327
328 cdata = lzma.compress(INPUT, lzma.FORMAT_ALONE)
329 ddata = lzma.decompress(cdata)
330 self.assertEqual(ddata, INPUT)
331
332 cdata = lzma.compress(INPUT, lzma.FORMAT_RAW, filters=FILTERS_RAW_4)
333 ddata = lzma.decompress(cdata, lzma.FORMAT_RAW, filters=FILTERS_RAW_4)
334 self.assertEqual(ddata, INPUT)
335
336 # Unlike LZMADecompressor, decompress() *does* handle concatenated streams.
337
338 def test_decompress_multistream(self):
339 ddata = lzma.decompress(COMPRESSED_XZ + COMPRESSED_ALONE)
340 self.assertEqual(ddata, INPUT * 2)
341
342
343class TempFile:
344 """Context manager - creates a file, and deletes it on __exit__."""
345
346 def __init__(self, filename, data=b""):
347 self.filename = filename
348 self.data = data
349
350 def __enter__(self):
351 with open(self.filename, "wb") as f:
352 f.write(self.data)
353
354 def __exit__(self, *args):
355 unlink(self.filename)
356
357
358class FileTestCase(unittest.TestCase):
359
360 def test_init(self):
Nadeem Vawda33c34da2012-06-04 23:34:07 +0200361 with LZMAFile(BytesIO(COMPRESSED_XZ)) as f:
Nadeem Vawda3ff069e2011-11-30 00:25:06 +0200362 pass
Nadeem Vawda33c34da2012-06-04 23:34:07 +0200363 with LZMAFile(BytesIO(), "w") as f:
Nadeem Vawda3ff069e2011-11-30 00:25:06 +0200364 pass
Nadeem Vawda33c34da2012-06-04 23:34:07 +0200365 with LZMAFile(BytesIO(), "a") as f:
Nadeem Vawda3ff069e2011-11-30 00:25:06 +0200366 pass
367
368 def test_init_with_filename(self):
369 with TempFile(TESTFN, COMPRESSED_XZ):
370 with LZMAFile(TESTFN) as f:
371 pass
372 with LZMAFile(TESTFN, "w") as f:
373 pass
374 with LZMAFile(TESTFN, "a") as f:
375 pass
376
Nadeem Vawda6cbb20c2012-06-04 23:36:24 +0200377 def test_init_mode(self):
378 with TempFile(TESTFN):
379 with LZMAFile(TESTFN, "r"):
380 pass
381 with LZMAFile(TESTFN, "rb"):
382 pass
383 with LZMAFile(TESTFN, "w"):
384 pass
385 with LZMAFile(TESTFN, "wb"):
386 pass
387 with LZMAFile(TESTFN, "a"):
388 pass
389 with LZMAFile(TESTFN, "ab"):
390 pass
391
Nadeem Vawda3ff069e2011-11-30 00:25:06 +0200392 def test_init_bad_mode(self):
393 with self.assertRaises(ValueError):
Nadeem Vawda33c34da2012-06-04 23:34:07 +0200394 LZMAFile(BytesIO(COMPRESSED_XZ), (3, "x"))
Nadeem Vawda3ff069e2011-11-30 00:25:06 +0200395 with self.assertRaises(ValueError):
Nadeem Vawda33c34da2012-06-04 23:34:07 +0200396 LZMAFile(BytesIO(COMPRESSED_XZ), "")
Nadeem Vawda3ff069e2011-11-30 00:25:06 +0200397 with self.assertRaises(ValueError):
Nadeem Vawda33c34da2012-06-04 23:34:07 +0200398 LZMAFile(BytesIO(COMPRESSED_XZ), "x")
Nadeem Vawda3ff069e2011-11-30 00:25:06 +0200399 with self.assertRaises(ValueError):
Nadeem Vawda6cbb20c2012-06-04 23:36:24 +0200400 LZMAFile(BytesIO(COMPRESSED_XZ), "rt")
Nadeem Vawda3ff069e2011-11-30 00:25:06 +0200401 with self.assertRaises(ValueError):
Nadeem Vawda33c34da2012-06-04 23:34:07 +0200402 LZMAFile(BytesIO(COMPRESSED_XZ), "r+")
Nadeem Vawda3ff069e2011-11-30 00:25:06 +0200403 with self.assertRaises(ValueError):
Nadeem Vawda6cbb20c2012-06-04 23:36:24 +0200404 LZMAFile(BytesIO(COMPRESSED_XZ), "wt")
Nadeem Vawda3ff069e2011-11-30 00:25:06 +0200405 with self.assertRaises(ValueError):
Nadeem Vawda33c34da2012-06-04 23:34:07 +0200406 LZMAFile(BytesIO(COMPRESSED_XZ), "w+")
Nadeem Vawda3ff069e2011-11-30 00:25:06 +0200407 with self.assertRaises(ValueError):
Nadeem Vawda33c34da2012-06-04 23:34:07 +0200408 LZMAFile(BytesIO(COMPRESSED_XZ), "rw")
Nadeem Vawda3ff069e2011-11-30 00:25:06 +0200409
410 def test_init_bad_check(self):
411 with self.assertRaises(TypeError):
Nadeem Vawda33c34da2012-06-04 23:34:07 +0200412 LZMAFile(BytesIO(), "w", check=b"asd")
Nadeem Vawda3ff069e2011-11-30 00:25:06 +0200413 # CHECK_UNKNOWN and anything above CHECK_ID_MAX should be invalid.
414 with self.assertRaises(LZMAError):
Nadeem Vawda33c34da2012-06-04 23:34:07 +0200415 LZMAFile(BytesIO(), "w", check=lzma.CHECK_UNKNOWN)
Nadeem Vawda3ff069e2011-11-30 00:25:06 +0200416 with self.assertRaises(LZMAError):
Nadeem Vawda33c34da2012-06-04 23:34:07 +0200417 LZMAFile(BytesIO(), "w", check=lzma.CHECK_ID_MAX + 3)
Nadeem Vawda3ff069e2011-11-30 00:25:06 +0200418 # Cannot specify a check with mode="r".
419 with self.assertRaises(ValueError):
Nadeem Vawda33c34da2012-06-04 23:34:07 +0200420 LZMAFile(BytesIO(COMPRESSED_XZ), check=lzma.CHECK_NONE)
Nadeem Vawda3ff069e2011-11-30 00:25:06 +0200421 with self.assertRaises(ValueError):
Nadeem Vawda33c34da2012-06-04 23:34:07 +0200422 LZMAFile(BytesIO(COMPRESSED_XZ), check=lzma.CHECK_CRC32)
Nadeem Vawda3ff069e2011-11-30 00:25:06 +0200423 with self.assertRaises(ValueError):
Nadeem Vawda33c34da2012-06-04 23:34:07 +0200424 LZMAFile(BytesIO(COMPRESSED_XZ), check=lzma.CHECK_CRC64)
Nadeem Vawda3ff069e2011-11-30 00:25:06 +0200425 with self.assertRaises(ValueError):
Nadeem Vawda33c34da2012-06-04 23:34:07 +0200426 LZMAFile(BytesIO(COMPRESSED_XZ), check=lzma.CHECK_SHA256)
Nadeem Vawda3ff069e2011-11-30 00:25:06 +0200427 with self.assertRaises(ValueError):
Nadeem Vawda33c34da2012-06-04 23:34:07 +0200428 LZMAFile(BytesIO(COMPRESSED_XZ), check=lzma.CHECK_UNKNOWN)
Nadeem Vawda3ff069e2011-11-30 00:25:06 +0200429
430 def test_init_bad_preset(self):
431 with self.assertRaises(TypeError):
Nadeem Vawda33c34da2012-06-04 23:34:07 +0200432 LZMAFile(BytesIO(), "w", preset=4.39)
Nadeem Vawda3ff069e2011-11-30 00:25:06 +0200433 with self.assertRaises(LZMAError):
Nadeem Vawda33c34da2012-06-04 23:34:07 +0200434 LZMAFile(BytesIO(), "w", preset=10)
Nadeem Vawda3ff069e2011-11-30 00:25:06 +0200435 with self.assertRaises(LZMAError):
Nadeem Vawda33c34da2012-06-04 23:34:07 +0200436 LZMAFile(BytesIO(), "w", preset=23)
Nadeem Vawda3ff069e2011-11-30 00:25:06 +0200437 with self.assertRaises(OverflowError):
Nadeem Vawda33c34da2012-06-04 23:34:07 +0200438 LZMAFile(BytesIO(), "w", preset=-1)
Nadeem Vawda3ff069e2011-11-30 00:25:06 +0200439 with self.assertRaises(OverflowError):
Nadeem Vawda33c34da2012-06-04 23:34:07 +0200440 LZMAFile(BytesIO(), "w", preset=-7)
Nadeem Vawda3ff069e2011-11-30 00:25:06 +0200441 with self.assertRaises(TypeError):
Nadeem Vawda33c34da2012-06-04 23:34:07 +0200442 LZMAFile(BytesIO(), "w", preset="foo")
Nadeem Vawda3ff069e2011-11-30 00:25:06 +0200443 # Cannot specify a preset with mode="r".
444 with self.assertRaises(ValueError):
Nadeem Vawda33c34da2012-06-04 23:34:07 +0200445 LZMAFile(BytesIO(COMPRESSED_XZ), preset=3)
Nadeem Vawda3ff069e2011-11-30 00:25:06 +0200446
447 def test_init_bad_filter_spec(self):
448 with self.assertRaises(TypeError):
Nadeem Vawda33c34da2012-06-04 23:34:07 +0200449 LZMAFile(BytesIO(), "w", filters=[b"wobsite"])
Nadeem Vawda3ff069e2011-11-30 00:25:06 +0200450 with self.assertRaises(ValueError):
Nadeem Vawda33c34da2012-06-04 23:34:07 +0200451 LZMAFile(BytesIO(), "w", filters=[{"xyzzy": 3}])
Nadeem Vawda3ff069e2011-11-30 00:25:06 +0200452 with self.assertRaises(ValueError):
Nadeem Vawda33c34da2012-06-04 23:34:07 +0200453 LZMAFile(BytesIO(), "w", filters=[{"id": 98765}])
Nadeem Vawda3ff069e2011-11-30 00:25:06 +0200454 with self.assertRaises(ValueError):
Nadeem Vawda33c34da2012-06-04 23:34:07 +0200455 LZMAFile(BytesIO(), "w",
Nadeem Vawda3ff069e2011-11-30 00:25:06 +0200456 filters=[{"id": lzma.FILTER_LZMA2, "foo": 0}])
457 with self.assertRaises(ValueError):
Nadeem Vawda33c34da2012-06-04 23:34:07 +0200458 LZMAFile(BytesIO(), "w",
Nadeem Vawda3ff069e2011-11-30 00:25:06 +0200459 filters=[{"id": lzma.FILTER_DELTA, "foo": 0}])
460 with self.assertRaises(ValueError):
Nadeem Vawda33c34da2012-06-04 23:34:07 +0200461 LZMAFile(BytesIO(), "w",
Nadeem Vawda3ff069e2011-11-30 00:25:06 +0200462 filters=[{"id": lzma.FILTER_X86, "foo": 0}])
463
464 def test_init_with_preset_and_filters(self):
465 with self.assertRaises(ValueError):
Nadeem Vawda33c34da2012-06-04 23:34:07 +0200466 LZMAFile(BytesIO(), "w", format=lzma.FORMAT_RAW,
467 preset=6, filters=FILTERS_RAW_1)
Nadeem Vawda3ff069e2011-11-30 00:25:06 +0200468
469 def test_close(self):
470 with BytesIO(COMPRESSED_XZ) as src:
Nadeem Vawda33c34da2012-06-04 23:34:07 +0200471 f = LZMAFile(src)
Nadeem Vawda3ff069e2011-11-30 00:25:06 +0200472 f.close()
473 # LZMAFile.close() should not close the underlying file object.
474 self.assertFalse(src.closed)
475 # Try closing an already-closed LZMAFile.
476 f.close()
477 self.assertFalse(src.closed)
478
479 # Test with a real file on disk, opened directly by LZMAFile.
480 with TempFile(TESTFN, COMPRESSED_XZ):
481 f = LZMAFile(TESTFN)
482 fp = f._fp
483 f.close()
484 # Here, LZMAFile.close() *should* close the underlying file object.
485 self.assertTrue(fp.closed)
486 # Try closing an already-closed LZMAFile.
487 f.close()
488
489 def test_closed(self):
Nadeem Vawda33c34da2012-06-04 23:34:07 +0200490 f = LZMAFile(BytesIO(COMPRESSED_XZ))
Nadeem Vawda3ff069e2011-11-30 00:25:06 +0200491 try:
492 self.assertFalse(f.closed)
493 f.read()
494 self.assertFalse(f.closed)
495 finally:
496 f.close()
497 self.assertTrue(f.closed)
498
Nadeem Vawda33c34da2012-06-04 23:34:07 +0200499 f = LZMAFile(BytesIO(), "w")
Nadeem Vawda3ff069e2011-11-30 00:25:06 +0200500 try:
501 self.assertFalse(f.closed)
502 finally:
503 f.close()
504 self.assertTrue(f.closed)
505
506 def test_fileno(self):
Nadeem Vawda33c34da2012-06-04 23:34:07 +0200507 f = LZMAFile(BytesIO(COMPRESSED_XZ))
Nadeem Vawda3ff069e2011-11-30 00:25:06 +0200508 try:
509 self.assertRaises(UnsupportedOperation, f.fileno)
510 finally:
511 f.close()
512 self.assertRaises(ValueError, f.fileno)
513 with TempFile(TESTFN, COMPRESSED_XZ):
514 f = LZMAFile(TESTFN)
515 try:
516 self.assertEqual(f.fileno(), f._fp.fileno())
517 self.assertIsInstance(f.fileno(), int)
518 finally:
519 f.close()
520 self.assertRaises(ValueError, f.fileno)
521
522 def test_seekable(self):
Nadeem Vawda33c34da2012-06-04 23:34:07 +0200523 f = LZMAFile(BytesIO(COMPRESSED_XZ))
Nadeem Vawda3ff069e2011-11-30 00:25:06 +0200524 try:
525 self.assertTrue(f.seekable())
526 f.read()
527 self.assertTrue(f.seekable())
528 finally:
529 f.close()
530 self.assertRaises(ValueError, f.seekable)
531
Nadeem Vawda33c34da2012-06-04 23:34:07 +0200532 f = LZMAFile(BytesIO(), "w")
Nadeem Vawda3ff069e2011-11-30 00:25:06 +0200533 try:
534 self.assertFalse(f.seekable())
535 finally:
536 f.close()
537 self.assertRaises(ValueError, f.seekable)
538
Nadeem Vawdaae557d72012-02-12 01:51:38 +0200539 src = BytesIO(COMPRESSED_XZ)
540 src.seekable = lambda: False
Nadeem Vawda33c34da2012-06-04 23:34:07 +0200541 f = LZMAFile(src)
Nadeem Vawdaae557d72012-02-12 01:51:38 +0200542 try:
543 self.assertFalse(f.seekable())
544 finally:
545 f.close()
546 self.assertRaises(ValueError, f.seekable)
547
Nadeem Vawda3ff069e2011-11-30 00:25:06 +0200548 def test_readable(self):
Nadeem Vawda33c34da2012-06-04 23:34:07 +0200549 f = LZMAFile(BytesIO(COMPRESSED_XZ))
Nadeem Vawda3ff069e2011-11-30 00:25:06 +0200550 try:
551 self.assertTrue(f.readable())
552 f.read()
553 self.assertTrue(f.readable())
554 finally:
555 f.close()
556 self.assertRaises(ValueError, f.readable)
557
Nadeem Vawda33c34da2012-06-04 23:34:07 +0200558 f = LZMAFile(BytesIO(), "w")
Nadeem Vawda3ff069e2011-11-30 00:25:06 +0200559 try:
560 self.assertFalse(f.readable())
561 finally:
562 f.close()
563 self.assertRaises(ValueError, f.readable)
564
565 def test_writable(self):
Nadeem Vawda33c34da2012-06-04 23:34:07 +0200566 f = LZMAFile(BytesIO(COMPRESSED_XZ))
Nadeem Vawda3ff069e2011-11-30 00:25:06 +0200567 try:
568 self.assertFalse(f.writable())
569 f.read()
570 self.assertFalse(f.writable())
571 finally:
572 f.close()
573 self.assertRaises(ValueError, f.writable)
574
Nadeem Vawda33c34da2012-06-04 23:34:07 +0200575 f = LZMAFile(BytesIO(), "w")
Nadeem Vawda3ff069e2011-11-30 00:25:06 +0200576 try:
577 self.assertTrue(f.writable())
578 finally:
579 f.close()
580 self.assertRaises(ValueError, f.writable)
581
582 def test_read(self):
Nadeem Vawda33c34da2012-06-04 23:34:07 +0200583 with LZMAFile(BytesIO(COMPRESSED_XZ)) as f:
Nadeem Vawda3ff069e2011-11-30 00:25:06 +0200584 self.assertEqual(f.read(), INPUT)
585 self.assertEqual(f.read(), b"")
Nadeem Vawda33c34da2012-06-04 23:34:07 +0200586 with LZMAFile(BytesIO(COMPRESSED_ALONE)) as f:
Nadeem Vawda3ff069e2011-11-30 00:25:06 +0200587 self.assertEqual(f.read(), INPUT)
Nadeem Vawda33c34da2012-06-04 23:34:07 +0200588 with LZMAFile(BytesIO(COMPRESSED_XZ), format=lzma.FORMAT_XZ) as f:
Nadeem Vawda3ff069e2011-11-30 00:25:06 +0200589 self.assertEqual(f.read(), INPUT)
590 self.assertEqual(f.read(), b"")
Nadeem Vawda33c34da2012-06-04 23:34:07 +0200591 with LZMAFile(BytesIO(COMPRESSED_ALONE), format=lzma.FORMAT_ALONE) as f:
Nadeem Vawda3ff069e2011-11-30 00:25:06 +0200592 self.assertEqual(f.read(), INPUT)
593 self.assertEqual(f.read(), b"")
Nadeem Vawda33c34da2012-06-04 23:34:07 +0200594 with LZMAFile(BytesIO(COMPRESSED_RAW_1),
Nadeem Vawda3ff069e2011-11-30 00:25:06 +0200595 format=lzma.FORMAT_RAW, filters=FILTERS_RAW_1) as f:
596 self.assertEqual(f.read(), INPUT)
597 self.assertEqual(f.read(), b"")
Nadeem Vawda33c34da2012-06-04 23:34:07 +0200598 with LZMAFile(BytesIO(COMPRESSED_RAW_2),
Nadeem Vawda3ff069e2011-11-30 00:25:06 +0200599 format=lzma.FORMAT_RAW, filters=FILTERS_RAW_2) as f:
600 self.assertEqual(f.read(), INPUT)
601 self.assertEqual(f.read(), b"")
Nadeem Vawda33c34da2012-06-04 23:34:07 +0200602 with LZMAFile(BytesIO(COMPRESSED_RAW_3),
Nadeem Vawda3ff069e2011-11-30 00:25:06 +0200603 format=lzma.FORMAT_RAW, filters=FILTERS_RAW_3) as f:
604 self.assertEqual(f.read(), INPUT)
605 self.assertEqual(f.read(), b"")
Nadeem Vawda33c34da2012-06-04 23:34:07 +0200606 with LZMAFile(BytesIO(COMPRESSED_RAW_4),
Nadeem Vawda3ff069e2011-11-30 00:25:06 +0200607 format=lzma.FORMAT_RAW, filters=FILTERS_RAW_4) as f:
608 self.assertEqual(f.read(), INPUT)
609 self.assertEqual(f.read(), b"")
610
611 def test_read_0(self):
Nadeem Vawda33c34da2012-06-04 23:34:07 +0200612 with LZMAFile(BytesIO(COMPRESSED_XZ)) as f:
Nadeem Vawda3ff069e2011-11-30 00:25:06 +0200613 self.assertEqual(f.read(0), b"")
Nadeem Vawda33c34da2012-06-04 23:34:07 +0200614 with LZMAFile(BytesIO(COMPRESSED_ALONE)) as f:
Nadeem Vawda3ff069e2011-11-30 00:25:06 +0200615 self.assertEqual(f.read(0), b"")
Nadeem Vawda33c34da2012-06-04 23:34:07 +0200616 with LZMAFile(BytesIO(COMPRESSED_XZ), format=lzma.FORMAT_XZ) as f:
Nadeem Vawda3ff069e2011-11-30 00:25:06 +0200617 self.assertEqual(f.read(0), b"")
Nadeem Vawda33c34da2012-06-04 23:34:07 +0200618 with LZMAFile(BytesIO(COMPRESSED_ALONE), format=lzma.FORMAT_ALONE) as f:
Nadeem Vawda3ff069e2011-11-30 00:25:06 +0200619 self.assertEqual(f.read(0), b"")
620
621 def test_read_10(self):
Nadeem Vawda33c34da2012-06-04 23:34:07 +0200622 with LZMAFile(BytesIO(COMPRESSED_XZ)) as f:
Nadeem Vawda3ff069e2011-11-30 00:25:06 +0200623 chunks = []
624 while True:
625 result = f.read(10)
626 if not result:
627 break
628 self.assertLessEqual(len(result), 10)
629 chunks.append(result)
630 self.assertEqual(b"".join(chunks), INPUT)
631
632 def test_read_multistream(self):
Nadeem Vawda33c34da2012-06-04 23:34:07 +0200633 with LZMAFile(BytesIO(COMPRESSED_XZ * 5)) as f:
Nadeem Vawda3ff069e2011-11-30 00:25:06 +0200634 self.assertEqual(f.read(), INPUT * 5)
Nadeem Vawda33c34da2012-06-04 23:34:07 +0200635 with LZMAFile(BytesIO(COMPRESSED_XZ + COMPRESSED_ALONE)) as f:
Nadeem Vawda3ff069e2011-11-30 00:25:06 +0200636 self.assertEqual(f.read(), INPUT * 2)
Nadeem Vawda33c34da2012-06-04 23:34:07 +0200637 with LZMAFile(BytesIO(COMPRESSED_RAW_3 * 4),
Nadeem Vawda3ff069e2011-11-30 00:25:06 +0200638 format=lzma.FORMAT_RAW, filters=FILTERS_RAW_3) as f:
639 self.assertEqual(f.read(), INPUT * 4)
640
641 def test_read_multistream_buffer_size_aligned(self):
642 # Test the case where a stream boundary coincides with the end
643 # of the raw read buffer.
644 saved_buffer_size = lzma._BUFFER_SIZE
645 lzma._BUFFER_SIZE = len(COMPRESSED_XZ)
646 try:
Nadeem Vawda33c34da2012-06-04 23:34:07 +0200647 with LZMAFile(BytesIO(COMPRESSED_XZ * 5)) as f:
Nadeem Vawda3ff069e2011-11-30 00:25:06 +0200648 self.assertEqual(f.read(), INPUT * 5)
649 finally:
650 lzma._BUFFER_SIZE = saved_buffer_size
651
652 def test_read_from_file(self):
653 with TempFile(TESTFN, COMPRESSED_XZ):
654 with LZMAFile(TESTFN) as f:
655 self.assertEqual(f.read(), INPUT)
656 self.assertEqual(f.read(), b"")
657
Nadeem Vawda10c87912012-06-20 01:48:50 +0200658 def test_read_from_file_with_bytes_filename(self):
659 try:
660 bytes_filename = TESTFN.encode("ascii")
661 except UnicodeEncodeError:
662 self.skipTest("Temporary file name needs to be ASCII")
663 with TempFile(TESTFN, COMPRESSED_XZ):
664 with LZMAFile(bytes_filename) as f:
665 self.assertEqual(f.read(), INPUT)
666 self.assertEqual(f.read(), b"")
667
Nadeem Vawda3ff069e2011-11-30 00:25:06 +0200668 def test_read_incomplete(self):
Nadeem Vawda33c34da2012-06-04 23:34:07 +0200669 with LZMAFile(BytesIO(COMPRESSED_XZ[:128])) as f:
Nadeem Vawda3ff069e2011-11-30 00:25:06 +0200670 self.assertRaises(EOFError, f.read)
671
672 def test_read_bad_args(self):
Nadeem Vawda33c34da2012-06-04 23:34:07 +0200673 f = LZMAFile(BytesIO(COMPRESSED_XZ))
Nadeem Vawda3ff069e2011-11-30 00:25:06 +0200674 f.close()
675 self.assertRaises(ValueError, f.read)
Nadeem Vawda33c34da2012-06-04 23:34:07 +0200676 with LZMAFile(BytesIO(), "w") as f:
Nadeem Vawda3ff069e2011-11-30 00:25:06 +0200677 self.assertRaises(ValueError, f.read)
Nadeem Vawda33c34da2012-06-04 23:34:07 +0200678 with LZMAFile(BytesIO(COMPRESSED_XZ)) as f:
Nadeem Vawda3ff069e2011-11-30 00:25:06 +0200679 self.assertRaises(TypeError, f.read, None)
680
681 def test_read1(self):
Nadeem Vawda33c34da2012-06-04 23:34:07 +0200682 with LZMAFile(BytesIO(COMPRESSED_XZ)) as f:
Nadeem Vawda3ff069e2011-11-30 00:25:06 +0200683 blocks = []
684 while True:
685 result = f.read1()
686 if not result:
687 break
688 blocks.append(result)
689 self.assertEqual(b"".join(blocks), INPUT)
690 self.assertEqual(f.read1(), b"")
691
692 def test_read1_0(self):
Nadeem Vawda33c34da2012-06-04 23:34:07 +0200693 with LZMAFile(BytesIO(COMPRESSED_XZ)) as f:
Nadeem Vawda3ff069e2011-11-30 00:25:06 +0200694 self.assertEqual(f.read1(0), b"")
695
696 def test_read1_10(self):
Nadeem Vawda33c34da2012-06-04 23:34:07 +0200697 with LZMAFile(BytesIO(COMPRESSED_XZ)) as f:
Nadeem Vawda3ff069e2011-11-30 00:25:06 +0200698 blocks = []
699 while True:
700 result = f.read1(10)
701 if not result:
702 break
703 blocks.append(result)
704 self.assertEqual(b"".join(blocks), INPUT)
705 self.assertEqual(f.read1(), b"")
706
707 def test_read1_multistream(self):
Nadeem Vawda33c34da2012-06-04 23:34:07 +0200708 with LZMAFile(BytesIO(COMPRESSED_XZ * 5)) as f:
Nadeem Vawda3ff069e2011-11-30 00:25:06 +0200709 blocks = []
710 while True:
711 result = f.read1()
712 if not result:
713 break
714 blocks.append(result)
715 self.assertEqual(b"".join(blocks), INPUT * 5)
716 self.assertEqual(f.read1(), b"")
717
718 def test_read1_bad_args(self):
Nadeem Vawda33c34da2012-06-04 23:34:07 +0200719 f = LZMAFile(BytesIO(COMPRESSED_XZ))
Nadeem Vawda3ff069e2011-11-30 00:25:06 +0200720 f.close()
721 self.assertRaises(ValueError, f.read1)
Nadeem Vawda33c34da2012-06-04 23:34:07 +0200722 with LZMAFile(BytesIO(), "w") as f:
Nadeem Vawda3ff069e2011-11-30 00:25:06 +0200723 self.assertRaises(ValueError, f.read1)
Nadeem Vawda33c34da2012-06-04 23:34:07 +0200724 with LZMAFile(BytesIO(COMPRESSED_XZ)) as f:
Nadeem Vawda3ff069e2011-11-30 00:25:06 +0200725 self.assertRaises(TypeError, f.read1, None)
726
727 def test_peek(self):
Nadeem Vawda33c34da2012-06-04 23:34:07 +0200728 with LZMAFile(BytesIO(COMPRESSED_XZ)) as f:
Nadeem Vawda3ff069e2011-11-30 00:25:06 +0200729 result = f.peek()
730 self.assertGreater(len(result), 0)
731 self.assertTrue(INPUT.startswith(result))
732 self.assertEqual(f.read(), INPUT)
Nadeem Vawda33c34da2012-06-04 23:34:07 +0200733 with LZMAFile(BytesIO(COMPRESSED_XZ)) as f:
Nadeem Vawda3ff069e2011-11-30 00:25:06 +0200734 result = f.peek(10)
735 self.assertGreater(len(result), 0)
736 self.assertTrue(INPUT.startswith(result))
737 self.assertEqual(f.read(), INPUT)
738
739 def test_peek_bad_args(self):
Nadeem Vawda33c34da2012-06-04 23:34:07 +0200740 with LZMAFile(BytesIO(), "w") as f:
Nadeem Vawda3ff069e2011-11-30 00:25:06 +0200741 self.assertRaises(ValueError, f.peek)
742
743 def test_iterator(self):
744 with BytesIO(INPUT) as f:
745 lines = f.readlines()
Nadeem Vawda33c34da2012-06-04 23:34:07 +0200746 with LZMAFile(BytesIO(COMPRESSED_XZ)) as f:
Nadeem Vawda3ff069e2011-11-30 00:25:06 +0200747 self.assertListEqual(list(iter(f)), lines)
Nadeem Vawda33c34da2012-06-04 23:34:07 +0200748 with LZMAFile(BytesIO(COMPRESSED_ALONE)) as f:
Nadeem Vawda3ff069e2011-11-30 00:25:06 +0200749 self.assertListEqual(list(iter(f)), lines)
Nadeem Vawda33c34da2012-06-04 23:34:07 +0200750 with LZMAFile(BytesIO(COMPRESSED_XZ), format=lzma.FORMAT_XZ) as f:
Nadeem Vawda3ff069e2011-11-30 00:25:06 +0200751 self.assertListEqual(list(iter(f)), lines)
Nadeem Vawda33c34da2012-06-04 23:34:07 +0200752 with LZMAFile(BytesIO(COMPRESSED_ALONE), format=lzma.FORMAT_ALONE) as f:
Nadeem Vawda3ff069e2011-11-30 00:25:06 +0200753 self.assertListEqual(list(iter(f)), lines)
Nadeem Vawda33c34da2012-06-04 23:34:07 +0200754 with LZMAFile(BytesIO(COMPRESSED_RAW_2),
Nadeem Vawda3ff069e2011-11-30 00:25:06 +0200755 format=lzma.FORMAT_RAW, filters=FILTERS_RAW_2) as f:
756 self.assertListEqual(list(iter(f)), lines)
757
758 def test_readline(self):
759 with BytesIO(INPUT) as f:
760 lines = f.readlines()
Nadeem Vawda33c34da2012-06-04 23:34:07 +0200761 with LZMAFile(BytesIO(COMPRESSED_XZ)) as f:
Nadeem Vawda3ff069e2011-11-30 00:25:06 +0200762 for line in lines:
763 self.assertEqual(f.readline(), line)
764
765 def test_readlines(self):
766 with BytesIO(INPUT) as f:
767 lines = f.readlines()
Nadeem Vawda33c34da2012-06-04 23:34:07 +0200768 with LZMAFile(BytesIO(COMPRESSED_XZ)) as f:
Nadeem Vawda3ff069e2011-11-30 00:25:06 +0200769 self.assertListEqual(f.readlines(), lines)
770
771 def test_write(self):
772 with BytesIO() as dst:
Nadeem Vawda33c34da2012-06-04 23:34:07 +0200773 with LZMAFile(dst, "w") as f:
Nadeem Vawda3ff069e2011-11-30 00:25:06 +0200774 f.write(INPUT)
775 expected = lzma.compress(INPUT)
776 self.assertEqual(dst.getvalue(), expected)
777 with BytesIO() as dst:
Nadeem Vawda33c34da2012-06-04 23:34:07 +0200778 with LZMAFile(dst, "w", format=lzma.FORMAT_XZ) as f:
Nadeem Vawda3ff069e2011-11-30 00:25:06 +0200779 f.write(INPUT)
780 expected = lzma.compress(INPUT, format=lzma.FORMAT_XZ)
781 self.assertEqual(dst.getvalue(), expected)
782 with BytesIO() as dst:
Nadeem Vawda33c34da2012-06-04 23:34:07 +0200783 with LZMAFile(dst, "w", format=lzma.FORMAT_ALONE) as f:
Nadeem Vawda3ff069e2011-11-30 00:25:06 +0200784 f.write(INPUT)
785 expected = lzma.compress(INPUT, format=lzma.FORMAT_ALONE)
786 self.assertEqual(dst.getvalue(), expected)
787 with BytesIO() as dst:
Nadeem Vawda33c34da2012-06-04 23:34:07 +0200788 with LZMAFile(dst, "w", format=lzma.FORMAT_RAW,
Nadeem Vawda3ff069e2011-11-30 00:25:06 +0200789 filters=FILTERS_RAW_2) as f:
790 f.write(INPUT)
791 expected = lzma.compress(INPUT, format=lzma.FORMAT_RAW,
792 filters=FILTERS_RAW_2)
793 self.assertEqual(dst.getvalue(), expected)
794
795 def test_write_10(self):
796 with BytesIO() as dst:
Nadeem Vawda33c34da2012-06-04 23:34:07 +0200797 with LZMAFile(dst, "w") as f:
Nadeem Vawda3ff069e2011-11-30 00:25:06 +0200798 for start in range(0, len(INPUT), 10):
799 f.write(INPUT[start:start+10])
800 expected = lzma.compress(INPUT)
801 self.assertEqual(dst.getvalue(), expected)
802
803 def test_write_append(self):
804 part1 = INPUT[:1024]
805 part2 = INPUT[1024:1536]
806 part3 = INPUT[1536:]
807 expected = b"".join(lzma.compress(x) for x in (part1, part2, part3))
808 with BytesIO() as dst:
Nadeem Vawda33c34da2012-06-04 23:34:07 +0200809 with LZMAFile(dst, "w") as f:
Nadeem Vawda3ff069e2011-11-30 00:25:06 +0200810 f.write(part1)
Nadeem Vawda33c34da2012-06-04 23:34:07 +0200811 with LZMAFile(dst, "a") as f:
Nadeem Vawda3ff069e2011-11-30 00:25:06 +0200812 f.write(part2)
Nadeem Vawda33c34da2012-06-04 23:34:07 +0200813 with LZMAFile(dst, "a") as f:
Nadeem Vawda3ff069e2011-11-30 00:25:06 +0200814 f.write(part3)
815 self.assertEqual(dst.getvalue(), expected)
816
817 def test_write_to_file(self):
818 try:
819 with LZMAFile(TESTFN, "w") as f:
820 f.write(INPUT)
821 expected = lzma.compress(INPUT)
822 with open(TESTFN, "rb") as f:
823 self.assertEqual(f.read(), expected)
824 finally:
825 unlink(TESTFN)
826
Nadeem Vawda10c87912012-06-20 01:48:50 +0200827 def test_write_to_file_with_bytes_filename(self):
828 try:
829 bytes_filename = TESTFN.encode("ascii")
830 except UnicodeEncodeError:
831 self.skipTest("Temporary file name needs to be ASCII")
832 try:
833 with LZMAFile(bytes_filename, "w") as f:
834 f.write(INPUT)
835 expected = lzma.compress(INPUT)
836 with open(TESTFN, "rb") as f:
837 self.assertEqual(f.read(), expected)
838 finally:
839 unlink(TESTFN)
840
Nadeem Vawda3ff069e2011-11-30 00:25:06 +0200841 def test_write_append_to_file(self):
842 part1 = INPUT[:1024]
843 part2 = INPUT[1024:1536]
844 part3 = INPUT[1536:]
845 expected = b"".join(lzma.compress(x) for x in (part1, part2, part3))
846 try:
847 with LZMAFile(TESTFN, "w") as f:
848 f.write(part1)
849 with LZMAFile(TESTFN, "a") as f:
850 f.write(part2)
851 with LZMAFile(TESTFN, "a") as f:
852 f.write(part3)
853 with open(TESTFN, "rb") as f:
854 self.assertEqual(f.read(), expected)
855 finally:
856 unlink(TESTFN)
857
858 def test_write_bad_args(self):
Nadeem Vawda33c34da2012-06-04 23:34:07 +0200859 f = LZMAFile(BytesIO(), "w")
Nadeem Vawda3ff069e2011-11-30 00:25:06 +0200860 f.close()
861 self.assertRaises(ValueError, f.write, b"foo")
Nadeem Vawda33c34da2012-06-04 23:34:07 +0200862 with LZMAFile(BytesIO(COMPRESSED_XZ), "r") as f:
Nadeem Vawda3ff069e2011-11-30 00:25:06 +0200863 self.assertRaises(ValueError, f.write, b"bar")
Nadeem Vawda33c34da2012-06-04 23:34:07 +0200864 with LZMAFile(BytesIO(), "w") as f:
Nadeem Vawda3ff069e2011-11-30 00:25:06 +0200865 self.assertRaises(TypeError, f.write, None)
866 self.assertRaises(TypeError, f.write, "text")
867 self.assertRaises(TypeError, f.write, 789)
868
869 def test_writelines(self):
870 with BytesIO(INPUT) as f:
871 lines = f.readlines()
872 with BytesIO() as dst:
Nadeem Vawda33c34da2012-06-04 23:34:07 +0200873 with LZMAFile(dst, "w") as f:
Nadeem Vawda3ff069e2011-11-30 00:25:06 +0200874 f.writelines(lines)
875 expected = lzma.compress(INPUT)
876 self.assertEqual(dst.getvalue(), expected)
877
878 def test_seek_forward(self):
Nadeem Vawda33c34da2012-06-04 23:34:07 +0200879 with LZMAFile(BytesIO(COMPRESSED_XZ)) as f:
Nadeem Vawda3ff069e2011-11-30 00:25:06 +0200880 f.seek(555)
881 self.assertEqual(f.read(), INPUT[555:])
882
883 def test_seek_forward_across_streams(self):
Nadeem Vawda33c34da2012-06-04 23:34:07 +0200884 with LZMAFile(BytesIO(COMPRESSED_XZ * 2)) as f:
Nadeem Vawda3ff069e2011-11-30 00:25:06 +0200885 f.seek(len(INPUT) + 123)
886 self.assertEqual(f.read(), INPUT[123:])
887
888 def test_seek_forward_relative_to_current(self):
Nadeem Vawda33c34da2012-06-04 23:34:07 +0200889 with LZMAFile(BytesIO(COMPRESSED_XZ)) as f:
Nadeem Vawda3ff069e2011-11-30 00:25:06 +0200890 f.read(100)
891 f.seek(1236, 1)
892 self.assertEqual(f.read(), INPUT[1336:])
893
894 def test_seek_forward_relative_to_end(self):
Nadeem Vawda33c34da2012-06-04 23:34:07 +0200895 with LZMAFile(BytesIO(COMPRESSED_XZ)) as f:
Nadeem Vawda3ff069e2011-11-30 00:25:06 +0200896 f.seek(-555, 2)
897 self.assertEqual(f.read(), INPUT[-555:])
898
899 def test_seek_backward(self):
Nadeem Vawda33c34da2012-06-04 23:34:07 +0200900 with LZMAFile(BytesIO(COMPRESSED_XZ)) as f:
Nadeem Vawda3ff069e2011-11-30 00:25:06 +0200901 f.read(1001)
902 f.seek(211)
903 self.assertEqual(f.read(), INPUT[211:])
904
905 def test_seek_backward_across_streams(self):
Nadeem Vawda33c34da2012-06-04 23:34:07 +0200906 with LZMAFile(BytesIO(COMPRESSED_XZ * 2)) as f:
Nadeem Vawda3ff069e2011-11-30 00:25:06 +0200907 f.read(len(INPUT) + 333)
908 f.seek(737)
909 self.assertEqual(f.read(), INPUT[737:] + INPUT)
910
911 def test_seek_backward_relative_to_end(self):
Nadeem Vawda33c34da2012-06-04 23:34:07 +0200912 with LZMAFile(BytesIO(COMPRESSED_XZ)) as f:
Nadeem Vawda3ff069e2011-11-30 00:25:06 +0200913 f.seek(-150, 2)
914 self.assertEqual(f.read(), INPUT[-150:])
915
916 def test_seek_past_end(self):
Nadeem Vawda33c34da2012-06-04 23:34:07 +0200917 with LZMAFile(BytesIO(COMPRESSED_XZ)) as f:
Nadeem Vawda3ff069e2011-11-30 00:25:06 +0200918 f.seek(len(INPUT) + 9001)
919 self.assertEqual(f.tell(), len(INPUT))
920 self.assertEqual(f.read(), b"")
921
922 def test_seek_past_start(self):
Nadeem Vawda33c34da2012-06-04 23:34:07 +0200923 with LZMAFile(BytesIO(COMPRESSED_XZ)) as f:
Nadeem Vawda3ff069e2011-11-30 00:25:06 +0200924 f.seek(-88)
925 self.assertEqual(f.tell(), 0)
926 self.assertEqual(f.read(), INPUT)
927
928 def test_seek_bad_args(self):
Nadeem Vawda33c34da2012-06-04 23:34:07 +0200929 f = LZMAFile(BytesIO(COMPRESSED_XZ))
Nadeem Vawda3ff069e2011-11-30 00:25:06 +0200930 f.close()
931 self.assertRaises(ValueError, f.seek, 0)
Nadeem Vawda33c34da2012-06-04 23:34:07 +0200932 with LZMAFile(BytesIO(), "w") as f:
Nadeem Vawda3ff069e2011-11-30 00:25:06 +0200933 self.assertRaises(ValueError, f.seek, 0)
Nadeem Vawda33c34da2012-06-04 23:34:07 +0200934 with LZMAFile(BytesIO(COMPRESSED_XZ)) as f:
Nadeem Vawda3ff069e2011-11-30 00:25:06 +0200935 self.assertRaises(ValueError, f.seek, 0, 3)
936 self.assertRaises(ValueError, f.seek, 9, ())
937 self.assertRaises(TypeError, f.seek, None)
938 self.assertRaises(TypeError, f.seek, b"derp")
939
940 def test_tell(self):
Nadeem Vawda33c34da2012-06-04 23:34:07 +0200941 with LZMAFile(BytesIO(COMPRESSED_XZ)) as f:
Nadeem Vawda3ff069e2011-11-30 00:25:06 +0200942 pos = 0
943 while True:
944 self.assertEqual(f.tell(), pos)
945 result = f.read(183)
946 if not result:
947 break
948 pos += len(result)
949 self.assertEqual(f.tell(), len(INPUT))
Nadeem Vawda33c34da2012-06-04 23:34:07 +0200950 with LZMAFile(BytesIO(), "w") as f:
Nadeem Vawda3ff069e2011-11-30 00:25:06 +0200951 for pos in range(0, len(INPUT), 144):
952 self.assertEqual(f.tell(), pos)
953 f.write(INPUT[pos:pos+144])
954 self.assertEqual(f.tell(), len(INPUT))
955
956 def test_tell_bad_args(self):
Nadeem Vawda33c34da2012-06-04 23:34:07 +0200957 f = LZMAFile(BytesIO(COMPRESSED_XZ))
Nadeem Vawda3ff069e2011-11-30 00:25:06 +0200958 f.close()
959 self.assertRaises(ValueError, f.tell)
960
961
Nadeem Vawdae8604042012-06-04 23:38:12 +0200962class OpenTestCase(unittest.TestCase):
963
964 def test_binary_modes(self):
965 with lzma.open(BytesIO(COMPRESSED_XZ), "rb") as f:
966 self.assertEqual(f.read(), INPUT)
967 with BytesIO() as bio:
968 with lzma.open(bio, "wb") as f:
969 f.write(INPUT)
970 file_data = lzma.decompress(bio.getvalue())
971 self.assertEqual(file_data, INPUT)
972 with lzma.open(bio, "ab") as f:
973 f.write(INPUT)
974 file_data = lzma.decompress(bio.getvalue())
975 self.assertEqual(file_data, INPUT * 2)
976
977 def test_text_modes(self):
978 uncompressed = INPUT.decode("ascii")
979 uncompressed_raw = uncompressed.replace("\n", os.linesep)
980 with lzma.open(BytesIO(COMPRESSED_XZ), "rt") as f:
981 self.assertEqual(f.read(), uncompressed)
982 with BytesIO() as bio:
983 with lzma.open(bio, "wt") as f:
984 f.write(uncompressed)
985 file_data = lzma.decompress(bio.getvalue()).decode("ascii")
986 self.assertEqual(file_data, uncompressed_raw)
987 with lzma.open(bio, "at") as f:
988 f.write(uncompressed)
989 file_data = lzma.decompress(bio.getvalue()).decode("ascii")
990 self.assertEqual(file_data, uncompressed_raw * 2)
991
992 def test_filename(self):
993 with TempFile(TESTFN):
994 with lzma.open(TESTFN, "wb") as f:
995 f.write(INPUT)
996 with open(TESTFN, "rb") as f:
997 file_data = lzma.decompress(f.read())
998 self.assertEqual(file_data, INPUT)
999 with lzma.open(TESTFN, "rb") as f:
1000 self.assertEqual(f.read(), INPUT)
1001 with lzma.open(TESTFN, "ab") as f:
1002 f.write(INPUT)
1003 with lzma.open(TESTFN, "rb") as f:
1004 self.assertEqual(f.read(), INPUT * 2)
1005
1006 def test_bad_params(self):
1007 # Test invalid parameter combinations.
1008 with self.assertRaises(ValueError):
1009 lzma.open(TESTFN, "")
1010 with self.assertRaises(ValueError):
1011 lzma.open(TESTFN, "x")
1012 with self.assertRaises(ValueError):
1013 lzma.open(TESTFN, "rbt")
1014 with self.assertRaises(ValueError):
1015 lzma.open(TESTFN, "rb", encoding="utf-8")
1016 with self.assertRaises(ValueError):
1017 lzma.open(TESTFN, "rb", errors="ignore")
1018 with self.assertRaises(ValueError):
1019 lzma.open(TESTFN, "rb", newline="\n")
1020
1021 def test_format_and_filters(self):
1022 # Test non-default format and filter chain.
1023 options = {"format": lzma.FORMAT_RAW, "filters": FILTERS_RAW_1}
1024 with lzma.open(BytesIO(COMPRESSED_RAW_1), "rb", **options) as f:
1025 self.assertEqual(f.read(), INPUT)
1026 with BytesIO() as bio:
1027 with lzma.open(bio, "wb", **options) as f:
1028 f.write(INPUT)
1029 file_data = lzma.decompress(bio.getvalue(), **options)
1030 self.assertEqual(file_data, INPUT)
1031
1032 def test_encoding(self):
1033 # Test non-default encoding.
1034 uncompressed = INPUT.decode("ascii")
1035 uncompressed_raw = uncompressed.replace("\n", os.linesep)
1036 with BytesIO() as bio:
1037 with lzma.open(bio, "wt", encoding="utf-16-le") as f:
1038 f.write(uncompressed)
1039 file_data = lzma.decompress(bio.getvalue()).decode("utf-16-le")
1040 self.assertEqual(file_data, uncompressed_raw)
1041 bio.seek(0)
1042 with lzma.open(bio, "rt", encoding="utf-16-le") as f:
1043 self.assertEqual(f.read(), uncompressed)
1044
1045 def test_encoding_error_handler(self):
1046 # Test wih non-default encoding error handler.
1047 with BytesIO(lzma.compress(b"foo\xffbar")) as bio:
1048 with lzma.open(bio, "rt", encoding="ascii", errors="ignore") as f:
1049 self.assertEqual(f.read(), "foobar")
1050
1051 def test_newline(self):
1052 # Test with explicit newline (universal newline mode disabled).
1053 text = INPUT.decode("ascii")
1054 with BytesIO() as bio:
1055 with lzma.open(bio, "wt", newline="\n") as f:
1056 f.write(text)
1057 bio.seek(0)
1058 with lzma.open(bio, "rt", newline="\r") as f:
1059 self.assertEqual(f.readlines(), [text])
1060
1061
Nadeem Vawda3ff069e2011-11-30 00:25:06 +02001062class MiscellaneousTestCase(unittest.TestCase):
1063
1064 def test_is_check_supported(self):
1065 # CHECK_NONE and CHECK_CRC32 should always be supported,
1066 # regardless of the options liblzma was compiled with.
Nadeem Vawdabc459bb2012-05-06 23:01:51 +02001067 self.assertTrue(lzma.is_check_supported(lzma.CHECK_NONE))
1068 self.assertTrue(lzma.is_check_supported(lzma.CHECK_CRC32))
Nadeem Vawda3ff069e2011-11-30 00:25:06 +02001069
1070 # The .xz format spec cannot store check IDs above this value.
Nadeem Vawdabc459bb2012-05-06 23:01:51 +02001071 self.assertFalse(lzma.is_check_supported(lzma.CHECK_ID_MAX + 1))
Nadeem Vawda3ff069e2011-11-30 00:25:06 +02001072
1073 # This value should not be a valid check ID.
Nadeem Vawdabc459bb2012-05-06 23:01:51 +02001074 self.assertFalse(lzma.is_check_supported(lzma.CHECK_UNKNOWN))
Nadeem Vawda3ff069e2011-11-30 00:25:06 +02001075
Nadeem Vawdaa425c3d2012-06-21 23:36:48 +02001076 def test__encode_filter_properties(self):
Nadeem Vawdaf55b3292012-05-06 23:01:27 +02001077 with self.assertRaises(TypeError):
Nadeem Vawdaa425c3d2012-06-21 23:36:48 +02001078 lzma._encode_filter_properties(b"not a dict")
Nadeem Vawdaf55b3292012-05-06 23:01:27 +02001079 with self.assertRaises(ValueError):
Nadeem Vawdaa425c3d2012-06-21 23:36:48 +02001080 lzma._encode_filter_properties({"id": 0x100})
Nadeem Vawdaf55b3292012-05-06 23:01:27 +02001081 with self.assertRaises(ValueError):
Nadeem Vawdaa425c3d2012-06-21 23:36:48 +02001082 lzma._encode_filter_properties({"id": lzma.FILTER_LZMA2, "junk": 12})
Nadeem Vawdaf55b3292012-05-06 23:01:27 +02001083 with self.assertRaises(lzma.LZMAError):
Nadeem Vawdaa425c3d2012-06-21 23:36:48 +02001084 lzma._encode_filter_properties({"id": lzma.FILTER_DELTA,
Nadeem Vawdaf55b3292012-05-06 23:01:27 +02001085 "dist": 9001})
1086
1087 # Test with parameters used by zipfile module.
Nadeem Vawdaa425c3d2012-06-21 23:36:48 +02001088 props = lzma._encode_filter_properties({
Nadeem Vawdaf55b3292012-05-06 23:01:27 +02001089 "id": lzma.FILTER_LZMA1,
1090 "pb": 2,
1091 "lp": 0,
1092 "lc": 3,
1093 "dict_size": 8 << 20,
1094 })
1095 self.assertEqual(props, b"]\x00\x00\x80\x00")
1096
Nadeem Vawdaa425c3d2012-06-21 23:36:48 +02001097 def test__decode_filter_properties(self):
Nadeem Vawdaf55b3292012-05-06 23:01:27 +02001098 with self.assertRaises(TypeError):
Nadeem Vawdaa425c3d2012-06-21 23:36:48 +02001099 lzma._decode_filter_properties(lzma.FILTER_X86, {"should be": bytes})
Nadeem Vawdaf55b3292012-05-06 23:01:27 +02001100 with self.assertRaises(lzma.LZMAError):
Nadeem Vawdaa425c3d2012-06-21 23:36:48 +02001101 lzma._decode_filter_properties(lzma.FILTER_DELTA, b"too long")
Nadeem Vawdaf55b3292012-05-06 23:01:27 +02001102
1103 # Test with parameters used by zipfile module.
Nadeem Vawdaa425c3d2012-06-21 23:36:48 +02001104 filterspec = lzma._decode_filter_properties(
Nadeem Vawdaf55b3292012-05-06 23:01:27 +02001105 lzma.FILTER_LZMA1, b"]\x00\x00\x80\x00")
1106 self.assertEqual(filterspec["id"], lzma.FILTER_LZMA1)
1107 self.assertEqual(filterspec["pb"], 2)
1108 self.assertEqual(filterspec["lp"], 0)
1109 self.assertEqual(filterspec["lc"], 3)
1110 self.assertEqual(filterspec["dict_size"], 8 << 20)
1111
1112 def test_filter_properties_roundtrip(self):
Nadeem Vawdaa425c3d2012-06-21 23:36:48 +02001113 spec1 = lzma._decode_filter_properties(
Nadeem Vawdaf55b3292012-05-06 23:01:27 +02001114 lzma.FILTER_LZMA1, b"]\x00\x00\x80\x00")
Nadeem Vawdaa425c3d2012-06-21 23:36:48 +02001115 reencoded = lzma._encode_filter_properties(spec1)
1116 spec2 = lzma._decode_filter_properties(lzma.FILTER_LZMA1, reencoded)
Nadeem Vawdaf55b3292012-05-06 23:01:27 +02001117 self.assertEqual(spec1, spec2)
1118
Nadeem Vawda3ff069e2011-11-30 00:25:06 +02001119
1120# Test data:
1121
1122INPUT = b"""
1123LAERTES
1124
1125 O, fear me not.
1126 I stay too long: but here my father comes.
1127
1128 Enter POLONIUS
1129
1130 A double blessing is a double grace,
1131 Occasion smiles upon a second leave.
1132
1133LORD POLONIUS
1134
1135 Yet here, Laertes! aboard, aboard, for shame!
1136 The wind sits in the shoulder of your sail,
1137 And you are stay'd for. There; my blessing with thee!
1138 And these few precepts in thy memory
1139 See thou character. Give thy thoughts no tongue,
1140 Nor any unproportioned thought his act.
1141 Be thou familiar, but by no means vulgar.
1142 Those friends thou hast, and their adoption tried,
1143 Grapple them to thy soul with hoops of steel;
1144 But do not dull thy palm with entertainment
1145 Of each new-hatch'd, unfledged comrade. Beware
1146 Of entrance to a quarrel, but being in,
1147 Bear't that the opposed may beware of thee.
1148 Give every man thy ear, but few thy voice;
1149 Take each man's censure, but reserve thy judgment.
1150 Costly thy habit as thy purse can buy,
1151 But not express'd in fancy; rich, not gaudy;
1152 For the apparel oft proclaims the man,
1153 And they in France of the best rank and station
1154 Are of a most select and generous chief in that.
1155 Neither a borrower nor a lender be;
1156 For loan oft loses both itself and friend,
1157 And borrowing dulls the edge of husbandry.
1158 This above all: to thine ownself be true,
1159 And it must follow, as the night the day,
1160 Thou canst not then be false to any man.
1161 Farewell: my blessing season this in thee!
1162
1163LAERTES
1164
1165 Most humbly do I take my leave, my lord.
1166
1167LORD POLONIUS
1168
1169 The time invites you; go; your servants tend.
1170
1171LAERTES
1172
1173 Farewell, Ophelia; and remember well
1174 What I have said to you.
1175
1176OPHELIA
1177
1178 'Tis in my memory lock'd,
1179 And you yourself shall keep the key of it.
1180
1181LAERTES
1182
1183 Farewell.
1184"""
1185
1186COMPRESSED_XZ = (
1187 b"\xfd7zXZ\x00\x00\x04\xe6\xd6\xb4F\x02\x00!\x01\x16\x00\x00\x00t/\xe5\xa3"
1188 b"\xe0\x07\x80\x03\xdf]\x00\x05\x14\x07bX\x19\xcd\xddn\x98\x15\xe4\xb4\x9d"
1189 b"o\x1d\xc4\xe5\n\x03\xcc2h\xc7\\\x86\xff\xf8\xe2\xfc\xe7\xd9\xfe6\xb8("
1190 b"\xa8wd\xc2\"u.n\x1e\xc3\xf2\x8e\x8d\x8f\x02\x17/\xa6=\xf0\xa2\xdf/M\x89"
1191 b"\xbe\xde\xa7\x1cz\x18-]\xd5\xef\x13\x8frZ\x15\x80\x8c\xf8\x8do\xfa\x12"
1192 b"\x9b#z/\xef\xf0\xfaF\x01\x82\xa3M\x8e\xa1t\xca6 BF$\xe5Q\xa4\x98\xee\xde"
1193 b"l\xe8\x7f\xf0\x9d,bn\x0b\x13\xd4\xa8\x81\xe4N\xc8\x86\x153\xf5x2\xa2O"
1194 b"\x13@Q\xa1\x00/\xa5\xd0O\x97\xdco\xae\xf7z\xc4\xcdS\xb6t<\x16\xf2\x9cI#"
1195 b"\x89ud\xc66Y\xd9\xee\xe6\xce\x12]\xe5\xf0\xaa\x96-Pe\xade:\x04\t\x1b\xf7"
1196 b"\xdb7\n\x86\x1fp\xc8J\xba\xf4\xf0V\xa9\xdc\xf0\x02%G\xf9\xdf=?\x15\x1b"
1197 b"\xe1(\xce\x82=\xd6I\xac3\x12\x0cR\xb7\xae\r\xb1i\x03\x95\x01\xbd\xbe\xfa"
1198 b"\x02s\x01P\x9d\x96X\xb12j\xc8L\xa8\x84b\xf6\xc3\xd4c-H\x93oJl\xd0iQ\xe4k"
1199 b"\x84\x0b\xc1\xb7\xbc\xb1\x17\x88\xb1\xca?@\xf6\x07\xea\xe6x\xf1H12P\x0f"
1200 b"\x8a\xc9\xeauw\xe3\xbe\xaai\xa9W\xd0\x80\xcd#cb5\x99\xd8]\xa9d\x0c\xbd"
1201 b"\xa2\xdcWl\xedUG\xbf\x89yF\xf77\x81v\xbd5\x98\xbeh8\x18W\x08\xf0\x1b\x99"
1202 b"5:\x1a?rD\x96\xa1\x04\x0f\xae\xba\x85\xeb\x9d5@\xf5\x83\xd37\x83\x8ac"
1203 b"\x06\xd4\x97i\xcdt\x16S\x82k\xf6K\x01vy\x88\x91\x9b6T\xdae\r\xfd]:k\xbal"
1204 b"\xa9\xbba\xc34\xf9r\xeb}r\xdb\xc7\xdb*\x8f\x03z\xdc8h\xcc\xc9\xd3\xbcl"
1205 b"\xa5-\xcb\xeaK\xa2\xc5\x15\xc0\xe3\xc1\x86Z\xfb\xebL\xe13\xcf\x9c\xe3"
1206 b"\x1d\xc9\xed\xc2\x06\xcc\xce!\x92\xe5\xfe\x9c^\xa59w \x9bP\xa3PK\x08d"
1207 b"\xf9\xe2Z}\xa7\xbf\xed\xeb%$\x0c\x82\xb8/\xb0\x01\xa9&,\xf7qh{Q\x96)\xf2"
1208 b"q\x96\xc3\x80\xb4\x12\xb0\xba\xe6o\xf4!\xb4[\xd4\x8aw\x10\xf7t\x0c\xb3"
1209 b"\xd9\xd5\xc3`^\x81\x11??\\\xa4\x99\x85R\xd4\x8e\x83\xc9\x1eX\xbfa\xf1"
1210 b"\xac\xb0\xea\xea\xd7\xd0\xab\x18\xe2\xf2\xed\xe1\xb7\xc9\x18\xcbS\xe4>"
1211 b"\xc9\x95H\xe8\xcb\t\r%\xeb\xc7$.o\xf1\xf3R\x17\x1db\xbb\xd8U\xa5^\xccS"
1212 b"\x16\x01\x87\xf3/\x93\xd1\xf0v\xc0r\xd7\xcc\xa2Gkz\xca\x80\x0e\xfd\xd0"
1213 b"\x8b\xbb\xd2Ix\xb3\x1ey\xca-0\xe3z^\xd6\xd6\x8f_\xf1\x9dP\x9fi\xa7\xd1"
1214 b"\xe8\x90\x84\xdc\xbf\xcdky\x8e\xdc\x81\x7f\xa3\xb2+\xbf\x04\xef\xd8\\"
1215 b"\xc4\xdf\xe1\xb0\x01\xe9\x93\xe3Y\xf1\x1dY\xe8h\x81\xcf\xf1w\xcc\xb4\xef"
1216 b" \x8b|\x04\xea\x83ej\xbe\x1f\xd4z\x9c`\xd3\x1a\x92A\x06\xe5\x8f\xa9\x13"
1217 b"\t\x9e=\xfa\x1c\xe5_\x9f%v\x1bo\x11ZO\xd8\xf4\t\xddM\x16-\x04\xfc\x18<\""
1218 b"CM\xddg~b\xf6\xef\x8e\x0c\xd0\xde|\xa0'\x8a\x0c\xd6x\xae!J\xa6F\x88\x15u"
1219 b"\x008\x17\xbc7y\xb3\xd8u\xac_\x85\x8d\xe7\xc1@\x9c\xecqc\xa3#\xad\xf1"
1220 b"\x935\xb5)_\r\xec3]\x0fo]5\xd0my\x07\x9b\xee\x81\xb5\x0f\xcfK+\x00\xc0"
1221 b"\xe4b\x10\xe4\x0c\x1a \x9b\xe0\x97t\xf6\xa1\x9e\x850\xba\x0c\x9a\x8d\xc8"
1222 b"\x8f\x07\xd7\xae\xc8\xf9+i\xdc\xb9k\xb0>f\x19\xb8\r\xa8\xf8\x1f$\xa5{p"
1223 b"\xc6\x880\xce\xdb\xcf\xca_\x86\xac\x88h6\x8bZ%'\xd0\n\xbf\x0f\x9c\"\xba"
1224 b"\xe5\x86\x9f\x0f7X=mNX[\xcc\x19FU\xc9\x860\xbc\x90a+* \xae_$\x03\x1e\xd3"
1225 b"\xcd_\xa0\x9c\xde\xaf46q\xa5\xc9\x92\xd7\xca\xe3`\x9d\x85}\xb4\xff\xb3"
1226 b"\x83\xfb\xb6\xca\xae`\x0bw\x7f\xfc\xd8\xacVe\x19\xc8\x17\x0bZ\xad\x88"
1227 b"\xeb#\x97\x03\x13\xb1d\x0f{\x0c\x04w\x07\r\x97\xbd\xd6\xc1\xc3B:\x95\x08"
1228 b"^\x10V\xaeaH\x02\xd9\xe3\n\\\x01X\xf6\x9c\x8a\x06u#%\xbe*\xa1\x18v\x85"
1229 b"\xec!\t4\x00\x00\x00\x00Vj?uLU\xf3\xa6\x00\x01\xfb\x07\x81\x0f\x00\x00tw"
1230 b"\x99P\xb1\xc4g\xfb\x02\x00\x00\x00\x00\x04YZ"
1231)
1232
1233COMPRESSED_ALONE = (
1234 b"]\x00\x00\x80\x00\xff\xff\xff\xff\xff\xff\xff\xff\x00\x05\x14\x07bX\x19"
1235 b"\xcd\xddn\x98\x15\xe4\xb4\x9do\x1d\xc4\xe5\n\x03\xcc2h\xc7\\\x86\xff\xf8"
1236 b"\xe2\xfc\xe7\xd9\xfe6\xb8(\xa8wd\xc2\"u.n\x1e\xc3\xf2\x8e\x8d\x8f\x02"
1237 b"\x17/\xa6=\xf0\xa2\xdf/M\x89\xbe\xde\xa7\x1cz\x18-]\xd5\xef\x13\x8frZ"
1238 b"\x15\x80\x8c\xf8\x8do\xfa\x12\x9b#z/\xef\xf0\xfaF\x01\x82\xa3M\x8e\xa1t"
1239 b"\xca6 BF$\xe5Q\xa4\x98\xee\xdel\xe8\x7f\xf0\x9d,bn\x0b\x13\xd4\xa8\x81"
1240 b"\xe4N\xc8\x86\x153\xf5x2\xa2O\x13@Q\xa1\x00/\xa5\xd0O\x97\xdco\xae\xf7z"
1241 b"\xc4\xcdS\xb6t<\x16\xf2\x9cI#\x89ud\xc66Y\xd9\xee\xe6\xce\x12]\xe5\xf0"
1242 b"\xaa\x96-Pe\xade:\x04\t\x1b\xf7\xdb7\n\x86\x1fp\xc8J\xba\xf4\xf0V\xa9"
1243 b"\xdc\xf0\x02%G\xf9\xdf=?\x15\x1b\xe1(\xce\x82=\xd6I\xac3\x12\x0cR\xb7"
1244 b"\xae\r\xb1i\x03\x95\x01\xbd\xbe\xfa\x02s\x01P\x9d\x96X\xb12j\xc8L\xa8"
1245 b"\x84b\xf8\x1epl\xeajr\xd1=\t\x03\xdd\x13\x1b3!E\xf9vV\xdaF\xf3\xd7\xb4"
1246 b"\x0c\xa9P~\xec\xdeE\xe37\xf6\x1d\xc6\xbb\xddc%\xb6\x0fI\x07\xf0;\xaf\xe7"
1247 b"\xa0\x8b\xa7Z\x99(\xe9\xe2\xf0o\x18>`\xe1\xaa\xa8\xd9\xa1\xb2}\xe7\x8d"
1248 b"\x834T\xb6\xef\xc1\xde\xe3\x98\xbcD\x03MA@\xd8\xed\xdc\xc8\x93\x03\x1a"
1249 b"\x93\x0b\x7f\x94\x12\x0b\x02Sa\x18\xc9\xc5\x9bTJE}\xf6\xc8g\x17#ZV\x01"
1250 b"\xc9\x9dc\x83\x0e>0\x16\x90S\xb8/\x03y_\x18\xfa(\xd7\x0br\xa2\xb0\xba?"
1251 b"\x8c\xe6\x83@\x84\xdf\x02:\xc5z\x9e\xa6\x84\xc9\xf5BeyX\x83\x1a\xf1 :\t"
1252 b"\xf7\x19\xfexD\\&G\xf3\x85Y\xa2J\xf9\x0bv{\x89\xf6\xe7)A\xaf\x04o\x00"
1253 b"\x075\xd3\xe0\x7f\x97\x98F\x0f?v\x93\xedVtTf\xb5\x97\x83\xed\x19\xd7\x1a"
1254 b"'k\xd7\xd9\xc5\\Y\xd1\xdc\x07\x15|w\xbc\xacd\x87\x08d\xec\xa7\xf6\x82"
1255 b"\xfc\xb3\x93\xeb\xb9 \x8d\xbc ,\xb3X\xb0\xd2s\xd7\xd1\xffv\x05\xdf}\xa2"
1256 b"\x96\xfb%\n\xdf\xa2\x7f\x08.\xa16\n\xe0\x19\x93\x7fh\n\x1c\x8c\x0f \x11"
1257 b"\xc6Bl\x95\x19U}\xe4s\xb5\x10H\xea\x86pB\xe88\x95\xbe\x8cZ\xdb\xe4\x94A"
1258 b"\x92\xb9;z\xaa\xa7{\x1c5!\xc0\xaf\xc1A\xf9\xda\xf0$\xb0\x02qg\xc8\xc7/|"
1259 b"\xafr\x99^\x91\x88\xbf\x03\xd9=\xd7n\xda6{>8\n\xc7:\xa9'\xba.\x0b\xe2"
1260 b"\xb5\x1d\x0e\n\x9a\x8e\x06\x8f:\xdd\x82'[\xc3\"wD$\xa7w\xecq\x8c,1\x93"
1261 b"\xd0,\xae2w\x93\x12$Jd\x19mg\x02\x93\x9cA\x95\x9d&\xca8i\x9c\xb0;\xe7NQ"
1262 b"\x1frh\x8beL;\xb0m\xee\x07Q\x9b\xc6\xd8\x03\xb5\xdeN\xd4\xfe\x98\xd0\xdc"
1263 b"\x1a[\x04\xde\x1a\xf6\x91j\xf8EOli\x8eB^\x1d\x82\x07\xb2\xb5R]\xb7\xd7"
1264 b"\xe9\xa6\xc3.\xfb\xf0-\xb4e\x9b\xde\x03\x88\xc6\xc1iN\x0e\x84wbQ\xdf~"
1265 b"\xe9\xa4\x884\x96kM\xbc)T\xf3\x89\x97\x0f\x143\xe7)\xa0\xb3B\x00\xa8\xaf"
1266 b"\x82^\xcb\xc7..\xdb\xc7\t\x9dH\xee5\xe9#\xe6NV\x94\xcb$Kk\xe3\x7f\r\xe3t"
1267 b"\x12\xcf'\xefR\x8b\xf42\xcf-LH\xac\xe5\x1f0~?SO\xeb\xc1E\x1a\x1c]\xf2"
1268 b"\xc4<\x11\x02\x10Z0a*?\xe4r\xff\xfb\xff\xf6\x14nG\xead^\xd6\xef8\xb6uEI"
1269 b"\x99\nV\xe2\xb3\x95\x8e\x83\xf6i!\xb5&1F\xb1DP\xf4 SO3D!w\x99_G\x7f+\x90"
1270 b".\xab\xbb]\x91>\xc9#h;\x0f5J\x91K\xf4^-[\x9e\x8a\\\x94\xca\xaf\xf6\x19"
1271 b"\xd4\xa1\x9b\xc4\xb8p\xa1\xae\x15\xe9r\x84\xe0\xcar.l []\x8b\xaf+0\xf2g"
1272 b"\x01aKY\xdfI\xcf,\n\xe8\xf0\xe7V\x80_#\xb2\xf2\xa9\x06\x8c>w\xe2W,\xf4"
1273 b"\x8c\r\xf963\xf5J\xcc2\x05=kT\xeaUti\xe5_\xce\x1b\xfa\x8dl\x02h\xef\xa8"
1274 b"\xfbf\x7f\xff\xf0\x19\xeax"
1275)
1276
1277FILTERS_RAW_1 = [{"id": lzma.FILTER_LZMA2, "preset": 3}]
1278COMPRESSED_RAW_1 = (
1279 b"\xe0\x07\x80\x03\xfd]\x00\x05\x14\x07bX\x19\xcd\xddn\x96cyq\xa1\xdd\xee"
1280 b"\xf8\xfam\xe3'\x88\xd3\xff\xe4\x9e \xceQ\x91\xa4\x14I\xf6\xb9\x9dVL8\x15"
1281 b"_\x0e\x12\xc3\xeb\xbc\xa5\xcd\nW\x1d$=R;\x1d\xf8k8\t\xb1{\xd4\xc5+\x9d"
1282 b"\x87c\xe5\xef\x98\xb4\xd7S3\xcd\xcc\xd2\xed\xa4\x0em\xe5\xf4\xdd\xd0b"
1283 b"\xbe4*\xaa\x0b\xc5\x08\x10\x85+\x81.\x17\xaf9\xc9b\xeaZrA\xe20\x7fs\"r"
1284 b"\xdaG\x81\xde\x90cu\xa5\xdb\xa9.A\x08l\xb0<\xf6\x03\xddOi\xd0\xc5\xb4"
1285 b"\xec\xecg4t6\"\xa6\xb8o\xb5?\x18^}\xb6}\x03[:\xeb\x03\xa9\n[\x89l\x19g"
1286 b"\x16\xc82\xed\x0b\xfb\x86n\xa2\x857@\x93\xcd6T\xc3u\xb0\t\xf9\x1b\x918"
1287 b"\xfc[\x1b\x1e4\xb3\x14\x06PCV\xa8\"\xf5\x81x~\xe9\xb5N\x9cK\x9f\xc6\xc3%"
1288 b"\xc8k:{6\xe7\xf7\xbd\x05\x02\xb4\xc4\xc3\xd3\xfd\xc3\xa8\\\xfc@\xb1F_"
1289 b"\xc8\x90\xd9sU\x98\xad8\x05\x07\xde7J\x8bM\xd0\xb3;X\xec\x87\xef\xae\xb3"
1290 b"eO,\xb1z,d\x11y\xeejlB\x02\x1d\xf28\x1f#\x896\xce\x0b\xf0\xf5\xa9PK\x0f"
1291 b"\xb3\x13P\xd8\x88\xd2\xa1\x08\x04C?\xdb\x94_\x9a\"\xe9\xe3e\x1d\xde\x9b"
1292 b"\xa1\xe8>H\x98\x10;\xc5\x03#\xb5\x9d4\x01\xe7\xc5\xba%v\xa49\x97A\xe0\""
1293 b"\x8c\xc22\xe3i\xc1\x9d\xab3\xdf\xbe\xfdDm7\x1b\x9d\xab\xb5\x15o:J\x92"
1294 b"\xdb\x816\x17\xc2O\x99\x1b\x0e\x8d\xf3\tQ\xed\x8e\x95S/\x16M\xb2S\x04"
1295 b"\x0f\xc3J\xc6\xc7\xe4\xcb\xc5\xf4\xe7d\x14\xe4=^B\xfb\xd3E\xd3\x1e\xcd"
1296 b"\x91\xa5\xd0G\x8f.\xf6\xf9\x0bb&\xd9\x9f\xc2\xfdj\xa2\x9e\xc4\\\x0e\x1dC"
1297 b"v\xe8\xd2\x8a?^H\xec\xae\xeb>\xfe\xb8\xab\xd4IqY\x8c\xd4K7\x11\xf4D\xd0W"
1298 b"\xa5\xbe\xeaO\xbf\xd0\x04\xfdl\x10\xae5\xd4U\x19\x06\xf9{\xaa\xe0\x81"
1299 b"\x0f\xcf\xa3k{\x95\xbd\x19\xa2\xf8\xe4\xa3\x08O*\xf1\xf1B-\xc7(\x0eR\xfd"
1300 b"@E\x9f\xd3\x1e:\xfdV\xb7\x04Y\x94\xeb]\x83\xc4\xa5\xd7\xc0gX\x98\xcf\x0f"
1301 b"\xcd3\x00]n\x17\xec\xbd\xa3Y\x86\xc5\xf3u\xf6*\xbdT\xedA$A\xd9A\xe7\x98"
1302 b"\xef\x14\x02\x9a\xfdiw\xec\xa0\x87\x11\xd9%\xc5\xeb\x8a=\xae\xc0\xc4\xc6"
1303 b"D\x80\x8f\xa8\xd1\xbbq\xb2\xc0\xa0\xf5Cqp\xeeL\xe3\xe5\xdc \x84\"\xe9"
1304 b"\x80t\x83\x05\xba\xf1\xc5~\x93\xc9\xf0\x01c\xceix\x9d\xed\xc5)l\x16)\xd1"
1305 b"\x03@l\x04\x7f\x87\xa5yn\x1b\x01D\xaa:\xd2\x96\xb4\xb3?\xb0\xf9\xce\x07"
1306 b"\xeb\x81\x00\xe4\xc3\xf5%_\xae\xd4\xf9\xeb\xe2\rh\xb2#\xd67Q\x16D\x82hn"
1307 b"\xd1\xa3_?q\xf0\xe2\xac\xf317\x9e\xd0_\x83|\xf1\xca\xb7\x95S\xabW\x12"
1308 b"\xff\xddt\xf69L\x01\xf2|\xdaW\xda\xees\x98L\x18\xb8_\xe8$\x82\xea\xd6"
1309 b"\xd1F\xd4\x0b\xcdk\x01vf\x88h\xc3\xae\xb91\xc7Q\x9f\xa5G\xd9\xcc\x1f\xe3"
1310 b"5\xb1\xdcy\x7fI\x8bcw\x8e\x10rIp\x02:\x19p_\xc8v\xcea\"\xc1\xd9\x91\x03"
1311 b"\xbfe\xbe\xa6\xb3\xa8\x14\x18\xc3\xabH*m}\xc2\xc1\x9a}>l%\xce\x84\x99"
1312 b"\xb3d\xaf\xd3\x82\x15\xdf\xc1\xfc5fOg\x9b\xfc\x8e^&\t@\xce\x9f\x06J\xb8"
1313 b"\xb5\x86\x1d\xda{\x9f\xae\xb0\xff\x02\x81r\x92z\x8cM\xb7ho\xc9^\x9c\xb6"
1314 b"\x9c\xae\xd1\xc9\xf4\xdfU7\xd6\\!\xea\x0b\x94k\xb9Ud~\x98\xe7\x86\x8az"
1315 b"\x10;\xe3\x1d\xe5PG\xf8\xa4\x12\x05w\x98^\xc4\xb1\xbb\xfb\xcf\xe0\x7f"
1316 b"\x033Sf\x0c \xb1\xf6@\x94\xe5\xa3\xb2\xa7\x10\x9a\xc0\x14\xc3s\xb5xRD"
1317 b"\xf4`W\xd9\xe5\xd3\xcf\x91\rTZ-X\xbe\xbf\xb5\xe2\xee|\x1a\xbf\xfb\x08"
1318 b"\x91\xe1\xfc\x9a\x18\xa3\x8b\xd6^\x89\xf5[\xef\x87\xd1\x06\x1c7\xd6\xa2"
1319 b"\t\tQ5/@S\xc05\xd2VhAK\x03VC\r\x9b\x93\xd6M\xf1xO\xaaO\xed\xb9<\x0c\xdae"
1320 b"*\xd0\x07Hk6\x9fG+\xa1)\xcd\x9cl\x87\xdb\xe1\xe7\xefK}\x875\xab\xa0\x19u"
1321 b"\xf6*F\xb32\x00\x00\x00"
1322)
1323
1324FILTERS_RAW_2 = [{"id": lzma.FILTER_DELTA, "dist": 2},
1325 {"id": lzma.FILTER_LZMA2,
1326 "preset": lzma.PRESET_DEFAULT | lzma.PRESET_EXTREME}]
1327COMPRESSED_RAW_2 = (
1328 b"\xe0\x07\x80\x05\x91]\x00\x05\x14\x06-\xd4\xa8d?\xef\xbe\xafH\xee\x042"
1329 b"\xcb.\xb5g\x8f\xfb\x14\xab\xa5\x9f\x025z\xa4\xdd\xd8\t[}W\xf8\x0c\x1dmH"
1330 b"\xfa\x05\xfcg\xba\xe5\x01Q\x0b\x83R\xb6A\x885\xc0\xba\xee\n\x1cv~\xde:o"
1331 b"\x06:J\xa7\x11Cc\xea\xf7\xe5*o\xf7\x83\\l\xbdE\x19\x1f\r\xa8\x10\xb42"
1332 b"\x0caU{\xd7\xb8w\xdc\xbe\x1b\xfc8\xb4\xcc\xd38\\\xf6\x13\xf6\xe7\x98\xfa"
1333 b"\xc7[\x17_9\x86%\xa8\xf8\xaa\xb8\x8dfs#\x1e=\xed<\x92\x10\\t\xff\x86\xfb"
1334 b"=\x9e7\x18\x1dft\\\xb5\x01\x95Q\xc5\x19\xb38\xe0\xd4\xaa\x07\xc3\x7f\xd8"
1335 b"\xa2\x00>-\xd3\x8e\xa1#\xfa\x83ArAm\xdbJ~\x93\xa3B\x82\xe0\xc7\xcc(\x08`"
1336 b"WK\xad\x1b\x94kaj\x04 \xde\xfc\xe1\xed\xb0\x82\x91\xefS\x84%\x86\xfbi"
1337 b"\x99X\xf1B\xe7\x90;E\xfde\x98\xda\xca\xd6T\xb4bg\xa4\n\x9aj\xd1\x83\x9e]"
1338 b"\"\x7fM\xb5\x0fr\xd2\\\xa5j~P\x10GH\xbfN*Z\x10.\x81\tpE\x8a\x08\xbe1\xbd"
1339 b"\xcd\xa9\xe1\x8d\x1f\x04\xf9\x0eH\xb9\xae\xd6\xc3\xc1\xa5\xa9\x95P\xdc~"
1340 b"\xff\x01\x930\xa9\x04\xf6\x03\xfe\xb5JK\xc3]\xdd9\xb1\xd3\xd7F\xf5\xd1"
1341 b"\x1e\xa0\x1c_\xed[\x0c\xae\xd4\x8b\x946\xeb\xbf\xbb\xe3$kS{\xb5\x80,f:Sj"
1342 b"\x0f\x08z\x1c\xf5\xe8\xe6\xae\x98\xb0Q~r\x0f\xb0\x05?\xb6\x90\x19\x02&"
1343 b"\xcb\x80\t\xc4\xea\x9c|x\xce\x10\x9c\xc5|\xcbdhh+\x0c'\xc5\x81\xc33\xb5"
1344 b"\x14q\xd6\xc5\xe3`Z#\xdc\x8a\xab\xdd\xea\x08\xc2I\xe7\x02l{\xec\x196\x06"
1345 b"\x91\x8d\xdc\xd5\xb3x\xe1hz%\xd1\xf8\xa5\xdd\x98!\x8c\x1c\xc1\x17RUa\xbb"
1346 b"\x95\x0f\xe4X\xea1\x0c\xf1=R\xbe\xc60\xe3\xa4\x9a\x90bd\x97$]B\x01\xdd"
1347 b"\x1f\xe3h2c\x1e\xa0L`4\xc6x\xa3Z\x8a\r\x14]T^\xd8\x89\x1b\x92\r;\xedY"
1348 b"\x0c\xef\x8d9z\xf3o\xb6)f\xa9]$n\rp\x93\xd0\x10\xa4\x08\xb8\xb2\x8b\xb6"
1349 b"\x8f\x80\xae;\xdcQ\xf1\xfa\x9a\x06\x8e\xa5\x0e\x8cK\x9c @\xaa:UcX\n!\xc6"
1350 b"\x02\x12\xcb\x1b\"=\x16.\x1f\x176\xf2g=\xe1Wn\xe9\xe1\xd4\xf1O\xad\x15"
1351 b"\x86\xe9\xa3T\xaf\xa9\xd7D\xb5\xd1W3pnt\x11\xc7VOj\xb7M\xc4i\xa1\xf1$3"
1352 b"\xbb\xdc\x8af\xb0\xc5Y\r\xd1\xfb\xf2\xe7K\xe6\xc5hwO\xfe\x8c2^&\x07\xd5"
1353 b"\x1fV\x19\xfd\r\x14\xd2i=yZ\xe6o\xaf\xc6\xb6\x92\x9d\xc4\r\xb3\xafw\xac%"
1354 b"\xcfc\x1a\xf1`]\xf2\x1a\x9e\x808\xedm\xedQ\xb2\xfe\xe4h`[q\xae\xe0\x0f"
1355 b"\xba0g\xb6\"N\xc3\xfb\xcfR\x11\xc5\x18)(\xc40\\\xa3\x02\xd9G!\xce\x1b"
1356 b"\xc1\x96x\xb5\xc8z\x1f\x01\xb4\xaf\xde\xc2\xcd\x07\xe7H\xb3y\xa8M\n\\A\t"
1357 b"ar\xddM\x8b\x9a\xea\x84\x9b!\xf1\x8d\xb1\xf1~\x1e\r\xa5H\xba\xf1\x84o"
1358 b"\xda\x87\x01h\xe9\xa2\xbe\xbeqN\x9d\x84\x0b!WG\xda\xa1\xa5A\xb7\xc7`j"
1359 b"\x15\xf2\xe9\xdd?\x015B\xd2~E\x06\x11\xe0\x91!\x05^\x80\xdd\xa8y\x15}"
1360 b"\xa1)\xb1)\x81\x18\xf4\xf4\xf8\xc0\xefD\xe3\xdb2f\x1e\x12\xabu\xc9\x97"
1361 b"\xcd\x1e\xa7\x0c\x02x4_6\x03\xc4$t\xf39\x94\x1d=\xcb\xbfv\\\xf5\xa3\x1d"
1362 b"\x9d8jk\x95\x13)ff\xf9n\xc4\xa9\xe3\x01\xb8\xda\xfb\xab\xdfM\x99\xfb\x05"
1363 b"\xe0\xe9\xb0I\xf4E\xab\xe2\x15\xa3\x035\xe7\xdeT\xee\x82p\xb4\x88\xd3"
1364 b"\x893\x9c/\xc0\xd6\x8fou;\xf6\x95PR\xa9\xb2\xc1\xefFj\xe2\xa7$\xf7h\xf1"
1365 b"\xdfK(\xc9c\xba7\xe8\xe3)\xdd\xb2,\x83\xfb\x84\x18.y\x18Qi\x88\xf8`h-"
1366 b"\xef\xd5\xed\x8c\t\xd8\xc3^\x0f\x00\xb7\xd0[!\xafM\x9b\xd7.\x07\xd8\xfb"
1367 b"\xd9\xe2-S+\xaa8,\xa0\x03\x1b \xea\xa8\x00\xc3\xab~\xd0$e\xa5\x7f\xf7"
1368 b"\x95P]\x12\x19i\xd9\x7fo\x0c\xd8g^\rE\xa5\x80\x18\xc5\x01\x80\xaek`\xff~"
1369 b"\xb6y\xe7+\xe5\x11^D\xa7\x85\x18\"!\xd6\xd2\xa7\xf4\x1eT\xdb\x02\xe15"
1370 b"\x02Y\xbc\x174Z\xe7\x9cH\x1c\xbf\x0f\xc6\xe9f]\xcf\x8cx\xbc\xe5\x15\x94"
1371 b"\xfc3\xbc\xa7TUH\xf1\x84\x1b\xf7\xa9y\xc07\x84\xf8X\xd8\xef\xfc \x1c\xd8"
1372 b"( /\xf2\xb7\xec\xc1\\\x8c\xf6\x95\xa1\x03J\x83vP8\xe1\xe3\xbb~\xc24kA"
1373 b"\x98y\xa1\xf2P\xe9\x9d\xc9J\xf8N\x99\xb4\xceaO\xde\x16\x1e\xc2\x19\xa7"
1374 b"\x03\xd2\xe0\x8f:\x15\xf3\x84\x9e\xee\xe6e\xb8\x02q\xc7AC\x1emw\xfd\t"
1375 b"\x9a\x1eu\xc1\xa9\xcaCwUP\x00\xa5\xf78L4w!\x91L2 \x87\xd0\xf2\x06\x81j"
1376 b"\x80;\x03V\x06\x87\x92\xcb\x90lv@E\x8d\x8d\xa5\xa6\xe7Z[\xdf\xd6E\x03`>"
1377 b"\x8f\xde\xa1bZ\x84\xd0\xa9`\x05\x0e{\x80;\xe3\xbef\x8d\x1d\xebk1.\xe3"
1378 b"\xe9N\x15\xf7\xd4(\xfa\xbb\x15\xbdu\xf7\x7f\x86\xae!\x03L\x1d\xb5\xc1"
1379 b"\xb9\x11\xdb\xd0\x93\xe4\x02\xe1\xd2\xcbBjc_\xe8}d\xdb\xc3\xa0Y\xbe\xc9/"
1380 b"\x95\x01\xa3,\xe6bl@\x01\xdbp\xc2\xce\x14\x168\xc2q\xe3uH\x89X\xa4\xa9"
1381 b"\x19\x1d\xc1}\x7fOX\x19\x9f\xdd\xbe\x85\x83\xff\x96\x1ee\x82O`CF=K\xeb$I"
1382 b"\x17_\xefX\x8bJ'v\xde\x1f+\xd9.v\xf8Tv\x17\xf2\x9f5\x19\xe1\xb9\x91\xa8S"
1383 b"\x86\xbd\x1a\"(\xa5x\x8dC\x03X\x81\x91\xa8\x11\xc4pS\x13\xbc\xf2'J\xae!"
1384 b"\xef\xef\x84G\t\x8d\xc4\x10\x132\x00oS\x9e\xe0\xe4d\x8f\xb8y\xac\xa6\x9f"
1385 b",\xb8f\x87\r\xdf\x9eE\x0f\xe1\xd0\\L\x00\xb2\xe1h\x84\xef}\x98\xa8\x11"
1386 b"\xccW#\\\x83\x7fo\xbbz\x8f\x00"
1387)
1388
1389FILTERS_RAW_3 = [{"id": lzma.FILTER_IA64, "start_offset": 0x100},
1390 {"id": lzma.FILTER_LZMA2}]
1391COMPRESSED_RAW_3 = (
1392 b"\xe0\x07\x80\x03\xdf]\x00\x05\x14\x07bX\x19\xcd\xddn\x98\x15\xe4\xb4\x9d"
1393 b"o\x1d\xc4\xe5\n\x03\xcc2h\xc7\\\x86\xff\xf8\xe2\xfc\xe7\xd9\xfe6\xb8("
1394 b"\xa8wd\xc2\"u.n\x1e\xc3\xf2\x8e\x8d\x8f\x02\x17/\xa6=\xf0\xa2\xdf/M\x89"
1395 b"\xbe\xde\xa7\x1cz\x18-]\xd5\xef\x13\x8frZ\x15\x80\x8c\xf8\x8do\xfa\x12"
1396 b"\x9b#z/\xef\xf0\xfaF\x01\x82\xa3M\x8e\xa1t\xca6 BF$\xe5Q\xa4\x98\xee\xde"
1397 b"l\xe8\x7f\xf0\x9d,bn\x0b\x13\xd4\xa8\x81\xe4N\xc8\x86\x153\xf5x2\xa2O"
1398 b"\x13@Q\xa1\x00/\xa5\xd0O\x97\xdco\xae\xf7z\xc4\xcdS\xb6t<\x16\xf2\x9cI#"
1399 b"\x89ud\xc66Y\xd9\xee\xe6\xce\x12]\xe5\xf0\xaa\x96-Pe\xade:\x04\t\x1b\xf7"
1400 b"\xdb7\n\x86\x1fp\xc8J\xba\xf4\xf0V\xa9\xdc\xf0\x02%G\xf9\xdf=?\x15\x1b"
1401 b"\xe1(\xce\x82=\xd6I\xac3\x12\x0cR\xb7\xae\r\xb1i\x03\x95\x01\xbd\xbe\xfa"
1402 b"\x02s\x01P\x9d\x96X\xb12j\xc8L\xa8\x84b\xf6\xc3\xd4c-H\x93oJl\xd0iQ\xe4k"
1403 b"\x84\x0b\xc1\xb7\xbc\xb1\x17\x88\xb1\xca?@\xf6\x07\xea\xe6x\xf1H12P\x0f"
1404 b"\x8a\xc9\xeauw\xe3\xbe\xaai\xa9W\xd0\x80\xcd#cb5\x99\xd8]\xa9d\x0c\xbd"
1405 b"\xa2\xdcWl\xedUG\xbf\x89yF\xf77\x81v\xbd5\x98\xbeh8\x18W\x08\xf0\x1b\x99"
1406 b"5:\x1a?rD\x96\xa1\x04\x0f\xae\xba\x85\xeb\x9d5@\xf5\x83\xd37\x83\x8ac"
1407 b"\x06\xd4\x97i\xcdt\x16S\x82k\xf6K\x01vy\x88\x91\x9b6T\xdae\r\xfd]:k\xbal"
1408 b"\xa9\xbba\xc34\xf9r\xeb}r\xdb\xc7\xdb*\x8f\x03z\xdc8h\xcc\xc9\xd3\xbcl"
1409 b"\xa5-\xcb\xeaK\xa2\xc5\x15\xc0\xe3\xc1\x86Z\xfb\xebL\xe13\xcf\x9c\xe3"
1410 b"\x1d\xc9\xed\xc2\x06\xcc\xce!\x92\xe5\xfe\x9c^\xa59w \x9bP\xa3PK\x08d"
1411 b"\xf9\xe2Z}\xa7\xbf\xed\xeb%$\x0c\x82\xb8/\xb0\x01\xa9&,\xf7qh{Q\x96)\xf2"
1412 b"q\x96\xc3\x80\xb4\x12\xb0\xba\xe6o\xf4!\xb4[\xd4\x8aw\x10\xf7t\x0c\xb3"
1413 b"\xd9\xd5\xc3`^\x81\x11??\\\xa4\x99\x85R\xd4\x8e\x83\xc9\x1eX\xbfa\xf1"
1414 b"\xac\xb0\xea\xea\xd7\xd0\xab\x18\xe2\xf2\xed\xe1\xb7\xc9\x18\xcbS\xe4>"
1415 b"\xc9\x95H\xe8\xcb\t\r%\xeb\xc7$.o\xf1\xf3R\x17\x1db\xbb\xd8U\xa5^\xccS"
1416 b"\x16\x01\x87\xf3/\x93\xd1\xf0v\xc0r\xd7\xcc\xa2Gkz\xca\x80\x0e\xfd\xd0"
1417 b"\x8b\xbb\xd2Ix\xb3\x1ey\xca-0\xe3z^\xd6\xd6\x8f_\xf1\x9dP\x9fi\xa7\xd1"
1418 b"\xe8\x90\x84\xdc\xbf\xcdky\x8e\xdc\x81\x7f\xa3\xb2+\xbf\x04\xef\xd8\\"
1419 b"\xc4\xdf\xe1\xb0\x01\xe9\x93\xe3Y\xf1\x1dY\xe8h\x81\xcf\xf1w\xcc\xb4\xef"
1420 b" \x8b|\x04\xea\x83ej\xbe\x1f\xd4z\x9c`\xd3\x1a\x92A\x06\xe5\x8f\xa9\x13"
1421 b"\t\x9e=\xfa\x1c\xe5_\x9f%v\x1bo\x11ZO\xd8\xf4\t\xddM\x16-\x04\xfc\x18<\""
1422 b"CM\xddg~b\xf6\xef\x8e\x0c\xd0\xde|\xa0'\x8a\x0c\xd6x\xae!J\xa6F\x88\x15u"
1423 b"\x008\x17\xbc7y\xb3\xd8u\xac_\x85\x8d\xe7\xc1@\x9c\xecqc\xa3#\xad\xf1"
1424 b"\x935\xb5)_\r\xec3]\x0fo]5\xd0my\x07\x9b\xee\x81\xb5\x0f\xcfK+\x00\xc0"
1425 b"\xe4b\x10\xe4\x0c\x1a \x9b\xe0\x97t\xf6\xa1\x9e\x850\xba\x0c\x9a\x8d\xc8"
1426 b"\x8f\x07\xd7\xae\xc8\xf9+i\xdc\xb9k\xb0>f\x19\xb8\r\xa8\xf8\x1f$\xa5{p"
1427 b"\xc6\x880\xce\xdb\xcf\xca_\x86\xac\x88h6\x8bZ%'\xd0\n\xbf\x0f\x9c\"\xba"
1428 b"\xe5\x86\x9f\x0f7X=mNX[\xcc\x19FU\xc9\x860\xbc\x90a+* \xae_$\x03\x1e\xd3"
1429 b"\xcd_\xa0\x9c\xde\xaf46q\xa5\xc9\x92\xd7\xca\xe3`\x9d\x85}\xb4\xff\xb3"
1430 b"\x83\xfb\xb6\xca\xae`\x0bw\x7f\xfc\xd8\xacVe\x19\xc8\x17\x0bZ\xad\x88"
1431 b"\xeb#\x97\x03\x13\xb1d\x0f{\x0c\x04w\x07\r\x97\xbd\xd6\xc1\xc3B:\x95\x08"
1432 b"^\x10V\xaeaH\x02\xd9\xe3\n\\\x01X\xf6\x9c\x8a\x06u#%\xbe*\xa1\x18v\x85"
1433 b"\xec!\t4\x00\x00\x00"
1434)
1435
1436FILTERS_RAW_4 = [{"id": lzma.FILTER_DELTA, "dist": 4},
1437 {"id": lzma.FILTER_X86, "start_offset": 0x40},
1438 {"id": lzma.FILTER_LZMA2, "preset": 4, "lc": 2}]
1439COMPRESSED_RAW_4 = (
1440 b"\xe0\x07\x80\x06\x0e\\\x00\x05\x14\x07bW\xaah\xdd\x10\xdc'\xd6\x90,\xc6v"
1441 b"Jq \x14l\xb7\x83xB\x0b\x97f=&fx\xba\n>Tn\xbf\x8f\xfb\x1dF\xca\xc3v_\xca?"
1442 b"\xfbV<\x92#\xd4w\xa6\x8a\xeb\xf6\x03\xc0\x01\x94\xd8\x9e\x13\x12\x98\xd1"
1443 b"*\xfa]c\xe8\x1e~\xaf\xb5]Eg\xfb\x9e\x01\"8\xb2\x90\x06=~\xe9\x91W\xcd"
1444 b"\xecD\x12\xc7\xfa\xe1\x91\x06\xc7\x99\xb9\xe3\x901\x87\x19u\x0f\x869\xff"
1445 b"\xc1\xb0hw|\xb0\xdcl\xcck\xb16o7\x85\xee{Y_b\xbf\xbc$\xf3=\x8d\x8bw\xe5Z"
1446 b"\x08@\xc4kmE\xad\xfb\xf6*\xd8\xad\xa1\xfb\xc5{\xdej,)\x1emB\x1f<\xaeca"
1447 b"\x80(\xee\x07 \xdf\xe9\xf8\xeb\x0e-\x97\x86\x90c\xf9\xea'B\xf7`\xd7\xb0"
1448 b"\x92\xbd\xa0\x82]\xbd\x0e\x0eB\x19\xdc\x96\xc6\x19\xd86D\xf0\xd5\x831"
1449 b"\x03\xb7\x1c\xf7&5\x1a\x8f PZ&j\xf8\x98\x1bo\xcc\x86\x9bS\xd3\xa5\xcdu"
1450 b"\xf9$\xcc\x97o\xe5V~\xfb\x97\xb5\x0b\x17\x9c\xfdxW\x10\xfep4\x80\xdaHDY"
1451 b"\xfa)\xfet\xb5\"\xd4\xd3F\x81\xf4\x13\x1f\xec\xdf\xa5\x13\xfc\"\x91x\xb7"
1452 b"\x99\xce\xc8\x92\n\xeb[\x10l*Y\xd8\xb1@\x06\xc8o\x8d7r\xebu\xfd5\x0e\x7f"
1453 b"\xf1$U{\t}\x1fQ\xcfxN\x9d\x9fXX\xe9`\x83\xc1\x06\xf4\x87v-f\x11\xdb/\\"
1454 b"\x06\xff\xd7)B\xf3g\x06\x88#2\x1eB244\x7f4q\t\xc893?mPX\x95\xa6a\xfb)d"
1455 b"\x9b\xfc\x98\x9aj\x04\xae\x9b\x9d\x19w\xba\xf92\xfaA\x11\\\x17\x97C3\xa4"
1456 b"\xbc!\x88\xcdo[\xec:\x030\x91.\x85\xe0@\\4\x16\x12\x9d\xcaJv\x97\xb04"
1457 b"\xack\xcbkf\xa3ss\xfc\x16^\x8ce\x85a\xa5=&\xecr\xb3p\xd1E\xd5\x80y\xc7"
1458 b"\xda\xf6\xfek\xbcT\xbfH\xee\x15o\xc5\x8c\x830\xec\x1d\x01\xae\x0c-e\\"
1459 b"\x91\x90\x94\xb2\xf8\x88\x91\xe8\x0b\xae\xa7>\x98\xf6\x9ck\xd2\xc6\x08"
1460 b"\xe6\xab\t\x98\xf2!\xa0\x8c^\xacqA\x99<\x1cEG\x97\xc8\xf1\xb6\xb9\x82"
1461 b"\x8d\xf7\x08s\x98a\xff\xe3\xcc\x92\x0e\xd2\xb6U\xd7\xd9\x86\x7fa\xe5\x1c"
1462 b"\x8dTG@\t\x1e\x0e7*\xfc\xde\xbc]6N\xf7\xf1\x84\x9e\x9f\xcf\xe9\x1e\xb5'"
1463 b"\xf4<\xdf\x99sq\xd0\x9d\xbd\x99\x0b\xb4%p4\xbf{\xbb\x8a\xd2\x0b\xbc=M"
1464 b"\x94H:\xf5\xa8\xd6\xa4\xc90\xc2D\xb9\xd3\xa8\xb0S\x87 `\xa2\xeb\xf3W\xce"
1465 b" 7\xf9N#\r\xe6\xbe\t\x9d\xe7\x811\xf9\x10\xc1\xc2\x14\xf6\xfc\xcba\xb7"
1466 b"\xb1\x7f\x95l\xe4\tjA\xec:\x10\xe5\xfe\xc2\\=D\xe2\x0c\x0b3]\xf7\xc1\xf7"
1467 b"\xbceZ\xb1A\xea\x16\xe5\xfddgFQ\xed\xaf\x04\xa3\xd3\xf8\xa2q\x19B\xd4r"
1468 b"\xc5\x0c\x9a\x14\x94\xea\x91\xc4o\xe4\xbb\xb4\x99\xf4@\xd1\xe6\x0c\xe3"
1469 b"\xc6d\xa0Q\n\xf2/\xd8\xb8S5\x8a\x18:\xb5g\xac\x95D\xce\x17\x07\xd4z\xda"
1470 b"\x90\xe65\x07\x19H!\t\xfdu\x16\x8e\x0eR\x19\xf4\x8cl\x0c\xf9Q\xf1\x80"
1471 b"\xe3\xbf\xd7O\xf8\x8c\x18\x0b\x9c\xf1\x1fb\xe1\tR\xb2\xf1\xe1A\xea \xcf-"
1472 b"IGE\xf1\x14\x98$\x83\x15\xc9\xd8j\xbf\x19\x0f\xd5\xd1\xaa\xb3\xf3\xa5I2s"
1473 b"\x8d\x145\xca\xd5\xd93\x9c\xb8D0\xe6\xaa%\xd0\xc0P}JO^h\x8e\x08\xadlV."
1474 b"\x18\x88\x13\x05o\xb0\x07\xeaw\xe0\xb6\xa4\xd5*\xe4r\xef\x07G+\xc1\xbei["
1475 b"w\xe8\xab@_\xef\x15y\xe5\x12\xc9W\x1b.\xad\x85-\xc2\xf7\xe3mU6g\x8eSA"
1476 b"\x01(\xd3\xdb\x16\x13=\xde\x92\xf9,D\xb8\x8a\xb2\xb4\xc9\xc3\xefnE\xe8\\"
1477 b"\xa6\xe2Y\xd2\xcf\xcb\x8c\xb6\xd5\xe9\x1d\x1e\x9a\x8b~\xe2\xa6\rE\x84uV"
1478 b"\xed\xc6\x99\xddm<\x10[\x0fu\x1f\xc1\x1d1\n\xcfw\xb2%!\xf0[\xce\x87\x83B"
1479 b"\x08\xaa,\x08%d\xcef\x94\"\xd9g.\xc83\xcbXY+4\xec\x85qA\n\x1d=9\xf0*\xb1"
1480 b"\x1f/\xf3s\xd61b\x7f@\xfb\x9d\xe3FQ\\\xbd\x82\x1e\x00\xf3\xce\xd3\xe1"
1481 b"\xca,E\xfd7[\xab\xb6\xb7\xac!mA}\xbd\x9d3R5\x9cF\xabH\xeb\x92)cc\x13\xd0"
1482 b"\xbd\xee\xe9n{\x1dIJB\xa5\xeb\x11\xe8`w&`\x8b}@Oxe\t\x8a\x07\x02\x95\xf2"
1483 b"\xed\xda|\xb1e\xbe\xaa\xbbg\x19@\xe1Y\x878\x84\x0f\x8c\xe3\xc98\xf2\x9e"
1484 b"\xd5N\xb5J\xef\xab!\xe2\x8dq\xe1\xe5q\xc5\xee\x11W\xb7\xe4k*\x027\xa0"
1485 b"\xa3J\xf4\xd8m\xd0q\x94\xcb\x07\n:\xb6`.\xe4\x9c\x15+\xc0)\xde\x80X\xd4"
1486 b"\xcfQm\x01\xc2cP\x1cA\x85'\xc9\xac\x8b\xe6\xb2)\xe6\x84t\x1c\x92\xe4Z"
1487 b"\x1cR\xb0\x9e\x96\xd1\xfb\x1c\xa6\x8b\xcb`\x10\x12]\xf2gR\x9bFT\xe0\xc8H"
1488 b"S\xfb\xac<\x04\xc7\xc1\xe8\xedP\xf4\x16\xdb\xc0\xd7e\xc2\x17J^\x1f\xab"
1489 b"\xff[\x08\x19\xb4\xf5\xfb\x19\xb4\x04\xe5c~']\xcb\xc2A\xec\x90\xd0\xed"
1490 b"\x06,\xc5K{\x86\x03\xb1\xcdMx\xdeQ\x8c3\xf9\x8a\xea=\x89\xaba\xd2\xc89a"
1491 b"\xd72\xf0\xc3\x19\x8a\xdfs\xd4\xfd\xbb\x81b\xeaE\"\xd8\xf4d\x0cD\xf7IJ!"
1492 b"\xe5d\xbbG\xe9\xcam\xaa\x0f_r\x95\x91NBq\xcaP\xce\xa7\xa9\xb5\x10\x94eP!"
1493 b"|\x856\xcd\xbfIir\xb8e\x9bjP\x97q\xabwS7\x1a\x0ehM\xe7\xca\x86?\xdeP}y~"
1494 b"\x0f\x95I\xfc\x13\xe1<Q\x1b\x868\x1d\x11\xdf\x94\xf4\x82>r\xa9k\x88\xcb"
1495 b"\xfd\xc3v\xe2\xb9\x8a\x02\x8eq\x92I\xf8\xf6\xf1\x03s\x9b\xb8\xe3\"\xe3"
1496 b"\xa9\xa5>D\xb8\x96;\xe7\x92\xd133\xe8\xdd'e\xc9.\xdc;\x17\x1f\xf5H\x13q"
1497 b"\xa4W\x0c\xdb~\x98\x01\xeb\xdf\xe32\x13\x0f\xddx\n6\xa0\t\x10\xb6\xbb"
1498 b"\xb0\xc3\x18\xb6;\x9fj[\xd9\xd5\xc9\x06\x8a\x87\xcd\xe5\xee\xfc\x9c-%@"
1499 b"\xee\xe0\xeb\xd2\xe3\xe8\xfb\xc0\x122\\\xc7\xaf\xc2\xa1Oth\xb3\x8f\x82"
1500 b"\xb3\x18\xa8\x07\xd5\xee_\xbe\xe0\x1cA\x1e_\r\x9a\xb0\x17W&\xa2D\x91\x94"
1501 b"\x1a\xb2\xef\xf2\xdc\x85;X\xb0,\xeb>-7S\xe5\xca\x07)\x1fp\x7f\xcaQBL\xca"
1502 b"\xf3\xb9d\xfc\xb5su\xb0\xc8\x95\x90\xeb*)\xa0v\xe4\x9a{FW\xf4l\xde\xcdj"
1503 b"\x00"
1504)
1505
1506
1507def test_main():
1508 run_unittest(
1509 CompressorDecompressorTestCase,
1510 CompressDecompressFunctionTestCase,
1511 FileTestCase,
Nadeem Vawdae8604042012-06-04 23:38:12 +02001512 OpenTestCase,
Nadeem Vawda3ff069e2011-11-30 00:25:06 +02001513 MiscellaneousTestCase,
1514 )
1515
1516if __name__ == "__main__":
1517 test_main()