blob: 8d3df92aa9a76e2f4b1f8f295b1adf7bdfe818db [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):
361 with LZMAFile(fileobj=BytesIO(COMPRESSED_XZ)) as f:
362 pass
363 with LZMAFile(fileobj=BytesIO(), mode="w") as f:
364 pass
365 with LZMAFile(fileobj=BytesIO(), mode="a") as f:
366 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
377 def test_init_bad_mode(self):
378 with self.assertRaises(ValueError):
379 LZMAFile(fileobj=BytesIO(COMPRESSED_XZ), mode=(3, "x"))
380 with self.assertRaises(ValueError):
381 LZMAFile(fileobj=BytesIO(COMPRESSED_XZ), mode="")
382 with self.assertRaises(ValueError):
383 LZMAFile(fileobj=BytesIO(COMPRESSED_XZ), mode="x")
384 with self.assertRaises(ValueError):
385 LZMAFile(fileobj=BytesIO(COMPRESSED_XZ), mode="rb")
386 with self.assertRaises(ValueError):
387 LZMAFile(fileobj=BytesIO(COMPRESSED_XZ), mode="r+")
388 with self.assertRaises(ValueError):
389 LZMAFile(fileobj=BytesIO(COMPRESSED_XZ), mode="wb")
390 with self.assertRaises(ValueError):
391 LZMAFile(fileobj=BytesIO(COMPRESSED_XZ), mode="w+")
392 with self.assertRaises(ValueError):
393 LZMAFile(fileobj=BytesIO(COMPRESSED_XZ), mode="rw")
394
395 def test_init_bad_check(self):
396 with self.assertRaises(TypeError):
397 LZMAFile(fileobj=BytesIO(), mode="w", check=b"asd")
398 # CHECK_UNKNOWN and anything above CHECK_ID_MAX should be invalid.
399 with self.assertRaises(LZMAError):
400 LZMAFile(fileobj=BytesIO(), mode="w", check=lzma.CHECK_UNKNOWN)
401 with self.assertRaises(LZMAError):
402 LZMAFile(fileobj=BytesIO(), mode="w", check=lzma.CHECK_ID_MAX + 3)
403 # Cannot specify a check with mode="r".
404 with self.assertRaises(ValueError):
405 LZMAFile(fileobj=BytesIO(COMPRESSED_XZ), check=lzma.CHECK_NONE)
406 with self.assertRaises(ValueError):
407 LZMAFile(fileobj=BytesIO(COMPRESSED_XZ), check=lzma.CHECK_CRC32)
408 with self.assertRaises(ValueError):
409 LZMAFile(fileobj=BytesIO(COMPRESSED_XZ), check=lzma.CHECK_CRC64)
410 with self.assertRaises(ValueError):
411 LZMAFile(fileobj=BytesIO(COMPRESSED_XZ), check=lzma.CHECK_SHA256)
412 with self.assertRaises(ValueError):
413 LZMAFile(fileobj=BytesIO(COMPRESSED_XZ), check=lzma.CHECK_UNKNOWN)
414
415 def test_init_bad_preset(self):
416 with self.assertRaises(TypeError):
417 LZMAFile(fileobj=BytesIO(), mode="w", preset=4.39)
418 with self.assertRaises(LZMAError):
419 LZMAFile(fileobj=BytesIO(), mode="w", preset=10)
420 with self.assertRaises(LZMAError):
421 LZMAFile(fileobj=BytesIO(), mode="w", preset=23)
422 with self.assertRaises(OverflowError):
423 LZMAFile(fileobj=BytesIO(), mode="w", preset=-1)
424 with self.assertRaises(OverflowError):
425 LZMAFile(fileobj=BytesIO(), mode="w", preset=-7)
426 with self.assertRaises(TypeError):
427 LZMAFile(fileobj=BytesIO(), mode="w", preset="foo")
428 # Cannot specify a preset with mode="r".
429 with self.assertRaises(ValueError):
430 LZMAFile(fileobj=BytesIO(COMPRESSED_XZ), preset=3)
431
432 def test_init_bad_filter_spec(self):
433 with self.assertRaises(TypeError):
434 LZMAFile(fileobj=BytesIO(), mode="w", filters=[b"wobsite"])
435 with self.assertRaises(ValueError):
436 LZMAFile(fileobj=BytesIO(), mode="w", filters=[{"xyzzy": 3}])
437 with self.assertRaises(ValueError):
438 LZMAFile(fileobj=BytesIO(), mode="w", filters=[{"id": 98765}])
439 with self.assertRaises(ValueError):
440 LZMAFile(fileobj=BytesIO(), mode="w",
441 filters=[{"id": lzma.FILTER_LZMA2, "foo": 0}])
442 with self.assertRaises(ValueError):
443 LZMAFile(fileobj=BytesIO(), mode="w",
444 filters=[{"id": lzma.FILTER_DELTA, "foo": 0}])
445 with self.assertRaises(ValueError):
446 LZMAFile(fileobj=BytesIO(), mode="w",
447 filters=[{"id": lzma.FILTER_X86, "foo": 0}])
448
449 def test_init_with_preset_and_filters(self):
450 with self.assertRaises(ValueError):
451 LZMAFile(fileobj=BytesIO(), mode="w", format=lzma.FORMAT_RAW,
452 preset=6, filters=FILTERS_RAW_1)
453
454 def test_init_with_filename_and_fileobj(self):
455 with self.assertRaises(ValueError):
456 LZMAFile("/dev/null", fileobj=BytesIO())
457
458 def test_close(self):
459 with BytesIO(COMPRESSED_XZ) as src:
460 f = LZMAFile(fileobj=src)
461 f.close()
462 # LZMAFile.close() should not close the underlying file object.
463 self.assertFalse(src.closed)
464 # Try closing an already-closed LZMAFile.
465 f.close()
466 self.assertFalse(src.closed)
467
468 # Test with a real file on disk, opened directly by LZMAFile.
469 with TempFile(TESTFN, COMPRESSED_XZ):
470 f = LZMAFile(TESTFN)
471 fp = f._fp
472 f.close()
473 # Here, LZMAFile.close() *should* close the underlying file object.
474 self.assertTrue(fp.closed)
475 # Try closing an already-closed LZMAFile.
476 f.close()
477
478 def test_closed(self):
479 f = LZMAFile(fileobj=BytesIO(COMPRESSED_XZ))
480 try:
481 self.assertFalse(f.closed)
482 f.read()
483 self.assertFalse(f.closed)
484 finally:
485 f.close()
486 self.assertTrue(f.closed)
487
488 f = LZMAFile(fileobj=BytesIO(), mode="w")
489 try:
490 self.assertFalse(f.closed)
491 finally:
492 f.close()
493 self.assertTrue(f.closed)
494
495 def test_fileno(self):
496 f = LZMAFile(fileobj=BytesIO(COMPRESSED_XZ))
497 try:
498 self.assertRaises(UnsupportedOperation, f.fileno)
499 finally:
500 f.close()
501 self.assertRaises(ValueError, f.fileno)
502 with TempFile(TESTFN, COMPRESSED_XZ):
503 f = LZMAFile(TESTFN)
504 try:
505 self.assertEqual(f.fileno(), f._fp.fileno())
506 self.assertIsInstance(f.fileno(), int)
507 finally:
508 f.close()
509 self.assertRaises(ValueError, f.fileno)
510
511 def test_seekable(self):
512 f = LZMAFile(fileobj=BytesIO(COMPRESSED_XZ))
513 try:
514 self.assertTrue(f.seekable())
515 f.read()
516 self.assertTrue(f.seekable())
517 finally:
518 f.close()
519 self.assertRaises(ValueError, f.seekable)
520
521 f = LZMAFile(fileobj=BytesIO(), mode="w")
522 try:
523 self.assertFalse(f.seekable())
524 finally:
525 f.close()
526 self.assertRaises(ValueError, f.seekable)
527
528 def test_readable(self):
529 f = LZMAFile(fileobj=BytesIO(COMPRESSED_XZ))
530 try:
531 self.assertTrue(f.readable())
532 f.read()
533 self.assertTrue(f.readable())
534 finally:
535 f.close()
536 self.assertRaises(ValueError, f.readable)
537
538 f = LZMAFile(fileobj=BytesIO(), mode="w")
539 try:
540 self.assertFalse(f.readable())
541 finally:
542 f.close()
543 self.assertRaises(ValueError, f.readable)
544
545 def test_writable(self):
546 f = LZMAFile(fileobj=BytesIO(COMPRESSED_XZ))
547 try:
548 self.assertFalse(f.writable())
549 f.read()
550 self.assertFalse(f.writable())
551 finally:
552 f.close()
553 self.assertRaises(ValueError, f.writable)
554
555 f = LZMAFile(fileobj=BytesIO(), mode="w")
556 try:
557 self.assertTrue(f.writable())
558 finally:
559 f.close()
560 self.assertRaises(ValueError, f.writable)
561
562 def test_read(self):
563 with LZMAFile(fileobj=BytesIO(COMPRESSED_XZ)) as f:
564 self.assertEqual(f.read(), INPUT)
565 self.assertEqual(f.read(), b"")
566 with LZMAFile(fileobj=BytesIO(COMPRESSED_ALONE)) as f:
567 self.assertEqual(f.read(), INPUT)
568 with LZMAFile(fileobj=BytesIO(COMPRESSED_XZ),
569 format=lzma.FORMAT_XZ) as f:
570 self.assertEqual(f.read(), INPUT)
571 self.assertEqual(f.read(), b"")
572 with LZMAFile(fileobj=BytesIO(COMPRESSED_ALONE),
573 format=lzma.FORMAT_ALONE) as f:
574 self.assertEqual(f.read(), INPUT)
575 self.assertEqual(f.read(), b"")
576 with LZMAFile(fileobj=BytesIO(COMPRESSED_RAW_1),
577 format=lzma.FORMAT_RAW, filters=FILTERS_RAW_1) as f:
578 self.assertEqual(f.read(), INPUT)
579 self.assertEqual(f.read(), b"")
580 with LZMAFile(fileobj=BytesIO(COMPRESSED_RAW_2),
581 format=lzma.FORMAT_RAW, filters=FILTERS_RAW_2) as f:
582 self.assertEqual(f.read(), INPUT)
583 self.assertEqual(f.read(), b"")
584 with LZMAFile(fileobj=BytesIO(COMPRESSED_RAW_3),
585 format=lzma.FORMAT_RAW, filters=FILTERS_RAW_3) as f:
586 self.assertEqual(f.read(), INPUT)
587 self.assertEqual(f.read(), b"")
588 with LZMAFile(fileobj=BytesIO(COMPRESSED_RAW_4),
589 format=lzma.FORMAT_RAW, filters=FILTERS_RAW_4) as f:
590 self.assertEqual(f.read(), INPUT)
591 self.assertEqual(f.read(), b"")
592
593 def test_read_0(self):
594 with LZMAFile(fileobj=BytesIO(COMPRESSED_XZ)) as f:
595 self.assertEqual(f.read(0), b"")
596 with LZMAFile(fileobj=BytesIO(COMPRESSED_ALONE)) as f:
597 self.assertEqual(f.read(0), b"")
598 with LZMAFile(fileobj=BytesIO(COMPRESSED_XZ),
599 format=lzma.FORMAT_XZ) as f:
600 self.assertEqual(f.read(0), b"")
601 with LZMAFile(fileobj=BytesIO(COMPRESSED_ALONE),
602 format=lzma.FORMAT_ALONE) as f:
603 self.assertEqual(f.read(0), b"")
604
605 def test_read_10(self):
606 with LZMAFile(fileobj=BytesIO(COMPRESSED_XZ)) as f:
607 chunks = []
608 while True:
609 result = f.read(10)
610 if not result:
611 break
612 self.assertLessEqual(len(result), 10)
613 chunks.append(result)
614 self.assertEqual(b"".join(chunks), INPUT)
615
616 def test_read_multistream(self):
617 with LZMAFile(fileobj=BytesIO(COMPRESSED_XZ * 5)) as f:
618 self.assertEqual(f.read(), INPUT * 5)
619 with LZMAFile(fileobj=BytesIO(COMPRESSED_XZ + COMPRESSED_ALONE)) as f:
620 self.assertEqual(f.read(), INPUT * 2)
621 with LZMAFile(fileobj=BytesIO(COMPRESSED_RAW_3 * 4),
622 format=lzma.FORMAT_RAW, filters=FILTERS_RAW_3) as f:
623 self.assertEqual(f.read(), INPUT * 4)
624
625 def test_read_multistream_buffer_size_aligned(self):
626 # Test the case where a stream boundary coincides with the end
627 # of the raw read buffer.
628 saved_buffer_size = lzma._BUFFER_SIZE
629 lzma._BUFFER_SIZE = len(COMPRESSED_XZ)
630 try:
631 with LZMAFile(fileobj=BytesIO(COMPRESSED_XZ * 5)) as f:
632 self.assertEqual(f.read(), INPUT * 5)
633 finally:
634 lzma._BUFFER_SIZE = saved_buffer_size
635
636 def test_read_from_file(self):
637 with TempFile(TESTFN, COMPRESSED_XZ):
638 with LZMAFile(TESTFN) as f:
639 self.assertEqual(f.read(), INPUT)
640 self.assertEqual(f.read(), b"")
641
642 def test_read_incomplete(self):
643 with LZMAFile(fileobj=BytesIO(COMPRESSED_XZ[:128])) as f:
644 self.assertRaises(EOFError, f.read)
645
646 def test_read_bad_args(self):
647 f = LZMAFile(fileobj=BytesIO(COMPRESSED_XZ))
648 f.close()
649 self.assertRaises(ValueError, f.read)
650 with LZMAFile(fileobj=BytesIO(), mode="w") as f:
651 self.assertRaises(ValueError, f.read)
652 with LZMAFile(fileobj=BytesIO(COMPRESSED_XZ)) as f:
653 self.assertRaises(TypeError, f.read, None)
654
655 def test_read1(self):
656 with LZMAFile(fileobj=BytesIO(COMPRESSED_XZ)) as f:
657 blocks = []
658 while True:
659 result = f.read1()
660 if not result:
661 break
662 blocks.append(result)
663 self.assertEqual(b"".join(blocks), INPUT)
664 self.assertEqual(f.read1(), b"")
665
666 def test_read1_0(self):
667 with LZMAFile(fileobj=BytesIO(COMPRESSED_XZ)) as f:
668 self.assertEqual(f.read1(0), b"")
669
670 def test_read1_10(self):
671 with LZMAFile(fileobj=BytesIO(COMPRESSED_XZ)) as f:
672 blocks = []
673 while True:
674 result = f.read1(10)
675 if not result:
676 break
677 blocks.append(result)
678 self.assertEqual(b"".join(blocks), INPUT)
679 self.assertEqual(f.read1(), b"")
680
681 def test_read1_multistream(self):
682 with LZMAFile(fileobj=BytesIO(COMPRESSED_XZ * 5)) as f:
683 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 * 5)
690 self.assertEqual(f.read1(), b"")
691
692 def test_read1_bad_args(self):
693 f = LZMAFile(fileobj=BytesIO(COMPRESSED_XZ))
694 f.close()
695 self.assertRaises(ValueError, f.read1)
696 with LZMAFile(fileobj=BytesIO(), mode="w") as f:
697 self.assertRaises(ValueError, f.read1)
698 with LZMAFile(fileobj=BytesIO(COMPRESSED_XZ)) as f:
699 self.assertRaises(TypeError, f.read1, None)
700
701 def test_peek(self):
702 with LZMAFile(fileobj=BytesIO(COMPRESSED_XZ)) as f:
703 result = f.peek()
704 self.assertGreater(len(result), 0)
705 self.assertTrue(INPUT.startswith(result))
706 self.assertEqual(f.read(), INPUT)
707 with LZMAFile(fileobj=BytesIO(COMPRESSED_XZ)) as f:
708 result = f.peek(10)
709 self.assertGreater(len(result), 0)
710 self.assertTrue(INPUT.startswith(result))
711 self.assertEqual(f.read(), INPUT)
712
713 def test_peek_bad_args(self):
714 with LZMAFile(fileobj=BytesIO(), mode="w") as f:
715 self.assertRaises(ValueError, f.peek)
716
717 def test_iterator(self):
718 with BytesIO(INPUT) as f:
719 lines = f.readlines()
720 with LZMAFile(fileobj=BytesIO(COMPRESSED_XZ)) as f:
721 self.assertListEqual(list(iter(f)), lines)
722 with LZMAFile(fileobj=BytesIO(COMPRESSED_ALONE)) as f:
723 self.assertListEqual(list(iter(f)), lines)
724 with LZMAFile(fileobj=BytesIO(COMPRESSED_XZ),
725 format=lzma.FORMAT_XZ) as f:
726 self.assertListEqual(list(iter(f)), lines)
727 with LZMAFile(fileobj=BytesIO(COMPRESSED_ALONE),
728 format=lzma.FORMAT_ALONE) as f:
729 self.assertListEqual(list(iter(f)), lines)
730 with LZMAFile(fileobj=BytesIO(COMPRESSED_RAW_2),
731 format=lzma.FORMAT_RAW, filters=FILTERS_RAW_2) as f:
732 self.assertListEqual(list(iter(f)), lines)
733
734 def test_readline(self):
735 with BytesIO(INPUT) as f:
736 lines = f.readlines()
737 with LZMAFile(fileobj=BytesIO(COMPRESSED_XZ)) as f:
738 for line in lines:
739 self.assertEqual(f.readline(), line)
740
741 def test_readlines(self):
742 with BytesIO(INPUT) as f:
743 lines = f.readlines()
744 with LZMAFile(fileobj=BytesIO(COMPRESSED_XZ)) as f:
745 self.assertListEqual(f.readlines(), lines)
746
747 def test_write(self):
748 with BytesIO() as dst:
749 with LZMAFile(fileobj=dst, mode="w") as f:
750 f.write(INPUT)
751 expected = lzma.compress(INPUT)
752 self.assertEqual(dst.getvalue(), expected)
753 with BytesIO() as dst:
754 with LZMAFile(fileobj=dst, mode="w", format=lzma.FORMAT_XZ) as f:
755 f.write(INPUT)
756 expected = lzma.compress(INPUT, format=lzma.FORMAT_XZ)
757 self.assertEqual(dst.getvalue(), expected)
758 with BytesIO() as dst:
759 with LZMAFile(fileobj=dst, mode="w", format=lzma.FORMAT_ALONE) as f:
760 f.write(INPUT)
761 expected = lzma.compress(INPUT, format=lzma.FORMAT_ALONE)
762 self.assertEqual(dst.getvalue(), expected)
763 with BytesIO() as dst:
764 with LZMAFile(fileobj=dst, mode="w", format=lzma.FORMAT_RAW,
765 filters=FILTERS_RAW_2) as f:
766 f.write(INPUT)
767 expected = lzma.compress(INPUT, format=lzma.FORMAT_RAW,
768 filters=FILTERS_RAW_2)
769 self.assertEqual(dst.getvalue(), expected)
770
771 def test_write_10(self):
772 with BytesIO() as dst:
773 with LZMAFile(fileobj=dst, mode="w") as f:
774 for start in range(0, len(INPUT), 10):
775 f.write(INPUT[start:start+10])
776 expected = lzma.compress(INPUT)
777 self.assertEqual(dst.getvalue(), expected)
778
779 def test_write_append(self):
780 part1 = INPUT[:1024]
781 part2 = INPUT[1024:1536]
782 part3 = INPUT[1536:]
783 expected = b"".join(lzma.compress(x) for x in (part1, part2, part3))
784 with BytesIO() as dst:
785 with LZMAFile(fileobj=dst, mode="w") as f:
786 f.write(part1)
787 with LZMAFile(fileobj=dst, mode="a") as f:
788 f.write(part2)
789 with LZMAFile(fileobj=dst, mode="a") as f:
790 f.write(part3)
791 self.assertEqual(dst.getvalue(), expected)
792
793 def test_write_to_file(self):
794 try:
795 with LZMAFile(TESTFN, "w") as f:
796 f.write(INPUT)
797 expected = lzma.compress(INPUT)
798 with open(TESTFN, "rb") as f:
799 self.assertEqual(f.read(), expected)
800 finally:
801 unlink(TESTFN)
802
803 def test_write_append_to_file(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 try:
809 with LZMAFile(TESTFN, "w") as f:
810 f.write(part1)
811 with LZMAFile(TESTFN, "a") as f:
812 f.write(part2)
813 with LZMAFile(TESTFN, "a") as f:
814 f.write(part3)
815 with open(TESTFN, "rb") as f:
816 self.assertEqual(f.read(), expected)
817 finally:
818 unlink(TESTFN)
819
820 def test_write_bad_args(self):
821 f = LZMAFile(fileobj=BytesIO(), mode="w")
822 f.close()
823 self.assertRaises(ValueError, f.write, b"foo")
824 with LZMAFile(fileobj=BytesIO(COMPRESSED_XZ), mode="r") as f:
825 self.assertRaises(ValueError, f.write, b"bar")
826 with LZMAFile(fileobj=BytesIO(), mode="w") as f:
827 self.assertRaises(TypeError, f.write, None)
828 self.assertRaises(TypeError, f.write, "text")
829 self.assertRaises(TypeError, f.write, 789)
830
831 def test_writelines(self):
832 with BytesIO(INPUT) as f:
833 lines = f.readlines()
834 with BytesIO() as dst:
835 with LZMAFile(fileobj=dst, mode="w") as f:
836 f.writelines(lines)
837 expected = lzma.compress(INPUT)
838 self.assertEqual(dst.getvalue(), expected)
839
840 def test_seek_forward(self):
841 with LZMAFile(fileobj=BytesIO(COMPRESSED_XZ)) as f:
842 f.seek(555)
843 self.assertEqual(f.read(), INPUT[555:])
844
845 def test_seek_forward_across_streams(self):
846 with LZMAFile(fileobj=BytesIO(COMPRESSED_XZ * 2)) as f:
847 f.seek(len(INPUT) + 123)
848 self.assertEqual(f.read(), INPUT[123:])
849
850 def test_seek_forward_relative_to_current(self):
851 with LZMAFile(fileobj=BytesIO(COMPRESSED_XZ)) as f:
852 f.read(100)
853 f.seek(1236, 1)
854 self.assertEqual(f.read(), INPUT[1336:])
855
856 def test_seek_forward_relative_to_end(self):
857 with LZMAFile(fileobj=BytesIO(COMPRESSED_XZ)) as f:
858 f.seek(-555, 2)
859 self.assertEqual(f.read(), INPUT[-555:])
860
861 def test_seek_backward(self):
862 with LZMAFile(fileobj=BytesIO(COMPRESSED_XZ)) as f:
863 f.read(1001)
864 f.seek(211)
865 self.assertEqual(f.read(), INPUT[211:])
866
867 def test_seek_backward_across_streams(self):
868 with LZMAFile(fileobj=BytesIO(COMPRESSED_XZ * 2)) as f:
869 f.read(len(INPUT) + 333)
870 f.seek(737)
871 self.assertEqual(f.read(), INPUT[737:] + INPUT)
872
873 def test_seek_backward_relative_to_end(self):
874 with LZMAFile(fileobj=BytesIO(COMPRESSED_XZ)) as f:
875 f.seek(-150, 2)
876 self.assertEqual(f.read(), INPUT[-150:])
877
878 def test_seek_past_end(self):
879 with LZMAFile(fileobj=BytesIO(COMPRESSED_XZ)) as f:
880 f.seek(len(INPUT) + 9001)
881 self.assertEqual(f.tell(), len(INPUT))
882 self.assertEqual(f.read(), b"")
883
884 def test_seek_past_start(self):
885 with LZMAFile(fileobj=BytesIO(COMPRESSED_XZ)) as f:
886 f.seek(-88)
887 self.assertEqual(f.tell(), 0)
888 self.assertEqual(f.read(), INPUT)
889
890 def test_seek_bad_args(self):
891 f = LZMAFile(fileobj=BytesIO(COMPRESSED_XZ))
892 f.close()
893 self.assertRaises(ValueError, f.seek, 0)
894 with LZMAFile(fileobj=BytesIO(), mode="w") as f:
895 self.assertRaises(ValueError, f.seek, 0)
896 with LZMAFile(fileobj=BytesIO(COMPRESSED_XZ)) as f:
897 self.assertRaises(ValueError, f.seek, 0, 3)
898 self.assertRaises(ValueError, f.seek, 9, ())
899 self.assertRaises(TypeError, f.seek, None)
900 self.assertRaises(TypeError, f.seek, b"derp")
901
902 def test_tell(self):
903 with LZMAFile(fileobj=BytesIO(COMPRESSED_XZ)) as f:
904 pos = 0
905 while True:
906 self.assertEqual(f.tell(), pos)
907 result = f.read(183)
908 if not result:
909 break
910 pos += len(result)
911 self.assertEqual(f.tell(), len(INPUT))
912 with LZMAFile(fileobj=BytesIO(), mode="w") as f:
913 for pos in range(0, len(INPUT), 144):
914 self.assertEqual(f.tell(), pos)
915 f.write(INPUT[pos:pos+144])
916 self.assertEqual(f.tell(), len(INPUT))
917
918 def test_tell_bad_args(self):
919 f = LZMAFile(fileobj=BytesIO(COMPRESSED_XZ))
920 f.close()
921 self.assertRaises(ValueError, f.tell)
922
923
924class MiscellaneousTestCase(unittest.TestCase):
925
926 def test_is_check_supported(self):
927 # CHECK_NONE and CHECK_CRC32 should always be supported,
928 # regardless of the options liblzma was compiled with.
929 self.assertTrue(lzma.check_is_supported(lzma.CHECK_NONE))
930 self.assertTrue(lzma.check_is_supported(lzma.CHECK_CRC32))
931
932 # The .xz format spec cannot store check IDs above this value.
933 self.assertFalse(lzma.check_is_supported(lzma.CHECK_ID_MAX + 1))
934
935 # This value should not be a valid check ID.
936 self.assertFalse(lzma.check_is_supported(lzma.CHECK_UNKNOWN))
937
938
939# Test data:
940
941INPUT = b"""
942LAERTES
943
944 O, fear me not.
945 I stay too long: but here my father comes.
946
947 Enter POLONIUS
948
949 A double blessing is a double grace,
950 Occasion smiles upon a second leave.
951
952LORD POLONIUS
953
954 Yet here, Laertes! aboard, aboard, for shame!
955 The wind sits in the shoulder of your sail,
956 And you are stay'd for. There; my blessing with thee!
957 And these few precepts in thy memory
958 See thou character. Give thy thoughts no tongue,
959 Nor any unproportioned thought his act.
960 Be thou familiar, but by no means vulgar.
961 Those friends thou hast, and their adoption tried,
962 Grapple them to thy soul with hoops of steel;
963 But do not dull thy palm with entertainment
964 Of each new-hatch'd, unfledged comrade. Beware
965 Of entrance to a quarrel, but being in,
966 Bear't that the opposed may beware of thee.
967 Give every man thy ear, but few thy voice;
968 Take each man's censure, but reserve thy judgment.
969 Costly thy habit as thy purse can buy,
970 But not express'd in fancy; rich, not gaudy;
971 For the apparel oft proclaims the man,
972 And they in France of the best rank and station
973 Are of a most select and generous chief in that.
974 Neither a borrower nor a lender be;
975 For loan oft loses both itself and friend,
976 And borrowing dulls the edge of husbandry.
977 This above all: to thine ownself be true,
978 And it must follow, as the night the day,
979 Thou canst not then be false to any man.
980 Farewell: my blessing season this in thee!
981
982LAERTES
983
984 Most humbly do I take my leave, my lord.
985
986LORD POLONIUS
987
988 The time invites you; go; your servants tend.
989
990LAERTES
991
992 Farewell, Ophelia; and remember well
993 What I have said to you.
994
995OPHELIA
996
997 'Tis in my memory lock'd,
998 And you yourself shall keep the key of it.
999
1000LAERTES
1001
1002 Farewell.
1003"""
1004
1005COMPRESSED_XZ = (
1006 b"\xfd7zXZ\x00\x00\x04\xe6\xd6\xb4F\x02\x00!\x01\x16\x00\x00\x00t/\xe5\xa3"
1007 b"\xe0\x07\x80\x03\xdf]\x00\x05\x14\x07bX\x19\xcd\xddn\x98\x15\xe4\xb4\x9d"
1008 b"o\x1d\xc4\xe5\n\x03\xcc2h\xc7\\\x86\xff\xf8\xe2\xfc\xe7\xd9\xfe6\xb8("
1009 b"\xa8wd\xc2\"u.n\x1e\xc3\xf2\x8e\x8d\x8f\x02\x17/\xa6=\xf0\xa2\xdf/M\x89"
1010 b"\xbe\xde\xa7\x1cz\x18-]\xd5\xef\x13\x8frZ\x15\x80\x8c\xf8\x8do\xfa\x12"
1011 b"\x9b#z/\xef\xf0\xfaF\x01\x82\xa3M\x8e\xa1t\xca6 BF$\xe5Q\xa4\x98\xee\xde"
1012 b"l\xe8\x7f\xf0\x9d,bn\x0b\x13\xd4\xa8\x81\xe4N\xc8\x86\x153\xf5x2\xa2O"
1013 b"\x13@Q\xa1\x00/\xa5\xd0O\x97\xdco\xae\xf7z\xc4\xcdS\xb6t<\x16\xf2\x9cI#"
1014 b"\x89ud\xc66Y\xd9\xee\xe6\xce\x12]\xe5\xf0\xaa\x96-Pe\xade:\x04\t\x1b\xf7"
1015 b"\xdb7\n\x86\x1fp\xc8J\xba\xf4\xf0V\xa9\xdc\xf0\x02%G\xf9\xdf=?\x15\x1b"
1016 b"\xe1(\xce\x82=\xd6I\xac3\x12\x0cR\xb7\xae\r\xb1i\x03\x95\x01\xbd\xbe\xfa"
1017 b"\x02s\x01P\x9d\x96X\xb12j\xc8L\xa8\x84b\xf6\xc3\xd4c-H\x93oJl\xd0iQ\xe4k"
1018 b"\x84\x0b\xc1\xb7\xbc\xb1\x17\x88\xb1\xca?@\xf6\x07\xea\xe6x\xf1H12P\x0f"
1019 b"\x8a\xc9\xeauw\xe3\xbe\xaai\xa9W\xd0\x80\xcd#cb5\x99\xd8]\xa9d\x0c\xbd"
1020 b"\xa2\xdcWl\xedUG\xbf\x89yF\xf77\x81v\xbd5\x98\xbeh8\x18W\x08\xf0\x1b\x99"
1021 b"5:\x1a?rD\x96\xa1\x04\x0f\xae\xba\x85\xeb\x9d5@\xf5\x83\xd37\x83\x8ac"
1022 b"\x06\xd4\x97i\xcdt\x16S\x82k\xf6K\x01vy\x88\x91\x9b6T\xdae\r\xfd]:k\xbal"
1023 b"\xa9\xbba\xc34\xf9r\xeb}r\xdb\xc7\xdb*\x8f\x03z\xdc8h\xcc\xc9\xd3\xbcl"
1024 b"\xa5-\xcb\xeaK\xa2\xc5\x15\xc0\xe3\xc1\x86Z\xfb\xebL\xe13\xcf\x9c\xe3"
1025 b"\x1d\xc9\xed\xc2\x06\xcc\xce!\x92\xe5\xfe\x9c^\xa59w \x9bP\xa3PK\x08d"
1026 b"\xf9\xe2Z}\xa7\xbf\xed\xeb%$\x0c\x82\xb8/\xb0\x01\xa9&,\xf7qh{Q\x96)\xf2"
1027 b"q\x96\xc3\x80\xb4\x12\xb0\xba\xe6o\xf4!\xb4[\xd4\x8aw\x10\xf7t\x0c\xb3"
1028 b"\xd9\xd5\xc3`^\x81\x11??\\\xa4\x99\x85R\xd4\x8e\x83\xc9\x1eX\xbfa\xf1"
1029 b"\xac\xb0\xea\xea\xd7\xd0\xab\x18\xe2\xf2\xed\xe1\xb7\xc9\x18\xcbS\xe4>"
1030 b"\xc9\x95H\xe8\xcb\t\r%\xeb\xc7$.o\xf1\xf3R\x17\x1db\xbb\xd8U\xa5^\xccS"
1031 b"\x16\x01\x87\xf3/\x93\xd1\xf0v\xc0r\xd7\xcc\xa2Gkz\xca\x80\x0e\xfd\xd0"
1032 b"\x8b\xbb\xd2Ix\xb3\x1ey\xca-0\xe3z^\xd6\xd6\x8f_\xf1\x9dP\x9fi\xa7\xd1"
1033 b"\xe8\x90\x84\xdc\xbf\xcdky\x8e\xdc\x81\x7f\xa3\xb2+\xbf\x04\xef\xd8\\"
1034 b"\xc4\xdf\xe1\xb0\x01\xe9\x93\xe3Y\xf1\x1dY\xe8h\x81\xcf\xf1w\xcc\xb4\xef"
1035 b" \x8b|\x04\xea\x83ej\xbe\x1f\xd4z\x9c`\xd3\x1a\x92A\x06\xe5\x8f\xa9\x13"
1036 b"\t\x9e=\xfa\x1c\xe5_\x9f%v\x1bo\x11ZO\xd8\xf4\t\xddM\x16-\x04\xfc\x18<\""
1037 b"CM\xddg~b\xf6\xef\x8e\x0c\xd0\xde|\xa0'\x8a\x0c\xd6x\xae!J\xa6F\x88\x15u"
1038 b"\x008\x17\xbc7y\xb3\xd8u\xac_\x85\x8d\xe7\xc1@\x9c\xecqc\xa3#\xad\xf1"
1039 b"\x935\xb5)_\r\xec3]\x0fo]5\xd0my\x07\x9b\xee\x81\xb5\x0f\xcfK+\x00\xc0"
1040 b"\xe4b\x10\xe4\x0c\x1a \x9b\xe0\x97t\xf6\xa1\x9e\x850\xba\x0c\x9a\x8d\xc8"
1041 b"\x8f\x07\xd7\xae\xc8\xf9+i\xdc\xb9k\xb0>f\x19\xb8\r\xa8\xf8\x1f$\xa5{p"
1042 b"\xc6\x880\xce\xdb\xcf\xca_\x86\xac\x88h6\x8bZ%'\xd0\n\xbf\x0f\x9c\"\xba"
1043 b"\xe5\x86\x9f\x0f7X=mNX[\xcc\x19FU\xc9\x860\xbc\x90a+* \xae_$\x03\x1e\xd3"
1044 b"\xcd_\xa0\x9c\xde\xaf46q\xa5\xc9\x92\xd7\xca\xe3`\x9d\x85}\xb4\xff\xb3"
1045 b"\x83\xfb\xb6\xca\xae`\x0bw\x7f\xfc\xd8\xacVe\x19\xc8\x17\x0bZ\xad\x88"
1046 b"\xeb#\x97\x03\x13\xb1d\x0f{\x0c\x04w\x07\r\x97\xbd\xd6\xc1\xc3B:\x95\x08"
1047 b"^\x10V\xaeaH\x02\xd9\xe3\n\\\x01X\xf6\x9c\x8a\x06u#%\xbe*\xa1\x18v\x85"
1048 b"\xec!\t4\x00\x00\x00\x00Vj?uLU\xf3\xa6\x00\x01\xfb\x07\x81\x0f\x00\x00tw"
1049 b"\x99P\xb1\xc4g\xfb\x02\x00\x00\x00\x00\x04YZ"
1050)
1051
1052COMPRESSED_ALONE = (
1053 b"]\x00\x00\x80\x00\xff\xff\xff\xff\xff\xff\xff\xff\x00\x05\x14\x07bX\x19"
1054 b"\xcd\xddn\x98\x15\xe4\xb4\x9do\x1d\xc4\xe5\n\x03\xcc2h\xc7\\\x86\xff\xf8"
1055 b"\xe2\xfc\xe7\xd9\xfe6\xb8(\xa8wd\xc2\"u.n\x1e\xc3\xf2\x8e\x8d\x8f\x02"
1056 b"\x17/\xa6=\xf0\xa2\xdf/M\x89\xbe\xde\xa7\x1cz\x18-]\xd5\xef\x13\x8frZ"
1057 b"\x15\x80\x8c\xf8\x8do\xfa\x12\x9b#z/\xef\xf0\xfaF\x01\x82\xa3M\x8e\xa1t"
1058 b"\xca6 BF$\xe5Q\xa4\x98\xee\xdel\xe8\x7f\xf0\x9d,bn\x0b\x13\xd4\xa8\x81"
1059 b"\xe4N\xc8\x86\x153\xf5x2\xa2O\x13@Q\xa1\x00/\xa5\xd0O\x97\xdco\xae\xf7z"
1060 b"\xc4\xcdS\xb6t<\x16\xf2\x9cI#\x89ud\xc66Y\xd9\xee\xe6\xce\x12]\xe5\xf0"
1061 b"\xaa\x96-Pe\xade:\x04\t\x1b\xf7\xdb7\n\x86\x1fp\xc8J\xba\xf4\xf0V\xa9"
1062 b"\xdc\xf0\x02%G\xf9\xdf=?\x15\x1b\xe1(\xce\x82=\xd6I\xac3\x12\x0cR\xb7"
1063 b"\xae\r\xb1i\x03\x95\x01\xbd\xbe\xfa\x02s\x01P\x9d\x96X\xb12j\xc8L\xa8"
1064 b"\x84b\xf8\x1epl\xeajr\xd1=\t\x03\xdd\x13\x1b3!E\xf9vV\xdaF\xf3\xd7\xb4"
1065 b"\x0c\xa9P~\xec\xdeE\xe37\xf6\x1d\xc6\xbb\xddc%\xb6\x0fI\x07\xf0;\xaf\xe7"
1066 b"\xa0\x8b\xa7Z\x99(\xe9\xe2\xf0o\x18>`\xe1\xaa\xa8\xd9\xa1\xb2}\xe7\x8d"
1067 b"\x834T\xb6\xef\xc1\xde\xe3\x98\xbcD\x03MA@\xd8\xed\xdc\xc8\x93\x03\x1a"
1068 b"\x93\x0b\x7f\x94\x12\x0b\x02Sa\x18\xc9\xc5\x9bTJE}\xf6\xc8g\x17#ZV\x01"
1069 b"\xc9\x9dc\x83\x0e>0\x16\x90S\xb8/\x03y_\x18\xfa(\xd7\x0br\xa2\xb0\xba?"
1070 b"\x8c\xe6\x83@\x84\xdf\x02:\xc5z\x9e\xa6\x84\xc9\xf5BeyX\x83\x1a\xf1 :\t"
1071 b"\xf7\x19\xfexD\\&G\xf3\x85Y\xa2J\xf9\x0bv{\x89\xf6\xe7)A\xaf\x04o\x00"
1072 b"\x075\xd3\xe0\x7f\x97\x98F\x0f?v\x93\xedVtTf\xb5\x97\x83\xed\x19\xd7\x1a"
1073 b"'k\xd7\xd9\xc5\\Y\xd1\xdc\x07\x15|w\xbc\xacd\x87\x08d\xec\xa7\xf6\x82"
1074 b"\xfc\xb3\x93\xeb\xb9 \x8d\xbc ,\xb3X\xb0\xd2s\xd7\xd1\xffv\x05\xdf}\xa2"
1075 b"\x96\xfb%\n\xdf\xa2\x7f\x08.\xa16\n\xe0\x19\x93\x7fh\n\x1c\x8c\x0f \x11"
1076 b"\xc6Bl\x95\x19U}\xe4s\xb5\x10H\xea\x86pB\xe88\x95\xbe\x8cZ\xdb\xe4\x94A"
1077 b"\x92\xb9;z\xaa\xa7{\x1c5!\xc0\xaf\xc1A\xf9\xda\xf0$\xb0\x02qg\xc8\xc7/|"
1078 b"\xafr\x99^\x91\x88\xbf\x03\xd9=\xd7n\xda6{>8\n\xc7:\xa9'\xba.\x0b\xe2"
1079 b"\xb5\x1d\x0e\n\x9a\x8e\x06\x8f:\xdd\x82'[\xc3\"wD$\xa7w\xecq\x8c,1\x93"
1080 b"\xd0,\xae2w\x93\x12$Jd\x19mg\x02\x93\x9cA\x95\x9d&\xca8i\x9c\xb0;\xe7NQ"
1081 b"\x1frh\x8beL;\xb0m\xee\x07Q\x9b\xc6\xd8\x03\xb5\xdeN\xd4\xfe\x98\xd0\xdc"
1082 b"\x1a[\x04\xde\x1a\xf6\x91j\xf8EOli\x8eB^\x1d\x82\x07\xb2\xb5R]\xb7\xd7"
1083 b"\xe9\xa6\xc3.\xfb\xf0-\xb4e\x9b\xde\x03\x88\xc6\xc1iN\x0e\x84wbQ\xdf~"
1084 b"\xe9\xa4\x884\x96kM\xbc)T\xf3\x89\x97\x0f\x143\xe7)\xa0\xb3B\x00\xa8\xaf"
1085 b"\x82^\xcb\xc7..\xdb\xc7\t\x9dH\xee5\xe9#\xe6NV\x94\xcb$Kk\xe3\x7f\r\xe3t"
1086 b"\x12\xcf'\xefR\x8b\xf42\xcf-LH\xac\xe5\x1f0~?SO\xeb\xc1E\x1a\x1c]\xf2"
1087 b"\xc4<\x11\x02\x10Z0a*?\xe4r\xff\xfb\xff\xf6\x14nG\xead^\xd6\xef8\xb6uEI"
1088 b"\x99\nV\xe2\xb3\x95\x8e\x83\xf6i!\xb5&1F\xb1DP\xf4 SO3D!w\x99_G\x7f+\x90"
1089 b".\xab\xbb]\x91>\xc9#h;\x0f5J\x91K\xf4^-[\x9e\x8a\\\x94\xca\xaf\xf6\x19"
1090 b"\xd4\xa1\x9b\xc4\xb8p\xa1\xae\x15\xe9r\x84\xe0\xcar.l []\x8b\xaf+0\xf2g"
1091 b"\x01aKY\xdfI\xcf,\n\xe8\xf0\xe7V\x80_#\xb2\xf2\xa9\x06\x8c>w\xe2W,\xf4"
1092 b"\x8c\r\xf963\xf5J\xcc2\x05=kT\xeaUti\xe5_\xce\x1b\xfa\x8dl\x02h\xef\xa8"
1093 b"\xfbf\x7f\xff\xf0\x19\xeax"
1094)
1095
1096FILTERS_RAW_1 = [{"id": lzma.FILTER_LZMA2, "preset": 3}]
1097COMPRESSED_RAW_1 = (
1098 b"\xe0\x07\x80\x03\xfd]\x00\x05\x14\x07bX\x19\xcd\xddn\x96cyq\xa1\xdd\xee"
1099 b"\xf8\xfam\xe3'\x88\xd3\xff\xe4\x9e \xceQ\x91\xa4\x14I\xf6\xb9\x9dVL8\x15"
1100 b"_\x0e\x12\xc3\xeb\xbc\xa5\xcd\nW\x1d$=R;\x1d\xf8k8\t\xb1{\xd4\xc5+\x9d"
1101 b"\x87c\xe5\xef\x98\xb4\xd7S3\xcd\xcc\xd2\xed\xa4\x0em\xe5\xf4\xdd\xd0b"
1102 b"\xbe4*\xaa\x0b\xc5\x08\x10\x85+\x81.\x17\xaf9\xc9b\xeaZrA\xe20\x7fs\"r"
1103 b"\xdaG\x81\xde\x90cu\xa5\xdb\xa9.A\x08l\xb0<\xf6\x03\xddOi\xd0\xc5\xb4"
1104 b"\xec\xecg4t6\"\xa6\xb8o\xb5?\x18^}\xb6}\x03[:\xeb\x03\xa9\n[\x89l\x19g"
1105 b"\x16\xc82\xed\x0b\xfb\x86n\xa2\x857@\x93\xcd6T\xc3u\xb0\t\xf9\x1b\x918"
1106 b"\xfc[\x1b\x1e4\xb3\x14\x06PCV\xa8\"\xf5\x81x~\xe9\xb5N\x9cK\x9f\xc6\xc3%"
1107 b"\xc8k:{6\xe7\xf7\xbd\x05\x02\xb4\xc4\xc3\xd3\xfd\xc3\xa8\\\xfc@\xb1F_"
1108 b"\xc8\x90\xd9sU\x98\xad8\x05\x07\xde7J\x8bM\xd0\xb3;X\xec\x87\xef\xae\xb3"
1109 b"eO,\xb1z,d\x11y\xeejlB\x02\x1d\xf28\x1f#\x896\xce\x0b\xf0\xf5\xa9PK\x0f"
1110 b"\xb3\x13P\xd8\x88\xd2\xa1\x08\x04C?\xdb\x94_\x9a\"\xe9\xe3e\x1d\xde\x9b"
1111 b"\xa1\xe8>H\x98\x10;\xc5\x03#\xb5\x9d4\x01\xe7\xc5\xba%v\xa49\x97A\xe0\""
1112 b"\x8c\xc22\xe3i\xc1\x9d\xab3\xdf\xbe\xfdDm7\x1b\x9d\xab\xb5\x15o:J\x92"
1113 b"\xdb\x816\x17\xc2O\x99\x1b\x0e\x8d\xf3\tQ\xed\x8e\x95S/\x16M\xb2S\x04"
1114 b"\x0f\xc3J\xc6\xc7\xe4\xcb\xc5\xf4\xe7d\x14\xe4=^B\xfb\xd3E\xd3\x1e\xcd"
1115 b"\x91\xa5\xd0G\x8f.\xf6\xf9\x0bb&\xd9\x9f\xc2\xfdj\xa2\x9e\xc4\\\x0e\x1dC"
1116 b"v\xe8\xd2\x8a?^H\xec\xae\xeb>\xfe\xb8\xab\xd4IqY\x8c\xd4K7\x11\xf4D\xd0W"
1117 b"\xa5\xbe\xeaO\xbf\xd0\x04\xfdl\x10\xae5\xd4U\x19\x06\xf9{\xaa\xe0\x81"
1118 b"\x0f\xcf\xa3k{\x95\xbd\x19\xa2\xf8\xe4\xa3\x08O*\xf1\xf1B-\xc7(\x0eR\xfd"
1119 b"@E\x9f\xd3\x1e:\xfdV\xb7\x04Y\x94\xeb]\x83\xc4\xa5\xd7\xc0gX\x98\xcf\x0f"
1120 b"\xcd3\x00]n\x17\xec\xbd\xa3Y\x86\xc5\xf3u\xf6*\xbdT\xedA$A\xd9A\xe7\x98"
1121 b"\xef\x14\x02\x9a\xfdiw\xec\xa0\x87\x11\xd9%\xc5\xeb\x8a=\xae\xc0\xc4\xc6"
1122 b"D\x80\x8f\xa8\xd1\xbbq\xb2\xc0\xa0\xf5Cqp\xeeL\xe3\xe5\xdc \x84\"\xe9"
1123 b"\x80t\x83\x05\xba\xf1\xc5~\x93\xc9\xf0\x01c\xceix\x9d\xed\xc5)l\x16)\xd1"
1124 b"\x03@l\x04\x7f\x87\xa5yn\x1b\x01D\xaa:\xd2\x96\xb4\xb3?\xb0\xf9\xce\x07"
1125 b"\xeb\x81\x00\xe4\xc3\xf5%_\xae\xd4\xf9\xeb\xe2\rh\xb2#\xd67Q\x16D\x82hn"
1126 b"\xd1\xa3_?q\xf0\xe2\xac\xf317\x9e\xd0_\x83|\xf1\xca\xb7\x95S\xabW\x12"
1127 b"\xff\xddt\xf69L\x01\xf2|\xdaW\xda\xees\x98L\x18\xb8_\xe8$\x82\xea\xd6"
1128 b"\xd1F\xd4\x0b\xcdk\x01vf\x88h\xc3\xae\xb91\xc7Q\x9f\xa5G\xd9\xcc\x1f\xe3"
1129 b"5\xb1\xdcy\x7fI\x8bcw\x8e\x10rIp\x02:\x19p_\xc8v\xcea\"\xc1\xd9\x91\x03"
1130 b"\xbfe\xbe\xa6\xb3\xa8\x14\x18\xc3\xabH*m}\xc2\xc1\x9a}>l%\xce\x84\x99"
1131 b"\xb3d\xaf\xd3\x82\x15\xdf\xc1\xfc5fOg\x9b\xfc\x8e^&\t@\xce\x9f\x06J\xb8"
1132 b"\xb5\x86\x1d\xda{\x9f\xae\xb0\xff\x02\x81r\x92z\x8cM\xb7ho\xc9^\x9c\xb6"
1133 b"\x9c\xae\xd1\xc9\xf4\xdfU7\xd6\\!\xea\x0b\x94k\xb9Ud~\x98\xe7\x86\x8az"
1134 b"\x10;\xe3\x1d\xe5PG\xf8\xa4\x12\x05w\x98^\xc4\xb1\xbb\xfb\xcf\xe0\x7f"
1135 b"\x033Sf\x0c \xb1\xf6@\x94\xe5\xa3\xb2\xa7\x10\x9a\xc0\x14\xc3s\xb5xRD"
1136 b"\xf4`W\xd9\xe5\xd3\xcf\x91\rTZ-X\xbe\xbf\xb5\xe2\xee|\x1a\xbf\xfb\x08"
1137 b"\x91\xe1\xfc\x9a\x18\xa3\x8b\xd6^\x89\xf5[\xef\x87\xd1\x06\x1c7\xd6\xa2"
1138 b"\t\tQ5/@S\xc05\xd2VhAK\x03VC\r\x9b\x93\xd6M\xf1xO\xaaO\xed\xb9<\x0c\xdae"
1139 b"*\xd0\x07Hk6\x9fG+\xa1)\xcd\x9cl\x87\xdb\xe1\xe7\xefK}\x875\xab\xa0\x19u"
1140 b"\xf6*F\xb32\x00\x00\x00"
1141)
1142
1143FILTERS_RAW_2 = [{"id": lzma.FILTER_DELTA, "dist": 2},
1144 {"id": lzma.FILTER_LZMA2,
1145 "preset": lzma.PRESET_DEFAULT | lzma.PRESET_EXTREME}]
1146COMPRESSED_RAW_2 = (
1147 b"\xe0\x07\x80\x05\x91]\x00\x05\x14\x06-\xd4\xa8d?\xef\xbe\xafH\xee\x042"
1148 b"\xcb.\xb5g\x8f\xfb\x14\xab\xa5\x9f\x025z\xa4\xdd\xd8\t[}W\xf8\x0c\x1dmH"
1149 b"\xfa\x05\xfcg\xba\xe5\x01Q\x0b\x83R\xb6A\x885\xc0\xba\xee\n\x1cv~\xde:o"
1150 b"\x06:J\xa7\x11Cc\xea\xf7\xe5*o\xf7\x83\\l\xbdE\x19\x1f\r\xa8\x10\xb42"
1151 b"\x0caU{\xd7\xb8w\xdc\xbe\x1b\xfc8\xb4\xcc\xd38\\\xf6\x13\xf6\xe7\x98\xfa"
1152 b"\xc7[\x17_9\x86%\xa8\xf8\xaa\xb8\x8dfs#\x1e=\xed<\x92\x10\\t\xff\x86\xfb"
1153 b"=\x9e7\x18\x1dft\\\xb5\x01\x95Q\xc5\x19\xb38\xe0\xd4\xaa\x07\xc3\x7f\xd8"
1154 b"\xa2\x00>-\xd3\x8e\xa1#\xfa\x83ArAm\xdbJ~\x93\xa3B\x82\xe0\xc7\xcc(\x08`"
1155 b"WK\xad\x1b\x94kaj\x04 \xde\xfc\xe1\xed\xb0\x82\x91\xefS\x84%\x86\xfbi"
1156 b"\x99X\xf1B\xe7\x90;E\xfde\x98\xda\xca\xd6T\xb4bg\xa4\n\x9aj\xd1\x83\x9e]"
1157 b"\"\x7fM\xb5\x0fr\xd2\\\xa5j~P\x10GH\xbfN*Z\x10.\x81\tpE\x8a\x08\xbe1\xbd"
1158 b"\xcd\xa9\xe1\x8d\x1f\x04\xf9\x0eH\xb9\xae\xd6\xc3\xc1\xa5\xa9\x95P\xdc~"
1159 b"\xff\x01\x930\xa9\x04\xf6\x03\xfe\xb5JK\xc3]\xdd9\xb1\xd3\xd7F\xf5\xd1"
1160 b"\x1e\xa0\x1c_\xed[\x0c\xae\xd4\x8b\x946\xeb\xbf\xbb\xe3$kS{\xb5\x80,f:Sj"
1161 b"\x0f\x08z\x1c\xf5\xe8\xe6\xae\x98\xb0Q~r\x0f\xb0\x05?\xb6\x90\x19\x02&"
1162 b"\xcb\x80\t\xc4\xea\x9c|x\xce\x10\x9c\xc5|\xcbdhh+\x0c'\xc5\x81\xc33\xb5"
1163 b"\x14q\xd6\xc5\xe3`Z#\xdc\x8a\xab\xdd\xea\x08\xc2I\xe7\x02l{\xec\x196\x06"
1164 b"\x91\x8d\xdc\xd5\xb3x\xe1hz%\xd1\xf8\xa5\xdd\x98!\x8c\x1c\xc1\x17RUa\xbb"
1165 b"\x95\x0f\xe4X\xea1\x0c\xf1=R\xbe\xc60\xe3\xa4\x9a\x90bd\x97$]B\x01\xdd"
1166 b"\x1f\xe3h2c\x1e\xa0L`4\xc6x\xa3Z\x8a\r\x14]T^\xd8\x89\x1b\x92\r;\xedY"
1167 b"\x0c\xef\x8d9z\xf3o\xb6)f\xa9]$n\rp\x93\xd0\x10\xa4\x08\xb8\xb2\x8b\xb6"
1168 b"\x8f\x80\xae;\xdcQ\xf1\xfa\x9a\x06\x8e\xa5\x0e\x8cK\x9c @\xaa:UcX\n!\xc6"
1169 b"\x02\x12\xcb\x1b\"=\x16.\x1f\x176\xf2g=\xe1Wn\xe9\xe1\xd4\xf1O\xad\x15"
1170 b"\x86\xe9\xa3T\xaf\xa9\xd7D\xb5\xd1W3pnt\x11\xc7VOj\xb7M\xc4i\xa1\xf1$3"
1171 b"\xbb\xdc\x8af\xb0\xc5Y\r\xd1\xfb\xf2\xe7K\xe6\xc5hwO\xfe\x8c2^&\x07\xd5"
1172 b"\x1fV\x19\xfd\r\x14\xd2i=yZ\xe6o\xaf\xc6\xb6\x92\x9d\xc4\r\xb3\xafw\xac%"
1173 b"\xcfc\x1a\xf1`]\xf2\x1a\x9e\x808\xedm\xedQ\xb2\xfe\xe4h`[q\xae\xe0\x0f"
1174 b"\xba0g\xb6\"N\xc3\xfb\xcfR\x11\xc5\x18)(\xc40\\\xa3\x02\xd9G!\xce\x1b"
1175 b"\xc1\x96x\xb5\xc8z\x1f\x01\xb4\xaf\xde\xc2\xcd\x07\xe7H\xb3y\xa8M\n\\A\t"
1176 b"ar\xddM\x8b\x9a\xea\x84\x9b!\xf1\x8d\xb1\xf1~\x1e\r\xa5H\xba\xf1\x84o"
1177 b"\xda\x87\x01h\xe9\xa2\xbe\xbeqN\x9d\x84\x0b!WG\xda\xa1\xa5A\xb7\xc7`j"
1178 b"\x15\xf2\xe9\xdd?\x015B\xd2~E\x06\x11\xe0\x91!\x05^\x80\xdd\xa8y\x15}"
1179 b"\xa1)\xb1)\x81\x18\xf4\xf4\xf8\xc0\xefD\xe3\xdb2f\x1e\x12\xabu\xc9\x97"
1180 b"\xcd\x1e\xa7\x0c\x02x4_6\x03\xc4$t\xf39\x94\x1d=\xcb\xbfv\\\xf5\xa3\x1d"
1181 b"\x9d8jk\x95\x13)ff\xf9n\xc4\xa9\xe3\x01\xb8\xda\xfb\xab\xdfM\x99\xfb\x05"
1182 b"\xe0\xe9\xb0I\xf4E\xab\xe2\x15\xa3\x035\xe7\xdeT\xee\x82p\xb4\x88\xd3"
1183 b"\x893\x9c/\xc0\xd6\x8fou;\xf6\x95PR\xa9\xb2\xc1\xefFj\xe2\xa7$\xf7h\xf1"
1184 b"\xdfK(\xc9c\xba7\xe8\xe3)\xdd\xb2,\x83\xfb\x84\x18.y\x18Qi\x88\xf8`h-"
1185 b"\xef\xd5\xed\x8c\t\xd8\xc3^\x0f\x00\xb7\xd0[!\xafM\x9b\xd7.\x07\xd8\xfb"
1186 b"\xd9\xe2-S+\xaa8,\xa0\x03\x1b \xea\xa8\x00\xc3\xab~\xd0$e\xa5\x7f\xf7"
1187 b"\x95P]\x12\x19i\xd9\x7fo\x0c\xd8g^\rE\xa5\x80\x18\xc5\x01\x80\xaek`\xff~"
1188 b"\xb6y\xe7+\xe5\x11^D\xa7\x85\x18\"!\xd6\xd2\xa7\xf4\x1eT\xdb\x02\xe15"
1189 b"\x02Y\xbc\x174Z\xe7\x9cH\x1c\xbf\x0f\xc6\xe9f]\xcf\x8cx\xbc\xe5\x15\x94"
1190 b"\xfc3\xbc\xa7TUH\xf1\x84\x1b\xf7\xa9y\xc07\x84\xf8X\xd8\xef\xfc \x1c\xd8"
1191 b"( /\xf2\xb7\xec\xc1\\\x8c\xf6\x95\xa1\x03J\x83vP8\xe1\xe3\xbb~\xc24kA"
1192 b"\x98y\xa1\xf2P\xe9\x9d\xc9J\xf8N\x99\xb4\xceaO\xde\x16\x1e\xc2\x19\xa7"
1193 b"\x03\xd2\xe0\x8f:\x15\xf3\x84\x9e\xee\xe6e\xb8\x02q\xc7AC\x1emw\xfd\t"
1194 b"\x9a\x1eu\xc1\xa9\xcaCwUP\x00\xa5\xf78L4w!\x91L2 \x87\xd0\xf2\x06\x81j"
1195 b"\x80;\x03V\x06\x87\x92\xcb\x90lv@E\x8d\x8d\xa5\xa6\xe7Z[\xdf\xd6E\x03`>"
1196 b"\x8f\xde\xa1bZ\x84\xd0\xa9`\x05\x0e{\x80;\xe3\xbef\x8d\x1d\xebk1.\xe3"
1197 b"\xe9N\x15\xf7\xd4(\xfa\xbb\x15\xbdu\xf7\x7f\x86\xae!\x03L\x1d\xb5\xc1"
1198 b"\xb9\x11\xdb\xd0\x93\xe4\x02\xe1\xd2\xcbBjc_\xe8}d\xdb\xc3\xa0Y\xbe\xc9/"
1199 b"\x95\x01\xa3,\xe6bl@\x01\xdbp\xc2\xce\x14\x168\xc2q\xe3uH\x89X\xa4\xa9"
1200 b"\x19\x1d\xc1}\x7fOX\x19\x9f\xdd\xbe\x85\x83\xff\x96\x1ee\x82O`CF=K\xeb$I"
1201 b"\x17_\xefX\x8bJ'v\xde\x1f+\xd9.v\xf8Tv\x17\xf2\x9f5\x19\xe1\xb9\x91\xa8S"
1202 b"\x86\xbd\x1a\"(\xa5x\x8dC\x03X\x81\x91\xa8\x11\xc4pS\x13\xbc\xf2'J\xae!"
1203 b"\xef\xef\x84G\t\x8d\xc4\x10\x132\x00oS\x9e\xe0\xe4d\x8f\xb8y\xac\xa6\x9f"
1204 b",\xb8f\x87\r\xdf\x9eE\x0f\xe1\xd0\\L\x00\xb2\xe1h\x84\xef}\x98\xa8\x11"
1205 b"\xccW#\\\x83\x7fo\xbbz\x8f\x00"
1206)
1207
1208FILTERS_RAW_3 = [{"id": lzma.FILTER_IA64, "start_offset": 0x100},
1209 {"id": lzma.FILTER_LZMA2}]
1210COMPRESSED_RAW_3 = (
1211 b"\xe0\x07\x80\x03\xdf]\x00\x05\x14\x07bX\x19\xcd\xddn\x98\x15\xe4\xb4\x9d"
1212 b"o\x1d\xc4\xe5\n\x03\xcc2h\xc7\\\x86\xff\xf8\xe2\xfc\xe7\xd9\xfe6\xb8("
1213 b"\xa8wd\xc2\"u.n\x1e\xc3\xf2\x8e\x8d\x8f\x02\x17/\xa6=\xf0\xa2\xdf/M\x89"
1214 b"\xbe\xde\xa7\x1cz\x18-]\xd5\xef\x13\x8frZ\x15\x80\x8c\xf8\x8do\xfa\x12"
1215 b"\x9b#z/\xef\xf0\xfaF\x01\x82\xa3M\x8e\xa1t\xca6 BF$\xe5Q\xa4\x98\xee\xde"
1216 b"l\xe8\x7f\xf0\x9d,bn\x0b\x13\xd4\xa8\x81\xe4N\xc8\x86\x153\xf5x2\xa2O"
1217 b"\x13@Q\xa1\x00/\xa5\xd0O\x97\xdco\xae\xf7z\xc4\xcdS\xb6t<\x16\xf2\x9cI#"
1218 b"\x89ud\xc66Y\xd9\xee\xe6\xce\x12]\xe5\xf0\xaa\x96-Pe\xade:\x04\t\x1b\xf7"
1219 b"\xdb7\n\x86\x1fp\xc8J\xba\xf4\xf0V\xa9\xdc\xf0\x02%G\xf9\xdf=?\x15\x1b"
1220 b"\xe1(\xce\x82=\xd6I\xac3\x12\x0cR\xb7\xae\r\xb1i\x03\x95\x01\xbd\xbe\xfa"
1221 b"\x02s\x01P\x9d\x96X\xb12j\xc8L\xa8\x84b\xf6\xc3\xd4c-H\x93oJl\xd0iQ\xe4k"
1222 b"\x84\x0b\xc1\xb7\xbc\xb1\x17\x88\xb1\xca?@\xf6\x07\xea\xe6x\xf1H12P\x0f"
1223 b"\x8a\xc9\xeauw\xe3\xbe\xaai\xa9W\xd0\x80\xcd#cb5\x99\xd8]\xa9d\x0c\xbd"
1224 b"\xa2\xdcWl\xedUG\xbf\x89yF\xf77\x81v\xbd5\x98\xbeh8\x18W\x08\xf0\x1b\x99"
1225 b"5:\x1a?rD\x96\xa1\x04\x0f\xae\xba\x85\xeb\x9d5@\xf5\x83\xd37\x83\x8ac"
1226 b"\x06\xd4\x97i\xcdt\x16S\x82k\xf6K\x01vy\x88\x91\x9b6T\xdae\r\xfd]:k\xbal"
1227 b"\xa9\xbba\xc34\xf9r\xeb}r\xdb\xc7\xdb*\x8f\x03z\xdc8h\xcc\xc9\xd3\xbcl"
1228 b"\xa5-\xcb\xeaK\xa2\xc5\x15\xc0\xe3\xc1\x86Z\xfb\xebL\xe13\xcf\x9c\xe3"
1229 b"\x1d\xc9\xed\xc2\x06\xcc\xce!\x92\xe5\xfe\x9c^\xa59w \x9bP\xa3PK\x08d"
1230 b"\xf9\xe2Z}\xa7\xbf\xed\xeb%$\x0c\x82\xb8/\xb0\x01\xa9&,\xf7qh{Q\x96)\xf2"
1231 b"q\x96\xc3\x80\xb4\x12\xb0\xba\xe6o\xf4!\xb4[\xd4\x8aw\x10\xf7t\x0c\xb3"
1232 b"\xd9\xd5\xc3`^\x81\x11??\\\xa4\x99\x85R\xd4\x8e\x83\xc9\x1eX\xbfa\xf1"
1233 b"\xac\xb0\xea\xea\xd7\xd0\xab\x18\xe2\xf2\xed\xe1\xb7\xc9\x18\xcbS\xe4>"
1234 b"\xc9\x95H\xe8\xcb\t\r%\xeb\xc7$.o\xf1\xf3R\x17\x1db\xbb\xd8U\xa5^\xccS"
1235 b"\x16\x01\x87\xf3/\x93\xd1\xf0v\xc0r\xd7\xcc\xa2Gkz\xca\x80\x0e\xfd\xd0"
1236 b"\x8b\xbb\xd2Ix\xb3\x1ey\xca-0\xe3z^\xd6\xd6\x8f_\xf1\x9dP\x9fi\xa7\xd1"
1237 b"\xe8\x90\x84\xdc\xbf\xcdky\x8e\xdc\x81\x7f\xa3\xb2+\xbf\x04\xef\xd8\\"
1238 b"\xc4\xdf\xe1\xb0\x01\xe9\x93\xe3Y\xf1\x1dY\xe8h\x81\xcf\xf1w\xcc\xb4\xef"
1239 b" \x8b|\x04\xea\x83ej\xbe\x1f\xd4z\x9c`\xd3\x1a\x92A\x06\xe5\x8f\xa9\x13"
1240 b"\t\x9e=\xfa\x1c\xe5_\x9f%v\x1bo\x11ZO\xd8\xf4\t\xddM\x16-\x04\xfc\x18<\""
1241 b"CM\xddg~b\xf6\xef\x8e\x0c\xd0\xde|\xa0'\x8a\x0c\xd6x\xae!J\xa6F\x88\x15u"
1242 b"\x008\x17\xbc7y\xb3\xd8u\xac_\x85\x8d\xe7\xc1@\x9c\xecqc\xa3#\xad\xf1"
1243 b"\x935\xb5)_\r\xec3]\x0fo]5\xd0my\x07\x9b\xee\x81\xb5\x0f\xcfK+\x00\xc0"
1244 b"\xe4b\x10\xe4\x0c\x1a \x9b\xe0\x97t\xf6\xa1\x9e\x850\xba\x0c\x9a\x8d\xc8"
1245 b"\x8f\x07\xd7\xae\xc8\xf9+i\xdc\xb9k\xb0>f\x19\xb8\r\xa8\xf8\x1f$\xa5{p"
1246 b"\xc6\x880\xce\xdb\xcf\xca_\x86\xac\x88h6\x8bZ%'\xd0\n\xbf\x0f\x9c\"\xba"
1247 b"\xe5\x86\x9f\x0f7X=mNX[\xcc\x19FU\xc9\x860\xbc\x90a+* \xae_$\x03\x1e\xd3"
1248 b"\xcd_\xa0\x9c\xde\xaf46q\xa5\xc9\x92\xd7\xca\xe3`\x9d\x85}\xb4\xff\xb3"
1249 b"\x83\xfb\xb6\xca\xae`\x0bw\x7f\xfc\xd8\xacVe\x19\xc8\x17\x0bZ\xad\x88"
1250 b"\xeb#\x97\x03\x13\xb1d\x0f{\x0c\x04w\x07\r\x97\xbd\xd6\xc1\xc3B:\x95\x08"
1251 b"^\x10V\xaeaH\x02\xd9\xe3\n\\\x01X\xf6\x9c\x8a\x06u#%\xbe*\xa1\x18v\x85"
1252 b"\xec!\t4\x00\x00\x00"
1253)
1254
1255FILTERS_RAW_4 = [{"id": lzma.FILTER_DELTA, "dist": 4},
1256 {"id": lzma.FILTER_X86, "start_offset": 0x40},
1257 {"id": lzma.FILTER_LZMA2, "preset": 4, "lc": 2}]
1258COMPRESSED_RAW_4 = (
1259 b"\xe0\x07\x80\x06\x0e\\\x00\x05\x14\x07bW\xaah\xdd\x10\xdc'\xd6\x90,\xc6v"
1260 b"Jq \x14l\xb7\x83xB\x0b\x97f=&fx\xba\n>Tn\xbf\x8f\xfb\x1dF\xca\xc3v_\xca?"
1261 b"\xfbV<\x92#\xd4w\xa6\x8a\xeb\xf6\x03\xc0\x01\x94\xd8\x9e\x13\x12\x98\xd1"
1262 b"*\xfa]c\xe8\x1e~\xaf\xb5]Eg\xfb\x9e\x01\"8\xb2\x90\x06=~\xe9\x91W\xcd"
1263 b"\xecD\x12\xc7\xfa\xe1\x91\x06\xc7\x99\xb9\xe3\x901\x87\x19u\x0f\x869\xff"
1264 b"\xc1\xb0hw|\xb0\xdcl\xcck\xb16o7\x85\xee{Y_b\xbf\xbc$\xf3=\x8d\x8bw\xe5Z"
1265 b"\x08@\xc4kmE\xad\xfb\xf6*\xd8\xad\xa1\xfb\xc5{\xdej,)\x1emB\x1f<\xaeca"
1266 b"\x80(\xee\x07 \xdf\xe9\xf8\xeb\x0e-\x97\x86\x90c\xf9\xea'B\xf7`\xd7\xb0"
1267 b"\x92\xbd\xa0\x82]\xbd\x0e\x0eB\x19\xdc\x96\xc6\x19\xd86D\xf0\xd5\x831"
1268 b"\x03\xb7\x1c\xf7&5\x1a\x8f PZ&j\xf8\x98\x1bo\xcc\x86\x9bS\xd3\xa5\xcdu"
1269 b"\xf9$\xcc\x97o\xe5V~\xfb\x97\xb5\x0b\x17\x9c\xfdxW\x10\xfep4\x80\xdaHDY"
1270 b"\xfa)\xfet\xb5\"\xd4\xd3F\x81\xf4\x13\x1f\xec\xdf\xa5\x13\xfc\"\x91x\xb7"
1271 b"\x99\xce\xc8\x92\n\xeb[\x10l*Y\xd8\xb1@\x06\xc8o\x8d7r\xebu\xfd5\x0e\x7f"
1272 b"\xf1$U{\t}\x1fQ\xcfxN\x9d\x9fXX\xe9`\x83\xc1\x06\xf4\x87v-f\x11\xdb/\\"
1273 b"\x06\xff\xd7)B\xf3g\x06\x88#2\x1eB244\x7f4q\t\xc893?mPX\x95\xa6a\xfb)d"
1274 b"\x9b\xfc\x98\x9aj\x04\xae\x9b\x9d\x19w\xba\xf92\xfaA\x11\\\x17\x97C3\xa4"
1275 b"\xbc!\x88\xcdo[\xec:\x030\x91.\x85\xe0@\\4\x16\x12\x9d\xcaJv\x97\xb04"
1276 b"\xack\xcbkf\xa3ss\xfc\x16^\x8ce\x85a\xa5=&\xecr\xb3p\xd1E\xd5\x80y\xc7"
1277 b"\xda\xf6\xfek\xbcT\xbfH\xee\x15o\xc5\x8c\x830\xec\x1d\x01\xae\x0c-e\\"
1278 b"\x91\x90\x94\xb2\xf8\x88\x91\xe8\x0b\xae\xa7>\x98\xf6\x9ck\xd2\xc6\x08"
1279 b"\xe6\xab\t\x98\xf2!\xa0\x8c^\xacqA\x99<\x1cEG\x97\xc8\xf1\xb6\xb9\x82"
1280 b"\x8d\xf7\x08s\x98a\xff\xe3\xcc\x92\x0e\xd2\xb6U\xd7\xd9\x86\x7fa\xe5\x1c"
1281 b"\x8dTG@\t\x1e\x0e7*\xfc\xde\xbc]6N\xf7\xf1\x84\x9e\x9f\xcf\xe9\x1e\xb5'"
1282 b"\xf4<\xdf\x99sq\xd0\x9d\xbd\x99\x0b\xb4%p4\xbf{\xbb\x8a\xd2\x0b\xbc=M"
1283 b"\x94H:\xf5\xa8\xd6\xa4\xc90\xc2D\xb9\xd3\xa8\xb0S\x87 `\xa2\xeb\xf3W\xce"
1284 b" 7\xf9N#\r\xe6\xbe\t\x9d\xe7\x811\xf9\x10\xc1\xc2\x14\xf6\xfc\xcba\xb7"
1285 b"\xb1\x7f\x95l\xe4\tjA\xec:\x10\xe5\xfe\xc2\\=D\xe2\x0c\x0b3]\xf7\xc1\xf7"
1286 b"\xbceZ\xb1A\xea\x16\xe5\xfddgFQ\xed\xaf\x04\xa3\xd3\xf8\xa2q\x19B\xd4r"
1287 b"\xc5\x0c\x9a\x14\x94\xea\x91\xc4o\xe4\xbb\xb4\x99\xf4@\xd1\xe6\x0c\xe3"
1288 b"\xc6d\xa0Q\n\xf2/\xd8\xb8S5\x8a\x18:\xb5g\xac\x95D\xce\x17\x07\xd4z\xda"
1289 b"\x90\xe65\x07\x19H!\t\xfdu\x16\x8e\x0eR\x19\xf4\x8cl\x0c\xf9Q\xf1\x80"
1290 b"\xe3\xbf\xd7O\xf8\x8c\x18\x0b\x9c\xf1\x1fb\xe1\tR\xb2\xf1\xe1A\xea \xcf-"
1291 b"IGE\xf1\x14\x98$\x83\x15\xc9\xd8j\xbf\x19\x0f\xd5\xd1\xaa\xb3\xf3\xa5I2s"
1292 b"\x8d\x145\xca\xd5\xd93\x9c\xb8D0\xe6\xaa%\xd0\xc0P}JO^h\x8e\x08\xadlV."
1293 b"\x18\x88\x13\x05o\xb0\x07\xeaw\xe0\xb6\xa4\xd5*\xe4r\xef\x07G+\xc1\xbei["
1294 b"w\xe8\xab@_\xef\x15y\xe5\x12\xc9W\x1b.\xad\x85-\xc2\xf7\xe3mU6g\x8eSA"
1295 b"\x01(\xd3\xdb\x16\x13=\xde\x92\xf9,D\xb8\x8a\xb2\xb4\xc9\xc3\xefnE\xe8\\"
1296 b"\xa6\xe2Y\xd2\xcf\xcb\x8c\xb6\xd5\xe9\x1d\x1e\x9a\x8b~\xe2\xa6\rE\x84uV"
1297 b"\xed\xc6\x99\xddm<\x10[\x0fu\x1f\xc1\x1d1\n\xcfw\xb2%!\xf0[\xce\x87\x83B"
1298 b"\x08\xaa,\x08%d\xcef\x94\"\xd9g.\xc83\xcbXY+4\xec\x85qA\n\x1d=9\xf0*\xb1"
1299 b"\x1f/\xf3s\xd61b\x7f@\xfb\x9d\xe3FQ\\\xbd\x82\x1e\x00\xf3\xce\xd3\xe1"
1300 b"\xca,E\xfd7[\xab\xb6\xb7\xac!mA}\xbd\x9d3R5\x9cF\xabH\xeb\x92)cc\x13\xd0"
1301 b"\xbd\xee\xe9n{\x1dIJB\xa5\xeb\x11\xe8`w&`\x8b}@Oxe\t\x8a\x07\x02\x95\xf2"
1302 b"\xed\xda|\xb1e\xbe\xaa\xbbg\x19@\xe1Y\x878\x84\x0f\x8c\xe3\xc98\xf2\x9e"
1303 b"\xd5N\xb5J\xef\xab!\xe2\x8dq\xe1\xe5q\xc5\xee\x11W\xb7\xe4k*\x027\xa0"
1304 b"\xa3J\xf4\xd8m\xd0q\x94\xcb\x07\n:\xb6`.\xe4\x9c\x15+\xc0)\xde\x80X\xd4"
1305 b"\xcfQm\x01\xc2cP\x1cA\x85'\xc9\xac\x8b\xe6\xb2)\xe6\x84t\x1c\x92\xe4Z"
1306 b"\x1cR\xb0\x9e\x96\xd1\xfb\x1c\xa6\x8b\xcb`\x10\x12]\xf2gR\x9bFT\xe0\xc8H"
1307 b"S\xfb\xac<\x04\xc7\xc1\xe8\xedP\xf4\x16\xdb\xc0\xd7e\xc2\x17J^\x1f\xab"
1308 b"\xff[\x08\x19\xb4\xf5\xfb\x19\xb4\x04\xe5c~']\xcb\xc2A\xec\x90\xd0\xed"
1309 b"\x06,\xc5K{\x86\x03\xb1\xcdMx\xdeQ\x8c3\xf9\x8a\xea=\x89\xaba\xd2\xc89a"
1310 b"\xd72\xf0\xc3\x19\x8a\xdfs\xd4\xfd\xbb\x81b\xeaE\"\xd8\xf4d\x0cD\xf7IJ!"
1311 b"\xe5d\xbbG\xe9\xcam\xaa\x0f_r\x95\x91NBq\xcaP\xce\xa7\xa9\xb5\x10\x94eP!"
1312 b"|\x856\xcd\xbfIir\xb8e\x9bjP\x97q\xabwS7\x1a\x0ehM\xe7\xca\x86?\xdeP}y~"
1313 b"\x0f\x95I\xfc\x13\xe1<Q\x1b\x868\x1d\x11\xdf\x94\xf4\x82>r\xa9k\x88\xcb"
1314 b"\xfd\xc3v\xe2\xb9\x8a\x02\x8eq\x92I\xf8\xf6\xf1\x03s\x9b\xb8\xe3\"\xe3"
1315 b"\xa9\xa5>D\xb8\x96;\xe7\x92\xd133\xe8\xdd'e\xc9.\xdc;\x17\x1f\xf5H\x13q"
1316 b"\xa4W\x0c\xdb~\x98\x01\xeb\xdf\xe32\x13\x0f\xddx\n6\xa0\t\x10\xb6\xbb"
1317 b"\xb0\xc3\x18\xb6;\x9fj[\xd9\xd5\xc9\x06\x8a\x87\xcd\xe5\xee\xfc\x9c-%@"
1318 b"\xee\xe0\xeb\xd2\xe3\xe8\xfb\xc0\x122\\\xc7\xaf\xc2\xa1Oth\xb3\x8f\x82"
1319 b"\xb3\x18\xa8\x07\xd5\xee_\xbe\xe0\x1cA\x1e_\r\x9a\xb0\x17W&\xa2D\x91\x94"
1320 b"\x1a\xb2\xef\xf2\xdc\x85;X\xb0,\xeb>-7S\xe5\xca\x07)\x1fp\x7f\xcaQBL\xca"
1321 b"\xf3\xb9d\xfc\xb5su\xb0\xc8\x95\x90\xeb*)\xa0v\xe4\x9a{FW\xf4l\xde\xcdj"
1322 b"\x00"
1323)
1324
1325
1326def test_main():
1327 run_unittest(
1328 CompressorDecompressorTestCase,
1329 CompressDecompressFunctionTestCase,
1330 FileTestCase,
1331 MiscellaneousTestCase,
1332 )
1333
1334if __name__ == "__main__":
1335 test_main()