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