blob: cded28c9b299da4ff67f59c3157a3a18a7e9fd52 [file] [log] [blame]
Nadeem Vawda3ff069e2011-11-30 00:25:06 +02001from io import BytesIO, UnsupportedOperation
2import os
Nadeem Vawda37970652013-10-28 21:35:23 +01003import pickle
Nadeem Vawda3ff069e2011-11-30 00:25:06 +02004import random
5import unittest
6
7from test.support import (
8 _4G, TESTFN, import_module, bigmemtest, run_unittest, unlink
9)
10
11lzma = import_module("lzma")
12from lzma import LZMACompressor, LZMADecompressor, LZMAError, LZMAFile
13
14
15class CompressorDecompressorTestCase(unittest.TestCase):
16
17 # Test error cases.
18
19 def test_simple_bad_args(self):
20 self.assertRaises(TypeError, LZMACompressor, [])
21 self.assertRaises(TypeError, LZMACompressor, format=3.45)
22 self.assertRaises(TypeError, LZMACompressor, check="")
23 self.assertRaises(TypeError, LZMACompressor, preset="asdf")
24 self.assertRaises(TypeError, LZMACompressor, filters=3)
25 # Can't specify FORMAT_AUTO when compressing.
26 self.assertRaises(ValueError, LZMACompressor, format=lzma.FORMAT_AUTO)
27 # Can't specify a preset and a custom filter chain at the same time.
28 with self.assertRaises(ValueError):
29 LZMACompressor(preset=7, filters=[{"id": lzma.FILTER_LZMA2}])
30
31 self.assertRaises(TypeError, LZMADecompressor, ())
32 self.assertRaises(TypeError, LZMADecompressor, memlimit=b"qw")
33 with self.assertRaises(TypeError):
34 LZMADecompressor(lzma.FORMAT_RAW, filters="zzz")
35 # Cannot specify a memory limit with FILTER_RAW.
36 with self.assertRaises(ValueError):
37 LZMADecompressor(lzma.FORMAT_RAW, memlimit=0x1000000)
38 # Can only specify a custom filter chain with FILTER_RAW.
39 self.assertRaises(ValueError, LZMADecompressor, filters=FILTERS_RAW_1)
40 with self.assertRaises(ValueError):
41 LZMADecompressor(format=lzma.FORMAT_XZ, filters=FILTERS_RAW_1)
42 with self.assertRaises(ValueError):
43 LZMADecompressor(format=lzma.FORMAT_ALONE, filters=FILTERS_RAW_1)
44
45 lzc = LZMACompressor()
46 self.assertRaises(TypeError, lzc.compress)
47 self.assertRaises(TypeError, lzc.compress, b"foo", b"bar")
48 self.assertRaises(TypeError, lzc.flush, b"blah")
49 empty = lzc.flush()
50 self.assertRaises(ValueError, lzc.compress, b"quux")
51 self.assertRaises(ValueError, lzc.flush)
52
53 lzd = LZMADecompressor()
54 self.assertRaises(TypeError, lzd.decompress)
55 self.assertRaises(TypeError, lzd.decompress, b"foo", b"bar")
56 lzd.decompress(empty)
57 self.assertRaises(EOFError, lzd.decompress, b"quux")
58
59 def test_bad_filter_spec(self):
60 self.assertRaises(TypeError, LZMACompressor, filters=[b"wobsite"])
61 self.assertRaises(ValueError, LZMACompressor, filters=[{"xyzzy": 3}])
62 self.assertRaises(ValueError, LZMACompressor, filters=[{"id": 98765}])
63 with self.assertRaises(ValueError):
64 LZMACompressor(filters=[{"id": lzma.FILTER_LZMA2, "foo": 0}])
65 with self.assertRaises(ValueError):
66 LZMACompressor(filters=[{"id": lzma.FILTER_DELTA, "foo": 0}])
67 with self.assertRaises(ValueError):
68 LZMACompressor(filters=[{"id": lzma.FILTER_X86, "foo": 0}])
69
70 def test_decompressor_after_eof(self):
71 lzd = LZMADecompressor()
72 lzd.decompress(COMPRESSED_XZ)
73 self.assertRaises(EOFError, lzd.decompress, b"nyan")
74
75 def test_decompressor_memlimit(self):
76 lzd = LZMADecompressor(memlimit=1024)
77 self.assertRaises(LZMAError, lzd.decompress, COMPRESSED_XZ)
78
79 lzd = LZMADecompressor(lzma.FORMAT_XZ, memlimit=1024)
80 self.assertRaises(LZMAError, lzd.decompress, COMPRESSED_XZ)
81
82 lzd = LZMADecompressor(lzma.FORMAT_ALONE, memlimit=1024)
83 self.assertRaises(LZMAError, lzd.decompress, COMPRESSED_ALONE)
84
85 # Test LZMADecompressor on known-good input data.
86
87 def _test_decompressor(self, lzd, data, check, unused_data=b""):
88 self.assertFalse(lzd.eof)
89 out = lzd.decompress(data)
90 self.assertEqual(out, INPUT)
91 self.assertEqual(lzd.check, check)
92 self.assertTrue(lzd.eof)
93 self.assertEqual(lzd.unused_data, unused_data)
94
95 def test_decompressor_auto(self):
96 lzd = LZMADecompressor()
97 self._test_decompressor(lzd, COMPRESSED_XZ, lzma.CHECK_CRC64)
98
99 lzd = LZMADecompressor()
100 self._test_decompressor(lzd, COMPRESSED_ALONE, lzma.CHECK_NONE)
101
102 def test_decompressor_xz(self):
103 lzd = LZMADecompressor(lzma.FORMAT_XZ)
104 self._test_decompressor(lzd, COMPRESSED_XZ, lzma.CHECK_CRC64)
105
106 def test_decompressor_alone(self):
107 lzd = LZMADecompressor(lzma.FORMAT_ALONE)
108 self._test_decompressor(lzd, COMPRESSED_ALONE, lzma.CHECK_NONE)
109
110 def test_decompressor_raw_1(self):
111 lzd = LZMADecompressor(lzma.FORMAT_RAW, filters=FILTERS_RAW_1)
112 self._test_decompressor(lzd, COMPRESSED_RAW_1, lzma.CHECK_NONE)
113
114 def test_decompressor_raw_2(self):
115 lzd = LZMADecompressor(lzma.FORMAT_RAW, filters=FILTERS_RAW_2)
116 self._test_decompressor(lzd, COMPRESSED_RAW_2, lzma.CHECK_NONE)
117
118 def test_decompressor_raw_3(self):
119 lzd = LZMADecompressor(lzma.FORMAT_RAW, filters=FILTERS_RAW_3)
120 self._test_decompressor(lzd, COMPRESSED_RAW_3, lzma.CHECK_NONE)
121
122 def test_decompressor_raw_4(self):
123 lzd = LZMADecompressor(lzma.FORMAT_RAW, filters=FILTERS_RAW_4)
124 self._test_decompressor(lzd, COMPRESSED_RAW_4, lzma.CHECK_NONE)
125
126 def test_decompressor_chunks(self):
127 lzd = LZMADecompressor()
128 out = []
129 for i in range(0, len(COMPRESSED_XZ), 10):
130 self.assertFalse(lzd.eof)
131 out.append(lzd.decompress(COMPRESSED_XZ[i:i+10]))
132 out = b"".join(out)
133 self.assertEqual(out, INPUT)
134 self.assertEqual(lzd.check, lzma.CHECK_CRC64)
135 self.assertTrue(lzd.eof)
136 self.assertEqual(lzd.unused_data, b"")
137
Antoine Pitrou26795ba2015-01-17 16:22:18 +0100138 def test_decompressor_chunks_maxsize(self):
139 lzd = LZMADecompressor()
140 max_length = 100
141 out = []
142
143 # Feed first half the input
144 len_ = len(COMPRESSED_XZ) // 2
145 out.append(lzd.decompress(COMPRESSED_XZ[:len_],
146 max_length=max_length))
147 self.assertFalse(lzd.needs_input)
148 self.assertEqual(len(out[-1]), max_length)
149
150 # Retrieve more data without providing more input
151 out.append(lzd.decompress(b'', max_length=max_length))
152 self.assertFalse(lzd.needs_input)
153 self.assertEqual(len(out[-1]), max_length)
154
155 # Retrieve more data while providing more input
156 out.append(lzd.decompress(COMPRESSED_XZ[len_:],
157 max_length=max_length))
158 self.assertLessEqual(len(out[-1]), max_length)
159
160 # Retrieve remaining uncompressed data
161 while not lzd.eof:
162 out.append(lzd.decompress(b'', max_length=max_length))
163 self.assertLessEqual(len(out[-1]), max_length)
164
165 out = b"".join(out)
166 self.assertEqual(out, INPUT)
167 self.assertEqual(lzd.check, lzma.CHECK_CRC64)
168 self.assertEqual(lzd.unused_data, b"")
169
170 def test_decompressor_inputbuf_1(self):
171 # Test reusing input buffer after moving existing
172 # contents to beginning
173 lzd = LZMADecompressor()
174 out = []
175
176 # Create input buffer and fill it
177 self.assertEqual(lzd.decompress(COMPRESSED_XZ[:100],
178 max_length=0), b'')
179
180 # Retrieve some results, freeing capacity at beginning
181 # of input buffer
182 out.append(lzd.decompress(b'', 2))
183
184 # Add more data that fits into input buffer after
185 # moving existing data to beginning
186 out.append(lzd.decompress(COMPRESSED_XZ[100:105], 15))
187
188 # Decompress rest of data
189 out.append(lzd.decompress(COMPRESSED_XZ[105:]))
190 self.assertEqual(b''.join(out), INPUT)
191
192 def test_decompressor_inputbuf_2(self):
193 # Test reusing input buffer by appending data at the
194 # end right away
195 lzd = LZMADecompressor()
196 out = []
197
198 # Create input buffer and empty it
199 self.assertEqual(lzd.decompress(COMPRESSED_XZ[:200],
200 max_length=0), b'')
201 out.append(lzd.decompress(b''))
202
203 # Fill buffer with new data
204 out.append(lzd.decompress(COMPRESSED_XZ[200:280], 2))
205
206 # Append some more data, not enough to require resize
207 out.append(lzd.decompress(COMPRESSED_XZ[280:300], 2))
208
209 # Decompress rest of data
210 out.append(lzd.decompress(COMPRESSED_XZ[300:]))
211 self.assertEqual(b''.join(out), INPUT)
212
213 def test_decompressor_inputbuf_3(self):
214 # Test reusing input buffer after extending it
215
216 lzd = LZMADecompressor()
217 out = []
218
219 # Create almost full input buffer
220 out.append(lzd.decompress(COMPRESSED_XZ[:200], 5))
221
222 # Add even more data to it, requiring resize
223 out.append(lzd.decompress(COMPRESSED_XZ[200:300], 5))
224
225 # Decompress rest of data
226 out.append(lzd.decompress(COMPRESSED_XZ[300:]))
227 self.assertEqual(b''.join(out), INPUT)
228
Nadeem Vawda3ff069e2011-11-30 00:25:06 +0200229 def test_decompressor_unused_data(self):
230 lzd = LZMADecompressor()
231 extra = b"fooblibar"
232 self._test_decompressor(lzd, COMPRESSED_XZ + extra, lzma.CHECK_CRC64,
233 unused_data=extra)
234
235 def test_decompressor_bad_input(self):
236 lzd = LZMADecompressor()
237 self.assertRaises(LZMAError, lzd.decompress, COMPRESSED_RAW_1)
238
239 lzd = LZMADecompressor(lzma.FORMAT_XZ)
240 self.assertRaises(LZMAError, lzd.decompress, COMPRESSED_ALONE)
241
242 lzd = LZMADecompressor(lzma.FORMAT_ALONE)
243 self.assertRaises(LZMAError, lzd.decompress, COMPRESSED_XZ)
244
245 lzd = LZMADecompressor(lzma.FORMAT_RAW, filters=FILTERS_RAW_1)
246 self.assertRaises(LZMAError, lzd.decompress, COMPRESSED_XZ)
247
248 # Test that LZMACompressor->LZMADecompressor preserves the input data.
249
250 def test_roundtrip_xz(self):
251 lzc = LZMACompressor()
252 cdata = lzc.compress(INPUT) + lzc.flush()
253 lzd = LZMADecompressor()
254 self._test_decompressor(lzd, cdata, lzma.CHECK_CRC64)
255
256 def test_roundtrip_alone(self):
257 lzc = LZMACompressor(lzma.FORMAT_ALONE)
258 cdata = lzc.compress(INPUT) + lzc.flush()
259 lzd = LZMADecompressor()
260 self._test_decompressor(lzd, cdata, lzma.CHECK_NONE)
261
262 def test_roundtrip_raw(self):
263 lzc = LZMACompressor(lzma.FORMAT_RAW, filters=FILTERS_RAW_4)
264 cdata = lzc.compress(INPUT) + lzc.flush()
265 lzd = LZMADecompressor(lzma.FORMAT_RAW, filters=FILTERS_RAW_4)
266 self._test_decompressor(lzd, cdata, lzma.CHECK_NONE)
267
268 def test_roundtrip_chunks(self):
269 lzc = LZMACompressor()
270 cdata = []
271 for i in range(0, len(INPUT), 10):
272 cdata.append(lzc.compress(INPUT[i:i+10]))
273 cdata.append(lzc.flush())
274 cdata = b"".join(cdata)
275 lzd = LZMADecompressor()
276 self._test_decompressor(lzd, cdata, lzma.CHECK_CRC64)
277
278 # LZMADecompressor intentionally does not handle concatenated streams.
279
280 def test_decompressor_multistream(self):
281 lzd = LZMADecompressor()
282 self._test_decompressor(lzd, COMPRESSED_XZ + COMPRESSED_ALONE,
283 lzma.CHECK_CRC64, unused_data=COMPRESSED_ALONE)
284
285 # Test with inputs larger than 4GiB.
286
287 @bigmemtest(size=_4G + 100, memuse=2)
288 def test_compressor_bigmem(self, size):
289 lzc = LZMACompressor()
290 cdata = lzc.compress(b"x" * size) + lzc.flush()
291 ddata = lzma.decompress(cdata)
292 try:
293 self.assertEqual(len(ddata), size)
294 self.assertEqual(len(ddata.strip(b"x")), 0)
295 finally:
296 ddata = None
297
298 @bigmemtest(size=_4G + 100, memuse=3)
299 def test_decompressor_bigmem(self, size):
300 lzd = LZMADecompressor()
301 blocksize = 10 * 1024 * 1024
302 block = random.getrandbits(blocksize * 8).to_bytes(blocksize, "little")
303 try:
304 input = block * (size // blocksize + 1)
305 cdata = lzma.compress(input)
306 ddata = lzd.decompress(cdata)
307 self.assertEqual(ddata, input)
308 finally:
309 input = cdata = ddata = None
310
Nadeem Vawda37970652013-10-28 21:35:23 +0100311 # Pickling raises an exception; there's no way to serialize an lzma_stream.
312
313 def test_pickle(self):
Serhiy Storchakabad12572014-12-15 14:03:42 +0200314 for proto in range(pickle.HIGHEST_PROTOCOL + 1):
315 with self.assertRaises(TypeError):
316 pickle.dumps(LZMACompressor(), proto)
317 with self.assertRaises(TypeError):
318 pickle.dumps(LZMADecompressor(), proto)
Nadeem Vawda37970652013-10-28 21:35:23 +0100319
Nadeem Vawda3ff069e2011-11-30 00:25:06 +0200320
321class CompressDecompressFunctionTestCase(unittest.TestCase):
322
323 # Test error cases:
324
325 def test_bad_args(self):
326 self.assertRaises(TypeError, lzma.compress)
327 self.assertRaises(TypeError, lzma.compress, [])
328 self.assertRaises(TypeError, lzma.compress, b"", format="xz")
329 self.assertRaises(TypeError, lzma.compress, b"", check="none")
330 self.assertRaises(TypeError, lzma.compress, b"", preset="blah")
331 self.assertRaises(TypeError, lzma.compress, b"", filters=1024)
332 # Can't specify a preset and a custom filter chain at the same time.
333 with self.assertRaises(ValueError):
334 lzma.compress(b"", preset=3, filters=[{"id": lzma.FILTER_LZMA2}])
335
336 self.assertRaises(TypeError, lzma.decompress)
337 self.assertRaises(TypeError, lzma.decompress, [])
338 self.assertRaises(TypeError, lzma.decompress, b"", format="lzma")
339 self.assertRaises(TypeError, lzma.decompress, b"", memlimit=7.3e9)
340 with self.assertRaises(TypeError):
341 lzma.decompress(b"", format=lzma.FORMAT_RAW, filters={})
342 # Cannot specify a memory limit with FILTER_RAW.
343 with self.assertRaises(ValueError):
344 lzma.decompress(b"", format=lzma.FORMAT_RAW, memlimit=0x1000000)
345 # Can only specify a custom filter chain with FILTER_RAW.
346 with self.assertRaises(ValueError):
347 lzma.decompress(b"", filters=FILTERS_RAW_1)
348 with self.assertRaises(ValueError):
349 lzma.decompress(b"", format=lzma.FORMAT_XZ, filters=FILTERS_RAW_1)
350 with self.assertRaises(ValueError):
351 lzma.decompress(
352 b"", format=lzma.FORMAT_ALONE, filters=FILTERS_RAW_1)
353
354 def test_decompress_memlimit(self):
355 with self.assertRaises(LZMAError):
356 lzma.decompress(COMPRESSED_XZ, memlimit=1024)
357 with self.assertRaises(LZMAError):
358 lzma.decompress(
359 COMPRESSED_XZ, format=lzma.FORMAT_XZ, memlimit=1024)
360 with self.assertRaises(LZMAError):
361 lzma.decompress(
362 COMPRESSED_ALONE, format=lzma.FORMAT_ALONE, memlimit=1024)
363
364 # Test LZMADecompressor on known-good input data.
365
366 def test_decompress_good_input(self):
367 ddata = lzma.decompress(COMPRESSED_XZ)
368 self.assertEqual(ddata, INPUT)
369
370 ddata = lzma.decompress(COMPRESSED_ALONE)
371 self.assertEqual(ddata, INPUT)
372
373 ddata = lzma.decompress(COMPRESSED_XZ, lzma.FORMAT_XZ)
374 self.assertEqual(ddata, INPUT)
375
376 ddata = lzma.decompress(COMPRESSED_ALONE, lzma.FORMAT_ALONE)
377 self.assertEqual(ddata, INPUT)
378
379 ddata = lzma.decompress(
380 COMPRESSED_RAW_1, lzma.FORMAT_RAW, filters=FILTERS_RAW_1)
381 self.assertEqual(ddata, INPUT)
382
383 ddata = lzma.decompress(
384 COMPRESSED_RAW_2, lzma.FORMAT_RAW, filters=FILTERS_RAW_2)
385 self.assertEqual(ddata, INPUT)
386
387 ddata = lzma.decompress(
388 COMPRESSED_RAW_3, lzma.FORMAT_RAW, filters=FILTERS_RAW_3)
389 self.assertEqual(ddata, INPUT)
390
391 ddata = lzma.decompress(
392 COMPRESSED_RAW_4, lzma.FORMAT_RAW, filters=FILTERS_RAW_4)
393 self.assertEqual(ddata, INPUT)
394
395 def test_decompress_incomplete_input(self):
396 self.assertRaises(LZMAError, lzma.decompress, COMPRESSED_XZ[:128])
397 self.assertRaises(LZMAError, lzma.decompress, COMPRESSED_ALONE[:128])
398 self.assertRaises(LZMAError, lzma.decompress, COMPRESSED_RAW_1[:128],
399 format=lzma.FORMAT_RAW, filters=FILTERS_RAW_1)
400 self.assertRaises(LZMAError, lzma.decompress, COMPRESSED_RAW_2[:128],
401 format=lzma.FORMAT_RAW, filters=FILTERS_RAW_2)
402 self.assertRaises(LZMAError, lzma.decompress, COMPRESSED_RAW_3[:128],
403 format=lzma.FORMAT_RAW, filters=FILTERS_RAW_3)
404 self.assertRaises(LZMAError, lzma.decompress, COMPRESSED_RAW_4[:128],
405 format=lzma.FORMAT_RAW, filters=FILTERS_RAW_4)
406
407 def test_decompress_bad_input(self):
408 with self.assertRaises(LZMAError):
Nadeem Vawda9c72ebc2013-12-04 23:03:49 +0100409 lzma.decompress(COMPRESSED_BOGUS)
410 with self.assertRaises(LZMAError):
Nadeem Vawda3ff069e2011-11-30 00:25:06 +0200411 lzma.decompress(COMPRESSED_RAW_1)
412 with self.assertRaises(LZMAError):
413 lzma.decompress(COMPRESSED_ALONE, format=lzma.FORMAT_XZ)
414 with self.assertRaises(LZMAError):
415 lzma.decompress(COMPRESSED_XZ, format=lzma.FORMAT_ALONE)
416 with self.assertRaises(LZMAError):
417 lzma.decompress(COMPRESSED_XZ, format=lzma.FORMAT_RAW,
418 filters=FILTERS_RAW_1)
419
420 # Test that compress()->decompress() preserves the input data.
421
422 def test_roundtrip(self):
423 cdata = lzma.compress(INPUT)
424 ddata = lzma.decompress(cdata)
425 self.assertEqual(ddata, INPUT)
426
427 cdata = lzma.compress(INPUT, lzma.FORMAT_XZ)
428 ddata = lzma.decompress(cdata)
429 self.assertEqual(ddata, INPUT)
430
431 cdata = lzma.compress(INPUT, lzma.FORMAT_ALONE)
432 ddata = lzma.decompress(cdata)
433 self.assertEqual(ddata, INPUT)
434
435 cdata = lzma.compress(INPUT, lzma.FORMAT_RAW, filters=FILTERS_RAW_4)
436 ddata = lzma.decompress(cdata, lzma.FORMAT_RAW, filters=FILTERS_RAW_4)
437 self.assertEqual(ddata, INPUT)
438
439 # Unlike LZMADecompressor, decompress() *does* handle concatenated streams.
440
441 def test_decompress_multistream(self):
442 ddata = lzma.decompress(COMPRESSED_XZ + COMPRESSED_ALONE)
443 self.assertEqual(ddata, INPUT * 2)
444
Nadeem Vawda9c72ebc2013-12-04 23:03:49 +0100445 # Test robust handling of non-LZMA data following the compressed stream(s).
446
447 def test_decompress_trailing_junk(self):
448 ddata = lzma.decompress(COMPRESSED_XZ + COMPRESSED_BOGUS)
449 self.assertEqual(ddata, INPUT)
450
451 def test_decompress_multistream_trailing_junk(self):
452 ddata = lzma.decompress(COMPRESSED_XZ * 3 + COMPRESSED_BOGUS)
453 self.assertEqual(ddata, INPUT * 3)
454
Nadeem Vawda3ff069e2011-11-30 00:25:06 +0200455
456class TempFile:
457 """Context manager - creates a file, and deletes it on __exit__."""
458
459 def __init__(self, filename, data=b""):
460 self.filename = filename
461 self.data = data
462
463 def __enter__(self):
464 with open(self.filename, "wb") as f:
465 f.write(self.data)
466
467 def __exit__(self, *args):
468 unlink(self.filename)
469
470
471class FileTestCase(unittest.TestCase):
472
473 def test_init(self):
Nadeem Vawda33c34da2012-06-04 23:34:07 +0200474 with LZMAFile(BytesIO(COMPRESSED_XZ)) as f:
Nadeem Vawda3ff069e2011-11-30 00:25:06 +0200475 pass
Nadeem Vawda33c34da2012-06-04 23:34:07 +0200476 with LZMAFile(BytesIO(), "w") as f:
Nadeem Vawda3ff069e2011-11-30 00:25:06 +0200477 pass
Nadeem Vawda42ca9822013-10-19 00:06:19 +0200478 with LZMAFile(BytesIO(), "x") as f:
479 pass
Nadeem Vawda33c34da2012-06-04 23:34:07 +0200480 with LZMAFile(BytesIO(), "a") as f:
Nadeem Vawda3ff069e2011-11-30 00:25:06 +0200481 pass
482
483 def test_init_with_filename(self):
484 with TempFile(TESTFN, COMPRESSED_XZ):
485 with LZMAFile(TESTFN) as f:
486 pass
487 with LZMAFile(TESTFN, "w") as f:
488 pass
489 with LZMAFile(TESTFN, "a") as f:
490 pass
491
Nadeem Vawda6cbb20c2012-06-04 23:36:24 +0200492 def test_init_mode(self):
493 with TempFile(TESTFN):
494 with LZMAFile(TESTFN, "r"):
495 pass
496 with LZMAFile(TESTFN, "rb"):
497 pass
498 with LZMAFile(TESTFN, "w"):
499 pass
500 with LZMAFile(TESTFN, "wb"):
501 pass
502 with LZMAFile(TESTFN, "a"):
503 pass
504 with LZMAFile(TESTFN, "ab"):
505 pass
506
Nadeem Vawda42ca9822013-10-19 00:06:19 +0200507 def test_init_with_x_mode(self):
508 self.addCleanup(unlink, TESTFN)
509 for mode in ("x", "xb"):
510 unlink(TESTFN)
511 with LZMAFile(TESTFN, mode):
512 pass
513 with self.assertRaises(FileExistsError):
514 with LZMAFile(TESTFN, mode):
515 pass
516
Nadeem Vawda3ff069e2011-11-30 00:25:06 +0200517 def test_init_bad_mode(self):
518 with self.assertRaises(ValueError):
Nadeem Vawda33c34da2012-06-04 23:34:07 +0200519 LZMAFile(BytesIO(COMPRESSED_XZ), (3, "x"))
Nadeem Vawda3ff069e2011-11-30 00:25:06 +0200520 with self.assertRaises(ValueError):
Nadeem Vawda33c34da2012-06-04 23:34:07 +0200521 LZMAFile(BytesIO(COMPRESSED_XZ), "")
Nadeem Vawda3ff069e2011-11-30 00:25:06 +0200522 with self.assertRaises(ValueError):
Nadeem Vawda42ca9822013-10-19 00:06:19 +0200523 LZMAFile(BytesIO(COMPRESSED_XZ), "xt")
524 with self.assertRaises(ValueError):
525 LZMAFile(BytesIO(COMPRESSED_XZ), "x+")
526 with self.assertRaises(ValueError):
527 LZMAFile(BytesIO(COMPRESSED_XZ), "rx")
528 with self.assertRaises(ValueError):
529 LZMAFile(BytesIO(COMPRESSED_XZ), "wx")
Nadeem Vawda3ff069e2011-11-30 00:25:06 +0200530 with self.assertRaises(ValueError):
Nadeem Vawda6cbb20c2012-06-04 23:36:24 +0200531 LZMAFile(BytesIO(COMPRESSED_XZ), "rt")
Nadeem Vawda3ff069e2011-11-30 00:25:06 +0200532 with self.assertRaises(ValueError):
Nadeem Vawda33c34da2012-06-04 23:34:07 +0200533 LZMAFile(BytesIO(COMPRESSED_XZ), "r+")
Nadeem Vawda3ff069e2011-11-30 00:25:06 +0200534 with self.assertRaises(ValueError):
Nadeem Vawda6cbb20c2012-06-04 23:36:24 +0200535 LZMAFile(BytesIO(COMPRESSED_XZ), "wt")
Nadeem Vawda3ff069e2011-11-30 00:25:06 +0200536 with self.assertRaises(ValueError):
Nadeem Vawda33c34da2012-06-04 23:34:07 +0200537 LZMAFile(BytesIO(COMPRESSED_XZ), "w+")
Nadeem Vawda3ff069e2011-11-30 00:25:06 +0200538 with self.assertRaises(ValueError):
Nadeem Vawda33c34da2012-06-04 23:34:07 +0200539 LZMAFile(BytesIO(COMPRESSED_XZ), "rw")
Nadeem Vawda3ff069e2011-11-30 00:25:06 +0200540
541 def test_init_bad_check(self):
542 with self.assertRaises(TypeError):
Nadeem Vawda33c34da2012-06-04 23:34:07 +0200543 LZMAFile(BytesIO(), "w", check=b"asd")
Nadeem Vawda3ff069e2011-11-30 00:25:06 +0200544 # CHECK_UNKNOWN and anything above CHECK_ID_MAX should be invalid.
545 with self.assertRaises(LZMAError):
Nadeem Vawda33c34da2012-06-04 23:34:07 +0200546 LZMAFile(BytesIO(), "w", check=lzma.CHECK_UNKNOWN)
Nadeem Vawda3ff069e2011-11-30 00:25:06 +0200547 with self.assertRaises(LZMAError):
Nadeem Vawda33c34da2012-06-04 23:34:07 +0200548 LZMAFile(BytesIO(), "w", check=lzma.CHECK_ID_MAX + 3)
Nadeem Vawda3ff069e2011-11-30 00:25:06 +0200549 # Cannot specify a check with mode="r".
550 with self.assertRaises(ValueError):
Nadeem Vawda33c34da2012-06-04 23:34:07 +0200551 LZMAFile(BytesIO(COMPRESSED_XZ), check=lzma.CHECK_NONE)
Nadeem Vawda3ff069e2011-11-30 00:25:06 +0200552 with self.assertRaises(ValueError):
Nadeem Vawda33c34da2012-06-04 23:34:07 +0200553 LZMAFile(BytesIO(COMPRESSED_XZ), check=lzma.CHECK_CRC32)
Nadeem Vawda3ff069e2011-11-30 00:25:06 +0200554 with self.assertRaises(ValueError):
Nadeem Vawda33c34da2012-06-04 23:34:07 +0200555 LZMAFile(BytesIO(COMPRESSED_XZ), check=lzma.CHECK_CRC64)
Nadeem Vawda3ff069e2011-11-30 00:25:06 +0200556 with self.assertRaises(ValueError):
Nadeem Vawda33c34da2012-06-04 23:34:07 +0200557 LZMAFile(BytesIO(COMPRESSED_XZ), check=lzma.CHECK_SHA256)
Nadeem Vawda3ff069e2011-11-30 00:25:06 +0200558 with self.assertRaises(ValueError):
Nadeem Vawda33c34da2012-06-04 23:34:07 +0200559 LZMAFile(BytesIO(COMPRESSED_XZ), check=lzma.CHECK_UNKNOWN)
Nadeem Vawda3ff069e2011-11-30 00:25:06 +0200560
561 def test_init_bad_preset(self):
562 with self.assertRaises(TypeError):
Nadeem Vawda33c34da2012-06-04 23:34:07 +0200563 LZMAFile(BytesIO(), "w", preset=4.39)
Nadeem Vawda3ff069e2011-11-30 00:25:06 +0200564 with self.assertRaises(LZMAError):
Nadeem Vawda33c34da2012-06-04 23:34:07 +0200565 LZMAFile(BytesIO(), "w", preset=10)
Nadeem Vawda3ff069e2011-11-30 00:25:06 +0200566 with self.assertRaises(LZMAError):
Nadeem Vawda33c34da2012-06-04 23:34:07 +0200567 LZMAFile(BytesIO(), "w", preset=23)
Nadeem Vawda3ff069e2011-11-30 00:25:06 +0200568 with self.assertRaises(OverflowError):
Nadeem Vawda33c34da2012-06-04 23:34:07 +0200569 LZMAFile(BytesIO(), "w", preset=-1)
Nadeem Vawda3ff069e2011-11-30 00:25:06 +0200570 with self.assertRaises(OverflowError):
Nadeem Vawda33c34da2012-06-04 23:34:07 +0200571 LZMAFile(BytesIO(), "w", preset=-7)
Nadeem Vawda3ff069e2011-11-30 00:25:06 +0200572 with self.assertRaises(TypeError):
Nadeem Vawda33c34da2012-06-04 23:34:07 +0200573 LZMAFile(BytesIO(), "w", preset="foo")
Nadeem Vawda3ff069e2011-11-30 00:25:06 +0200574 # Cannot specify a preset with mode="r".
575 with self.assertRaises(ValueError):
Nadeem Vawda33c34da2012-06-04 23:34:07 +0200576 LZMAFile(BytesIO(COMPRESSED_XZ), preset=3)
Nadeem Vawda3ff069e2011-11-30 00:25:06 +0200577
578 def test_init_bad_filter_spec(self):
579 with self.assertRaises(TypeError):
Nadeem Vawda33c34da2012-06-04 23:34:07 +0200580 LZMAFile(BytesIO(), "w", filters=[b"wobsite"])
Nadeem Vawda3ff069e2011-11-30 00:25:06 +0200581 with self.assertRaises(ValueError):
Nadeem Vawda33c34da2012-06-04 23:34:07 +0200582 LZMAFile(BytesIO(), "w", filters=[{"xyzzy": 3}])
Nadeem Vawda3ff069e2011-11-30 00:25:06 +0200583 with self.assertRaises(ValueError):
Nadeem Vawda33c34da2012-06-04 23:34:07 +0200584 LZMAFile(BytesIO(), "w", filters=[{"id": 98765}])
Nadeem Vawda3ff069e2011-11-30 00:25:06 +0200585 with self.assertRaises(ValueError):
Nadeem Vawda33c34da2012-06-04 23:34:07 +0200586 LZMAFile(BytesIO(), "w",
Nadeem Vawda3ff069e2011-11-30 00:25:06 +0200587 filters=[{"id": lzma.FILTER_LZMA2, "foo": 0}])
588 with self.assertRaises(ValueError):
Nadeem Vawda33c34da2012-06-04 23:34:07 +0200589 LZMAFile(BytesIO(), "w",
Nadeem Vawda3ff069e2011-11-30 00:25:06 +0200590 filters=[{"id": lzma.FILTER_DELTA, "foo": 0}])
591 with self.assertRaises(ValueError):
Nadeem Vawda33c34da2012-06-04 23:34:07 +0200592 LZMAFile(BytesIO(), "w",
Nadeem Vawda3ff069e2011-11-30 00:25:06 +0200593 filters=[{"id": lzma.FILTER_X86, "foo": 0}])
594
595 def test_init_with_preset_and_filters(self):
596 with self.assertRaises(ValueError):
Nadeem Vawda33c34da2012-06-04 23:34:07 +0200597 LZMAFile(BytesIO(), "w", format=lzma.FORMAT_RAW,
598 preset=6, filters=FILTERS_RAW_1)
Nadeem Vawda3ff069e2011-11-30 00:25:06 +0200599
600 def test_close(self):
601 with BytesIO(COMPRESSED_XZ) as src:
Nadeem Vawda33c34da2012-06-04 23:34:07 +0200602 f = LZMAFile(src)
Nadeem Vawda3ff069e2011-11-30 00:25:06 +0200603 f.close()
604 # LZMAFile.close() should not close the underlying file object.
605 self.assertFalse(src.closed)
606 # Try closing an already-closed LZMAFile.
607 f.close()
608 self.assertFalse(src.closed)
609
610 # Test with a real file on disk, opened directly by LZMAFile.
611 with TempFile(TESTFN, COMPRESSED_XZ):
612 f = LZMAFile(TESTFN)
613 fp = f._fp
614 f.close()
615 # Here, LZMAFile.close() *should* close the underlying file object.
616 self.assertTrue(fp.closed)
617 # Try closing an already-closed LZMAFile.
618 f.close()
619
620 def test_closed(self):
Nadeem Vawda33c34da2012-06-04 23:34:07 +0200621 f = LZMAFile(BytesIO(COMPRESSED_XZ))
Nadeem Vawda3ff069e2011-11-30 00:25:06 +0200622 try:
623 self.assertFalse(f.closed)
624 f.read()
625 self.assertFalse(f.closed)
626 finally:
627 f.close()
628 self.assertTrue(f.closed)
629
Nadeem Vawda33c34da2012-06-04 23:34:07 +0200630 f = LZMAFile(BytesIO(), "w")
Nadeem Vawda3ff069e2011-11-30 00:25:06 +0200631 try:
632 self.assertFalse(f.closed)
633 finally:
634 f.close()
635 self.assertTrue(f.closed)
636
637 def test_fileno(self):
Nadeem Vawda33c34da2012-06-04 23:34:07 +0200638 f = LZMAFile(BytesIO(COMPRESSED_XZ))
Nadeem Vawda3ff069e2011-11-30 00:25:06 +0200639 try:
640 self.assertRaises(UnsupportedOperation, f.fileno)
641 finally:
642 f.close()
643 self.assertRaises(ValueError, f.fileno)
644 with TempFile(TESTFN, COMPRESSED_XZ):
645 f = LZMAFile(TESTFN)
646 try:
647 self.assertEqual(f.fileno(), f._fp.fileno())
648 self.assertIsInstance(f.fileno(), int)
649 finally:
650 f.close()
651 self.assertRaises(ValueError, f.fileno)
652
653 def test_seekable(self):
Nadeem Vawda33c34da2012-06-04 23:34:07 +0200654 f = LZMAFile(BytesIO(COMPRESSED_XZ))
Nadeem Vawda3ff069e2011-11-30 00:25:06 +0200655 try:
656 self.assertTrue(f.seekable())
657 f.read()
658 self.assertTrue(f.seekable())
659 finally:
660 f.close()
661 self.assertRaises(ValueError, f.seekable)
662
Nadeem Vawda33c34da2012-06-04 23:34:07 +0200663 f = LZMAFile(BytesIO(), "w")
Nadeem Vawda3ff069e2011-11-30 00:25:06 +0200664 try:
665 self.assertFalse(f.seekable())
666 finally:
667 f.close()
668 self.assertRaises(ValueError, f.seekable)
669
Nadeem Vawdaae557d72012-02-12 01:51:38 +0200670 src = BytesIO(COMPRESSED_XZ)
671 src.seekable = lambda: False
Nadeem Vawda33c34da2012-06-04 23:34:07 +0200672 f = LZMAFile(src)
Nadeem Vawdaae557d72012-02-12 01:51:38 +0200673 try:
674 self.assertFalse(f.seekable())
675 finally:
676 f.close()
677 self.assertRaises(ValueError, f.seekable)
678
Nadeem Vawda3ff069e2011-11-30 00:25:06 +0200679 def test_readable(self):
Nadeem Vawda33c34da2012-06-04 23:34:07 +0200680 f = LZMAFile(BytesIO(COMPRESSED_XZ))
Nadeem Vawda3ff069e2011-11-30 00:25:06 +0200681 try:
682 self.assertTrue(f.readable())
683 f.read()
684 self.assertTrue(f.readable())
685 finally:
686 f.close()
687 self.assertRaises(ValueError, f.readable)
688
Nadeem Vawda33c34da2012-06-04 23:34:07 +0200689 f = LZMAFile(BytesIO(), "w")
Nadeem Vawda3ff069e2011-11-30 00:25:06 +0200690 try:
691 self.assertFalse(f.readable())
692 finally:
693 f.close()
694 self.assertRaises(ValueError, f.readable)
695
696 def test_writable(self):
Nadeem Vawda33c34da2012-06-04 23:34:07 +0200697 f = LZMAFile(BytesIO(COMPRESSED_XZ))
Nadeem Vawda3ff069e2011-11-30 00:25:06 +0200698 try:
699 self.assertFalse(f.writable())
700 f.read()
701 self.assertFalse(f.writable())
702 finally:
703 f.close()
704 self.assertRaises(ValueError, f.writable)
705
Nadeem Vawda33c34da2012-06-04 23:34:07 +0200706 f = LZMAFile(BytesIO(), "w")
Nadeem Vawda3ff069e2011-11-30 00:25:06 +0200707 try:
708 self.assertTrue(f.writable())
709 finally:
710 f.close()
711 self.assertRaises(ValueError, f.writable)
712
713 def test_read(self):
Nadeem Vawda33c34da2012-06-04 23:34:07 +0200714 with LZMAFile(BytesIO(COMPRESSED_XZ)) as f:
Nadeem Vawda3ff069e2011-11-30 00:25:06 +0200715 self.assertEqual(f.read(), INPUT)
716 self.assertEqual(f.read(), b"")
Nadeem Vawda33c34da2012-06-04 23:34:07 +0200717 with LZMAFile(BytesIO(COMPRESSED_ALONE)) as f:
Nadeem Vawda3ff069e2011-11-30 00:25:06 +0200718 self.assertEqual(f.read(), INPUT)
Nadeem Vawda33c34da2012-06-04 23:34:07 +0200719 with LZMAFile(BytesIO(COMPRESSED_XZ), format=lzma.FORMAT_XZ) as f:
Nadeem Vawda3ff069e2011-11-30 00:25:06 +0200720 self.assertEqual(f.read(), INPUT)
721 self.assertEqual(f.read(), b"")
Nadeem Vawda33c34da2012-06-04 23:34:07 +0200722 with LZMAFile(BytesIO(COMPRESSED_ALONE), format=lzma.FORMAT_ALONE) as f:
Nadeem Vawda3ff069e2011-11-30 00:25:06 +0200723 self.assertEqual(f.read(), INPUT)
724 self.assertEqual(f.read(), b"")
Nadeem Vawda33c34da2012-06-04 23:34:07 +0200725 with LZMAFile(BytesIO(COMPRESSED_RAW_1),
Nadeem Vawda3ff069e2011-11-30 00:25:06 +0200726 format=lzma.FORMAT_RAW, filters=FILTERS_RAW_1) as f:
727 self.assertEqual(f.read(), INPUT)
728 self.assertEqual(f.read(), b"")
Nadeem Vawda33c34da2012-06-04 23:34:07 +0200729 with LZMAFile(BytesIO(COMPRESSED_RAW_2),
Nadeem Vawda3ff069e2011-11-30 00:25:06 +0200730 format=lzma.FORMAT_RAW, filters=FILTERS_RAW_2) as f:
731 self.assertEqual(f.read(), INPUT)
732 self.assertEqual(f.read(), b"")
Nadeem Vawda33c34da2012-06-04 23:34:07 +0200733 with LZMAFile(BytesIO(COMPRESSED_RAW_3),
Nadeem Vawda3ff069e2011-11-30 00:25:06 +0200734 format=lzma.FORMAT_RAW, filters=FILTERS_RAW_3) as f:
735 self.assertEqual(f.read(), INPUT)
736 self.assertEqual(f.read(), b"")
Nadeem Vawda33c34da2012-06-04 23:34:07 +0200737 with LZMAFile(BytesIO(COMPRESSED_RAW_4),
Nadeem Vawda3ff069e2011-11-30 00:25:06 +0200738 format=lzma.FORMAT_RAW, filters=FILTERS_RAW_4) as f:
739 self.assertEqual(f.read(), INPUT)
740 self.assertEqual(f.read(), b"")
741
742 def test_read_0(self):
Nadeem Vawda33c34da2012-06-04 23:34:07 +0200743 with LZMAFile(BytesIO(COMPRESSED_XZ)) as f:
Nadeem Vawda3ff069e2011-11-30 00:25:06 +0200744 self.assertEqual(f.read(0), b"")
Nadeem Vawda33c34da2012-06-04 23:34:07 +0200745 with LZMAFile(BytesIO(COMPRESSED_ALONE)) as f:
Nadeem Vawda3ff069e2011-11-30 00:25:06 +0200746 self.assertEqual(f.read(0), b"")
Nadeem Vawda33c34da2012-06-04 23:34:07 +0200747 with LZMAFile(BytesIO(COMPRESSED_XZ), format=lzma.FORMAT_XZ) as f:
Nadeem Vawda3ff069e2011-11-30 00:25:06 +0200748 self.assertEqual(f.read(0), b"")
Nadeem Vawda33c34da2012-06-04 23:34:07 +0200749 with LZMAFile(BytesIO(COMPRESSED_ALONE), format=lzma.FORMAT_ALONE) as f:
Nadeem Vawda3ff069e2011-11-30 00:25:06 +0200750 self.assertEqual(f.read(0), b"")
751
752 def test_read_10(self):
Nadeem Vawda33c34da2012-06-04 23:34:07 +0200753 with LZMAFile(BytesIO(COMPRESSED_XZ)) as f:
Nadeem Vawda3ff069e2011-11-30 00:25:06 +0200754 chunks = []
755 while True:
756 result = f.read(10)
757 if not result:
758 break
759 self.assertLessEqual(len(result), 10)
760 chunks.append(result)
761 self.assertEqual(b"".join(chunks), INPUT)
762
763 def test_read_multistream(self):
Nadeem Vawda33c34da2012-06-04 23:34:07 +0200764 with LZMAFile(BytesIO(COMPRESSED_XZ * 5)) as f:
Nadeem Vawda3ff069e2011-11-30 00:25:06 +0200765 self.assertEqual(f.read(), INPUT * 5)
Nadeem Vawda33c34da2012-06-04 23:34:07 +0200766 with LZMAFile(BytesIO(COMPRESSED_XZ + COMPRESSED_ALONE)) as f:
Nadeem Vawda3ff069e2011-11-30 00:25:06 +0200767 self.assertEqual(f.read(), INPUT * 2)
Nadeem Vawda33c34da2012-06-04 23:34:07 +0200768 with LZMAFile(BytesIO(COMPRESSED_RAW_3 * 4),
Nadeem Vawda3ff069e2011-11-30 00:25:06 +0200769 format=lzma.FORMAT_RAW, filters=FILTERS_RAW_3) as f:
770 self.assertEqual(f.read(), INPUT * 4)
771
772 def test_read_multistream_buffer_size_aligned(self):
773 # Test the case where a stream boundary coincides with the end
774 # of the raw read buffer.
775 saved_buffer_size = lzma._BUFFER_SIZE
776 lzma._BUFFER_SIZE = len(COMPRESSED_XZ)
777 try:
Nadeem Vawda33c34da2012-06-04 23:34:07 +0200778 with LZMAFile(BytesIO(COMPRESSED_XZ * 5)) as f:
Nadeem Vawda3ff069e2011-11-30 00:25:06 +0200779 self.assertEqual(f.read(), INPUT * 5)
780 finally:
781 lzma._BUFFER_SIZE = saved_buffer_size
782
Nadeem Vawda9c72ebc2013-12-04 23:03:49 +0100783 def test_read_trailing_junk(self):
784 with LZMAFile(BytesIO(COMPRESSED_XZ + COMPRESSED_BOGUS)) as f:
785 self.assertEqual(f.read(), INPUT)
786
787 def test_read_multistream_trailing_junk(self):
788 with LZMAFile(BytesIO(COMPRESSED_XZ * 5 + COMPRESSED_BOGUS)) as f:
789 self.assertEqual(f.read(), INPUT * 5)
790
Nadeem Vawda3ff069e2011-11-30 00:25:06 +0200791 def test_read_from_file(self):
792 with TempFile(TESTFN, COMPRESSED_XZ):
793 with LZMAFile(TESTFN) as f:
794 self.assertEqual(f.read(), INPUT)
795 self.assertEqual(f.read(), b"")
796
Nadeem Vawda10c87912012-06-20 01:48:50 +0200797 def test_read_from_file_with_bytes_filename(self):
798 try:
799 bytes_filename = TESTFN.encode("ascii")
800 except UnicodeEncodeError:
801 self.skipTest("Temporary file name needs to be ASCII")
802 with TempFile(TESTFN, COMPRESSED_XZ):
803 with LZMAFile(bytes_filename) as f:
804 self.assertEqual(f.read(), INPUT)
805 self.assertEqual(f.read(), b"")
806
Nadeem Vawda3ff069e2011-11-30 00:25:06 +0200807 def test_read_incomplete(self):
Nadeem Vawda33c34da2012-06-04 23:34:07 +0200808 with LZMAFile(BytesIO(COMPRESSED_XZ[:128])) as f:
Nadeem Vawda3ff069e2011-11-30 00:25:06 +0200809 self.assertRaises(EOFError, f.read)
810
Serhiy Storchaka57f9b7a2013-01-22 17:07:49 +0200811 def test_read_truncated(self):
812 # Drop stream footer: CRC (4 bytes), index size (4 bytes),
Serhiy Storchaka70ea7fa2013-02-08 11:24:16 +0200813 # flags (2 bytes) and magic number (2 bytes).
Serhiy Storchaka57f9b7a2013-01-22 17:07:49 +0200814 truncated = COMPRESSED_XZ[:-12]
815 with LZMAFile(BytesIO(truncated)) as f:
816 self.assertRaises(EOFError, f.read)
817 with LZMAFile(BytesIO(truncated)) as f:
818 self.assertEqual(f.read(len(INPUT)), INPUT)
819 self.assertRaises(EOFError, f.read, 1)
820 # Incomplete 12-byte header.
821 for i in range(12):
822 with LZMAFile(BytesIO(truncated[:i])) as f:
823 self.assertRaises(EOFError, f.read, 1)
824
Nadeem Vawda3ff069e2011-11-30 00:25:06 +0200825 def test_read_bad_args(self):
Nadeem Vawda33c34da2012-06-04 23:34:07 +0200826 f = LZMAFile(BytesIO(COMPRESSED_XZ))
Nadeem Vawda3ff069e2011-11-30 00:25:06 +0200827 f.close()
828 self.assertRaises(ValueError, f.read)
Nadeem Vawda33c34da2012-06-04 23:34:07 +0200829 with LZMAFile(BytesIO(), "w") as f:
Nadeem Vawda3ff069e2011-11-30 00:25:06 +0200830 self.assertRaises(ValueError, f.read)
Nadeem Vawda33c34da2012-06-04 23:34:07 +0200831 with LZMAFile(BytesIO(COMPRESSED_XZ)) as f:
Nadeem Vawda3ff069e2011-11-30 00:25:06 +0200832 self.assertRaises(TypeError, f.read, None)
833
Nadeem Vawda9c72ebc2013-12-04 23:03:49 +0100834 def test_read_bad_data(self):
835 with LZMAFile(BytesIO(COMPRESSED_BOGUS)) as f:
836 self.assertRaises(LZMAError, f.read)
837
Nadeem Vawda3ff069e2011-11-30 00:25:06 +0200838 def test_read1(self):
Nadeem Vawda33c34da2012-06-04 23:34:07 +0200839 with LZMAFile(BytesIO(COMPRESSED_XZ)) as f:
Nadeem Vawda3ff069e2011-11-30 00:25:06 +0200840 blocks = []
841 while True:
842 result = f.read1()
843 if not result:
844 break
845 blocks.append(result)
846 self.assertEqual(b"".join(blocks), INPUT)
847 self.assertEqual(f.read1(), b"")
848
849 def test_read1_0(self):
Nadeem Vawda33c34da2012-06-04 23:34:07 +0200850 with LZMAFile(BytesIO(COMPRESSED_XZ)) as f:
Nadeem Vawda3ff069e2011-11-30 00:25:06 +0200851 self.assertEqual(f.read1(0), b"")
852
853 def test_read1_10(self):
Nadeem Vawda33c34da2012-06-04 23:34:07 +0200854 with LZMAFile(BytesIO(COMPRESSED_XZ)) as f:
Nadeem Vawda3ff069e2011-11-30 00:25:06 +0200855 blocks = []
856 while True:
857 result = f.read1(10)
858 if not result:
859 break
860 blocks.append(result)
861 self.assertEqual(b"".join(blocks), INPUT)
862 self.assertEqual(f.read1(), b"")
863
864 def test_read1_multistream(self):
Nadeem Vawda33c34da2012-06-04 23:34:07 +0200865 with LZMAFile(BytesIO(COMPRESSED_XZ * 5)) as f:
Nadeem Vawda3ff069e2011-11-30 00:25:06 +0200866 blocks = []
867 while True:
868 result = f.read1()
869 if not result:
870 break
871 blocks.append(result)
872 self.assertEqual(b"".join(blocks), INPUT * 5)
873 self.assertEqual(f.read1(), b"")
874
875 def test_read1_bad_args(self):
Nadeem Vawda33c34da2012-06-04 23:34:07 +0200876 f = LZMAFile(BytesIO(COMPRESSED_XZ))
Nadeem Vawda3ff069e2011-11-30 00:25:06 +0200877 f.close()
878 self.assertRaises(ValueError, f.read1)
Nadeem Vawda33c34da2012-06-04 23:34:07 +0200879 with LZMAFile(BytesIO(), "w") as f:
Nadeem Vawda3ff069e2011-11-30 00:25:06 +0200880 self.assertRaises(ValueError, f.read1)
Nadeem Vawda33c34da2012-06-04 23:34:07 +0200881 with LZMAFile(BytesIO(COMPRESSED_XZ)) as f:
Nadeem Vawda3ff069e2011-11-30 00:25:06 +0200882 self.assertRaises(TypeError, f.read1, None)
883
884 def test_peek(self):
Nadeem Vawda33c34da2012-06-04 23:34:07 +0200885 with LZMAFile(BytesIO(COMPRESSED_XZ)) as f:
Nadeem Vawda3ff069e2011-11-30 00:25:06 +0200886 result = f.peek()
887 self.assertGreater(len(result), 0)
888 self.assertTrue(INPUT.startswith(result))
889 self.assertEqual(f.read(), INPUT)
Nadeem Vawda33c34da2012-06-04 23:34:07 +0200890 with LZMAFile(BytesIO(COMPRESSED_XZ)) as f:
Nadeem Vawda3ff069e2011-11-30 00:25:06 +0200891 result = f.peek(10)
892 self.assertGreater(len(result), 0)
893 self.assertTrue(INPUT.startswith(result))
894 self.assertEqual(f.read(), INPUT)
895
896 def test_peek_bad_args(self):
Nadeem Vawda33c34da2012-06-04 23:34:07 +0200897 with LZMAFile(BytesIO(), "w") as f:
Nadeem Vawda3ff069e2011-11-30 00:25:06 +0200898 self.assertRaises(ValueError, f.peek)
899
900 def test_iterator(self):
901 with BytesIO(INPUT) as f:
902 lines = f.readlines()
Nadeem Vawda33c34da2012-06-04 23:34:07 +0200903 with LZMAFile(BytesIO(COMPRESSED_XZ)) as f:
Nadeem Vawda3ff069e2011-11-30 00:25:06 +0200904 self.assertListEqual(list(iter(f)), lines)
Nadeem Vawda33c34da2012-06-04 23:34:07 +0200905 with LZMAFile(BytesIO(COMPRESSED_ALONE)) as f:
Nadeem Vawda3ff069e2011-11-30 00:25:06 +0200906 self.assertListEqual(list(iter(f)), lines)
Nadeem Vawda33c34da2012-06-04 23:34:07 +0200907 with LZMAFile(BytesIO(COMPRESSED_XZ), format=lzma.FORMAT_XZ) as f:
Nadeem Vawda3ff069e2011-11-30 00:25:06 +0200908 self.assertListEqual(list(iter(f)), lines)
Nadeem Vawda33c34da2012-06-04 23:34:07 +0200909 with LZMAFile(BytesIO(COMPRESSED_ALONE), format=lzma.FORMAT_ALONE) as f:
Nadeem Vawda3ff069e2011-11-30 00:25:06 +0200910 self.assertListEqual(list(iter(f)), lines)
Nadeem Vawda33c34da2012-06-04 23:34:07 +0200911 with LZMAFile(BytesIO(COMPRESSED_RAW_2),
Nadeem Vawda3ff069e2011-11-30 00:25:06 +0200912 format=lzma.FORMAT_RAW, filters=FILTERS_RAW_2) as f:
913 self.assertListEqual(list(iter(f)), lines)
914
915 def test_readline(self):
916 with BytesIO(INPUT) as f:
917 lines = f.readlines()
Nadeem Vawda33c34da2012-06-04 23:34:07 +0200918 with LZMAFile(BytesIO(COMPRESSED_XZ)) as f:
Nadeem Vawda3ff069e2011-11-30 00:25:06 +0200919 for line in lines:
920 self.assertEqual(f.readline(), line)
921
922 def test_readlines(self):
923 with BytesIO(INPUT) as f:
924 lines = f.readlines()
Nadeem Vawda33c34da2012-06-04 23:34:07 +0200925 with LZMAFile(BytesIO(COMPRESSED_XZ)) as f:
Nadeem Vawda3ff069e2011-11-30 00:25:06 +0200926 self.assertListEqual(f.readlines(), lines)
927
928 def test_write(self):
929 with BytesIO() as dst:
Nadeem Vawda33c34da2012-06-04 23:34:07 +0200930 with LZMAFile(dst, "w") as f:
Nadeem Vawda3ff069e2011-11-30 00:25:06 +0200931 f.write(INPUT)
932 expected = lzma.compress(INPUT)
933 self.assertEqual(dst.getvalue(), expected)
934 with BytesIO() as dst:
Nadeem Vawda33c34da2012-06-04 23:34:07 +0200935 with LZMAFile(dst, "w", format=lzma.FORMAT_XZ) as f:
Nadeem Vawda3ff069e2011-11-30 00:25:06 +0200936 f.write(INPUT)
937 expected = lzma.compress(INPUT, format=lzma.FORMAT_XZ)
938 self.assertEqual(dst.getvalue(), expected)
939 with BytesIO() as dst:
Nadeem Vawda33c34da2012-06-04 23:34:07 +0200940 with LZMAFile(dst, "w", format=lzma.FORMAT_ALONE) as f:
Nadeem Vawda3ff069e2011-11-30 00:25:06 +0200941 f.write(INPUT)
942 expected = lzma.compress(INPUT, format=lzma.FORMAT_ALONE)
943 self.assertEqual(dst.getvalue(), expected)
944 with BytesIO() as dst:
Nadeem Vawda33c34da2012-06-04 23:34:07 +0200945 with LZMAFile(dst, "w", format=lzma.FORMAT_RAW,
Nadeem Vawda3ff069e2011-11-30 00:25:06 +0200946 filters=FILTERS_RAW_2) as f:
947 f.write(INPUT)
948 expected = lzma.compress(INPUT, format=lzma.FORMAT_RAW,
949 filters=FILTERS_RAW_2)
950 self.assertEqual(dst.getvalue(), expected)
951
952 def test_write_10(self):
953 with BytesIO() as dst:
Nadeem Vawda33c34da2012-06-04 23:34:07 +0200954 with LZMAFile(dst, "w") as f:
Nadeem Vawda3ff069e2011-11-30 00:25:06 +0200955 for start in range(0, len(INPUT), 10):
956 f.write(INPUT[start:start+10])
957 expected = lzma.compress(INPUT)
958 self.assertEqual(dst.getvalue(), expected)
959
960 def test_write_append(self):
961 part1 = INPUT[:1024]
962 part2 = INPUT[1024:1536]
963 part3 = INPUT[1536:]
964 expected = b"".join(lzma.compress(x) for x in (part1, part2, part3))
965 with BytesIO() as dst:
Nadeem Vawda33c34da2012-06-04 23:34:07 +0200966 with LZMAFile(dst, "w") as f:
Nadeem Vawda3ff069e2011-11-30 00:25:06 +0200967 f.write(part1)
Nadeem Vawda33c34da2012-06-04 23:34:07 +0200968 with LZMAFile(dst, "a") as f:
Nadeem Vawda3ff069e2011-11-30 00:25:06 +0200969 f.write(part2)
Nadeem Vawda33c34da2012-06-04 23:34:07 +0200970 with LZMAFile(dst, "a") as f:
Nadeem Vawda3ff069e2011-11-30 00:25:06 +0200971 f.write(part3)
972 self.assertEqual(dst.getvalue(), expected)
973
974 def test_write_to_file(self):
975 try:
976 with LZMAFile(TESTFN, "w") as f:
977 f.write(INPUT)
978 expected = lzma.compress(INPUT)
979 with open(TESTFN, "rb") as f:
980 self.assertEqual(f.read(), expected)
981 finally:
982 unlink(TESTFN)
983
Nadeem Vawda10c87912012-06-20 01:48:50 +0200984 def test_write_to_file_with_bytes_filename(self):
985 try:
986 bytes_filename = TESTFN.encode("ascii")
987 except UnicodeEncodeError:
988 self.skipTest("Temporary file name needs to be ASCII")
989 try:
990 with LZMAFile(bytes_filename, "w") as f:
991 f.write(INPUT)
992 expected = lzma.compress(INPUT)
993 with open(TESTFN, "rb") as f:
994 self.assertEqual(f.read(), expected)
995 finally:
996 unlink(TESTFN)
997
Nadeem Vawda3ff069e2011-11-30 00:25:06 +0200998 def test_write_append_to_file(self):
999 part1 = INPUT[:1024]
1000 part2 = INPUT[1024:1536]
1001 part3 = INPUT[1536:]
1002 expected = b"".join(lzma.compress(x) for x in (part1, part2, part3))
1003 try:
1004 with LZMAFile(TESTFN, "w") as f:
1005 f.write(part1)
1006 with LZMAFile(TESTFN, "a") as f:
1007 f.write(part2)
1008 with LZMAFile(TESTFN, "a") as f:
1009 f.write(part3)
1010 with open(TESTFN, "rb") as f:
1011 self.assertEqual(f.read(), expected)
1012 finally:
1013 unlink(TESTFN)
1014
1015 def test_write_bad_args(self):
Nadeem Vawda33c34da2012-06-04 23:34:07 +02001016 f = LZMAFile(BytesIO(), "w")
Nadeem Vawda3ff069e2011-11-30 00:25:06 +02001017 f.close()
1018 self.assertRaises(ValueError, f.write, b"foo")
Nadeem Vawda33c34da2012-06-04 23:34:07 +02001019 with LZMAFile(BytesIO(COMPRESSED_XZ), "r") as f:
Nadeem Vawda3ff069e2011-11-30 00:25:06 +02001020 self.assertRaises(ValueError, f.write, b"bar")
Nadeem Vawda33c34da2012-06-04 23:34:07 +02001021 with LZMAFile(BytesIO(), "w") as f:
Nadeem Vawda3ff069e2011-11-30 00:25:06 +02001022 self.assertRaises(TypeError, f.write, None)
1023 self.assertRaises(TypeError, f.write, "text")
1024 self.assertRaises(TypeError, f.write, 789)
1025
1026 def test_writelines(self):
1027 with BytesIO(INPUT) as f:
1028 lines = f.readlines()
1029 with BytesIO() as dst:
Nadeem Vawda33c34da2012-06-04 23:34:07 +02001030 with LZMAFile(dst, "w") as f:
Nadeem Vawda3ff069e2011-11-30 00:25:06 +02001031 f.writelines(lines)
1032 expected = lzma.compress(INPUT)
1033 self.assertEqual(dst.getvalue(), expected)
1034
1035 def test_seek_forward(self):
Nadeem Vawda33c34da2012-06-04 23:34:07 +02001036 with LZMAFile(BytesIO(COMPRESSED_XZ)) as f:
Nadeem Vawda3ff069e2011-11-30 00:25:06 +02001037 f.seek(555)
1038 self.assertEqual(f.read(), INPUT[555:])
1039
1040 def test_seek_forward_across_streams(self):
Nadeem Vawda33c34da2012-06-04 23:34:07 +02001041 with LZMAFile(BytesIO(COMPRESSED_XZ * 2)) as f:
Nadeem Vawda3ff069e2011-11-30 00:25:06 +02001042 f.seek(len(INPUT) + 123)
1043 self.assertEqual(f.read(), INPUT[123:])
1044
1045 def test_seek_forward_relative_to_current(self):
Nadeem Vawda33c34da2012-06-04 23:34:07 +02001046 with LZMAFile(BytesIO(COMPRESSED_XZ)) as f:
Nadeem Vawda3ff069e2011-11-30 00:25:06 +02001047 f.read(100)
1048 f.seek(1236, 1)
1049 self.assertEqual(f.read(), INPUT[1336:])
1050
1051 def test_seek_forward_relative_to_end(self):
Nadeem Vawda33c34da2012-06-04 23:34:07 +02001052 with LZMAFile(BytesIO(COMPRESSED_XZ)) as f:
Nadeem Vawda3ff069e2011-11-30 00:25:06 +02001053 f.seek(-555, 2)
1054 self.assertEqual(f.read(), INPUT[-555:])
1055
1056 def test_seek_backward(self):
Nadeem Vawda33c34da2012-06-04 23:34:07 +02001057 with LZMAFile(BytesIO(COMPRESSED_XZ)) as f:
Nadeem Vawda3ff069e2011-11-30 00:25:06 +02001058 f.read(1001)
1059 f.seek(211)
1060 self.assertEqual(f.read(), INPUT[211:])
1061
1062 def test_seek_backward_across_streams(self):
Nadeem Vawda33c34da2012-06-04 23:34:07 +02001063 with LZMAFile(BytesIO(COMPRESSED_XZ * 2)) as f:
Nadeem Vawda3ff069e2011-11-30 00:25:06 +02001064 f.read(len(INPUT) + 333)
1065 f.seek(737)
1066 self.assertEqual(f.read(), INPUT[737:] + INPUT)
1067
1068 def test_seek_backward_relative_to_end(self):
Nadeem Vawda33c34da2012-06-04 23:34:07 +02001069 with LZMAFile(BytesIO(COMPRESSED_XZ)) as f:
Nadeem Vawda3ff069e2011-11-30 00:25:06 +02001070 f.seek(-150, 2)
1071 self.assertEqual(f.read(), INPUT[-150:])
1072
1073 def test_seek_past_end(self):
Nadeem Vawda33c34da2012-06-04 23:34:07 +02001074 with LZMAFile(BytesIO(COMPRESSED_XZ)) as f:
Nadeem Vawda3ff069e2011-11-30 00:25:06 +02001075 f.seek(len(INPUT) + 9001)
1076 self.assertEqual(f.tell(), len(INPUT))
1077 self.assertEqual(f.read(), b"")
1078
1079 def test_seek_past_start(self):
Nadeem Vawda33c34da2012-06-04 23:34:07 +02001080 with LZMAFile(BytesIO(COMPRESSED_XZ)) as f:
Nadeem Vawda3ff069e2011-11-30 00:25:06 +02001081 f.seek(-88)
1082 self.assertEqual(f.tell(), 0)
1083 self.assertEqual(f.read(), INPUT)
1084
1085 def test_seek_bad_args(self):
Nadeem Vawda33c34da2012-06-04 23:34:07 +02001086 f = LZMAFile(BytesIO(COMPRESSED_XZ))
Nadeem Vawda3ff069e2011-11-30 00:25:06 +02001087 f.close()
1088 self.assertRaises(ValueError, f.seek, 0)
Nadeem Vawda33c34da2012-06-04 23:34:07 +02001089 with LZMAFile(BytesIO(), "w") as f:
Nadeem Vawda3ff069e2011-11-30 00:25:06 +02001090 self.assertRaises(ValueError, f.seek, 0)
Nadeem Vawda33c34da2012-06-04 23:34:07 +02001091 with LZMAFile(BytesIO(COMPRESSED_XZ)) as f:
Nadeem Vawda3ff069e2011-11-30 00:25:06 +02001092 self.assertRaises(ValueError, f.seek, 0, 3)
1093 self.assertRaises(ValueError, f.seek, 9, ())
1094 self.assertRaises(TypeError, f.seek, None)
1095 self.assertRaises(TypeError, f.seek, b"derp")
1096
1097 def test_tell(self):
Nadeem Vawda33c34da2012-06-04 23:34:07 +02001098 with LZMAFile(BytesIO(COMPRESSED_XZ)) as f:
Nadeem Vawda3ff069e2011-11-30 00:25:06 +02001099 pos = 0
1100 while True:
1101 self.assertEqual(f.tell(), pos)
1102 result = f.read(183)
1103 if not result:
1104 break
1105 pos += len(result)
1106 self.assertEqual(f.tell(), len(INPUT))
Nadeem Vawda33c34da2012-06-04 23:34:07 +02001107 with LZMAFile(BytesIO(), "w") as f:
Nadeem Vawda3ff069e2011-11-30 00:25:06 +02001108 for pos in range(0, len(INPUT), 144):
1109 self.assertEqual(f.tell(), pos)
1110 f.write(INPUT[pos:pos+144])
1111 self.assertEqual(f.tell(), len(INPUT))
1112
1113 def test_tell_bad_args(self):
Nadeem Vawda33c34da2012-06-04 23:34:07 +02001114 f = LZMAFile(BytesIO(COMPRESSED_XZ))
Nadeem Vawda3ff069e2011-11-30 00:25:06 +02001115 f.close()
1116 self.assertRaises(ValueError, f.tell)
1117
1118
Nadeem Vawdae8604042012-06-04 23:38:12 +02001119class OpenTestCase(unittest.TestCase):
1120
1121 def test_binary_modes(self):
1122 with lzma.open(BytesIO(COMPRESSED_XZ), "rb") as f:
1123 self.assertEqual(f.read(), INPUT)
1124 with BytesIO() as bio:
1125 with lzma.open(bio, "wb") as f:
1126 f.write(INPUT)
1127 file_data = lzma.decompress(bio.getvalue())
1128 self.assertEqual(file_data, INPUT)
1129 with lzma.open(bio, "ab") as f:
1130 f.write(INPUT)
1131 file_data = lzma.decompress(bio.getvalue())
1132 self.assertEqual(file_data, INPUT * 2)
1133
1134 def test_text_modes(self):
1135 uncompressed = INPUT.decode("ascii")
1136 uncompressed_raw = uncompressed.replace("\n", os.linesep)
1137 with lzma.open(BytesIO(COMPRESSED_XZ), "rt") as f:
1138 self.assertEqual(f.read(), uncompressed)
1139 with BytesIO() as bio:
1140 with lzma.open(bio, "wt") as f:
1141 f.write(uncompressed)
1142 file_data = lzma.decompress(bio.getvalue()).decode("ascii")
1143 self.assertEqual(file_data, uncompressed_raw)
1144 with lzma.open(bio, "at") as f:
1145 f.write(uncompressed)
1146 file_data = lzma.decompress(bio.getvalue()).decode("ascii")
1147 self.assertEqual(file_data, uncompressed_raw * 2)
1148
1149 def test_filename(self):
1150 with TempFile(TESTFN):
1151 with lzma.open(TESTFN, "wb") as f:
1152 f.write(INPUT)
1153 with open(TESTFN, "rb") as f:
1154 file_data = lzma.decompress(f.read())
1155 self.assertEqual(file_data, INPUT)
1156 with lzma.open(TESTFN, "rb") as f:
1157 self.assertEqual(f.read(), INPUT)
1158 with lzma.open(TESTFN, "ab") as f:
1159 f.write(INPUT)
1160 with lzma.open(TESTFN, "rb") as f:
1161 self.assertEqual(f.read(), INPUT * 2)
1162
1163 def test_bad_params(self):
1164 # Test invalid parameter combinations.
1165 with self.assertRaises(ValueError):
1166 lzma.open(TESTFN, "")
1167 with self.assertRaises(ValueError):
Nadeem Vawdae8604042012-06-04 23:38:12 +02001168 lzma.open(TESTFN, "rbt")
1169 with self.assertRaises(ValueError):
1170 lzma.open(TESTFN, "rb", encoding="utf-8")
1171 with self.assertRaises(ValueError):
1172 lzma.open(TESTFN, "rb", errors="ignore")
1173 with self.assertRaises(ValueError):
1174 lzma.open(TESTFN, "rb", newline="\n")
1175
1176 def test_format_and_filters(self):
1177 # Test non-default format and filter chain.
1178 options = {"format": lzma.FORMAT_RAW, "filters": FILTERS_RAW_1}
1179 with lzma.open(BytesIO(COMPRESSED_RAW_1), "rb", **options) as f:
1180 self.assertEqual(f.read(), INPUT)
1181 with BytesIO() as bio:
1182 with lzma.open(bio, "wb", **options) as f:
1183 f.write(INPUT)
1184 file_data = lzma.decompress(bio.getvalue(), **options)
1185 self.assertEqual(file_data, INPUT)
1186
1187 def test_encoding(self):
1188 # Test non-default encoding.
1189 uncompressed = INPUT.decode("ascii")
1190 uncompressed_raw = uncompressed.replace("\n", os.linesep)
1191 with BytesIO() as bio:
1192 with lzma.open(bio, "wt", encoding="utf-16-le") as f:
1193 f.write(uncompressed)
1194 file_data = lzma.decompress(bio.getvalue()).decode("utf-16-le")
1195 self.assertEqual(file_data, uncompressed_raw)
1196 bio.seek(0)
1197 with lzma.open(bio, "rt", encoding="utf-16-le") as f:
1198 self.assertEqual(f.read(), uncompressed)
1199
1200 def test_encoding_error_handler(self):
1201 # Test wih non-default encoding error handler.
1202 with BytesIO(lzma.compress(b"foo\xffbar")) as bio:
1203 with lzma.open(bio, "rt", encoding="ascii", errors="ignore") as f:
1204 self.assertEqual(f.read(), "foobar")
1205
1206 def test_newline(self):
1207 # Test with explicit newline (universal newline mode disabled).
1208 text = INPUT.decode("ascii")
1209 with BytesIO() as bio:
1210 with lzma.open(bio, "wt", newline="\n") as f:
1211 f.write(text)
1212 bio.seek(0)
1213 with lzma.open(bio, "rt", newline="\r") as f:
1214 self.assertEqual(f.readlines(), [text])
1215
Nadeem Vawda42ca9822013-10-19 00:06:19 +02001216 def test_x_mode(self):
1217 self.addCleanup(unlink, TESTFN)
1218 for mode in ("x", "xb", "xt"):
1219 unlink(TESTFN)
1220 with lzma.open(TESTFN, mode):
1221 pass
1222 with self.assertRaises(FileExistsError):
1223 with lzma.open(TESTFN, mode):
1224 pass
1225
Nadeem Vawdae8604042012-06-04 23:38:12 +02001226
Nadeem Vawda3ff069e2011-11-30 00:25:06 +02001227class MiscellaneousTestCase(unittest.TestCase):
1228
1229 def test_is_check_supported(self):
1230 # CHECK_NONE and CHECK_CRC32 should always be supported,
1231 # regardless of the options liblzma was compiled with.
Nadeem Vawdabc459bb2012-05-06 23:01:51 +02001232 self.assertTrue(lzma.is_check_supported(lzma.CHECK_NONE))
1233 self.assertTrue(lzma.is_check_supported(lzma.CHECK_CRC32))
Nadeem Vawda3ff069e2011-11-30 00:25:06 +02001234
1235 # The .xz format spec cannot store check IDs above this value.
Nadeem Vawdabc459bb2012-05-06 23:01:51 +02001236 self.assertFalse(lzma.is_check_supported(lzma.CHECK_ID_MAX + 1))
Nadeem Vawda3ff069e2011-11-30 00:25:06 +02001237
1238 # This value should not be a valid check ID.
Nadeem Vawdabc459bb2012-05-06 23:01:51 +02001239 self.assertFalse(lzma.is_check_supported(lzma.CHECK_UNKNOWN))
Nadeem Vawda3ff069e2011-11-30 00:25:06 +02001240
Nadeem Vawdaa425c3d2012-06-21 23:36:48 +02001241 def test__encode_filter_properties(self):
Nadeem Vawdaf55b3292012-05-06 23:01:27 +02001242 with self.assertRaises(TypeError):
Nadeem Vawdaa425c3d2012-06-21 23:36:48 +02001243 lzma._encode_filter_properties(b"not a dict")
Nadeem Vawdaf55b3292012-05-06 23:01:27 +02001244 with self.assertRaises(ValueError):
Nadeem Vawdaa425c3d2012-06-21 23:36:48 +02001245 lzma._encode_filter_properties({"id": 0x100})
Nadeem Vawdaf55b3292012-05-06 23:01:27 +02001246 with self.assertRaises(ValueError):
Nadeem Vawdaa425c3d2012-06-21 23:36:48 +02001247 lzma._encode_filter_properties({"id": lzma.FILTER_LZMA2, "junk": 12})
Nadeem Vawdaf55b3292012-05-06 23:01:27 +02001248 with self.assertRaises(lzma.LZMAError):
Nadeem Vawdaa425c3d2012-06-21 23:36:48 +02001249 lzma._encode_filter_properties({"id": lzma.FILTER_DELTA,
Nadeem Vawdaf55b3292012-05-06 23:01:27 +02001250 "dist": 9001})
1251
1252 # Test with parameters used by zipfile module.
Nadeem Vawdaa425c3d2012-06-21 23:36:48 +02001253 props = lzma._encode_filter_properties({
Nadeem Vawdaf55b3292012-05-06 23:01:27 +02001254 "id": lzma.FILTER_LZMA1,
1255 "pb": 2,
1256 "lp": 0,
1257 "lc": 3,
1258 "dict_size": 8 << 20,
1259 })
1260 self.assertEqual(props, b"]\x00\x00\x80\x00")
1261
Nadeem Vawdaa425c3d2012-06-21 23:36:48 +02001262 def test__decode_filter_properties(self):
Nadeem Vawdaf55b3292012-05-06 23:01:27 +02001263 with self.assertRaises(TypeError):
Nadeem Vawdaa425c3d2012-06-21 23:36:48 +02001264 lzma._decode_filter_properties(lzma.FILTER_X86, {"should be": bytes})
Nadeem Vawdaf55b3292012-05-06 23:01:27 +02001265 with self.assertRaises(lzma.LZMAError):
Nadeem Vawdaa425c3d2012-06-21 23:36:48 +02001266 lzma._decode_filter_properties(lzma.FILTER_DELTA, b"too long")
Nadeem Vawdaf55b3292012-05-06 23:01:27 +02001267
1268 # Test with parameters used by zipfile module.
Nadeem Vawdaa425c3d2012-06-21 23:36:48 +02001269 filterspec = lzma._decode_filter_properties(
Nadeem Vawdaf55b3292012-05-06 23:01:27 +02001270 lzma.FILTER_LZMA1, b"]\x00\x00\x80\x00")
1271 self.assertEqual(filterspec["id"], lzma.FILTER_LZMA1)
1272 self.assertEqual(filterspec["pb"], 2)
1273 self.assertEqual(filterspec["lp"], 0)
1274 self.assertEqual(filterspec["lc"], 3)
1275 self.assertEqual(filterspec["dict_size"], 8 << 20)
1276
1277 def test_filter_properties_roundtrip(self):
Nadeem Vawdaa425c3d2012-06-21 23:36:48 +02001278 spec1 = lzma._decode_filter_properties(
Nadeem Vawdaf55b3292012-05-06 23:01:27 +02001279 lzma.FILTER_LZMA1, b"]\x00\x00\x80\x00")
Nadeem Vawdaa425c3d2012-06-21 23:36:48 +02001280 reencoded = lzma._encode_filter_properties(spec1)
1281 spec2 = lzma._decode_filter_properties(lzma.FILTER_LZMA1, reencoded)
Nadeem Vawdaf55b3292012-05-06 23:01:27 +02001282 self.assertEqual(spec1, spec2)
1283
Nadeem Vawda3ff069e2011-11-30 00:25:06 +02001284
1285# Test data:
1286
1287INPUT = b"""
1288LAERTES
1289
1290 O, fear me not.
1291 I stay too long: but here my father comes.
1292
1293 Enter POLONIUS
1294
1295 A double blessing is a double grace,
1296 Occasion smiles upon a second leave.
1297
1298LORD POLONIUS
1299
1300 Yet here, Laertes! aboard, aboard, for shame!
1301 The wind sits in the shoulder of your sail,
1302 And you are stay'd for. There; my blessing with thee!
1303 And these few precepts in thy memory
1304 See thou character. Give thy thoughts no tongue,
1305 Nor any unproportioned thought his act.
1306 Be thou familiar, but by no means vulgar.
1307 Those friends thou hast, and their adoption tried,
1308 Grapple them to thy soul with hoops of steel;
1309 But do not dull thy palm with entertainment
1310 Of each new-hatch'd, unfledged comrade. Beware
1311 Of entrance to a quarrel, but being in,
1312 Bear't that the opposed may beware of thee.
1313 Give every man thy ear, but few thy voice;
1314 Take each man's censure, but reserve thy judgment.
1315 Costly thy habit as thy purse can buy,
1316 But not express'd in fancy; rich, not gaudy;
1317 For the apparel oft proclaims the man,
1318 And they in France of the best rank and station
1319 Are of a most select and generous chief in that.
1320 Neither a borrower nor a lender be;
1321 For loan oft loses both itself and friend,
1322 And borrowing dulls the edge of husbandry.
1323 This above all: to thine ownself be true,
1324 And it must follow, as the night the day,
1325 Thou canst not then be false to any man.
1326 Farewell: my blessing season this in thee!
1327
1328LAERTES
1329
1330 Most humbly do I take my leave, my lord.
1331
1332LORD POLONIUS
1333
1334 The time invites you; go; your servants tend.
1335
1336LAERTES
1337
1338 Farewell, Ophelia; and remember well
1339 What I have said to you.
1340
1341OPHELIA
1342
1343 'Tis in my memory lock'd,
1344 And you yourself shall keep the key of it.
1345
1346LAERTES
1347
1348 Farewell.
1349"""
1350
Nadeem Vawda9c72ebc2013-12-04 23:03:49 +01001351COMPRESSED_BOGUS = b"this is not a valid lzma stream"
1352
Nadeem Vawda3ff069e2011-11-30 00:25:06 +02001353COMPRESSED_XZ = (
1354 b"\xfd7zXZ\x00\x00\x04\xe6\xd6\xb4F\x02\x00!\x01\x16\x00\x00\x00t/\xe5\xa3"
1355 b"\xe0\x07\x80\x03\xdf]\x00\x05\x14\x07bX\x19\xcd\xddn\x98\x15\xe4\xb4\x9d"
1356 b"o\x1d\xc4\xe5\n\x03\xcc2h\xc7\\\x86\xff\xf8\xe2\xfc\xe7\xd9\xfe6\xb8("
1357 b"\xa8wd\xc2\"u.n\x1e\xc3\xf2\x8e\x8d\x8f\x02\x17/\xa6=\xf0\xa2\xdf/M\x89"
1358 b"\xbe\xde\xa7\x1cz\x18-]\xd5\xef\x13\x8frZ\x15\x80\x8c\xf8\x8do\xfa\x12"
1359 b"\x9b#z/\xef\xf0\xfaF\x01\x82\xa3M\x8e\xa1t\xca6 BF$\xe5Q\xa4\x98\xee\xde"
1360 b"l\xe8\x7f\xf0\x9d,bn\x0b\x13\xd4\xa8\x81\xe4N\xc8\x86\x153\xf5x2\xa2O"
1361 b"\x13@Q\xa1\x00/\xa5\xd0O\x97\xdco\xae\xf7z\xc4\xcdS\xb6t<\x16\xf2\x9cI#"
1362 b"\x89ud\xc66Y\xd9\xee\xe6\xce\x12]\xe5\xf0\xaa\x96-Pe\xade:\x04\t\x1b\xf7"
1363 b"\xdb7\n\x86\x1fp\xc8J\xba\xf4\xf0V\xa9\xdc\xf0\x02%G\xf9\xdf=?\x15\x1b"
1364 b"\xe1(\xce\x82=\xd6I\xac3\x12\x0cR\xb7\xae\r\xb1i\x03\x95\x01\xbd\xbe\xfa"
1365 b"\x02s\x01P\x9d\x96X\xb12j\xc8L\xa8\x84b\xf6\xc3\xd4c-H\x93oJl\xd0iQ\xe4k"
1366 b"\x84\x0b\xc1\xb7\xbc\xb1\x17\x88\xb1\xca?@\xf6\x07\xea\xe6x\xf1H12P\x0f"
1367 b"\x8a\xc9\xeauw\xe3\xbe\xaai\xa9W\xd0\x80\xcd#cb5\x99\xd8]\xa9d\x0c\xbd"
1368 b"\xa2\xdcWl\xedUG\xbf\x89yF\xf77\x81v\xbd5\x98\xbeh8\x18W\x08\xf0\x1b\x99"
1369 b"5:\x1a?rD\x96\xa1\x04\x0f\xae\xba\x85\xeb\x9d5@\xf5\x83\xd37\x83\x8ac"
1370 b"\x06\xd4\x97i\xcdt\x16S\x82k\xf6K\x01vy\x88\x91\x9b6T\xdae\r\xfd]:k\xbal"
1371 b"\xa9\xbba\xc34\xf9r\xeb}r\xdb\xc7\xdb*\x8f\x03z\xdc8h\xcc\xc9\xd3\xbcl"
1372 b"\xa5-\xcb\xeaK\xa2\xc5\x15\xc0\xe3\xc1\x86Z\xfb\xebL\xe13\xcf\x9c\xe3"
1373 b"\x1d\xc9\xed\xc2\x06\xcc\xce!\x92\xe5\xfe\x9c^\xa59w \x9bP\xa3PK\x08d"
1374 b"\xf9\xe2Z}\xa7\xbf\xed\xeb%$\x0c\x82\xb8/\xb0\x01\xa9&,\xf7qh{Q\x96)\xf2"
1375 b"q\x96\xc3\x80\xb4\x12\xb0\xba\xe6o\xf4!\xb4[\xd4\x8aw\x10\xf7t\x0c\xb3"
1376 b"\xd9\xd5\xc3`^\x81\x11??\\\xa4\x99\x85R\xd4\x8e\x83\xc9\x1eX\xbfa\xf1"
1377 b"\xac\xb0\xea\xea\xd7\xd0\xab\x18\xe2\xf2\xed\xe1\xb7\xc9\x18\xcbS\xe4>"
1378 b"\xc9\x95H\xe8\xcb\t\r%\xeb\xc7$.o\xf1\xf3R\x17\x1db\xbb\xd8U\xa5^\xccS"
1379 b"\x16\x01\x87\xf3/\x93\xd1\xf0v\xc0r\xd7\xcc\xa2Gkz\xca\x80\x0e\xfd\xd0"
1380 b"\x8b\xbb\xd2Ix\xb3\x1ey\xca-0\xe3z^\xd6\xd6\x8f_\xf1\x9dP\x9fi\xa7\xd1"
1381 b"\xe8\x90\x84\xdc\xbf\xcdky\x8e\xdc\x81\x7f\xa3\xb2+\xbf\x04\xef\xd8\\"
1382 b"\xc4\xdf\xe1\xb0\x01\xe9\x93\xe3Y\xf1\x1dY\xe8h\x81\xcf\xf1w\xcc\xb4\xef"
1383 b" \x8b|\x04\xea\x83ej\xbe\x1f\xd4z\x9c`\xd3\x1a\x92A\x06\xe5\x8f\xa9\x13"
1384 b"\t\x9e=\xfa\x1c\xe5_\x9f%v\x1bo\x11ZO\xd8\xf4\t\xddM\x16-\x04\xfc\x18<\""
1385 b"CM\xddg~b\xf6\xef\x8e\x0c\xd0\xde|\xa0'\x8a\x0c\xd6x\xae!J\xa6F\x88\x15u"
1386 b"\x008\x17\xbc7y\xb3\xd8u\xac_\x85\x8d\xe7\xc1@\x9c\xecqc\xa3#\xad\xf1"
1387 b"\x935\xb5)_\r\xec3]\x0fo]5\xd0my\x07\x9b\xee\x81\xb5\x0f\xcfK+\x00\xc0"
1388 b"\xe4b\x10\xe4\x0c\x1a \x9b\xe0\x97t\xf6\xa1\x9e\x850\xba\x0c\x9a\x8d\xc8"
1389 b"\x8f\x07\xd7\xae\xc8\xf9+i\xdc\xb9k\xb0>f\x19\xb8\r\xa8\xf8\x1f$\xa5{p"
1390 b"\xc6\x880\xce\xdb\xcf\xca_\x86\xac\x88h6\x8bZ%'\xd0\n\xbf\x0f\x9c\"\xba"
1391 b"\xe5\x86\x9f\x0f7X=mNX[\xcc\x19FU\xc9\x860\xbc\x90a+* \xae_$\x03\x1e\xd3"
1392 b"\xcd_\xa0\x9c\xde\xaf46q\xa5\xc9\x92\xd7\xca\xe3`\x9d\x85}\xb4\xff\xb3"
1393 b"\x83\xfb\xb6\xca\xae`\x0bw\x7f\xfc\xd8\xacVe\x19\xc8\x17\x0bZ\xad\x88"
1394 b"\xeb#\x97\x03\x13\xb1d\x0f{\x0c\x04w\x07\r\x97\xbd\xd6\xc1\xc3B:\x95\x08"
1395 b"^\x10V\xaeaH\x02\xd9\xe3\n\\\x01X\xf6\x9c\x8a\x06u#%\xbe*\xa1\x18v\x85"
1396 b"\xec!\t4\x00\x00\x00\x00Vj?uLU\xf3\xa6\x00\x01\xfb\x07\x81\x0f\x00\x00tw"
1397 b"\x99P\xb1\xc4g\xfb\x02\x00\x00\x00\x00\x04YZ"
1398)
1399
1400COMPRESSED_ALONE = (
1401 b"]\x00\x00\x80\x00\xff\xff\xff\xff\xff\xff\xff\xff\x00\x05\x14\x07bX\x19"
1402 b"\xcd\xddn\x98\x15\xe4\xb4\x9do\x1d\xc4\xe5\n\x03\xcc2h\xc7\\\x86\xff\xf8"
1403 b"\xe2\xfc\xe7\xd9\xfe6\xb8(\xa8wd\xc2\"u.n\x1e\xc3\xf2\x8e\x8d\x8f\x02"
1404 b"\x17/\xa6=\xf0\xa2\xdf/M\x89\xbe\xde\xa7\x1cz\x18-]\xd5\xef\x13\x8frZ"
1405 b"\x15\x80\x8c\xf8\x8do\xfa\x12\x9b#z/\xef\xf0\xfaF\x01\x82\xa3M\x8e\xa1t"
1406 b"\xca6 BF$\xe5Q\xa4\x98\xee\xdel\xe8\x7f\xf0\x9d,bn\x0b\x13\xd4\xa8\x81"
1407 b"\xe4N\xc8\x86\x153\xf5x2\xa2O\x13@Q\xa1\x00/\xa5\xd0O\x97\xdco\xae\xf7z"
1408 b"\xc4\xcdS\xb6t<\x16\xf2\x9cI#\x89ud\xc66Y\xd9\xee\xe6\xce\x12]\xe5\xf0"
1409 b"\xaa\x96-Pe\xade:\x04\t\x1b\xf7\xdb7\n\x86\x1fp\xc8J\xba\xf4\xf0V\xa9"
1410 b"\xdc\xf0\x02%G\xf9\xdf=?\x15\x1b\xe1(\xce\x82=\xd6I\xac3\x12\x0cR\xb7"
1411 b"\xae\r\xb1i\x03\x95\x01\xbd\xbe\xfa\x02s\x01P\x9d\x96X\xb12j\xc8L\xa8"
1412 b"\x84b\xf8\x1epl\xeajr\xd1=\t\x03\xdd\x13\x1b3!E\xf9vV\xdaF\xf3\xd7\xb4"
1413 b"\x0c\xa9P~\xec\xdeE\xe37\xf6\x1d\xc6\xbb\xddc%\xb6\x0fI\x07\xf0;\xaf\xe7"
1414 b"\xa0\x8b\xa7Z\x99(\xe9\xe2\xf0o\x18>`\xe1\xaa\xa8\xd9\xa1\xb2}\xe7\x8d"
1415 b"\x834T\xb6\xef\xc1\xde\xe3\x98\xbcD\x03MA@\xd8\xed\xdc\xc8\x93\x03\x1a"
1416 b"\x93\x0b\x7f\x94\x12\x0b\x02Sa\x18\xc9\xc5\x9bTJE}\xf6\xc8g\x17#ZV\x01"
1417 b"\xc9\x9dc\x83\x0e>0\x16\x90S\xb8/\x03y_\x18\xfa(\xd7\x0br\xa2\xb0\xba?"
1418 b"\x8c\xe6\x83@\x84\xdf\x02:\xc5z\x9e\xa6\x84\xc9\xf5BeyX\x83\x1a\xf1 :\t"
1419 b"\xf7\x19\xfexD\\&G\xf3\x85Y\xa2J\xf9\x0bv{\x89\xf6\xe7)A\xaf\x04o\x00"
1420 b"\x075\xd3\xe0\x7f\x97\x98F\x0f?v\x93\xedVtTf\xb5\x97\x83\xed\x19\xd7\x1a"
1421 b"'k\xd7\xd9\xc5\\Y\xd1\xdc\x07\x15|w\xbc\xacd\x87\x08d\xec\xa7\xf6\x82"
1422 b"\xfc\xb3\x93\xeb\xb9 \x8d\xbc ,\xb3X\xb0\xd2s\xd7\xd1\xffv\x05\xdf}\xa2"
1423 b"\x96\xfb%\n\xdf\xa2\x7f\x08.\xa16\n\xe0\x19\x93\x7fh\n\x1c\x8c\x0f \x11"
1424 b"\xc6Bl\x95\x19U}\xe4s\xb5\x10H\xea\x86pB\xe88\x95\xbe\x8cZ\xdb\xe4\x94A"
1425 b"\x92\xb9;z\xaa\xa7{\x1c5!\xc0\xaf\xc1A\xf9\xda\xf0$\xb0\x02qg\xc8\xc7/|"
1426 b"\xafr\x99^\x91\x88\xbf\x03\xd9=\xd7n\xda6{>8\n\xc7:\xa9'\xba.\x0b\xe2"
1427 b"\xb5\x1d\x0e\n\x9a\x8e\x06\x8f:\xdd\x82'[\xc3\"wD$\xa7w\xecq\x8c,1\x93"
1428 b"\xd0,\xae2w\x93\x12$Jd\x19mg\x02\x93\x9cA\x95\x9d&\xca8i\x9c\xb0;\xe7NQ"
1429 b"\x1frh\x8beL;\xb0m\xee\x07Q\x9b\xc6\xd8\x03\xb5\xdeN\xd4\xfe\x98\xd0\xdc"
1430 b"\x1a[\x04\xde\x1a\xf6\x91j\xf8EOli\x8eB^\x1d\x82\x07\xb2\xb5R]\xb7\xd7"
1431 b"\xe9\xa6\xc3.\xfb\xf0-\xb4e\x9b\xde\x03\x88\xc6\xc1iN\x0e\x84wbQ\xdf~"
1432 b"\xe9\xa4\x884\x96kM\xbc)T\xf3\x89\x97\x0f\x143\xe7)\xa0\xb3B\x00\xa8\xaf"
1433 b"\x82^\xcb\xc7..\xdb\xc7\t\x9dH\xee5\xe9#\xe6NV\x94\xcb$Kk\xe3\x7f\r\xe3t"
1434 b"\x12\xcf'\xefR\x8b\xf42\xcf-LH\xac\xe5\x1f0~?SO\xeb\xc1E\x1a\x1c]\xf2"
1435 b"\xc4<\x11\x02\x10Z0a*?\xe4r\xff\xfb\xff\xf6\x14nG\xead^\xd6\xef8\xb6uEI"
1436 b"\x99\nV\xe2\xb3\x95\x8e\x83\xf6i!\xb5&1F\xb1DP\xf4 SO3D!w\x99_G\x7f+\x90"
1437 b".\xab\xbb]\x91>\xc9#h;\x0f5J\x91K\xf4^-[\x9e\x8a\\\x94\xca\xaf\xf6\x19"
1438 b"\xd4\xa1\x9b\xc4\xb8p\xa1\xae\x15\xe9r\x84\xe0\xcar.l []\x8b\xaf+0\xf2g"
1439 b"\x01aKY\xdfI\xcf,\n\xe8\xf0\xe7V\x80_#\xb2\xf2\xa9\x06\x8c>w\xe2W,\xf4"
1440 b"\x8c\r\xf963\xf5J\xcc2\x05=kT\xeaUti\xe5_\xce\x1b\xfa\x8dl\x02h\xef\xa8"
1441 b"\xfbf\x7f\xff\xf0\x19\xeax"
1442)
1443
1444FILTERS_RAW_1 = [{"id": lzma.FILTER_LZMA2, "preset": 3}]
1445COMPRESSED_RAW_1 = (
1446 b"\xe0\x07\x80\x03\xfd]\x00\x05\x14\x07bX\x19\xcd\xddn\x96cyq\xa1\xdd\xee"
1447 b"\xf8\xfam\xe3'\x88\xd3\xff\xe4\x9e \xceQ\x91\xa4\x14I\xf6\xb9\x9dVL8\x15"
1448 b"_\x0e\x12\xc3\xeb\xbc\xa5\xcd\nW\x1d$=R;\x1d\xf8k8\t\xb1{\xd4\xc5+\x9d"
1449 b"\x87c\xe5\xef\x98\xb4\xd7S3\xcd\xcc\xd2\xed\xa4\x0em\xe5\xf4\xdd\xd0b"
1450 b"\xbe4*\xaa\x0b\xc5\x08\x10\x85+\x81.\x17\xaf9\xc9b\xeaZrA\xe20\x7fs\"r"
1451 b"\xdaG\x81\xde\x90cu\xa5\xdb\xa9.A\x08l\xb0<\xf6\x03\xddOi\xd0\xc5\xb4"
1452 b"\xec\xecg4t6\"\xa6\xb8o\xb5?\x18^}\xb6}\x03[:\xeb\x03\xa9\n[\x89l\x19g"
1453 b"\x16\xc82\xed\x0b\xfb\x86n\xa2\x857@\x93\xcd6T\xc3u\xb0\t\xf9\x1b\x918"
1454 b"\xfc[\x1b\x1e4\xb3\x14\x06PCV\xa8\"\xf5\x81x~\xe9\xb5N\x9cK\x9f\xc6\xc3%"
1455 b"\xc8k:{6\xe7\xf7\xbd\x05\x02\xb4\xc4\xc3\xd3\xfd\xc3\xa8\\\xfc@\xb1F_"
1456 b"\xc8\x90\xd9sU\x98\xad8\x05\x07\xde7J\x8bM\xd0\xb3;X\xec\x87\xef\xae\xb3"
1457 b"eO,\xb1z,d\x11y\xeejlB\x02\x1d\xf28\x1f#\x896\xce\x0b\xf0\xf5\xa9PK\x0f"
1458 b"\xb3\x13P\xd8\x88\xd2\xa1\x08\x04C?\xdb\x94_\x9a\"\xe9\xe3e\x1d\xde\x9b"
1459 b"\xa1\xe8>H\x98\x10;\xc5\x03#\xb5\x9d4\x01\xe7\xc5\xba%v\xa49\x97A\xe0\""
1460 b"\x8c\xc22\xe3i\xc1\x9d\xab3\xdf\xbe\xfdDm7\x1b\x9d\xab\xb5\x15o:J\x92"
1461 b"\xdb\x816\x17\xc2O\x99\x1b\x0e\x8d\xf3\tQ\xed\x8e\x95S/\x16M\xb2S\x04"
1462 b"\x0f\xc3J\xc6\xc7\xe4\xcb\xc5\xf4\xe7d\x14\xe4=^B\xfb\xd3E\xd3\x1e\xcd"
1463 b"\x91\xa5\xd0G\x8f.\xf6\xf9\x0bb&\xd9\x9f\xc2\xfdj\xa2\x9e\xc4\\\x0e\x1dC"
1464 b"v\xe8\xd2\x8a?^H\xec\xae\xeb>\xfe\xb8\xab\xd4IqY\x8c\xd4K7\x11\xf4D\xd0W"
1465 b"\xa5\xbe\xeaO\xbf\xd0\x04\xfdl\x10\xae5\xd4U\x19\x06\xf9{\xaa\xe0\x81"
1466 b"\x0f\xcf\xa3k{\x95\xbd\x19\xa2\xf8\xe4\xa3\x08O*\xf1\xf1B-\xc7(\x0eR\xfd"
1467 b"@E\x9f\xd3\x1e:\xfdV\xb7\x04Y\x94\xeb]\x83\xc4\xa5\xd7\xc0gX\x98\xcf\x0f"
1468 b"\xcd3\x00]n\x17\xec\xbd\xa3Y\x86\xc5\xf3u\xf6*\xbdT\xedA$A\xd9A\xe7\x98"
1469 b"\xef\x14\x02\x9a\xfdiw\xec\xa0\x87\x11\xd9%\xc5\xeb\x8a=\xae\xc0\xc4\xc6"
1470 b"D\x80\x8f\xa8\xd1\xbbq\xb2\xc0\xa0\xf5Cqp\xeeL\xe3\xe5\xdc \x84\"\xe9"
1471 b"\x80t\x83\x05\xba\xf1\xc5~\x93\xc9\xf0\x01c\xceix\x9d\xed\xc5)l\x16)\xd1"
1472 b"\x03@l\x04\x7f\x87\xa5yn\x1b\x01D\xaa:\xd2\x96\xb4\xb3?\xb0\xf9\xce\x07"
1473 b"\xeb\x81\x00\xe4\xc3\xf5%_\xae\xd4\xf9\xeb\xe2\rh\xb2#\xd67Q\x16D\x82hn"
1474 b"\xd1\xa3_?q\xf0\xe2\xac\xf317\x9e\xd0_\x83|\xf1\xca\xb7\x95S\xabW\x12"
1475 b"\xff\xddt\xf69L\x01\xf2|\xdaW\xda\xees\x98L\x18\xb8_\xe8$\x82\xea\xd6"
1476 b"\xd1F\xd4\x0b\xcdk\x01vf\x88h\xc3\xae\xb91\xc7Q\x9f\xa5G\xd9\xcc\x1f\xe3"
1477 b"5\xb1\xdcy\x7fI\x8bcw\x8e\x10rIp\x02:\x19p_\xc8v\xcea\"\xc1\xd9\x91\x03"
1478 b"\xbfe\xbe\xa6\xb3\xa8\x14\x18\xc3\xabH*m}\xc2\xc1\x9a}>l%\xce\x84\x99"
1479 b"\xb3d\xaf\xd3\x82\x15\xdf\xc1\xfc5fOg\x9b\xfc\x8e^&\t@\xce\x9f\x06J\xb8"
1480 b"\xb5\x86\x1d\xda{\x9f\xae\xb0\xff\x02\x81r\x92z\x8cM\xb7ho\xc9^\x9c\xb6"
1481 b"\x9c\xae\xd1\xc9\xf4\xdfU7\xd6\\!\xea\x0b\x94k\xb9Ud~\x98\xe7\x86\x8az"
1482 b"\x10;\xe3\x1d\xe5PG\xf8\xa4\x12\x05w\x98^\xc4\xb1\xbb\xfb\xcf\xe0\x7f"
1483 b"\x033Sf\x0c \xb1\xf6@\x94\xe5\xa3\xb2\xa7\x10\x9a\xc0\x14\xc3s\xb5xRD"
1484 b"\xf4`W\xd9\xe5\xd3\xcf\x91\rTZ-X\xbe\xbf\xb5\xe2\xee|\x1a\xbf\xfb\x08"
1485 b"\x91\xe1\xfc\x9a\x18\xa3\x8b\xd6^\x89\xf5[\xef\x87\xd1\x06\x1c7\xd6\xa2"
1486 b"\t\tQ5/@S\xc05\xd2VhAK\x03VC\r\x9b\x93\xd6M\xf1xO\xaaO\xed\xb9<\x0c\xdae"
1487 b"*\xd0\x07Hk6\x9fG+\xa1)\xcd\x9cl\x87\xdb\xe1\xe7\xefK}\x875\xab\xa0\x19u"
1488 b"\xf6*F\xb32\x00\x00\x00"
1489)
1490
1491FILTERS_RAW_2 = [{"id": lzma.FILTER_DELTA, "dist": 2},
1492 {"id": lzma.FILTER_LZMA2,
1493 "preset": lzma.PRESET_DEFAULT | lzma.PRESET_EXTREME}]
1494COMPRESSED_RAW_2 = (
1495 b"\xe0\x07\x80\x05\x91]\x00\x05\x14\x06-\xd4\xa8d?\xef\xbe\xafH\xee\x042"
1496 b"\xcb.\xb5g\x8f\xfb\x14\xab\xa5\x9f\x025z\xa4\xdd\xd8\t[}W\xf8\x0c\x1dmH"
1497 b"\xfa\x05\xfcg\xba\xe5\x01Q\x0b\x83R\xb6A\x885\xc0\xba\xee\n\x1cv~\xde:o"
1498 b"\x06:J\xa7\x11Cc\xea\xf7\xe5*o\xf7\x83\\l\xbdE\x19\x1f\r\xa8\x10\xb42"
1499 b"\x0caU{\xd7\xb8w\xdc\xbe\x1b\xfc8\xb4\xcc\xd38\\\xf6\x13\xf6\xe7\x98\xfa"
1500 b"\xc7[\x17_9\x86%\xa8\xf8\xaa\xb8\x8dfs#\x1e=\xed<\x92\x10\\t\xff\x86\xfb"
1501 b"=\x9e7\x18\x1dft\\\xb5\x01\x95Q\xc5\x19\xb38\xe0\xd4\xaa\x07\xc3\x7f\xd8"
1502 b"\xa2\x00>-\xd3\x8e\xa1#\xfa\x83ArAm\xdbJ~\x93\xa3B\x82\xe0\xc7\xcc(\x08`"
1503 b"WK\xad\x1b\x94kaj\x04 \xde\xfc\xe1\xed\xb0\x82\x91\xefS\x84%\x86\xfbi"
1504 b"\x99X\xf1B\xe7\x90;E\xfde\x98\xda\xca\xd6T\xb4bg\xa4\n\x9aj\xd1\x83\x9e]"
1505 b"\"\x7fM\xb5\x0fr\xd2\\\xa5j~P\x10GH\xbfN*Z\x10.\x81\tpE\x8a\x08\xbe1\xbd"
1506 b"\xcd\xa9\xe1\x8d\x1f\x04\xf9\x0eH\xb9\xae\xd6\xc3\xc1\xa5\xa9\x95P\xdc~"
1507 b"\xff\x01\x930\xa9\x04\xf6\x03\xfe\xb5JK\xc3]\xdd9\xb1\xd3\xd7F\xf5\xd1"
1508 b"\x1e\xa0\x1c_\xed[\x0c\xae\xd4\x8b\x946\xeb\xbf\xbb\xe3$kS{\xb5\x80,f:Sj"
1509 b"\x0f\x08z\x1c\xf5\xe8\xe6\xae\x98\xb0Q~r\x0f\xb0\x05?\xb6\x90\x19\x02&"
1510 b"\xcb\x80\t\xc4\xea\x9c|x\xce\x10\x9c\xc5|\xcbdhh+\x0c'\xc5\x81\xc33\xb5"
1511 b"\x14q\xd6\xc5\xe3`Z#\xdc\x8a\xab\xdd\xea\x08\xc2I\xe7\x02l{\xec\x196\x06"
1512 b"\x91\x8d\xdc\xd5\xb3x\xe1hz%\xd1\xf8\xa5\xdd\x98!\x8c\x1c\xc1\x17RUa\xbb"
1513 b"\x95\x0f\xe4X\xea1\x0c\xf1=R\xbe\xc60\xe3\xa4\x9a\x90bd\x97$]B\x01\xdd"
1514 b"\x1f\xe3h2c\x1e\xa0L`4\xc6x\xa3Z\x8a\r\x14]T^\xd8\x89\x1b\x92\r;\xedY"
1515 b"\x0c\xef\x8d9z\xf3o\xb6)f\xa9]$n\rp\x93\xd0\x10\xa4\x08\xb8\xb2\x8b\xb6"
1516 b"\x8f\x80\xae;\xdcQ\xf1\xfa\x9a\x06\x8e\xa5\x0e\x8cK\x9c @\xaa:UcX\n!\xc6"
1517 b"\x02\x12\xcb\x1b\"=\x16.\x1f\x176\xf2g=\xe1Wn\xe9\xe1\xd4\xf1O\xad\x15"
1518 b"\x86\xe9\xa3T\xaf\xa9\xd7D\xb5\xd1W3pnt\x11\xc7VOj\xb7M\xc4i\xa1\xf1$3"
1519 b"\xbb\xdc\x8af\xb0\xc5Y\r\xd1\xfb\xf2\xe7K\xe6\xc5hwO\xfe\x8c2^&\x07\xd5"
1520 b"\x1fV\x19\xfd\r\x14\xd2i=yZ\xe6o\xaf\xc6\xb6\x92\x9d\xc4\r\xb3\xafw\xac%"
1521 b"\xcfc\x1a\xf1`]\xf2\x1a\x9e\x808\xedm\xedQ\xb2\xfe\xe4h`[q\xae\xe0\x0f"
1522 b"\xba0g\xb6\"N\xc3\xfb\xcfR\x11\xc5\x18)(\xc40\\\xa3\x02\xd9G!\xce\x1b"
1523 b"\xc1\x96x\xb5\xc8z\x1f\x01\xb4\xaf\xde\xc2\xcd\x07\xe7H\xb3y\xa8M\n\\A\t"
1524 b"ar\xddM\x8b\x9a\xea\x84\x9b!\xf1\x8d\xb1\xf1~\x1e\r\xa5H\xba\xf1\x84o"
1525 b"\xda\x87\x01h\xe9\xa2\xbe\xbeqN\x9d\x84\x0b!WG\xda\xa1\xa5A\xb7\xc7`j"
1526 b"\x15\xf2\xe9\xdd?\x015B\xd2~E\x06\x11\xe0\x91!\x05^\x80\xdd\xa8y\x15}"
1527 b"\xa1)\xb1)\x81\x18\xf4\xf4\xf8\xc0\xefD\xe3\xdb2f\x1e\x12\xabu\xc9\x97"
1528 b"\xcd\x1e\xa7\x0c\x02x4_6\x03\xc4$t\xf39\x94\x1d=\xcb\xbfv\\\xf5\xa3\x1d"
1529 b"\x9d8jk\x95\x13)ff\xf9n\xc4\xa9\xe3\x01\xb8\xda\xfb\xab\xdfM\x99\xfb\x05"
1530 b"\xe0\xe9\xb0I\xf4E\xab\xe2\x15\xa3\x035\xe7\xdeT\xee\x82p\xb4\x88\xd3"
1531 b"\x893\x9c/\xc0\xd6\x8fou;\xf6\x95PR\xa9\xb2\xc1\xefFj\xe2\xa7$\xf7h\xf1"
1532 b"\xdfK(\xc9c\xba7\xe8\xe3)\xdd\xb2,\x83\xfb\x84\x18.y\x18Qi\x88\xf8`h-"
1533 b"\xef\xd5\xed\x8c\t\xd8\xc3^\x0f\x00\xb7\xd0[!\xafM\x9b\xd7.\x07\xd8\xfb"
1534 b"\xd9\xe2-S+\xaa8,\xa0\x03\x1b \xea\xa8\x00\xc3\xab~\xd0$e\xa5\x7f\xf7"
1535 b"\x95P]\x12\x19i\xd9\x7fo\x0c\xd8g^\rE\xa5\x80\x18\xc5\x01\x80\xaek`\xff~"
1536 b"\xb6y\xe7+\xe5\x11^D\xa7\x85\x18\"!\xd6\xd2\xa7\xf4\x1eT\xdb\x02\xe15"
1537 b"\x02Y\xbc\x174Z\xe7\x9cH\x1c\xbf\x0f\xc6\xe9f]\xcf\x8cx\xbc\xe5\x15\x94"
1538 b"\xfc3\xbc\xa7TUH\xf1\x84\x1b\xf7\xa9y\xc07\x84\xf8X\xd8\xef\xfc \x1c\xd8"
1539 b"( /\xf2\xb7\xec\xc1\\\x8c\xf6\x95\xa1\x03J\x83vP8\xe1\xe3\xbb~\xc24kA"
1540 b"\x98y\xa1\xf2P\xe9\x9d\xc9J\xf8N\x99\xb4\xceaO\xde\x16\x1e\xc2\x19\xa7"
1541 b"\x03\xd2\xe0\x8f:\x15\xf3\x84\x9e\xee\xe6e\xb8\x02q\xc7AC\x1emw\xfd\t"
1542 b"\x9a\x1eu\xc1\xa9\xcaCwUP\x00\xa5\xf78L4w!\x91L2 \x87\xd0\xf2\x06\x81j"
1543 b"\x80;\x03V\x06\x87\x92\xcb\x90lv@E\x8d\x8d\xa5\xa6\xe7Z[\xdf\xd6E\x03`>"
1544 b"\x8f\xde\xa1bZ\x84\xd0\xa9`\x05\x0e{\x80;\xe3\xbef\x8d\x1d\xebk1.\xe3"
1545 b"\xe9N\x15\xf7\xd4(\xfa\xbb\x15\xbdu\xf7\x7f\x86\xae!\x03L\x1d\xb5\xc1"
1546 b"\xb9\x11\xdb\xd0\x93\xe4\x02\xe1\xd2\xcbBjc_\xe8}d\xdb\xc3\xa0Y\xbe\xc9/"
1547 b"\x95\x01\xa3,\xe6bl@\x01\xdbp\xc2\xce\x14\x168\xc2q\xe3uH\x89X\xa4\xa9"
1548 b"\x19\x1d\xc1}\x7fOX\x19\x9f\xdd\xbe\x85\x83\xff\x96\x1ee\x82O`CF=K\xeb$I"
1549 b"\x17_\xefX\x8bJ'v\xde\x1f+\xd9.v\xf8Tv\x17\xf2\x9f5\x19\xe1\xb9\x91\xa8S"
1550 b"\x86\xbd\x1a\"(\xa5x\x8dC\x03X\x81\x91\xa8\x11\xc4pS\x13\xbc\xf2'J\xae!"
1551 b"\xef\xef\x84G\t\x8d\xc4\x10\x132\x00oS\x9e\xe0\xe4d\x8f\xb8y\xac\xa6\x9f"
1552 b",\xb8f\x87\r\xdf\x9eE\x0f\xe1\xd0\\L\x00\xb2\xe1h\x84\xef}\x98\xa8\x11"
1553 b"\xccW#\\\x83\x7fo\xbbz\x8f\x00"
1554)
1555
1556FILTERS_RAW_3 = [{"id": lzma.FILTER_IA64, "start_offset": 0x100},
1557 {"id": lzma.FILTER_LZMA2}]
1558COMPRESSED_RAW_3 = (
1559 b"\xe0\x07\x80\x03\xdf]\x00\x05\x14\x07bX\x19\xcd\xddn\x98\x15\xe4\xb4\x9d"
1560 b"o\x1d\xc4\xe5\n\x03\xcc2h\xc7\\\x86\xff\xf8\xe2\xfc\xe7\xd9\xfe6\xb8("
1561 b"\xa8wd\xc2\"u.n\x1e\xc3\xf2\x8e\x8d\x8f\x02\x17/\xa6=\xf0\xa2\xdf/M\x89"
1562 b"\xbe\xde\xa7\x1cz\x18-]\xd5\xef\x13\x8frZ\x15\x80\x8c\xf8\x8do\xfa\x12"
1563 b"\x9b#z/\xef\xf0\xfaF\x01\x82\xa3M\x8e\xa1t\xca6 BF$\xe5Q\xa4\x98\xee\xde"
1564 b"l\xe8\x7f\xf0\x9d,bn\x0b\x13\xd4\xa8\x81\xe4N\xc8\x86\x153\xf5x2\xa2O"
1565 b"\x13@Q\xa1\x00/\xa5\xd0O\x97\xdco\xae\xf7z\xc4\xcdS\xb6t<\x16\xf2\x9cI#"
1566 b"\x89ud\xc66Y\xd9\xee\xe6\xce\x12]\xe5\xf0\xaa\x96-Pe\xade:\x04\t\x1b\xf7"
1567 b"\xdb7\n\x86\x1fp\xc8J\xba\xf4\xf0V\xa9\xdc\xf0\x02%G\xf9\xdf=?\x15\x1b"
1568 b"\xe1(\xce\x82=\xd6I\xac3\x12\x0cR\xb7\xae\r\xb1i\x03\x95\x01\xbd\xbe\xfa"
1569 b"\x02s\x01P\x9d\x96X\xb12j\xc8L\xa8\x84b\xf6\xc3\xd4c-H\x93oJl\xd0iQ\xe4k"
1570 b"\x84\x0b\xc1\xb7\xbc\xb1\x17\x88\xb1\xca?@\xf6\x07\xea\xe6x\xf1H12P\x0f"
1571 b"\x8a\xc9\xeauw\xe3\xbe\xaai\xa9W\xd0\x80\xcd#cb5\x99\xd8]\xa9d\x0c\xbd"
1572 b"\xa2\xdcWl\xedUG\xbf\x89yF\xf77\x81v\xbd5\x98\xbeh8\x18W\x08\xf0\x1b\x99"
1573 b"5:\x1a?rD\x96\xa1\x04\x0f\xae\xba\x85\xeb\x9d5@\xf5\x83\xd37\x83\x8ac"
1574 b"\x06\xd4\x97i\xcdt\x16S\x82k\xf6K\x01vy\x88\x91\x9b6T\xdae\r\xfd]:k\xbal"
1575 b"\xa9\xbba\xc34\xf9r\xeb}r\xdb\xc7\xdb*\x8f\x03z\xdc8h\xcc\xc9\xd3\xbcl"
1576 b"\xa5-\xcb\xeaK\xa2\xc5\x15\xc0\xe3\xc1\x86Z\xfb\xebL\xe13\xcf\x9c\xe3"
1577 b"\x1d\xc9\xed\xc2\x06\xcc\xce!\x92\xe5\xfe\x9c^\xa59w \x9bP\xa3PK\x08d"
1578 b"\xf9\xe2Z}\xa7\xbf\xed\xeb%$\x0c\x82\xb8/\xb0\x01\xa9&,\xf7qh{Q\x96)\xf2"
1579 b"q\x96\xc3\x80\xb4\x12\xb0\xba\xe6o\xf4!\xb4[\xd4\x8aw\x10\xf7t\x0c\xb3"
1580 b"\xd9\xd5\xc3`^\x81\x11??\\\xa4\x99\x85R\xd4\x8e\x83\xc9\x1eX\xbfa\xf1"
1581 b"\xac\xb0\xea\xea\xd7\xd0\xab\x18\xe2\xf2\xed\xe1\xb7\xc9\x18\xcbS\xe4>"
1582 b"\xc9\x95H\xe8\xcb\t\r%\xeb\xc7$.o\xf1\xf3R\x17\x1db\xbb\xd8U\xa5^\xccS"
1583 b"\x16\x01\x87\xf3/\x93\xd1\xf0v\xc0r\xd7\xcc\xa2Gkz\xca\x80\x0e\xfd\xd0"
1584 b"\x8b\xbb\xd2Ix\xb3\x1ey\xca-0\xe3z^\xd6\xd6\x8f_\xf1\x9dP\x9fi\xa7\xd1"
1585 b"\xe8\x90\x84\xdc\xbf\xcdky\x8e\xdc\x81\x7f\xa3\xb2+\xbf\x04\xef\xd8\\"
1586 b"\xc4\xdf\xe1\xb0\x01\xe9\x93\xe3Y\xf1\x1dY\xe8h\x81\xcf\xf1w\xcc\xb4\xef"
1587 b" \x8b|\x04\xea\x83ej\xbe\x1f\xd4z\x9c`\xd3\x1a\x92A\x06\xe5\x8f\xa9\x13"
1588 b"\t\x9e=\xfa\x1c\xe5_\x9f%v\x1bo\x11ZO\xd8\xf4\t\xddM\x16-\x04\xfc\x18<\""
1589 b"CM\xddg~b\xf6\xef\x8e\x0c\xd0\xde|\xa0'\x8a\x0c\xd6x\xae!J\xa6F\x88\x15u"
1590 b"\x008\x17\xbc7y\xb3\xd8u\xac_\x85\x8d\xe7\xc1@\x9c\xecqc\xa3#\xad\xf1"
1591 b"\x935\xb5)_\r\xec3]\x0fo]5\xd0my\x07\x9b\xee\x81\xb5\x0f\xcfK+\x00\xc0"
1592 b"\xe4b\x10\xe4\x0c\x1a \x9b\xe0\x97t\xf6\xa1\x9e\x850\xba\x0c\x9a\x8d\xc8"
1593 b"\x8f\x07\xd7\xae\xc8\xf9+i\xdc\xb9k\xb0>f\x19\xb8\r\xa8\xf8\x1f$\xa5{p"
1594 b"\xc6\x880\xce\xdb\xcf\xca_\x86\xac\x88h6\x8bZ%'\xd0\n\xbf\x0f\x9c\"\xba"
1595 b"\xe5\x86\x9f\x0f7X=mNX[\xcc\x19FU\xc9\x860\xbc\x90a+* \xae_$\x03\x1e\xd3"
1596 b"\xcd_\xa0\x9c\xde\xaf46q\xa5\xc9\x92\xd7\xca\xe3`\x9d\x85}\xb4\xff\xb3"
1597 b"\x83\xfb\xb6\xca\xae`\x0bw\x7f\xfc\xd8\xacVe\x19\xc8\x17\x0bZ\xad\x88"
1598 b"\xeb#\x97\x03\x13\xb1d\x0f{\x0c\x04w\x07\r\x97\xbd\xd6\xc1\xc3B:\x95\x08"
1599 b"^\x10V\xaeaH\x02\xd9\xe3\n\\\x01X\xf6\x9c\x8a\x06u#%\xbe*\xa1\x18v\x85"
1600 b"\xec!\t4\x00\x00\x00"
1601)
1602
1603FILTERS_RAW_4 = [{"id": lzma.FILTER_DELTA, "dist": 4},
1604 {"id": lzma.FILTER_X86, "start_offset": 0x40},
1605 {"id": lzma.FILTER_LZMA2, "preset": 4, "lc": 2}]
1606COMPRESSED_RAW_4 = (
1607 b"\xe0\x07\x80\x06\x0e\\\x00\x05\x14\x07bW\xaah\xdd\x10\xdc'\xd6\x90,\xc6v"
1608 b"Jq \x14l\xb7\x83xB\x0b\x97f=&fx\xba\n>Tn\xbf\x8f\xfb\x1dF\xca\xc3v_\xca?"
1609 b"\xfbV<\x92#\xd4w\xa6\x8a\xeb\xf6\x03\xc0\x01\x94\xd8\x9e\x13\x12\x98\xd1"
1610 b"*\xfa]c\xe8\x1e~\xaf\xb5]Eg\xfb\x9e\x01\"8\xb2\x90\x06=~\xe9\x91W\xcd"
1611 b"\xecD\x12\xc7\xfa\xe1\x91\x06\xc7\x99\xb9\xe3\x901\x87\x19u\x0f\x869\xff"
1612 b"\xc1\xb0hw|\xb0\xdcl\xcck\xb16o7\x85\xee{Y_b\xbf\xbc$\xf3=\x8d\x8bw\xe5Z"
1613 b"\x08@\xc4kmE\xad\xfb\xf6*\xd8\xad\xa1\xfb\xc5{\xdej,)\x1emB\x1f<\xaeca"
1614 b"\x80(\xee\x07 \xdf\xe9\xf8\xeb\x0e-\x97\x86\x90c\xf9\xea'B\xf7`\xd7\xb0"
1615 b"\x92\xbd\xa0\x82]\xbd\x0e\x0eB\x19\xdc\x96\xc6\x19\xd86D\xf0\xd5\x831"
1616 b"\x03\xb7\x1c\xf7&5\x1a\x8f PZ&j\xf8\x98\x1bo\xcc\x86\x9bS\xd3\xa5\xcdu"
1617 b"\xf9$\xcc\x97o\xe5V~\xfb\x97\xb5\x0b\x17\x9c\xfdxW\x10\xfep4\x80\xdaHDY"
1618 b"\xfa)\xfet\xb5\"\xd4\xd3F\x81\xf4\x13\x1f\xec\xdf\xa5\x13\xfc\"\x91x\xb7"
1619 b"\x99\xce\xc8\x92\n\xeb[\x10l*Y\xd8\xb1@\x06\xc8o\x8d7r\xebu\xfd5\x0e\x7f"
1620 b"\xf1$U{\t}\x1fQ\xcfxN\x9d\x9fXX\xe9`\x83\xc1\x06\xf4\x87v-f\x11\xdb/\\"
1621 b"\x06\xff\xd7)B\xf3g\x06\x88#2\x1eB244\x7f4q\t\xc893?mPX\x95\xa6a\xfb)d"
1622 b"\x9b\xfc\x98\x9aj\x04\xae\x9b\x9d\x19w\xba\xf92\xfaA\x11\\\x17\x97C3\xa4"
1623 b"\xbc!\x88\xcdo[\xec:\x030\x91.\x85\xe0@\\4\x16\x12\x9d\xcaJv\x97\xb04"
1624 b"\xack\xcbkf\xa3ss\xfc\x16^\x8ce\x85a\xa5=&\xecr\xb3p\xd1E\xd5\x80y\xc7"
1625 b"\xda\xf6\xfek\xbcT\xbfH\xee\x15o\xc5\x8c\x830\xec\x1d\x01\xae\x0c-e\\"
1626 b"\x91\x90\x94\xb2\xf8\x88\x91\xe8\x0b\xae\xa7>\x98\xf6\x9ck\xd2\xc6\x08"
1627 b"\xe6\xab\t\x98\xf2!\xa0\x8c^\xacqA\x99<\x1cEG\x97\xc8\xf1\xb6\xb9\x82"
1628 b"\x8d\xf7\x08s\x98a\xff\xe3\xcc\x92\x0e\xd2\xb6U\xd7\xd9\x86\x7fa\xe5\x1c"
1629 b"\x8dTG@\t\x1e\x0e7*\xfc\xde\xbc]6N\xf7\xf1\x84\x9e\x9f\xcf\xe9\x1e\xb5'"
1630 b"\xf4<\xdf\x99sq\xd0\x9d\xbd\x99\x0b\xb4%p4\xbf{\xbb\x8a\xd2\x0b\xbc=M"
1631 b"\x94H:\xf5\xa8\xd6\xa4\xc90\xc2D\xb9\xd3\xa8\xb0S\x87 `\xa2\xeb\xf3W\xce"
1632 b" 7\xf9N#\r\xe6\xbe\t\x9d\xe7\x811\xf9\x10\xc1\xc2\x14\xf6\xfc\xcba\xb7"
1633 b"\xb1\x7f\x95l\xe4\tjA\xec:\x10\xe5\xfe\xc2\\=D\xe2\x0c\x0b3]\xf7\xc1\xf7"
1634 b"\xbceZ\xb1A\xea\x16\xe5\xfddgFQ\xed\xaf\x04\xa3\xd3\xf8\xa2q\x19B\xd4r"
1635 b"\xc5\x0c\x9a\x14\x94\xea\x91\xc4o\xe4\xbb\xb4\x99\xf4@\xd1\xe6\x0c\xe3"
1636 b"\xc6d\xa0Q\n\xf2/\xd8\xb8S5\x8a\x18:\xb5g\xac\x95D\xce\x17\x07\xd4z\xda"
1637 b"\x90\xe65\x07\x19H!\t\xfdu\x16\x8e\x0eR\x19\xf4\x8cl\x0c\xf9Q\xf1\x80"
1638 b"\xe3\xbf\xd7O\xf8\x8c\x18\x0b\x9c\xf1\x1fb\xe1\tR\xb2\xf1\xe1A\xea \xcf-"
1639 b"IGE\xf1\x14\x98$\x83\x15\xc9\xd8j\xbf\x19\x0f\xd5\xd1\xaa\xb3\xf3\xa5I2s"
1640 b"\x8d\x145\xca\xd5\xd93\x9c\xb8D0\xe6\xaa%\xd0\xc0P}JO^h\x8e\x08\xadlV."
1641 b"\x18\x88\x13\x05o\xb0\x07\xeaw\xe0\xb6\xa4\xd5*\xe4r\xef\x07G+\xc1\xbei["
1642 b"w\xe8\xab@_\xef\x15y\xe5\x12\xc9W\x1b.\xad\x85-\xc2\xf7\xe3mU6g\x8eSA"
1643 b"\x01(\xd3\xdb\x16\x13=\xde\x92\xf9,D\xb8\x8a\xb2\xb4\xc9\xc3\xefnE\xe8\\"
1644 b"\xa6\xe2Y\xd2\xcf\xcb\x8c\xb6\xd5\xe9\x1d\x1e\x9a\x8b~\xe2\xa6\rE\x84uV"
1645 b"\xed\xc6\x99\xddm<\x10[\x0fu\x1f\xc1\x1d1\n\xcfw\xb2%!\xf0[\xce\x87\x83B"
1646 b"\x08\xaa,\x08%d\xcef\x94\"\xd9g.\xc83\xcbXY+4\xec\x85qA\n\x1d=9\xf0*\xb1"
1647 b"\x1f/\xf3s\xd61b\x7f@\xfb\x9d\xe3FQ\\\xbd\x82\x1e\x00\xf3\xce\xd3\xe1"
1648 b"\xca,E\xfd7[\xab\xb6\xb7\xac!mA}\xbd\x9d3R5\x9cF\xabH\xeb\x92)cc\x13\xd0"
1649 b"\xbd\xee\xe9n{\x1dIJB\xa5\xeb\x11\xe8`w&`\x8b}@Oxe\t\x8a\x07\x02\x95\xf2"
1650 b"\xed\xda|\xb1e\xbe\xaa\xbbg\x19@\xe1Y\x878\x84\x0f\x8c\xe3\xc98\xf2\x9e"
1651 b"\xd5N\xb5J\xef\xab!\xe2\x8dq\xe1\xe5q\xc5\xee\x11W\xb7\xe4k*\x027\xa0"
1652 b"\xa3J\xf4\xd8m\xd0q\x94\xcb\x07\n:\xb6`.\xe4\x9c\x15+\xc0)\xde\x80X\xd4"
1653 b"\xcfQm\x01\xc2cP\x1cA\x85'\xc9\xac\x8b\xe6\xb2)\xe6\x84t\x1c\x92\xe4Z"
1654 b"\x1cR\xb0\x9e\x96\xd1\xfb\x1c\xa6\x8b\xcb`\x10\x12]\xf2gR\x9bFT\xe0\xc8H"
1655 b"S\xfb\xac<\x04\xc7\xc1\xe8\xedP\xf4\x16\xdb\xc0\xd7e\xc2\x17J^\x1f\xab"
1656 b"\xff[\x08\x19\xb4\xf5\xfb\x19\xb4\x04\xe5c~']\xcb\xc2A\xec\x90\xd0\xed"
1657 b"\x06,\xc5K{\x86\x03\xb1\xcdMx\xdeQ\x8c3\xf9\x8a\xea=\x89\xaba\xd2\xc89a"
1658 b"\xd72\xf0\xc3\x19\x8a\xdfs\xd4\xfd\xbb\x81b\xeaE\"\xd8\xf4d\x0cD\xf7IJ!"
1659 b"\xe5d\xbbG\xe9\xcam\xaa\x0f_r\x95\x91NBq\xcaP\xce\xa7\xa9\xb5\x10\x94eP!"
1660 b"|\x856\xcd\xbfIir\xb8e\x9bjP\x97q\xabwS7\x1a\x0ehM\xe7\xca\x86?\xdeP}y~"
1661 b"\x0f\x95I\xfc\x13\xe1<Q\x1b\x868\x1d\x11\xdf\x94\xf4\x82>r\xa9k\x88\xcb"
1662 b"\xfd\xc3v\xe2\xb9\x8a\x02\x8eq\x92I\xf8\xf6\xf1\x03s\x9b\xb8\xe3\"\xe3"
1663 b"\xa9\xa5>D\xb8\x96;\xe7\x92\xd133\xe8\xdd'e\xc9.\xdc;\x17\x1f\xf5H\x13q"
1664 b"\xa4W\x0c\xdb~\x98\x01\xeb\xdf\xe32\x13\x0f\xddx\n6\xa0\t\x10\xb6\xbb"
1665 b"\xb0\xc3\x18\xb6;\x9fj[\xd9\xd5\xc9\x06\x8a\x87\xcd\xe5\xee\xfc\x9c-%@"
1666 b"\xee\xe0\xeb\xd2\xe3\xe8\xfb\xc0\x122\\\xc7\xaf\xc2\xa1Oth\xb3\x8f\x82"
1667 b"\xb3\x18\xa8\x07\xd5\xee_\xbe\xe0\x1cA\x1e_\r\x9a\xb0\x17W&\xa2D\x91\x94"
1668 b"\x1a\xb2\xef\xf2\xdc\x85;X\xb0,\xeb>-7S\xe5\xca\x07)\x1fp\x7f\xcaQBL\xca"
1669 b"\xf3\xb9d\xfc\xb5su\xb0\xc8\x95\x90\xeb*)\xa0v\xe4\x9a{FW\xf4l\xde\xcdj"
1670 b"\x00"
1671)
1672
1673
1674def test_main():
1675 run_unittest(
1676 CompressorDecompressorTestCase,
1677 CompressDecompressFunctionTestCase,
1678 FileTestCase,
Nadeem Vawdae8604042012-06-04 23:38:12 +02001679 OpenTestCase,
Nadeem Vawda3ff069e2011-11-30 00:25:06 +02001680 MiscellaneousTestCase,
1681 )
1682
1683if __name__ == "__main__":
1684 test_main()