blob: 16e89d5a9e97941dc5ce97cbd8bba79d8a07dacc [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()
Martin Panter38317d32016-10-01 02:45:17 +0000252 self.assertRaises(LZMAError, lzd.decompress, COMPRESSED_RAW_1)
253 # Previously, a second call could crash due to internal inconsistency
254 self.assertRaises(LZMAError, lzd.decompress, COMPRESSED_RAW_1)
Serhiy Storchakac0b70372016-09-27 20:14:26 +0300255
Nadeem Vawda3ff069e2011-11-30 00:25:06 +0200256 # Test that LZMACompressor->LZMADecompressor preserves the input data.
257
258 def test_roundtrip_xz(self):
259 lzc = LZMACompressor()
260 cdata = lzc.compress(INPUT) + lzc.flush()
261 lzd = LZMADecompressor()
262 self._test_decompressor(lzd, cdata, lzma.CHECK_CRC64)
263
264 def test_roundtrip_alone(self):
265 lzc = LZMACompressor(lzma.FORMAT_ALONE)
266 cdata = lzc.compress(INPUT) + lzc.flush()
267 lzd = LZMADecompressor()
268 self._test_decompressor(lzd, cdata, lzma.CHECK_NONE)
269
270 def test_roundtrip_raw(self):
271 lzc = LZMACompressor(lzma.FORMAT_RAW, filters=FILTERS_RAW_4)
272 cdata = lzc.compress(INPUT) + lzc.flush()
273 lzd = LZMADecompressor(lzma.FORMAT_RAW, filters=FILTERS_RAW_4)
274 self._test_decompressor(lzd, cdata, lzma.CHECK_NONE)
275
276 def test_roundtrip_chunks(self):
277 lzc = LZMACompressor()
278 cdata = []
279 for i in range(0, len(INPUT), 10):
280 cdata.append(lzc.compress(INPUT[i:i+10]))
281 cdata.append(lzc.flush())
282 cdata = b"".join(cdata)
283 lzd = LZMADecompressor()
284 self._test_decompressor(lzd, cdata, lzma.CHECK_CRC64)
285
286 # LZMADecompressor intentionally does not handle concatenated streams.
287
288 def test_decompressor_multistream(self):
289 lzd = LZMADecompressor()
290 self._test_decompressor(lzd, COMPRESSED_XZ + COMPRESSED_ALONE,
291 lzma.CHECK_CRC64, unused_data=COMPRESSED_ALONE)
292
293 # Test with inputs larger than 4GiB.
294
295 @bigmemtest(size=_4G + 100, memuse=2)
296 def test_compressor_bigmem(self, size):
297 lzc = LZMACompressor()
298 cdata = lzc.compress(b"x" * size) + lzc.flush()
299 ddata = lzma.decompress(cdata)
300 try:
301 self.assertEqual(len(ddata), size)
302 self.assertEqual(len(ddata.strip(b"x")), 0)
303 finally:
304 ddata = None
305
306 @bigmemtest(size=_4G + 100, memuse=3)
307 def test_decompressor_bigmem(self, size):
308 lzd = LZMADecompressor()
309 blocksize = 10 * 1024 * 1024
310 block = random.getrandbits(blocksize * 8).to_bytes(blocksize, "little")
311 try:
312 input = block * (size // blocksize + 1)
313 cdata = lzma.compress(input)
314 ddata = lzd.decompress(cdata)
315 self.assertEqual(ddata, input)
316 finally:
317 input = cdata = ddata = None
318
Nadeem Vawda37970652013-10-28 21:35:23 +0100319 # Pickling raises an exception; there's no way to serialize an lzma_stream.
320
321 def test_pickle(self):
Serhiy Storchakabad12572014-12-15 14:03:42 +0200322 for proto in range(pickle.HIGHEST_PROTOCOL + 1):
323 with self.assertRaises(TypeError):
324 pickle.dumps(LZMACompressor(), proto)
325 with self.assertRaises(TypeError):
326 pickle.dumps(LZMADecompressor(), proto)
Nadeem Vawda37970652013-10-28 21:35:23 +0100327
Nadeem Vawda3ff069e2011-11-30 00:25:06 +0200328
329class CompressDecompressFunctionTestCase(unittest.TestCase):
330
331 # Test error cases:
332
333 def test_bad_args(self):
334 self.assertRaises(TypeError, lzma.compress)
335 self.assertRaises(TypeError, lzma.compress, [])
336 self.assertRaises(TypeError, lzma.compress, b"", format="xz")
337 self.assertRaises(TypeError, lzma.compress, b"", check="none")
338 self.assertRaises(TypeError, lzma.compress, b"", preset="blah")
339 self.assertRaises(TypeError, lzma.compress, b"", filters=1024)
340 # Can't specify a preset and a custom filter chain at the same time.
341 with self.assertRaises(ValueError):
342 lzma.compress(b"", preset=3, filters=[{"id": lzma.FILTER_LZMA2}])
343
344 self.assertRaises(TypeError, lzma.decompress)
345 self.assertRaises(TypeError, lzma.decompress, [])
346 self.assertRaises(TypeError, lzma.decompress, b"", format="lzma")
347 self.assertRaises(TypeError, lzma.decompress, b"", memlimit=7.3e9)
348 with self.assertRaises(TypeError):
349 lzma.decompress(b"", format=lzma.FORMAT_RAW, filters={})
350 # Cannot specify a memory limit with FILTER_RAW.
351 with self.assertRaises(ValueError):
352 lzma.decompress(b"", format=lzma.FORMAT_RAW, memlimit=0x1000000)
353 # Can only specify a custom filter chain with FILTER_RAW.
354 with self.assertRaises(ValueError):
355 lzma.decompress(b"", filters=FILTERS_RAW_1)
356 with self.assertRaises(ValueError):
357 lzma.decompress(b"", format=lzma.FORMAT_XZ, filters=FILTERS_RAW_1)
358 with self.assertRaises(ValueError):
359 lzma.decompress(
360 b"", format=lzma.FORMAT_ALONE, filters=FILTERS_RAW_1)
361
362 def test_decompress_memlimit(self):
363 with self.assertRaises(LZMAError):
364 lzma.decompress(COMPRESSED_XZ, memlimit=1024)
365 with self.assertRaises(LZMAError):
366 lzma.decompress(
367 COMPRESSED_XZ, format=lzma.FORMAT_XZ, memlimit=1024)
368 with self.assertRaises(LZMAError):
369 lzma.decompress(
370 COMPRESSED_ALONE, format=lzma.FORMAT_ALONE, memlimit=1024)
371
372 # Test LZMADecompressor on known-good input data.
373
374 def test_decompress_good_input(self):
375 ddata = lzma.decompress(COMPRESSED_XZ)
376 self.assertEqual(ddata, INPUT)
377
378 ddata = lzma.decompress(COMPRESSED_ALONE)
379 self.assertEqual(ddata, INPUT)
380
381 ddata = lzma.decompress(COMPRESSED_XZ, lzma.FORMAT_XZ)
382 self.assertEqual(ddata, INPUT)
383
384 ddata = lzma.decompress(COMPRESSED_ALONE, lzma.FORMAT_ALONE)
385 self.assertEqual(ddata, INPUT)
386
387 ddata = lzma.decompress(
388 COMPRESSED_RAW_1, lzma.FORMAT_RAW, filters=FILTERS_RAW_1)
389 self.assertEqual(ddata, INPUT)
390
391 ddata = lzma.decompress(
392 COMPRESSED_RAW_2, lzma.FORMAT_RAW, filters=FILTERS_RAW_2)
393 self.assertEqual(ddata, INPUT)
394
395 ddata = lzma.decompress(
396 COMPRESSED_RAW_3, lzma.FORMAT_RAW, filters=FILTERS_RAW_3)
397 self.assertEqual(ddata, INPUT)
398
399 ddata = lzma.decompress(
400 COMPRESSED_RAW_4, lzma.FORMAT_RAW, filters=FILTERS_RAW_4)
401 self.assertEqual(ddata, INPUT)
402
403 def test_decompress_incomplete_input(self):
404 self.assertRaises(LZMAError, lzma.decompress, COMPRESSED_XZ[:128])
405 self.assertRaises(LZMAError, lzma.decompress, COMPRESSED_ALONE[:128])
406 self.assertRaises(LZMAError, lzma.decompress, COMPRESSED_RAW_1[:128],
407 format=lzma.FORMAT_RAW, filters=FILTERS_RAW_1)
408 self.assertRaises(LZMAError, lzma.decompress, COMPRESSED_RAW_2[:128],
409 format=lzma.FORMAT_RAW, filters=FILTERS_RAW_2)
410 self.assertRaises(LZMAError, lzma.decompress, COMPRESSED_RAW_3[:128],
411 format=lzma.FORMAT_RAW, filters=FILTERS_RAW_3)
412 self.assertRaises(LZMAError, lzma.decompress, COMPRESSED_RAW_4[:128],
413 format=lzma.FORMAT_RAW, filters=FILTERS_RAW_4)
414
415 def test_decompress_bad_input(self):
416 with self.assertRaises(LZMAError):
Nadeem Vawda9c72ebc2013-12-04 23:03:49 +0100417 lzma.decompress(COMPRESSED_BOGUS)
418 with self.assertRaises(LZMAError):
Nadeem Vawda3ff069e2011-11-30 00:25:06 +0200419 lzma.decompress(COMPRESSED_RAW_1)
420 with self.assertRaises(LZMAError):
421 lzma.decompress(COMPRESSED_ALONE, format=lzma.FORMAT_XZ)
422 with self.assertRaises(LZMAError):
423 lzma.decompress(COMPRESSED_XZ, format=lzma.FORMAT_ALONE)
424 with self.assertRaises(LZMAError):
425 lzma.decompress(COMPRESSED_XZ, format=lzma.FORMAT_RAW,
426 filters=FILTERS_RAW_1)
427
428 # Test that compress()->decompress() preserves the input data.
429
430 def test_roundtrip(self):
431 cdata = lzma.compress(INPUT)
432 ddata = lzma.decompress(cdata)
433 self.assertEqual(ddata, INPUT)
434
435 cdata = lzma.compress(INPUT, lzma.FORMAT_XZ)
436 ddata = lzma.decompress(cdata)
437 self.assertEqual(ddata, INPUT)
438
439 cdata = lzma.compress(INPUT, lzma.FORMAT_ALONE)
440 ddata = lzma.decompress(cdata)
441 self.assertEqual(ddata, INPUT)
442
443 cdata = lzma.compress(INPUT, lzma.FORMAT_RAW, filters=FILTERS_RAW_4)
444 ddata = lzma.decompress(cdata, lzma.FORMAT_RAW, filters=FILTERS_RAW_4)
445 self.assertEqual(ddata, INPUT)
446
447 # Unlike LZMADecompressor, decompress() *does* handle concatenated streams.
448
449 def test_decompress_multistream(self):
450 ddata = lzma.decompress(COMPRESSED_XZ + COMPRESSED_ALONE)
451 self.assertEqual(ddata, INPUT * 2)
452
Nadeem Vawda9c72ebc2013-12-04 23:03:49 +0100453 # Test robust handling of non-LZMA data following the compressed stream(s).
454
455 def test_decompress_trailing_junk(self):
456 ddata = lzma.decompress(COMPRESSED_XZ + COMPRESSED_BOGUS)
457 self.assertEqual(ddata, INPUT)
458
459 def test_decompress_multistream_trailing_junk(self):
460 ddata = lzma.decompress(COMPRESSED_XZ * 3 + COMPRESSED_BOGUS)
461 self.assertEqual(ddata, INPUT * 3)
462
Nadeem Vawda3ff069e2011-11-30 00:25:06 +0200463
464class TempFile:
465 """Context manager - creates a file, and deletes it on __exit__."""
466
467 def __init__(self, filename, data=b""):
468 self.filename = filename
469 self.data = data
470
471 def __enter__(self):
472 with open(self.filename, "wb") as f:
473 f.write(self.data)
474
475 def __exit__(self, *args):
476 unlink(self.filename)
477
478
479class FileTestCase(unittest.TestCase):
480
481 def test_init(self):
Nadeem Vawda33c34da2012-06-04 23:34:07 +0200482 with LZMAFile(BytesIO(COMPRESSED_XZ)) as f:
Nadeem Vawda3ff069e2011-11-30 00:25:06 +0200483 pass
Nadeem Vawda33c34da2012-06-04 23:34:07 +0200484 with LZMAFile(BytesIO(), "w") as f:
Nadeem Vawda3ff069e2011-11-30 00:25:06 +0200485 pass
Nadeem Vawda42ca9822013-10-19 00:06:19 +0200486 with LZMAFile(BytesIO(), "x") as f:
487 pass
Nadeem Vawda33c34da2012-06-04 23:34:07 +0200488 with LZMAFile(BytesIO(), "a") as f:
Nadeem Vawda3ff069e2011-11-30 00:25:06 +0200489 pass
490
491 def test_init_with_filename(self):
492 with TempFile(TESTFN, COMPRESSED_XZ):
493 with LZMAFile(TESTFN) as f:
494 pass
495 with LZMAFile(TESTFN, "w") as f:
496 pass
497 with LZMAFile(TESTFN, "a") as f:
498 pass
499
Nadeem Vawda6cbb20c2012-06-04 23:36:24 +0200500 def test_init_mode(self):
501 with TempFile(TESTFN):
502 with LZMAFile(TESTFN, "r"):
503 pass
504 with LZMAFile(TESTFN, "rb"):
505 pass
506 with LZMAFile(TESTFN, "w"):
507 pass
508 with LZMAFile(TESTFN, "wb"):
509 pass
510 with LZMAFile(TESTFN, "a"):
511 pass
512 with LZMAFile(TESTFN, "ab"):
513 pass
514
Nadeem Vawda42ca9822013-10-19 00:06:19 +0200515 def test_init_with_x_mode(self):
516 self.addCleanup(unlink, TESTFN)
517 for mode in ("x", "xb"):
518 unlink(TESTFN)
519 with LZMAFile(TESTFN, mode):
520 pass
521 with self.assertRaises(FileExistsError):
522 with LZMAFile(TESTFN, mode):
523 pass
524
Nadeem Vawda3ff069e2011-11-30 00:25:06 +0200525 def test_init_bad_mode(self):
526 with self.assertRaises(ValueError):
Nadeem Vawda33c34da2012-06-04 23:34:07 +0200527 LZMAFile(BytesIO(COMPRESSED_XZ), (3, "x"))
Nadeem Vawda3ff069e2011-11-30 00:25:06 +0200528 with self.assertRaises(ValueError):
Nadeem Vawda33c34da2012-06-04 23:34:07 +0200529 LZMAFile(BytesIO(COMPRESSED_XZ), "")
Nadeem Vawda3ff069e2011-11-30 00:25:06 +0200530 with self.assertRaises(ValueError):
Nadeem Vawda42ca9822013-10-19 00:06:19 +0200531 LZMAFile(BytesIO(COMPRESSED_XZ), "xt")
532 with self.assertRaises(ValueError):
533 LZMAFile(BytesIO(COMPRESSED_XZ), "x+")
534 with self.assertRaises(ValueError):
535 LZMAFile(BytesIO(COMPRESSED_XZ), "rx")
536 with self.assertRaises(ValueError):
537 LZMAFile(BytesIO(COMPRESSED_XZ), "wx")
Nadeem Vawda3ff069e2011-11-30 00:25:06 +0200538 with self.assertRaises(ValueError):
Nadeem Vawda6cbb20c2012-06-04 23:36:24 +0200539 LZMAFile(BytesIO(COMPRESSED_XZ), "rt")
Nadeem Vawda3ff069e2011-11-30 00:25:06 +0200540 with self.assertRaises(ValueError):
Nadeem Vawda33c34da2012-06-04 23:34:07 +0200541 LZMAFile(BytesIO(COMPRESSED_XZ), "r+")
Nadeem Vawda3ff069e2011-11-30 00:25:06 +0200542 with self.assertRaises(ValueError):
Nadeem Vawda6cbb20c2012-06-04 23:36:24 +0200543 LZMAFile(BytesIO(COMPRESSED_XZ), "wt")
Nadeem Vawda3ff069e2011-11-30 00:25:06 +0200544 with self.assertRaises(ValueError):
Nadeem Vawda33c34da2012-06-04 23:34:07 +0200545 LZMAFile(BytesIO(COMPRESSED_XZ), "w+")
Nadeem Vawda3ff069e2011-11-30 00:25:06 +0200546 with self.assertRaises(ValueError):
Nadeem Vawda33c34da2012-06-04 23:34:07 +0200547 LZMAFile(BytesIO(COMPRESSED_XZ), "rw")
Nadeem Vawda3ff069e2011-11-30 00:25:06 +0200548
549 def test_init_bad_check(self):
550 with self.assertRaises(TypeError):
Nadeem Vawda33c34da2012-06-04 23:34:07 +0200551 LZMAFile(BytesIO(), "w", check=b"asd")
Nadeem Vawda3ff069e2011-11-30 00:25:06 +0200552 # CHECK_UNKNOWN and anything above CHECK_ID_MAX should be invalid.
553 with self.assertRaises(LZMAError):
Nadeem Vawda33c34da2012-06-04 23:34:07 +0200554 LZMAFile(BytesIO(), "w", check=lzma.CHECK_UNKNOWN)
Nadeem Vawda3ff069e2011-11-30 00:25:06 +0200555 with self.assertRaises(LZMAError):
Nadeem Vawda33c34da2012-06-04 23:34:07 +0200556 LZMAFile(BytesIO(), "w", check=lzma.CHECK_ID_MAX + 3)
Nadeem Vawda3ff069e2011-11-30 00:25:06 +0200557 # Cannot specify a check with mode="r".
558 with self.assertRaises(ValueError):
Nadeem Vawda33c34da2012-06-04 23:34:07 +0200559 LZMAFile(BytesIO(COMPRESSED_XZ), check=lzma.CHECK_NONE)
Nadeem Vawda3ff069e2011-11-30 00:25:06 +0200560 with self.assertRaises(ValueError):
Nadeem Vawda33c34da2012-06-04 23:34:07 +0200561 LZMAFile(BytesIO(COMPRESSED_XZ), check=lzma.CHECK_CRC32)
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_CRC64)
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_SHA256)
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_UNKNOWN)
Nadeem Vawda3ff069e2011-11-30 00:25:06 +0200568
569 def test_init_bad_preset(self):
570 with self.assertRaises(TypeError):
Nadeem Vawda33c34da2012-06-04 23:34:07 +0200571 LZMAFile(BytesIO(), "w", preset=4.39)
Nadeem Vawda3ff069e2011-11-30 00:25:06 +0200572 with self.assertRaises(LZMAError):
Nadeem Vawda33c34da2012-06-04 23:34:07 +0200573 LZMAFile(BytesIO(), "w", preset=10)
Nadeem Vawda3ff069e2011-11-30 00:25:06 +0200574 with self.assertRaises(LZMAError):
Nadeem Vawda33c34da2012-06-04 23:34:07 +0200575 LZMAFile(BytesIO(), "w", preset=23)
Nadeem Vawda3ff069e2011-11-30 00:25:06 +0200576 with self.assertRaises(OverflowError):
Nadeem Vawda33c34da2012-06-04 23:34:07 +0200577 LZMAFile(BytesIO(), "w", preset=-1)
Nadeem Vawda3ff069e2011-11-30 00:25:06 +0200578 with self.assertRaises(OverflowError):
Nadeem Vawda33c34da2012-06-04 23:34:07 +0200579 LZMAFile(BytesIO(), "w", preset=-7)
Nadeem Vawda3ff069e2011-11-30 00:25:06 +0200580 with self.assertRaises(TypeError):
Nadeem Vawda33c34da2012-06-04 23:34:07 +0200581 LZMAFile(BytesIO(), "w", preset="foo")
Nadeem Vawda3ff069e2011-11-30 00:25:06 +0200582 # Cannot specify a preset with mode="r".
583 with self.assertRaises(ValueError):
Nadeem Vawda33c34da2012-06-04 23:34:07 +0200584 LZMAFile(BytesIO(COMPRESSED_XZ), preset=3)
Nadeem Vawda3ff069e2011-11-30 00:25:06 +0200585
586 def test_init_bad_filter_spec(self):
587 with self.assertRaises(TypeError):
Nadeem Vawda33c34da2012-06-04 23:34:07 +0200588 LZMAFile(BytesIO(), "w", filters=[b"wobsite"])
Nadeem Vawda3ff069e2011-11-30 00:25:06 +0200589 with self.assertRaises(ValueError):
Nadeem Vawda33c34da2012-06-04 23:34:07 +0200590 LZMAFile(BytesIO(), "w", filters=[{"xyzzy": 3}])
Nadeem Vawda3ff069e2011-11-30 00:25:06 +0200591 with self.assertRaises(ValueError):
Nadeem Vawda33c34da2012-06-04 23:34:07 +0200592 LZMAFile(BytesIO(), "w", filters=[{"id": 98765}])
Nadeem Vawda3ff069e2011-11-30 00:25:06 +0200593 with self.assertRaises(ValueError):
Nadeem Vawda33c34da2012-06-04 23:34:07 +0200594 LZMAFile(BytesIO(), "w",
Nadeem Vawda3ff069e2011-11-30 00:25:06 +0200595 filters=[{"id": lzma.FILTER_LZMA2, "foo": 0}])
596 with self.assertRaises(ValueError):
Nadeem Vawda33c34da2012-06-04 23:34:07 +0200597 LZMAFile(BytesIO(), "w",
Nadeem Vawda3ff069e2011-11-30 00:25:06 +0200598 filters=[{"id": lzma.FILTER_DELTA, "foo": 0}])
599 with self.assertRaises(ValueError):
Nadeem Vawda33c34da2012-06-04 23:34:07 +0200600 LZMAFile(BytesIO(), "w",
Nadeem Vawda3ff069e2011-11-30 00:25:06 +0200601 filters=[{"id": lzma.FILTER_X86, "foo": 0}])
602
603 def test_init_with_preset_and_filters(self):
604 with self.assertRaises(ValueError):
Nadeem Vawda33c34da2012-06-04 23:34:07 +0200605 LZMAFile(BytesIO(), "w", format=lzma.FORMAT_RAW,
606 preset=6, filters=FILTERS_RAW_1)
Nadeem Vawda3ff069e2011-11-30 00:25:06 +0200607
608 def test_close(self):
609 with BytesIO(COMPRESSED_XZ) as src:
Nadeem Vawda33c34da2012-06-04 23:34:07 +0200610 f = LZMAFile(src)
Nadeem Vawda3ff069e2011-11-30 00:25:06 +0200611 f.close()
612 # LZMAFile.close() should not close the underlying file object.
613 self.assertFalse(src.closed)
614 # Try closing an already-closed LZMAFile.
615 f.close()
616 self.assertFalse(src.closed)
617
618 # Test with a real file on disk, opened directly by LZMAFile.
619 with TempFile(TESTFN, COMPRESSED_XZ):
620 f = LZMAFile(TESTFN)
621 fp = f._fp
622 f.close()
623 # Here, LZMAFile.close() *should* close the underlying file object.
624 self.assertTrue(fp.closed)
625 # Try closing an already-closed LZMAFile.
626 f.close()
627
628 def test_closed(self):
Nadeem Vawda33c34da2012-06-04 23:34:07 +0200629 f = LZMAFile(BytesIO(COMPRESSED_XZ))
Nadeem Vawda3ff069e2011-11-30 00:25:06 +0200630 try:
631 self.assertFalse(f.closed)
632 f.read()
633 self.assertFalse(f.closed)
634 finally:
635 f.close()
636 self.assertTrue(f.closed)
637
Nadeem Vawda33c34da2012-06-04 23:34:07 +0200638 f = LZMAFile(BytesIO(), "w")
Nadeem Vawda3ff069e2011-11-30 00:25:06 +0200639 try:
640 self.assertFalse(f.closed)
641 finally:
642 f.close()
643 self.assertTrue(f.closed)
644
645 def test_fileno(self):
Nadeem Vawda33c34da2012-06-04 23:34:07 +0200646 f = LZMAFile(BytesIO(COMPRESSED_XZ))
Nadeem Vawda3ff069e2011-11-30 00:25:06 +0200647 try:
648 self.assertRaises(UnsupportedOperation, f.fileno)
649 finally:
650 f.close()
651 self.assertRaises(ValueError, f.fileno)
652 with TempFile(TESTFN, COMPRESSED_XZ):
653 f = LZMAFile(TESTFN)
654 try:
655 self.assertEqual(f.fileno(), f._fp.fileno())
656 self.assertIsInstance(f.fileno(), int)
657 finally:
658 f.close()
659 self.assertRaises(ValueError, f.fileno)
660
661 def test_seekable(self):
Nadeem Vawda33c34da2012-06-04 23:34:07 +0200662 f = LZMAFile(BytesIO(COMPRESSED_XZ))
Nadeem Vawda3ff069e2011-11-30 00:25:06 +0200663 try:
664 self.assertTrue(f.seekable())
665 f.read()
666 self.assertTrue(f.seekable())
667 finally:
668 f.close()
669 self.assertRaises(ValueError, f.seekable)
670
Nadeem Vawda33c34da2012-06-04 23:34:07 +0200671 f = LZMAFile(BytesIO(), "w")
Nadeem Vawda3ff069e2011-11-30 00:25:06 +0200672 try:
673 self.assertFalse(f.seekable())
674 finally:
675 f.close()
676 self.assertRaises(ValueError, f.seekable)
677
Nadeem Vawdaae557d72012-02-12 01:51:38 +0200678 src = BytesIO(COMPRESSED_XZ)
679 src.seekable = lambda: False
Nadeem Vawda33c34da2012-06-04 23:34:07 +0200680 f = LZMAFile(src)
Nadeem Vawdaae557d72012-02-12 01:51:38 +0200681 try:
682 self.assertFalse(f.seekable())
683 finally:
684 f.close()
685 self.assertRaises(ValueError, f.seekable)
686
Nadeem Vawda3ff069e2011-11-30 00:25:06 +0200687 def test_readable(self):
Nadeem Vawda33c34da2012-06-04 23:34:07 +0200688 f = LZMAFile(BytesIO(COMPRESSED_XZ))
Nadeem Vawda3ff069e2011-11-30 00:25:06 +0200689 try:
690 self.assertTrue(f.readable())
691 f.read()
692 self.assertTrue(f.readable())
693 finally:
694 f.close()
695 self.assertRaises(ValueError, f.readable)
696
Nadeem Vawda33c34da2012-06-04 23:34:07 +0200697 f = LZMAFile(BytesIO(), "w")
Nadeem Vawda3ff069e2011-11-30 00:25:06 +0200698 try:
699 self.assertFalse(f.readable())
700 finally:
701 f.close()
702 self.assertRaises(ValueError, f.readable)
703
704 def test_writable(self):
Nadeem Vawda33c34da2012-06-04 23:34:07 +0200705 f = LZMAFile(BytesIO(COMPRESSED_XZ))
Nadeem Vawda3ff069e2011-11-30 00:25:06 +0200706 try:
707 self.assertFalse(f.writable())
708 f.read()
709 self.assertFalse(f.writable())
710 finally:
711 f.close()
712 self.assertRaises(ValueError, f.writable)
713
Nadeem Vawda33c34da2012-06-04 23:34:07 +0200714 f = LZMAFile(BytesIO(), "w")
Nadeem Vawda3ff069e2011-11-30 00:25:06 +0200715 try:
716 self.assertTrue(f.writable())
717 finally:
718 f.close()
719 self.assertRaises(ValueError, f.writable)
720
721 def test_read(self):
Nadeem Vawda33c34da2012-06-04 23:34:07 +0200722 with LZMAFile(BytesIO(COMPRESSED_XZ)) 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_ALONE)) as f:
Nadeem Vawda3ff069e2011-11-30 00:25:06 +0200726 self.assertEqual(f.read(), INPUT)
Nadeem Vawda33c34da2012-06-04 23:34:07 +0200727 with LZMAFile(BytesIO(COMPRESSED_XZ), format=lzma.FORMAT_XZ) as f:
Nadeem Vawda3ff069e2011-11-30 00:25:06 +0200728 self.assertEqual(f.read(), INPUT)
729 self.assertEqual(f.read(), b"")
Nadeem Vawda33c34da2012-06-04 23:34:07 +0200730 with LZMAFile(BytesIO(COMPRESSED_ALONE), format=lzma.FORMAT_ALONE) as f:
Nadeem Vawda3ff069e2011-11-30 00:25:06 +0200731 self.assertEqual(f.read(), INPUT)
732 self.assertEqual(f.read(), b"")
Nadeem Vawda33c34da2012-06-04 23:34:07 +0200733 with LZMAFile(BytesIO(COMPRESSED_RAW_1),
Nadeem Vawda3ff069e2011-11-30 00:25:06 +0200734 format=lzma.FORMAT_RAW, filters=FILTERS_RAW_1) 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_2),
Nadeem Vawda3ff069e2011-11-30 00:25:06 +0200738 format=lzma.FORMAT_RAW, filters=FILTERS_RAW_2) as f:
739 self.assertEqual(f.read(), INPUT)
740 self.assertEqual(f.read(), b"")
Nadeem Vawda33c34da2012-06-04 23:34:07 +0200741 with LZMAFile(BytesIO(COMPRESSED_RAW_3),
Nadeem Vawda3ff069e2011-11-30 00:25:06 +0200742 format=lzma.FORMAT_RAW, filters=FILTERS_RAW_3) as f:
743 self.assertEqual(f.read(), INPUT)
744 self.assertEqual(f.read(), b"")
Nadeem Vawda33c34da2012-06-04 23:34:07 +0200745 with LZMAFile(BytesIO(COMPRESSED_RAW_4),
Nadeem Vawda3ff069e2011-11-30 00:25:06 +0200746 format=lzma.FORMAT_RAW, filters=FILTERS_RAW_4) as f:
747 self.assertEqual(f.read(), INPUT)
748 self.assertEqual(f.read(), b"")
749
750 def test_read_0(self):
Nadeem Vawda33c34da2012-06-04 23:34:07 +0200751 with LZMAFile(BytesIO(COMPRESSED_XZ)) as f:
Nadeem Vawda3ff069e2011-11-30 00:25:06 +0200752 self.assertEqual(f.read(0), b"")
Nadeem Vawda33c34da2012-06-04 23:34:07 +0200753 with LZMAFile(BytesIO(COMPRESSED_ALONE)) 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_XZ), format=lzma.FORMAT_XZ) 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_ALONE), format=lzma.FORMAT_ALONE) as f:
Nadeem Vawda3ff069e2011-11-30 00:25:06 +0200758 self.assertEqual(f.read(0), b"")
759
760 def test_read_10(self):
Nadeem Vawda33c34da2012-06-04 23:34:07 +0200761 with LZMAFile(BytesIO(COMPRESSED_XZ)) as f:
Nadeem Vawda3ff069e2011-11-30 00:25:06 +0200762 chunks = []
763 while True:
764 result = f.read(10)
765 if not result:
766 break
767 self.assertLessEqual(len(result), 10)
768 chunks.append(result)
769 self.assertEqual(b"".join(chunks), INPUT)
770
771 def test_read_multistream(self):
Nadeem Vawda33c34da2012-06-04 23:34:07 +0200772 with LZMAFile(BytesIO(COMPRESSED_XZ * 5)) as f:
Nadeem Vawda3ff069e2011-11-30 00:25:06 +0200773 self.assertEqual(f.read(), INPUT * 5)
Nadeem Vawda33c34da2012-06-04 23:34:07 +0200774 with LZMAFile(BytesIO(COMPRESSED_XZ + COMPRESSED_ALONE)) as f:
Nadeem Vawda3ff069e2011-11-30 00:25:06 +0200775 self.assertEqual(f.read(), INPUT * 2)
Nadeem Vawda33c34da2012-06-04 23:34:07 +0200776 with LZMAFile(BytesIO(COMPRESSED_RAW_3 * 4),
Nadeem Vawda3ff069e2011-11-30 00:25:06 +0200777 format=lzma.FORMAT_RAW, filters=FILTERS_RAW_3) as f:
778 self.assertEqual(f.read(), INPUT * 4)
779
780 def test_read_multistream_buffer_size_aligned(self):
781 # Test the case where a stream boundary coincides with the end
782 # of the raw read buffer.
Antoine Pitrou2dbc6e62015-04-11 00:31:01 +0200783 saved_buffer_size = _compression.BUFFER_SIZE
784 _compression.BUFFER_SIZE = len(COMPRESSED_XZ)
Nadeem Vawda3ff069e2011-11-30 00:25:06 +0200785 try:
Nadeem Vawda33c34da2012-06-04 23:34:07 +0200786 with LZMAFile(BytesIO(COMPRESSED_XZ * 5)) as f:
Nadeem Vawda3ff069e2011-11-30 00:25:06 +0200787 self.assertEqual(f.read(), INPUT * 5)
788 finally:
Antoine Pitrou2dbc6e62015-04-11 00:31:01 +0200789 _compression.BUFFER_SIZE = saved_buffer_size
Nadeem Vawda3ff069e2011-11-30 00:25:06 +0200790
Nadeem Vawda9c72ebc2013-12-04 23:03:49 +0100791 def test_read_trailing_junk(self):
792 with LZMAFile(BytesIO(COMPRESSED_XZ + COMPRESSED_BOGUS)) as f:
793 self.assertEqual(f.read(), INPUT)
794
795 def test_read_multistream_trailing_junk(self):
796 with LZMAFile(BytesIO(COMPRESSED_XZ * 5 + COMPRESSED_BOGUS)) as f:
797 self.assertEqual(f.read(), INPUT * 5)
798
Nadeem Vawda3ff069e2011-11-30 00:25:06 +0200799 def test_read_from_file(self):
800 with TempFile(TESTFN, COMPRESSED_XZ):
801 with LZMAFile(TESTFN) as f:
802 self.assertEqual(f.read(), INPUT)
803 self.assertEqual(f.read(), b"")
804
Nadeem Vawda10c87912012-06-20 01:48:50 +0200805 def test_read_from_file_with_bytes_filename(self):
806 try:
807 bytes_filename = TESTFN.encode("ascii")
808 except UnicodeEncodeError:
809 self.skipTest("Temporary file name needs to be ASCII")
810 with TempFile(TESTFN, COMPRESSED_XZ):
811 with LZMAFile(bytes_filename) as f:
812 self.assertEqual(f.read(), INPUT)
813 self.assertEqual(f.read(), b"")
814
Nadeem Vawda3ff069e2011-11-30 00:25:06 +0200815 def test_read_incomplete(self):
Nadeem Vawda33c34da2012-06-04 23:34:07 +0200816 with LZMAFile(BytesIO(COMPRESSED_XZ[:128])) as f:
Nadeem Vawda3ff069e2011-11-30 00:25:06 +0200817 self.assertRaises(EOFError, f.read)
818
Serhiy Storchaka57f9b7a2013-01-22 17:07:49 +0200819 def test_read_truncated(self):
820 # Drop stream footer: CRC (4 bytes), index size (4 bytes),
Serhiy Storchaka70ea7fa2013-02-08 11:24:16 +0200821 # flags (2 bytes) and magic number (2 bytes).
Serhiy Storchaka57f9b7a2013-01-22 17:07:49 +0200822 truncated = COMPRESSED_XZ[:-12]
823 with LZMAFile(BytesIO(truncated)) as f:
824 self.assertRaises(EOFError, f.read)
825 with LZMAFile(BytesIO(truncated)) as f:
826 self.assertEqual(f.read(len(INPUT)), INPUT)
827 self.assertRaises(EOFError, f.read, 1)
828 # Incomplete 12-byte header.
829 for i in range(12):
830 with LZMAFile(BytesIO(truncated[:i])) as f:
831 self.assertRaises(EOFError, f.read, 1)
832
Nadeem Vawda3ff069e2011-11-30 00:25:06 +0200833 def test_read_bad_args(self):
Nadeem Vawda33c34da2012-06-04 23:34:07 +0200834 f = LZMAFile(BytesIO(COMPRESSED_XZ))
Nadeem Vawda3ff069e2011-11-30 00:25:06 +0200835 f.close()
836 self.assertRaises(ValueError, f.read)
Nadeem Vawda33c34da2012-06-04 23:34:07 +0200837 with LZMAFile(BytesIO(), "w") as f:
Nadeem Vawda3ff069e2011-11-30 00:25:06 +0200838 self.assertRaises(ValueError, f.read)
Nadeem Vawda33c34da2012-06-04 23:34:07 +0200839 with LZMAFile(BytesIO(COMPRESSED_XZ)) as f:
Antoine Pitrou2dbc6e62015-04-11 00:31:01 +0200840 self.assertRaises(TypeError, f.read, float())
Nadeem Vawda3ff069e2011-11-30 00:25:06 +0200841
Nadeem Vawda9c72ebc2013-12-04 23:03:49 +0100842 def test_read_bad_data(self):
843 with LZMAFile(BytesIO(COMPRESSED_BOGUS)) as f:
844 self.assertRaises(LZMAError, f.read)
845
Nadeem Vawda3ff069e2011-11-30 00:25:06 +0200846 def test_read1(self):
Nadeem Vawda33c34da2012-06-04 23:34:07 +0200847 with LZMAFile(BytesIO(COMPRESSED_XZ)) as f:
Nadeem Vawda3ff069e2011-11-30 00:25:06 +0200848 blocks = []
849 while True:
850 result = f.read1()
851 if not result:
852 break
853 blocks.append(result)
854 self.assertEqual(b"".join(blocks), INPUT)
855 self.assertEqual(f.read1(), b"")
856
857 def test_read1_0(self):
Nadeem Vawda33c34da2012-06-04 23:34:07 +0200858 with LZMAFile(BytesIO(COMPRESSED_XZ)) as f:
Nadeem Vawda3ff069e2011-11-30 00:25:06 +0200859 self.assertEqual(f.read1(0), b"")
860
861 def test_read1_10(self):
Nadeem Vawda33c34da2012-06-04 23:34:07 +0200862 with LZMAFile(BytesIO(COMPRESSED_XZ)) as f:
Nadeem Vawda3ff069e2011-11-30 00:25:06 +0200863 blocks = []
864 while True:
865 result = f.read1(10)
866 if not result:
867 break
868 blocks.append(result)
869 self.assertEqual(b"".join(blocks), INPUT)
870 self.assertEqual(f.read1(), b"")
871
872 def test_read1_multistream(self):
Nadeem Vawda33c34da2012-06-04 23:34:07 +0200873 with LZMAFile(BytesIO(COMPRESSED_XZ * 5)) as f:
Nadeem Vawda3ff069e2011-11-30 00:25:06 +0200874 blocks = []
875 while True:
876 result = f.read1()
877 if not result:
878 break
879 blocks.append(result)
880 self.assertEqual(b"".join(blocks), INPUT * 5)
881 self.assertEqual(f.read1(), b"")
882
883 def test_read1_bad_args(self):
Nadeem Vawda33c34da2012-06-04 23:34:07 +0200884 f = LZMAFile(BytesIO(COMPRESSED_XZ))
Nadeem Vawda3ff069e2011-11-30 00:25:06 +0200885 f.close()
886 self.assertRaises(ValueError, f.read1)
Nadeem Vawda33c34da2012-06-04 23:34:07 +0200887 with LZMAFile(BytesIO(), "w") as f:
Nadeem Vawda3ff069e2011-11-30 00:25:06 +0200888 self.assertRaises(ValueError, f.read1)
Nadeem Vawda33c34da2012-06-04 23:34:07 +0200889 with LZMAFile(BytesIO(COMPRESSED_XZ)) as f:
Nadeem Vawda3ff069e2011-11-30 00:25:06 +0200890 self.assertRaises(TypeError, f.read1, None)
891
892 def test_peek(self):
Nadeem Vawda33c34da2012-06-04 23:34:07 +0200893 with LZMAFile(BytesIO(COMPRESSED_XZ)) as f:
Nadeem Vawda3ff069e2011-11-30 00:25:06 +0200894 result = f.peek()
895 self.assertGreater(len(result), 0)
896 self.assertTrue(INPUT.startswith(result))
897 self.assertEqual(f.read(), INPUT)
Nadeem Vawda33c34da2012-06-04 23:34:07 +0200898 with LZMAFile(BytesIO(COMPRESSED_XZ)) as f:
Nadeem Vawda3ff069e2011-11-30 00:25:06 +0200899 result = f.peek(10)
900 self.assertGreater(len(result), 0)
901 self.assertTrue(INPUT.startswith(result))
902 self.assertEqual(f.read(), INPUT)
903
904 def test_peek_bad_args(self):
Nadeem Vawda33c34da2012-06-04 23:34:07 +0200905 with LZMAFile(BytesIO(), "w") as f:
Nadeem Vawda3ff069e2011-11-30 00:25:06 +0200906 self.assertRaises(ValueError, f.peek)
907
908 def test_iterator(self):
909 with BytesIO(INPUT) as f:
910 lines = f.readlines()
Nadeem Vawda33c34da2012-06-04 23:34:07 +0200911 with LZMAFile(BytesIO(COMPRESSED_XZ)) as f:
Nadeem Vawda3ff069e2011-11-30 00:25:06 +0200912 self.assertListEqual(list(iter(f)), lines)
Nadeem Vawda33c34da2012-06-04 23:34:07 +0200913 with LZMAFile(BytesIO(COMPRESSED_ALONE)) 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_XZ), format=lzma.FORMAT_XZ) 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_ALONE), format=lzma.FORMAT_ALONE) 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_RAW_2),
Nadeem Vawda3ff069e2011-11-30 00:25:06 +0200920 format=lzma.FORMAT_RAW, filters=FILTERS_RAW_2) as f:
921 self.assertListEqual(list(iter(f)), lines)
922
923 def test_readline(self):
924 with BytesIO(INPUT) as f:
925 lines = f.readlines()
Nadeem Vawda33c34da2012-06-04 23:34:07 +0200926 with LZMAFile(BytesIO(COMPRESSED_XZ)) as f:
Nadeem Vawda3ff069e2011-11-30 00:25:06 +0200927 for line in lines:
928 self.assertEqual(f.readline(), line)
929
930 def test_readlines(self):
931 with BytesIO(INPUT) as f:
932 lines = f.readlines()
Nadeem Vawda33c34da2012-06-04 23:34:07 +0200933 with LZMAFile(BytesIO(COMPRESSED_XZ)) as f:
Nadeem Vawda3ff069e2011-11-30 00:25:06 +0200934 self.assertListEqual(f.readlines(), lines)
935
Antoine Pitrou2dbc6e62015-04-11 00:31:01 +0200936 def test_decompress_limited(self):
937 """Decompressed data buffering should be limited"""
938 bomb = lzma.compress(bytes(int(2e6)), preset=6)
939 self.assertLess(len(bomb), _compression.BUFFER_SIZE)
940
941 decomp = LZMAFile(BytesIO(bomb))
942 self.assertEqual(bytes(1), decomp.read(1))
943 max_decomp = 1 + DEFAULT_BUFFER_SIZE
944 self.assertLessEqual(decomp._buffer.raw.tell(), max_decomp,
945 "Excessive amount of data was decompressed")
946
Nadeem Vawda3ff069e2011-11-30 00:25:06 +0200947 def test_write(self):
948 with BytesIO() as dst:
Nadeem Vawda33c34da2012-06-04 23:34:07 +0200949 with LZMAFile(dst, "w") as f:
Nadeem Vawda3ff069e2011-11-30 00:25:06 +0200950 f.write(INPUT)
951 expected = lzma.compress(INPUT)
952 self.assertEqual(dst.getvalue(), expected)
953 with BytesIO() as dst:
Nadeem Vawda33c34da2012-06-04 23:34:07 +0200954 with LZMAFile(dst, "w", format=lzma.FORMAT_XZ) as f:
Nadeem Vawda3ff069e2011-11-30 00:25:06 +0200955 f.write(INPUT)
956 expected = lzma.compress(INPUT, format=lzma.FORMAT_XZ)
957 self.assertEqual(dst.getvalue(), expected)
958 with BytesIO() as dst:
Nadeem Vawda33c34da2012-06-04 23:34:07 +0200959 with LZMAFile(dst, "w", format=lzma.FORMAT_ALONE) as f:
Nadeem Vawda3ff069e2011-11-30 00:25:06 +0200960 f.write(INPUT)
961 expected = lzma.compress(INPUT, format=lzma.FORMAT_ALONE)
962 self.assertEqual(dst.getvalue(), expected)
963 with BytesIO() as dst:
Nadeem Vawda33c34da2012-06-04 23:34:07 +0200964 with LZMAFile(dst, "w", format=lzma.FORMAT_RAW,
Nadeem Vawda3ff069e2011-11-30 00:25:06 +0200965 filters=FILTERS_RAW_2) as f:
966 f.write(INPUT)
967 expected = lzma.compress(INPUT, format=lzma.FORMAT_RAW,
968 filters=FILTERS_RAW_2)
969 self.assertEqual(dst.getvalue(), expected)
970
971 def test_write_10(self):
972 with BytesIO() as dst:
Nadeem Vawda33c34da2012-06-04 23:34:07 +0200973 with LZMAFile(dst, "w") as f:
Nadeem Vawda3ff069e2011-11-30 00:25:06 +0200974 for start in range(0, len(INPUT), 10):
975 f.write(INPUT[start:start+10])
976 expected = lzma.compress(INPUT)
977 self.assertEqual(dst.getvalue(), expected)
978
979 def test_write_append(self):
980 part1 = INPUT[:1024]
981 part2 = INPUT[1024:1536]
982 part3 = INPUT[1536:]
983 expected = b"".join(lzma.compress(x) for x in (part1, part2, part3))
984 with BytesIO() as dst:
Nadeem Vawda33c34da2012-06-04 23:34:07 +0200985 with LZMAFile(dst, "w") as f:
Nadeem Vawda3ff069e2011-11-30 00:25:06 +0200986 f.write(part1)
Nadeem Vawda33c34da2012-06-04 23:34:07 +0200987 with LZMAFile(dst, "a") as f:
Nadeem Vawda3ff069e2011-11-30 00:25:06 +0200988 f.write(part2)
Nadeem Vawda33c34da2012-06-04 23:34:07 +0200989 with LZMAFile(dst, "a") as f:
Nadeem Vawda3ff069e2011-11-30 00:25:06 +0200990 f.write(part3)
991 self.assertEqual(dst.getvalue(), expected)
992
993 def test_write_to_file(self):
994 try:
995 with LZMAFile(TESTFN, "w") as f:
996 f.write(INPUT)
997 expected = lzma.compress(INPUT)
998 with open(TESTFN, "rb") as f:
999 self.assertEqual(f.read(), expected)
1000 finally:
1001 unlink(TESTFN)
1002
Nadeem Vawda10c87912012-06-20 01:48:50 +02001003 def test_write_to_file_with_bytes_filename(self):
1004 try:
1005 bytes_filename = TESTFN.encode("ascii")
1006 except UnicodeEncodeError:
1007 self.skipTest("Temporary file name needs to be ASCII")
1008 try:
1009 with LZMAFile(bytes_filename, "w") as f:
1010 f.write(INPUT)
1011 expected = lzma.compress(INPUT)
1012 with open(TESTFN, "rb") as f:
1013 self.assertEqual(f.read(), expected)
1014 finally:
1015 unlink(TESTFN)
1016
Nadeem Vawda3ff069e2011-11-30 00:25:06 +02001017 def test_write_append_to_file(self):
1018 part1 = INPUT[:1024]
1019 part2 = INPUT[1024:1536]
1020 part3 = INPUT[1536:]
1021 expected = b"".join(lzma.compress(x) for x in (part1, part2, part3))
1022 try:
1023 with LZMAFile(TESTFN, "w") as f:
1024 f.write(part1)
1025 with LZMAFile(TESTFN, "a") as f:
1026 f.write(part2)
1027 with LZMAFile(TESTFN, "a") as f:
1028 f.write(part3)
1029 with open(TESTFN, "rb") as f:
1030 self.assertEqual(f.read(), expected)
1031 finally:
1032 unlink(TESTFN)
1033
1034 def test_write_bad_args(self):
Nadeem Vawda33c34da2012-06-04 23:34:07 +02001035 f = LZMAFile(BytesIO(), "w")
Nadeem Vawda3ff069e2011-11-30 00:25:06 +02001036 f.close()
1037 self.assertRaises(ValueError, f.write, b"foo")
Nadeem Vawda33c34da2012-06-04 23:34:07 +02001038 with LZMAFile(BytesIO(COMPRESSED_XZ), "r") as f:
Nadeem Vawda3ff069e2011-11-30 00:25:06 +02001039 self.assertRaises(ValueError, f.write, b"bar")
Nadeem Vawda33c34da2012-06-04 23:34:07 +02001040 with LZMAFile(BytesIO(), "w") as f:
Nadeem Vawda3ff069e2011-11-30 00:25:06 +02001041 self.assertRaises(TypeError, f.write, None)
1042 self.assertRaises(TypeError, f.write, "text")
1043 self.assertRaises(TypeError, f.write, 789)
1044
1045 def test_writelines(self):
1046 with BytesIO(INPUT) as f:
1047 lines = f.readlines()
1048 with BytesIO() as dst:
Nadeem Vawda33c34da2012-06-04 23:34:07 +02001049 with LZMAFile(dst, "w") as f:
Nadeem Vawda3ff069e2011-11-30 00:25:06 +02001050 f.writelines(lines)
1051 expected = lzma.compress(INPUT)
1052 self.assertEqual(dst.getvalue(), expected)
1053
1054 def test_seek_forward(self):
Nadeem Vawda33c34da2012-06-04 23:34:07 +02001055 with LZMAFile(BytesIO(COMPRESSED_XZ)) as f:
Nadeem Vawda3ff069e2011-11-30 00:25:06 +02001056 f.seek(555)
1057 self.assertEqual(f.read(), INPUT[555:])
1058
1059 def test_seek_forward_across_streams(self):
Nadeem Vawda33c34da2012-06-04 23:34:07 +02001060 with LZMAFile(BytesIO(COMPRESSED_XZ * 2)) as f:
Nadeem Vawda3ff069e2011-11-30 00:25:06 +02001061 f.seek(len(INPUT) + 123)
1062 self.assertEqual(f.read(), INPUT[123:])
1063
1064 def test_seek_forward_relative_to_current(self):
Nadeem Vawda33c34da2012-06-04 23:34:07 +02001065 with LZMAFile(BytesIO(COMPRESSED_XZ)) as f:
Nadeem Vawda3ff069e2011-11-30 00:25:06 +02001066 f.read(100)
1067 f.seek(1236, 1)
1068 self.assertEqual(f.read(), INPUT[1336:])
1069
1070 def test_seek_forward_relative_to_end(self):
Nadeem Vawda33c34da2012-06-04 23:34:07 +02001071 with LZMAFile(BytesIO(COMPRESSED_XZ)) as f:
Nadeem Vawda3ff069e2011-11-30 00:25:06 +02001072 f.seek(-555, 2)
1073 self.assertEqual(f.read(), INPUT[-555:])
1074
1075 def test_seek_backward(self):
Nadeem Vawda33c34da2012-06-04 23:34:07 +02001076 with LZMAFile(BytesIO(COMPRESSED_XZ)) as f:
Nadeem Vawda3ff069e2011-11-30 00:25:06 +02001077 f.read(1001)
1078 f.seek(211)
1079 self.assertEqual(f.read(), INPUT[211:])
1080
1081 def test_seek_backward_across_streams(self):
Nadeem Vawda33c34da2012-06-04 23:34:07 +02001082 with LZMAFile(BytesIO(COMPRESSED_XZ * 2)) as f:
Nadeem Vawda3ff069e2011-11-30 00:25:06 +02001083 f.read(len(INPUT) + 333)
1084 f.seek(737)
1085 self.assertEqual(f.read(), INPUT[737:] + INPUT)
1086
1087 def test_seek_backward_relative_to_end(self):
Nadeem Vawda33c34da2012-06-04 23:34:07 +02001088 with LZMAFile(BytesIO(COMPRESSED_XZ)) as f:
Nadeem Vawda3ff069e2011-11-30 00:25:06 +02001089 f.seek(-150, 2)
1090 self.assertEqual(f.read(), INPUT[-150:])
1091
1092 def test_seek_past_end(self):
Nadeem Vawda33c34da2012-06-04 23:34:07 +02001093 with LZMAFile(BytesIO(COMPRESSED_XZ)) as f:
Nadeem Vawda3ff069e2011-11-30 00:25:06 +02001094 f.seek(len(INPUT) + 9001)
1095 self.assertEqual(f.tell(), len(INPUT))
1096 self.assertEqual(f.read(), b"")
1097
1098 def test_seek_past_start(self):
Nadeem Vawda33c34da2012-06-04 23:34:07 +02001099 with LZMAFile(BytesIO(COMPRESSED_XZ)) as f:
Nadeem Vawda3ff069e2011-11-30 00:25:06 +02001100 f.seek(-88)
1101 self.assertEqual(f.tell(), 0)
1102 self.assertEqual(f.read(), INPUT)
1103
1104 def test_seek_bad_args(self):
Nadeem Vawda33c34da2012-06-04 23:34:07 +02001105 f = LZMAFile(BytesIO(COMPRESSED_XZ))
Nadeem Vawda3ff069e2011-11-30 00:25:06 +02001106 f.close()
1107 self.assertRaises(ValueError, f.seek, 0)
Nadeem Vawda33c34da2012-06-04 23:34:07 +02001108 with LZMAFile(BytesIO(), "w") as f:
Nadeem Vawda3ff069e2011-11-30 00:25:06 +02001109 self.assertRaises(ValueError, f.seek, 0)
Nadeem Vawda33c34da2012-06-04 23:34:07 +02001110 with LZMAFile(BytesIO(COMPRESSED_XZ)) as f:
Nadeem Vawda3ff069e2011-11-30 00:25:06 +02001111 self.assertRaises(ValueError, f.seek, 0, 3)
Antoine Pitrou2dbc6e62015-04-11 00:31:01 +02001112 # io.BufferedReader raises TypeError instead of ValueError
1113 self.assertRaises((TypeError, ValueError), f.seek, 9, ())
Nadeem Vawda3ff069e2011-11-30 00:25:06 +02001114 self.assertRaises(TypeError, f.seek, None)
1115 self.assertRaises(TypeError, f.seek, b"derp")
1116
1117 def test_tell(self):
Nadeem Vawda33c34da2012-06-04 23:34:07 +02001118 with LZMAFile(BytesIO(COMPRESSED_XZ)) as f:
Nadeem Vawda3ff069e2011-11-30 00:25:06 +02001119 pos = 0
1120 while True:
1121 self.assertEqual(f.tell(), pos)
1122 result = f.read(183)
1123 if not result:
1124 break
1125 pos += len(result)
1126 self.assertEqual(f.tell(), len(INPUT))
Nadeem Vawda33c34da2012-06-04 23:34:07 +02001127 with LZMAFile(BytesIO(), "w") as f:
Nadeem Vawda3ff069e2011-11-30 00:25:06 +02001128 for pos in range(0, len(INPUT), 144):
1129 self.assertEqual(f.tell(), pos)
1130 f.write(INPUT[pos:pos+144])
1131 self.assertEqual(f.tell(), len(INPUT))
1132
1133 def test_tell_bad_args(self):
Nadeem Vawda33c34da2012-06-04 23:34:07 +02001134 f = LZMAFile(BytesIO(COMPRESSED_XZ))
Nadeem Vawda3ff069e2011-11-30 00:25:06 +02001135 f.close()
1136 self.assertRaises(ValueError, f.tell)
1137
1138
Nadeem Vawdae8604042012-06-04 23:38:12 +02001139class OpenTestCase(unittest.TestCase):
1140
1141 def test_binary_modes(self):
1142 with lzma.open(BytesIO(COMPRESSED_XZ), "rb") as f:
1143 self.assertEqual(f.read(), INPUT)
1144 with BytesIO() as bio:
1145 with lzma.open(bio, "wb") as f:
1146 f.write(INPUT)
1147 file_data = lzma.decompress(bio.getvalue())
1148 self.assertEqual(file_data, INPUT)
1149 with lzma.open(bio, "ab") as f:
1150 f.write(INPUT)
1151 file_data = lzma.decompress(bio.getvalue())
1152 self.assertEqual(file_data, INPUT * 2)
1153
1154 def test_text_modes(self):
1155 uncompressed = INPUT.decode("ascii")
1156 uncompressed_raw = uncompressed.replace("\n", os.linesep)
1157 with lzma.open(BytesIO(COMPRESSED_XZ), "rt") as f:
1158 self.assertEqual(f.read(), uncompressed)
1159 with BytesIO() as bio:
1160 with lzma.open(bio, "wt") as f:
1161 f.write(uncompressed)
1162 file_data = lzma.decompress(bio.getvalue()).decode("ascii")
1163 self.assertEqual(file_data, uncompressed_raw)
1164 with lzma.open(bio, "at") as f:
1165 f.write(uncompressed)
1166 file_data = lzma.decompress(bio.getvalue()).decode("ascii")
1167 self.assertEqual(file_data, uncompressed_raw * 2)
1168
1169 def test_filename(self):
1170 with TempFile(TESTFN):
1171 with lzma.open(TESTFN, "wb") as f:
1172 f.write(INPUT)
1173 with open(TESTFN, "rb") as f:
1174 file_data = lzma.decompress(f.read())
1175 self.assertEqual(file_data, INPUT)
1176 with lzma.open(TESTFN, "rb") as f:
1177 self.assertEqual(f.read(), INPUT)
1178 with lzma.open(TESTFN, "ab") as f:
1179 f.write(INPUT)
1180 with lzma.open(TESTFN, "rb") as f:
1181 self.assertEqual(f.read(), INPUT * 2)
1182
1183 def test_bad_params(self):
1184 # Test invalid parameter combinations.
1185 with self.assertRaises(ValueError):
1186 lzma.open(TESTFN, "")
1187 with self.assertRaises(ValueError):
Nadeem Vawdae8604042012-06-04 23:38:12 +02001188 lzma.open(TESTFN, "rbt")
1189 with self.assertRaises(ValueError):
1190 lzma.open(TESTFN, "rb", encoding="utf-8")
1191 with self.assertRaises(ValueError):
1192 lzma.open(TESTFN, "rb", errors="ignore")
1193 with self.assertRaises(ValueError):
1194 lzma.open(TESTFN, "rb", newline="\n")
1195
1196 def test_format_and_filters(self):
1197 # Test non-default format and filter chain.
1198 options = {"format": lzma.FORMAT_RAW, "filters": FILTERS_RAW_1}
1199 with lzma.open(BytesIO(COMPRESSED_RAW_1), "rb", **options) as f:
1200 self.assertEqual(f.read(), INPUT)
1201 with BytesIO() as bio:
1202 with lzma.open(bio, "wb", **options) as f:
1203 f.write(INPUT)
1204 file_data = lzma.decompress(bio.getvalue(), **options)
1205 self.assertEqual(file_data, INPUT)
1206
1207 def test_encoding(self):
1208 # Test non-default encoding.
1209 uncompressed = INPUT.decode("ascii")
1210 uncompressed_raw = uncompressed.replace("\n", os.linesep)
1211 with BytesIO() as bio:
1212 with lzma.open(bio, "wt", encoding="utf-16-le") as f:
1213 f.write(uncompressed)
1214 file_data = lzma.decompress(bio.getvalue()).decode("utf-16-le")
1215 self.assertEqual(file_data, uncompressed_raw)
1216 bio.seek(0)
1217 with lzma.open(bio, "rt", encoding="utf-16-le") as f:
1218 self.assertEqual(f.read(), uncompressed)
1219
1220 def test_encoding_error_handler(self):
Martin Panter46f50722016-05-26 05:35:26 +00001221 # Test with non-default encoding error handler.
Nadeem Vawdae8604042012-06-04 23:38:12 +02001222 with BytesIO(lzma.compress(b"foo\xffbar")) as bio:
1223 with lzma.open(bio, "rt", encoding="ascii", errors="ignore") as f:
1224 self.assertEqual(f.read(), "foobar")
1225
1226 def test_newline(self):
1227 # Test with explicit newline (universal newline mode disabled).
1228 text = INPUT.decode("ascii")
1229 with BytesIO() as bio:
1230 with lzma.open(bio, "wt", newline="\n") as f:
1231 f.write(text)
1232 bio.seek(0)
1233 with lzma.open(bio, "rt", newline="\r") as f:
1234 self.assertEqual(f.readlines(), [text])
1235
Nadeem Vawda42ca9822013-10-19 00:06:19 +02001236 def test_x_mode(self):
1237 self.addCleanup(unlink, TESTFN)
1238 for mode in ("x", "xb", "xt"):
1239 unlink(TESTFN)
1240 with lzma.open(TESTFN, mode):
1241 pass
1242 with self.assertRaises(FileExistsError):
1243 with lzma.open(TESTFN, mode):
1244 pass
1245
Nadeem Vawdae8604042012-06-04 23:38:12 +02001246
Nadeem Vawda3ff069e2011-11-30 00:25:06 +02001247class MiscellaneousTestCase(unittest.TestCase):
1248
1249 def test_is_check_supported(self):
1250 # CHECK_NONE and CHECK_CRC32 should always be supported,
1251 # regardless of the options liblzma was compiled with.
Nadeem Vawdabc459bb2012-05-06 23:01:51 +02001252 self.assertTrue(lzma.is_check_supported(lzma.CHECK_NONE))
1253 self.assertTrue(lzma.is_check_supported(lzma.CHECK_CRC32))
Nadeem Vawda3ff069e2011-11-30 00:25:06 +02001254
1255 # The .xz format spec cannot store check IDs above this value.
Nadeem Vawdabc459bb2012-05-06 23:01:51 +02001256 self.assertFalse(lzma.is_check_supported(lzma.CHECK_ID_MAX + 1))
Nadeem Vawda3ff069e2011-11-30 00:25:06 +02001257
1258 # This value should not be a valid check ID.
Nadeem Vawdabc459bb2012-05-06 23:01:51 +02001259 self.assertFalse(lzma.is_check_supported(lzma.CHECK_UNKNOWN))
Nadeem Vawda3ff069e2011-11-30 00:25:06 +02001260
Nadeem Vawdaa425c3d2012-06-21 23:36:48 +02001261 def test__encode_filter_properties(self):
Nadeem Vawdaf55b3292012-05-06 23:01:27 +02001262 with self.assertRaises(TypeError):
Nadeem Vawdaa425c3d2012-06-21 23:36:48 +02001263 lzma._encode_filter_properties(b"not a dict")
Nadeem Vawdaf55b3292012-05-06 23:01:27 +02001264 with self.assertRaises(ValueError):
Nadeem Vawdaa425c3d2012-06-21 23:36:48 +02001265 lzma._encode_filter_properties({"id": 0x100})
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": lzma.FILTER_LZMA2, "junk": 12})
Nadeem Vawdaf55b3292012-05-06 23:01:27 +02001268 with self.assertRaises(lzma.LZMAError):
Nadeem Vawdaa425c3d2012-06-21 23:36:48 +02001269 lzma._encode_filter_properties({"id": lzma.FILTER_DELTA,
Nadeem Vawdaf55b3292012-05-06 23:01:27 +02001270 "dist": 9001})
1271
1272 # Test with parameters used by zipfile module.
Nadeem Vawdaa425c3d2012-06-21 23:36:48 +02001273 props = lzma._encode_filter_properties({
Nadeem Vawdaf55b3292012-05-06 23:01:27 +02001274 "id": lzma.FILTER_LZMA1,
1275 "pb": 2,
1276 "lp": 0,
1277 "lc": 3,
1278 "dict_size": 8 << 20,
1279 })
1280 self.assertEqual(props, b"]\x00\x00\x80\x00")
1281
Nadeem Vawdaa425c3d2012-06-21 23:36:48 +02001282 def test__decode_filter_properties(self):
Nadeem Vawdaf55b3292012-05-06 23:01:27 +02001283 with self.assertRaises(TypeError):
Nadeem Vawdaa425c3d2012-06-21 23:36:48 +02001284 lzma._decode_filter_properties(lzma.FILTER_X86, {"should be": bytes})
Nadeem Vawdaf55b3292012-05-06 23:01:27 +02001285 with self.assertRaises(lzma.LZMAError):
Nadeem Vawdaa425c3d2012-06-21 23:36:48 +02001286 lzma._decode_filter_properties(lzma.FILTER_DELTA, b"too long")
Nadeem Vawdaf55b3292012-05-06 23:01:27 +02001287
1288 # Test with parameters used by zipfile module.
Nadeem Vawdaa425c3d2012-06-21 23:36:48 +02001289 filterspec = lzma._decode_filter_properties(
Nadeem Vawdaf55b3292012-05-06 23:01:27 +02001290 lzma.FILTER_LZMA1, b"]\x00\x00\x80\x00")
1291 self.assertEqual(filterspec["id"], lzma.FILTER_LZMA1)
1292 self.assertEqual(filterspec["pb"], 2)
1293 self.assertEqual(filterspec["lp"], 0)
1294 self.assertEqual(filterspec["lc"], 3)
1295 self.assertEqual(filterspec["dict_size"], 8 << 20)
1296
1297 def test_filter_properties_roundtrip(self):
Nadeem Vawdaa425c3d2012-06-21 23:36:48 +02001298 spec1 = lzma._decode_filter_properties(
Nadeem Vawdaf55b3292012-05-06 23:01:27 +02001299 lzma.FILTER_LZMA1, b"]\x00\x00\x80\x00")
Nadeem Vawdaa425c3d2012-06-21 23:36:48 +02001300 reencoded = lzma._encode_filter_properties(spec1)
1301 spec2 = lzma._decode_filter_properties(lzma.FILTER_LZMA1, reencoded)
Nadeem Vawdaf55b3292012-05-06 23:01:27 +02001302 self.assertEqual(spec1, spec2)
1303
Nadeem Vawda3ff069e2011-11-30 00:25:06 +02001304
1305# Test data:
1306
1307INPUT = b"""
1308LAERTES
1309
1310 O, fear me not.
1311 I stay too long: but here my father comes.
1312
1313 Enter POLONIUS
1314
1315 A double blessing is a double grace,
1316 Occasion smiles upon a second leave.
1317
1318LORD POLONIUS
1319
1320 Yet here, Laertes! aboard, aboard, for shame!
1321 The wind sits in the shoulder of your sail,
1322 And you are stay'd for. There; my blessing with thee!
1323 And these few precepts in thy memory
1324 See thou character. Give thy thoughts no tongue,
1325 Nor any unproportioned thought his act.
1326 Be thou familiar, but by no means vulgar.
1327 Those friends thou hast, and their adoption tried,
1328 Grapple them to thy soul with hoops of steel;
1329 But do not dull thy palm with entertainment
1330 Of each new-hatch'd, unfledged comrade. Beware
1331 Of entrance to a quarrel, but being in,
1332 Bear't that the opposed may beware of thee.
1333 Give every man thy ear, but few thy voice;
1334 Take each man's censure, but reserve thy judgment.
1335 Costly thy habit as thy purse can buy,
1336 But not express'd in fancy; rich, not gaudy;
1337 For the apparel oft proclaims the man,
1338 And they in France of the best rank and station
1339 Are of a most select and generous chief in that.
1340 Neither a borrower nor a lender be;
1341 For loan oft loses both itself and friend,
1342 And borrowing dulls the edge of husbandry.
1343 This above all: to thine ownself be true,
1344 And it must follow, as the night the day,
1345 Thou canst not then be false to any man.
1346 Farewell: my blessing season this in thee!
1347
1348LAERTES
1349
1350 Most humbly do I take my leave, my lord.
1351
1352LORD POLONIUS
1353
1354 The time invites you; go; your servants tend.
1355
1356LAERTES
1357
1358 Farewell, Ophelia; and remember well
1359 What I have said to you.
1360
1361OPHELIA
1362
1363 'Tis in my memory lock'd,
1364 And you yourself shall keep the key of it.
1365
1366LAERTES
1367
1368 Farewell.
1369"""
1370
Nadeem Vawda9c72ebc2013-12-04 23:03:49 +01001371COMPRESSED_BOGUS = b"this is not a valid lzma stream"
1372
Nadeem Vawda3ff069e2011-11-30 00:25:06 +02001373COMPRESSED_XZ = (
1374 b"\xfd7zXZ\x00\x00\x04\xe6\xd6\xb4F\x02\x00!\x01\x16\x00\x00\x00t/\xe5\xa3"
1375 b"\xe0\x07\x80\x03\xdf]\x00\x05\x14\x07bX\x19\xcd\xddn\x98\x15\xe4\xb4\x9d"
1376 b"o\x1d\xc4\xe5\n\x03\xcc2h\xc7\\\x86\xff\xf8\xe2\xfc\xe7\xd9\xfe6\xb8("
1377 b"\xa8wd\xc2\"u.n\x1e\xc3\xf2\x8e\x8d\x8f\x02\x17/\xa6=\xf0\xa2\xdf/M\x89"
1378 b"\xbe\xde\xa7\x1cz\x18-]\xd5\xef\x13\x8frZ\x15\x80\x8c\xf8\x8do\xfa\x12"
1379 b"\x9b#z/\xef\xf0\xfaF\x01\x82\xa3M\x8e\xa1t\xca6 BF$\xe5Q\xa4\x98\xee\xde"
1380 b"l\xe8\x7f\xf0\x9d,bn\x0b\x13\xd4\xa8\x81\xe4N\xc8\x86\x153\xf5x2\xa2O"
1381 b"\x13@Q\xa1\x00/\xa5\xd0O\x97\xdco\xae\xf7z\xc4\xcdS\xb6t<\x16\xf2\x9cI#"
1382 b"\x89ud\xc66Y\xd9\xee\xe6\xce\x12]\xe5\xf0\xaa\x96-Pe\xade:\x04\t\x1b\xf7"
1383 b"\xdb7\n\x86\x1fp\xc8J\xba\xf4\xf0V\xa9\xdc\xf0\x02%G\xf9\xdf=?\x15\x1b"
1384 b"\xe1(\xce\x82=\xd6I\xac3\x12\x0cR\xb7\xae\r\xb1i\x03\x95\x01\xbd\xbe\xfa"
1385 b"\x02s\x01P\x9d\x96X\xb12j\xc8L\xa8\x84b\xf6\xc3\xd4c-H\x93oJl\xd0iQ\xe4k"
1386 b"\x84\x0b\xc1\xb7\xbc\xb1\x17\x88\xb1\xca?@\xf6\x07\xea\xe6x\xf1H12P\x0f"
1387 b"\x8a\xc9\xeauw\xe3\xbe\xaai\xa9W\xd0\x80\xcd#cb5\x99\xd8]\xa9d\x0c\xbd"
1388 b"\xa2\xdcWl\xedUG\xbf\x89yF\xf77\x81v\xbd5\x98\xbeh8\x18W\x08\xf0\x1b\x99"
1389 b"5:\x1a?rD\x96\xa1\x04\x0f\xae\xba\x85\xeb\x9d5@\xf5\x83\xd37\x83\x8ac"
1390 b"\x06\xd4\x97i\xcdt\x16S\x82k\xf6K\x01vy\x88\x91\x9b6T\xdae\r\xfd]:k\xbal"
1391 b"\xa9\xbba\xc34\xf9r\xeb}r\xdb\xc7\xdb*\x8f\x03z\xdc8h\xcc\xc9\xd3\xbcl"
1392 b"\xa5-\xcb\xeaK\xa2\xc5\x15\xc0\xe3\xc1\x86Z\xfb\xebL\xe13\xcf\x9c\xe3"
1393 b"\x1d\xc9\xed\xc2\x06\xcc\xce!\x92\xe5\xfe\x9c^\xa59w \x9bP\xa3PK\x08d"
1394 b"\xf9\xe2Z}\xa7\xbf\xed\xeb%$\x0c\x82\xb8/\xb0\x01\xa9&,\xf7qh{Q\x96)\xf2"
1395 b"q\x96\xc3\x80\xb4\x12\xb0\xba\xe6o\xf4!\xb4[\xd4\x8aw\x10\xf7t\x0c\xb3"
1396 b"\xd9\xd5\xc3`^\x81\x11??\\\xa4\x99\x85R\xd4\x8e\x83\xc9\x1eX\xbfa\xf1"
1397 b"\xac\xb0\xea\xea\xd7\xd0\xab\x18\xe2\xf2\xed\xe1\xb7\xc9\x18\xcbS\xe4>"
1398 b"\xc9\x95H\xe8\xcb\t\r%\xeb\xc7$.o\xf1\xf3R\x17\x1db\xbb\xd8U\xa5^\xccS"
1399 b"\x16\x01\x87\xf3/\x93\xd1\xf0v\xc0r\xd7\xcc\xa2Gkz\xca\x80\x0e\xfd\xd0"
1400 b"\x8b\xbb\xd2Ix\xb3\x1ey\xca-0\xe3z^\xd6\xd6\x8f_\xf1\x9dP\x9fi\xa7\xd1"
1401 b"\xe8\x90\x84\xdc\xbf\xcdky\x8e\xdc\x81\x7f\xa3\xb2+\xbf\x04\xef\xd8\\"
1402 b"\xc4\xdf\xe1\xb0\x01\xe9\x93\xe3Y\xf1\x1dY\xe8h\x81\xcf\xf1w\xcc\xb4\xef"
1403 b" \x8b|\x04\xea\x83ej\xbe\x1f\xd4z\x9c`\xd3\x1a\x92A\x06\xe5\x8f\xa9\x13"
1404 b"\t\x9e=\xfa\x1c\xe5_\x9f%v\x1bo\x11ZO\xd8\xf4\t\xddM\x16-\x04\xfc\x18<\""
1405 b"CM\xddg~b\xf6\xef\x8e\x0c\xd0\xde|\xa0'\x8a\x0c\xd6x\xae!J\xa6F\x88\x15u"
1406 b"\x008\x17\xbc7y\xb3\xd8u\xac_\x85\x8d\xe7\xc1@\x9c\xecqc\xa3#\xad\xf1"
1407 b"\x935\xb5)_\r\xec3]\x0fo]5\xd0my\x07\x9b\xee\x81\xb5\x0f\xcfK+\x00\xc0"
1408 b"\xe4b\x10\xe4\x0c\x1a \x9b\xe0\x97t\xf6\xa1\x9e\x850\xba\x0c\x9a\x8d\xc8"
1409 b"\x8f\x07\xd7\xae\xc8\xf9+i\xdc\xb9k\xb0>f\x19\xb8\r\xa8\xf8\x1f$\xa5{p"
1410 b"\xc6\x880\xce\xdb\xcf\xca_\x86\xac\x88h6\x8bZ%'\xd0\n\xbf\x0f\x9c\"\xba"
1411 b"\xe5\x86\x9f\x0f7X=mNX[\xcc\x19FU\xc9\x860\xbc\x90a+* \xae_$\x03\x1e\xd3"
1412 b"\xcd_\xa0\x9c\xde\xaf46q\xa5\xc9\x92\xd7\xca\xe3`\x9d\x85}\xb4\xff\xb3"
1413 b"\x83\xfb\xb6\xca\xae`\x0bw\x7f\xfc\xd8\xacVe\x19\xc8\x17\x0bZ\xad\x88"
1414 b"\xeb#\x97\x03\x13\xb1d\x0f{\x0c\x04w\x07\r\x97\xbd\xd6\xc1\xc3B:\x95\x08"
1415 b"^\x10V\xaeaH\x02\xd9\xe3\n\\\x01X\xf6\x9c\x8a\x06u#%\xbe*\xa1\x18v\x85"
1416 b"\xec!\t4\x00\x00\x00\x00Vj?uLU\xf3\xa6\x00\x01\xfb\x07\x81\x0f\x00\x00tw"
1417 b"\x99P\xb1\xc4g\xfb\x02\x00\x00\x00\x00\x04YZ"
1418)
1419
1420COMPRESSED_ALONE = (
1421 b"]\x00\x00\x80\x00\xff\xff\xff\xff\xff\xff\xff\xff\x00\x05\x14\x07bX\x19"
1422 b"\xcd\xddn\x98\x15\xe4\xb4\x9do\x1d\xc4\xe5\n\x03\xcc2h\xc7\\\x86\xff\xf8"
1423 b"\xe2\xfc\xe7\xd9\xfe6\xb8(\xa8wd\xc2\"u.n\x1e\xc3\xf2\x8e\x8d\x8f\x02"
1424 b"\x17/\xa6=\xf0\xa2\xdf/M\x89\xbe\xde\xa7\x1cz\x18-]\xd5\xef\x13\x8frZ"
1425 b"\x15\x80\x8c\xf8\x8do\xfa\x12\x9b#z/\xef\xf0\xfaF\x01\x82\xa3M\x8e\xa1t"
1426 b"\xca6 BF$\xe5Q\xa4\x98\xee\xdel\xe8\x7f\xf0\x9d,bn\x0b\x13\xd4\xa8\x81"
1427 b"\xe4N\xc8\x86\x153\xf5x2\xa2O\x13@Q\xa1\x00/\xa5\xd0O\x97\xdco\xae\xf7z"
1428 b"\xc4\xcdS\xb6t<\x16\xf2\x9cI#\x89ud\xc66Y\xd9\xee\xe6\xce\x12]\xe5\xf0"
1429 b"\xaa\x96-Pe\xade:\x04\t\x1b\xf7\xdb7\n\x86\x1fp\xc8J\xba\xf4\xf0V\xa9"
1430 b"\xdc\xf0\x02%G\xf9\xdf=?\x15\x1b\xe1(\xce\x82=\xd6I\xac3\x12\x0cR\xb7"
1431 b"\xae\r\xb1i\x03\x95\x01\xbd\xbe\xfa\x02s\x01P\x9d\x96X\xb12j\xc8L\xa8"
1432 b"\x84b\xf8\x1epl\xeajr\xd1=\t\x03\xdd\x13\x1b3!E\xf9vV\xdaF\xf3\xd7\xb4"
1433 b"\x0c\xa9P~\xec\xdeE\xe37\xf6\x1d\xc6\xbb\xddc%\xb6\x0fI\x07\xf0;\xaf\xe7"
1434 b"\xa0\x8b\xa7Z\x99(\xe9\xe2\xf0o\x18>`\xe1\xaa\xa8\xd9\xa1\xb2}\xe7\x8d"
1435 b"\x834T\xb6\xef\xc1\xde\xe3\x98\xbcD\x03MA@\xd8\xed\xdc\xc8\x93\x03\x1a"
1436 b"\x93\x0b\x7f\x94\x12\x0b\x02Sa\x18\xc9\xc5\x9bTJE}\xf6\xc8g\x17#ZV\x01"
1437 b"\xc9\x9dc\x83\x0e>0\x16\x90S\xb8/\x03y_\x18\xfa(\xd7\x0br\xa2\xb0\xba?"
1438 b"\x8c\xe6\x83@\x84\xdf\x02:\xc5z\x9e\xa6\x84\xc9\xf5BeyX\x83\x1a\xf1 :\t"
1439 b"\xf7\x19\xfexD\\&G\xf3\x85Y\xa2J\xf9\x0bv{\x89\xf6\xe7)A\xaf\x04o\x00"
1440 b"\x075\xd3\xe0\x7f\x97\x98F\x0f?v\x93\xedVtTf\xb5\x97\x83\xed\x19\xd7\x1a"
1441 b"'k\xd7\xd9\xc5\\Y\xd1\xdc\x07\x15|w\xbc\xacd\x87\x08d\xec\xa7\xf6\x82"
1442 b"\xfc\xb3\x93\xeb\xb9 \x8d\xbc ,\xb3X\xb0\xd2s\xd7\xd1\xffv\x05\xdf}\xa2"
1443 b"\x96\xfb%\n\xdf\xa2\x7f\x08.\xa16\n\xe0\x19\x93\x7fh\n\x1c\x8c\x0f \x11"
1444 b"\xc6Bl\x95\x19U}\xe4s\xb5\x10H\xea\x86pB\xe88\x95\xbe\x8cZ\xdb\xe4\x94A"
1445 b"\x92\xb9;z\xaa\xa7{\x1c5!\xc0\xaf\xc1A\xf9\xda\xf0$\xb0\x02qg\xc8\xc7/|"
1446 b"\xafr\x99^\x91\x88\xbf\x03\xd9=\xd7n\xda6{>8\n\xc7:\xa9'\xba.\x0b\xe2"
1447 b"\xb5\x1d\x0e\n\x9a\x8e\x06\x8f:\xdd\x82'[\xc3\"wD$\xa7w\xecq\x8c,1\x93"
1448 b"\xd0,\xae2w\x93\x12$Jd\x19mg\x02\x93\x9cA\x95\x9d&\xca8i\x9c\xb0;\xe7NQ"
1449 b"\x1frh\x8beL;\xb0m\xee\x07Q\x9b\xc6\xd8\x03\xb5\xdeN\xd4\xfe\x98\xd0\xdc"
1450 b"\x1a[\x04\xde\x1a\xf6\x91j\xf8EOli\x8eB^\x1d\x82\x07\xb2\xb5R]\xb7\xd7"
1451 b"\xe9\xa6\xc3.\xfb\xf0-\xb4e\x9b\xde\x03\x88\xc6\xc1iN\x0e\x84wbQ\xdf~"
1452 b"\xe9\xa4\x884\x96kM\xbc)T\xf3\x89\x97\x0f\x143\xe7)\xa0\xb3B\x00\xa8\xaf"
1453 b"\x82^\xcb\xc7..\xdb\xc7\t\x9dH\xee5\xe9#\xe6NV\x94\xcb$Kk\xe3\x7f\r\xe3t"
1454 b"\x12\xcf'\xefR\x8b\xf42\xcf-LH\xac\xe5\x1f0~?SO\xeb\xc1E\x1a\x1c]\xf2"
1455 b"\xc4<\x11\x02\x10Z0a*?\xe4r\xff\xfb\xff\xf6\x14nG\xead^\xd6\xef8\xb6uEI"
1456 b"\x99\nV\xe2\xb3\x95\x8e\x83\xf6i!\xb5&1F\xb1DP\xf4 SO3D!w\x99_G\x7f+\x90"
1457 b".\xab\xbb]\x91>\xc9#h;\x0f5J\x91K\xf4^-[\x9e\x8a\\\x94\xca\xaf\xf6\x19"
1458 b"\xd4\xa1\x9b\xc4\xb8p\xa1\xae\x15\xe9r\x84\xe0\xcar.l []\x8b\xaf+0\xf2g"
1459 b"\x01aKY\xdfI\xcf,\n\xe8\xf0\xe7V\x80_#\xb2\xf2\xa9\x06\x8c>w\xe2W,\xf4"
1460 b"\x8c\r\xf963\xf5J\xcc2\x05=kT\xeaUti\xe5_\xce\x1b\xfa\x8dl\x02h\xef\xa8"
1461 b"\xfbf\x7f\xff\xf0\x19\xeax"
1462)
1463
1464FILTERS_RAW_1 = [{"id": lzma.FILTER_LZMA2, "preset": 3}]
1465COMPRESSED_RAW_1 = (
1466 b"\xe0\x07\x80\x03\xfd]\x00\x05\x14\x07bX\x19\xcd\xddn\x96cyq\xa1\xdd\xee"
1467 b"\xf8\xfam\xe3'\x88\xd3\xff\xe4\x9e \xceQ\x91\xa4\x14I\xf6\xb9\x9dVL8\x15"
1468 b"_\x0e\x12\xc3\xeb\xbc\xa5\xcd\nW\x1d$=R;\x1d\xf8k8\t\xb1{\xd4\xc5+\x9d"
1469 b"\x87c\xe5\xef\x98\xb4\xd7S3\xcd\xcc\xd2\xed\xa4\x0em\xe5\xf4\xdd\xd0b"
1470 b"\xbe4*\xaa\x0b\xc5\x08\x10\x85+\x81.\x17\xaf9\xc9b\xeaZrA\xe20\x7fs\"r"
1471 b"\xdaG\x81\xde\x90cu\xa5\xdb\xa9.A\x08l\xb0<\xf6\x03\xddOi\xd0\xc5\xb4"
1472 b"\xec\xecg4t6\"\xa6\xb8o\xb5?\x18^}\xb6}\x03[:\xeb\x03\xa9\n[\x89l\x19g"
1473 b"\x16\xc82\xed\x0b\xfb\x86n\xa2\x857@\x93\xcd6T\xc3u\xb0\t\xf9\x1b\x918"
1474 b"\xfc[\x1b\x1e4\xb3\x14\x06PCV\xa8\"\xf5\x81x~\xe9\xb5N\x9cK\x9f\xc6\xc3%"
1475 b"\xc8k:{6\xe7\xf7\xbd\x05\x02\xb4\xc4\xc3\xd3\xfd\xc3\xa8\\\xfc@\xb1F_"
1476 b"\xc8\x90\xd9sU\x98\xad8\x05\x07\xde7J\x8bM\xd0\xb3;X\xec\x87\xef\xae\xb3"
1477 b"eO,\xb1z,d\x11y\xeejlB\x02\x1d\xf28\x1f#\x896\xce\x0b\xf0\xf5\xa9PK\x0f"
1478 b"\xb3\x13P\xd8\x88\xd2\xa1\x08\x04C?\xdb\x94_\x9a\"\xe9\xe3e\x1d\xde\x9b"
1479 b"\xa1\xe8>H\x98\x10;\xc5\x03#\xb5\x9d4\x01\xe7\xc5\xba%v\xa49\x97A\xe0\""
1480 b"\x8c\xc22\xe3i\xc1\x9d\xab3\xdf\xbe\xfdDm7\x1b\x9d\xab\xb5\x15o:J\x92"
1481 b"\xdb\x816\x17\xc2O\x99\x1b\x0e\x8d\xf3\tQ\xed\x8e\x95S/\x16M\xb2S\x04"
1482 b"\x0f\xc3J\xc6\xc7\xe4\xcb\xc5\xf4\xe7d\x14\xe4=^B\xfb\xd3E\xd3\x1e\xcd"
1483 b"\x91\xa5\xd0G\x8f.\xf6\xf9\x0bb&\xd9\x9f\xc2\xfdj\xa2\x9e\xc4\\\x0e\x1dC"
1484 b"v\xe8\xd2\x8a?^H\xec\xae\xeb>\xfe\xb8\xab\xd4IqY\x8c\xd4K7\x11\xf4D\xd0W"
1485 b"\xa5\xbe\xeaO\xbf\xd0\x04\xfdl\x10\xae5\xd4U\x19\x06\xf9{\xaa\xe0\x81"
1486 b"\x0f\xcf\xa3k{\x95\xbd\x19\xa2\xf8\xe4\xa3\x08O*\xf1\xf1B-\xc7(\x0eR\xfd"
1487 b"@E\x9f\xd3\x1e:\xfdV\xb7\x04Y\x94\xeb]\x83\xc4\xa5\xd7\xc0gX\x98\xcf\x0f"
1488 b"\xcd3\x00]n\x17\xec\xbd\xa3Y\x86\xc5\xf3u\xf6*\xbdT\xedA$A\xd9A\xe7\x98"
1489 b"\xef\x14\x02\x9a\xfdiw\xec\xa0\x87\x11\xd9%\xc5\xeb\x8a=\xae\xc0\xc4\xc6"
1490 b"D\x80\x8f\xa8\xd1\xbbq\xb2\xc0\xa0\xf5Cqp\xeeL\xe3\xe5\xdc \x84\"\xe9"
1491 b"\x80t\x83\x05\xba\xf1\xc5~\x93\xc9\xf0\x01c\xceix\x9d\xed\xc5)l\x16)\xd1"
1492 b"\x03@l\x04\x7f\x87\xa5yn\x1b\x01D\xaa:\xd2\x96\xb4\xb3?\xb0\xf9\xce\x07"
1493 b"\xeb\x81\x00\xe4\xc3\xf5%_\xae\xd4\xf9\xeb\xe2\rh\xb2#\xd67Q\x16D\x82hn"
1494 b"\xd1\xa3_?q\xf0\xe2\xac\xf317\x9e\xd0_\x83|\xf1\xca\xb7\x95S\xabW\x12"
1495 b"\xff\xddt\xf69L\x01\xf2|\xdaW\xda\xees\x98L\x18\xb8_\xe8$\x82\xea\xd6"
1496 b"\xd1F\xd4\x0b\xcdk\x01vf\x88h\xc3\xae\xb91\xc7Q\x9f\xa5G\xd9\xcc\x1f\xe3"
1497 b"5\xb1\xdcy\x7fI\x8bcw\x8e\x10rIp\x02:\x19p_\xc8v\xcea\"\xc1\xd9\x91\x03"
1498 b"\xbfe\xbe\xa6\xb3\xa8\x14\x18\xc3\xabH*m}\xc2\xc1\x9a}>l%\xce\x84\x99"
1499 b"\xb3d\xaf\xd3\x82\x15\xdf\xc1\xfc5fOg\x9b\xfc\x8e^&\t@\xce\x9f\x06J\xb8"
1500 b"\xb5\x86\x1d\xda{\x9f\xae\xb0\xff\x02\x81r\x92z\x8cM\xb7ho\xc9^\x9c\xb6"
1501 b"\x9c\xae\xd1\xc9\xf4\xdfU7\xd6\\!\xea\x0b\x94k\xb9Ud~\x98\xe7\x86\x8az"
1502 b"\x10;\xe3\x1d\xe5PG\xf8\xa4\x12\x05w\x98^\xc4\xb1\xbb\xfb\xcf\xe0\x7f"
1503 b"\x033Sf\x0c \xb1\xf6@\x94\xe5\xa3\xb2\xa7\x10\x9a\xc0\x14\xc3s\xb5xRD"
1504 b"\xf4`W\xd9\xe5\xd3\xcf\x91\rTZ-X\xbe\xbf\xb5\xe2\xee|\x1a\xbf\xfb\x08"
1505 b"\x91\xe1\xfc\x9a\x18\xa3\x8b\xd6^\x89\xf5[\xef\x87\xd1\x06\x1c7\xd6\xa2"
1506 b"\t\tQ5/@S\xc05\xd2VhAK\x03VC\r\x9b\x93\xd6M\xf1xO\xaaO\xed\xb9<\x0c\xdae"
1507 b"*\xd0\x07Hk6\x9fG+\xa1)\xcd\x9cl\x87\xdb\xe1\xe7\xefK}\x875\xab\xa0\x19u"
1508 b"\xf6*F\xb32\x00\x00\x00"
1509)
1510
1511FILTERS_RAW_2 = [{"id": lzma.FILTER_DELTA, "dist": 2},
1512 {"id": lzma.FILTER_LZMA2,
1513 "preset": lzma.PRESET_DEFAULT | lzma.PRESET_EXTREME}]
1514COMPRESSED_RAW_2 = (
1515 b"\xe0\x07\x80\x05\x91]\x00\x05\x14\x06-\xd4\xa8d?\xef\xbe\xafH\xee\x042"
1516 b"\xcb.\xb5g\x8f\xfb\x14\xab\xa5\x9f\x025z\xa4\xdd\xd8\t[}W\xf8\x0c\x1dmH"
1517 b"\xfa\x05\xfcg\xba\xe5\x01Q\x0b\x83R\xb6A\x885\xc0\xba\xee\n\x1cv~\xde:o"
1518 b"\x06:J\xa7\x11Cc\xea\xf7\xe5*o\xf7\x83\\l\xbdE\x19\x1f\r\xa8\x10\xb42"
1519 b"\x0caU{\xd7\xb8w\xdc\xbe\x1b\xfc8\xb4\xcc\xd38\\\xf6\x13\xf6\xe7\x98\xfa"
1520 b"\xc7[\x17_9\x86%\xa8\xf8\xaa\xb8\x8dfs#\x1e=\xed<\x92\x10\\t\xff\x86\xfb"
1521 b"=\x9e7\x18\x1dft\\\xb5\x01\x95Q\xc5\x19\xb38\xe0\xd4\xaa\x07\xc3\x7f\xd8"
1522 b"\xa2\x00>-\xd3\x8e\xa1#\xfa\x83ArAm\xdbJ~\x93\xa3B\x82\xe0\xc7\xcc(\x08`"
1523 b"WK\xad\x1b\x94kaj\x04 \xde\xfc\xe1\xed\xb0\x82\x91\xefS\x84%\x86\xfbi"
1524 b"\x99X\xf1B\xe7\x90;E\xfde\x98\xda\xca\xd6T\xb4bg\xa4\n\x9aj\xd1\x83\x9e]"
1525 b"\"\x7fM\xb5\x0fr\xd2\\\xa5j~P\x10GH\xbfN*Z\x10.\x81\tpE\x8a\x08\xbe1\xbd"
1526 b"\xcd\xa9\xe1\x8d\x1f\x04\xf9\x0eH\xb9\xae\xd6\xc3\xc1\xa5\xa9\x95P\xdc~"
1527 b"\xff\x01\x930\xa9\x04\xf6\x03\xfe\xb5JK\xc3]\xdd9\xb1\xd3\xd7F\xf5\xd1"
1528 b"\x1e\xa0\x1c_\xed[\x0c\xae\xd4\x8b\x946\xeb\xbf\xbb\xe3$kS{\xb5\x80,f:Sj"
1529 b"\x0f\x08z\x1c\xf5\xe8\xe6\xae\x98\xb0Q~r\x0f\xb0\x05?\xb6\x90\x19\x02&"
1530 b"\xcb\x80\t\xc4\xea\x9c|x\xce\x10\x9c\xc5|\xcbdhh+\x0c'\xc5\x81\xc33\xb5"
1531 b"\x14q\xd6\xc5\xe3`Z#\xdc\x8a\xab\xdd\xea\x08\xc2I\xe7\x02l{\xec\x196\x06"
1532 b"\x91\x8d\xdc\xd5\xb3x\xe1hz%\xd1\xf8\xa5\xdd\x98!\x8c\x1c\xc1\x17RUa\xbb"
1533 b"\x95\x0f\xe4X\xea1\x0c\xf1=R\xbe\xc60\xe3\xa4\x9a\x90bd\x97$]B\x01\xdd"
1534 b"\x1f\xe3h2c\x1e\xa0L`4\xc6x\xa3Z\x8a\r\x14]T^\xd8\x89\x1b\x92\r;\xedY"
1535 b"\x0c\xef\x8d9z\xf3o\xb6)f\xa9]$n\rp\x93\xd0\x10\xa4\x08\xb8\xb2\x8b\xb6"
1536 b"\x8f\x80\xae;\xdcQ\xf1\xfa\x9a\x06\x8e\xa5\x0e\x8cK\x9c @\xaa:UcX\n!\xc6"
1537 b"\x02\x12\xcb\x1b\"=\x16.\x1f\x176\xf2g=\xe1Wn\xe9\xe1\xd4\xf1O\xad\x15"
1538 b"\x86\xe9\xa3T\xaf\xa9\xd7D\xb5\xd1W3pnt\x11\xc7VOj\xb7M\xc4i\xa1\xf1$3"
1539 b"\xbb\xdc\x8af\xb0\xc5Y\r\xd1\xfb\xf2\xe7K\xe6\xc5hwO\xfe\x8c2^&\x07\xd5"
1540 b"\x1fV\x19\xfd\r\x14\xd2i=yZ\xe6o\xaf\xc6\xb6\x92\x9d\xc4\r\xb3\xafw\xac%"
1541 b"\xcfc\x1a\xf1`]\xf2\x1a\x9e\x808\xedm\xedQ\xb2\xfe\xe4h`[q\xae\xe0\x0f"
1542 b"\xba0g\xb6\"N\xc3\xfb\xcfR\x11\xc5\x18)(\xc40\\\xa3\x02\xd9G!\xce\x1b"
1543 b"\xc1\x96x\xb5\xc8z\x1f\x01\xb4\xaf\xde\xc2\xcd\x07\xe7H\xb3y\xa8M\n\\A\t"
1544 b"ar\xddM\x8b\x9a\xea\x84\x9b!\xf1\x8d\xb1\xf1~\x1e\r\xa5H\xba\xf1\x84o"
1545 b"\xda\x87\x01h\xe9\xa2\xbe\xbeqN\x9d\x84\x0b!WG\xda\xa1\xa5A\xb7\xc7`j"
1546 b"\x15\xf2\xe9\xdd?\x015B\xd2~E\x06\x11\xe0\x91!\x05^\x80\xdd\xa8y\x15}"
1547 b"\xa1)\xb1)\x81\x18\xf4\xf4\xf8\xc0\xefD\xe3\xdb2f\x1e\x12\xabu\xc9\x97"
1548 b"\xcd\x1e\xa7\x0c\x02x4_6\x03\xc4$t\xf39\x94\x1d=\xcb\xbfv\\\xf5\xa3\x1d"
1549 b"\x9d8jk\x95\x13)ff\xf9n\xc4\xa9\xe3\x01\xb8\xda\xfb\xab\xdfM\x99\xfb\x05"
1550 b"\xe0\xe9\xb0I\xf4E\xab\xe2\x15\xa3\x035\xe7\xdeT\xee\x82p\xb4\x88\xd3"
1551 b"\x893\x9c/\xc0\xd6\x8fou;\xf6\x95PR\xa9\xb2\xc1\xefFj\xe2\xa7$\xf7h\xf1"
1552 b"\xdfK(\xc9c\xba7\xe8\xe3)\xdd\xb2,\x83\xfb\x84\x18.y\x18Qi\x88\xf8`h-"
1553 b"\xef\xd5\xed\x8c\t\xd8\xc3^\x0f\x00\xb7\xd0[!\xafM\x9b\xd7.\x07\xd8\xfb"
1554 b"\xd9\xe2-S+\xaa8,\xa0\x03\x1b \xea\xa8\x00\xc3\xab~\xd0$e\xa5\x7f\xf7"
1555 b"\x95P]\x12\x19i\xd9\x7fo\x0c\xd8g^\rE\xa5\x80\x18\xc5\x01\x80\xaek`\xff~"
1556 b"\xb6y\xe7+\xe5\x11^D\xa7\x85\x18\"!\xd6\xd2\xa7\xf4\x1eT\xdb\x02\xe15"
1557 b"\x02Y\xbc\x174Z\xe7\x9cH\x1c\xbf\x0f\xc6\xe9f]\xcf\x8cx\xbc\xe5\x15\x94"
1558 b"\xfc3\xbc\xa7TUH\xf1\x84\x1b\xf7\xa9y\xc07\x84\xf8X\xd8\xef\xfc \x1c\xd8"
1559 b"( /\xf2\xb7\xec\xc1\\\x8c\xf6\x95\xa1\x03J\x83vP8\xe1\xe3\xbb~\xc24kA"
1560 b"\x98y\xa1\xf2P\xe9\x9d\xc9J\xf8N\x99\xb4\xceaO\xde\x16\x1e\xc2\x19\xa7"
1561 b"\x03\xd2\xe0\x8f:\x15\xf3\x84\x9e\xee\xe6e\xb8\x02q\xc7AC\x1emw\xfd\t"
1562 b"\x9a\x1eu\xc1\xa9\xcaCwUP\x00\xa5\xf78L4w!\x91L2 \x87\xd0\xf2\x06\x81j"
1563 b"\x80;\x03V\x06\x87\x92\xcb\x90lv@E\x8d\x8d\xa5\xa6\xe7Z[\xdf\xd6E\x03`>"
1564 b"\x8f\xde\xa1bZ\x84\xd0\xa9`\x05\x0e{\x80;\xe3\xbef\x8d\x1d\xebk1.\xe3"
1565 b"\xe9N\x15\xf7\xd4(\xfa\xbb\x15\xbdu\xf7\x7f\x86\xae!\x03L\x1d\xb5\xc1"
1566 b"\xb9\x11\xdb\xd0\x93\xe4\x02\xe1\xd2\xcbBjc_\xe8}d\xdb\xc3\xa0Y\xbe\xc9/"
1567 b"\x95\x01\xa3,\xe6bl@\x01\xdbp\xc2\xce\x14\x168\xc2q\xe3uH\x89X\xa4\xa9"
1568 b"\x19\x1d\xc1}\x7fOX\x19\x9f\xdd\xbe\x85\x83\xff\x96\x1ee\x82O`CF=K\xeb$I"
1569 b"\x17_\xefX\x8bJ'v\xde\x1f+\xd9.v\xf8Tv\x17\xf2\x9f5\x19\xe1\xb9\x91\xa8S"
1570 b"\x86\xbd\x1a\"(\xa5x\x8dC\x03X\x81\x91\xa8\x11\xc4pS\x13\xbc\xf2'J\xae!"
1571 b"\xef\xef\x84G\t\x8d\xc4\x10\x132\x00oS\x9e\xe0\xe4d\x8f\xb8y\xac\xa6\x9f"
1572 b",\xb8f\x87\r\xdf\x9eE\x0f\xe1\xd0\\L\x00\xb2\xe1h\x84\xef}\x98\xa8\x11"
1573 b"\xccW#\\\x83\x7fo\xbbz\x8f\x00"
1574)
1575
1576FILTERS_RAW_3 = [{"id": lzma.FILTER_IA64, "start_offset": 0x100},
1577 {"id": lzma.FILTER_LZMA2}]
1578COMPRESSED_RAW_3 = (
1579 b"\xe0\x07\x80\x03\xdf]\x00\x05\x14\x07bX\x19\xcd\xddn\x98\x15\xe4\xb4\x9d"
1580 b"o\x1d\xc4\xe5\n\x03\xcc2h\xc7\\\x86\xff\xf8\xe2\xfc\xe7\xd9\xfe6\xb8("
1581 b"\xa8wd\xc2\"u.n\x1e\xc3\xf2\x8e\x8d\x8f\x02\x17/\xa6=\xf0\xa2\xdf/M\x89"
1582 b"\xbe\xde\xa7\x1cz\x18-]\xd5\xef\x13\x8frZ\x15\x80\x8c\xf8\x8do\xfa\x12"
1583 b"\x9b#z/\xef\xf0\xfaF\x01\x82\xa3M\x8e\xa1t\xca6 BF$\xe5Q\xa4\x98\xee\xde"
1584 b"l\xe8\x7f\xf0\x9d,bn\x0b\x13\xd4\xa8\x81\xe4N\xc8\x86\x153\xf5x2\xa2O"
1585 b"\x13@Q\xa1\x00/\xa5\xd0O\x97\xdco\xae\xf7z\xc4\xcdS\xb6t<\x16\xf2\x9cI#"
1586 b"\x89ud\xc66Y\xd9\xee\xe6\xce\x12]\xe5\xf0\xaa\x96-Pe\xade:\x04\t\x1b\xf7"
1587 b"\xdb7\n\x86\x1fp\xc8J\xba\xf4\xf0V\xa9\xdc\xf0\x02%G\xf9\xdf=?\x15\x1b"
1588 b"\xe1(\xce\x82=\xd6I\xac3\x12\x0cR\xb7\xae\r\xb1i\x03\x95\x01\xbd\xbe\xfa"
1589 b"\x02s\x01P\x9d\x96X\xb12j\xc8L\xa8\x84b\xf6\xc3\xd4c-H\x93oJl\xd0iQ\xe4k"
1590 b"\x84\x0b\xc1\xb7\xbc\xb1\x17\x88\xb1\xca?@\xf6\x07\xea\xe6x\xf1H12P\x0f"
1591 b"\x8a\xc9\xeauw\xe3\xbe\xaai\xa9W\xd0\x80\xcd#cb5\x99\xd8]\xa9d\x0c\xbd"
1592 b"\xa2\xdcWl\xedUG\xbf\x89yF\xf77\x81v\xbd5\x98\xbeh8\x18W\x08\xf0\x1b\x99"
1593 b"5:\x1a?rD\x96\xa1\x04\x0f\xae\xba\x85\xeb\x9d5@\xf5\x83\xd37\x83\x8ac"
1594 b"\x06\xd4\x97i\xcdt\x16S\x82k\xf6K\x01vy\x88\x91\x9b6T\xdae\r\xfd]:k\xbal"
1595 b"\xa9\xbba\xc34\xf9r\xeb}r\xdb\xc7\xdb*\x8f\x03z\xdc8h\xcc\xc9\xd3\xbcl"
1596 b"\xa5-\xcb\xeaK\xa2\xc5\x15\xc0\xe3\xc1\x86Z\xfb\xebL\xe13\xcf\x9c\xe3"
1597 b"\x1d\xc9\xed\xc2\x06\xcc\xce!\x92\xe5\xfe\x9c^\xa59w \x9bP\xa3PK\x08d"
1598 b"\xf9\xe2Z}\xa7\xbf\xed\xeb%$\x0c\x82\xb8/\xb0\x01\xa9&,\xf7qh{Q\x96)\xf2"
1599 b"q\x96\xc3\x80\xb4\x12\xb0\xba\xe6o\xf4!\xb4[\xd4\x8aw\x10\xf7t\x0c\xb3"
1600 b"\xd9\xd5\xc3`^\x81\x11??\\\xa4\x99\x85R\xd4\x8e\x83\xc9\x1eX\xbfa\xf1"
1601 b"\xac\xb0\xea\xea\xd7\xd0\xab\x18\xe2\xf2\xed\xe1\xb7\xc9\x18\xcbS\xe4>"
1602 b"\xc9\x95H\xe8\xcb\t\r%\xeb\xc7$.o\xf1\xf3R\x17\x1db\xbb\xd8U\xa5^\xccS"
1603 b"\x16\x01\x87\xf3/\x93\xd1\xf0v\xc0r\xd7\xcc\xa2Gkz\xca\x80\x0e\xfd\xd0"
1604 b"\x8b\xbb\xd2Ix\xb3\x1ey\xca-0\xe3z^\xd6\xd6\x8f_\xf1\x9dP\x9fi\xa7\xd1"
1605 b"\xe8\x90\x84\xdc\xbf\xcdky\x8e\xdc\x81\x7f\xa3\xb2+\xbf\x04\xef\xd8\\"
1606 b"\xc4\xdf\xe1\xb0\x01\xe9\x93\xe3Y\xf1\x1dY\xe8h\x81\xcf\xf1w\xcc\xb4\xef"
1607 b" \x8b|\x04\xea\x83ej\xbe\x1f\xd4z\x9c`\xd3\x1a\x92A\x06\xe5\x8f\xa9\x13"
1608 b"\t\x9e=\xfa\x1c\xe5_\x9f%v\x1bo\x11ZO\xd8\xf4\t\xddM\x16-\x04\xfc\x18<\""
1609 b"CM\xddg~b\xf6\xef\x8e\x0c\xd0\xde|\xa0'\x8a\x0c\xd6x\xae!J\xa6F\x88\x15u"
1610 b"\x008\x17\xbc7y\xb3\xd8u\xac_\x85\x8d\xe7\xc1@\x9c\xecqc\xa3#\xad\xf1"
1611 b"\x935\xb5)_\r\xec3]\x0fo]5\xd0my\x07\x9b\xee\x81\xb5\x0f\xcfK+\x00\xc0"
1612 b"\xe4b\x10\xe4\x0c\x1a \x9b\xe0\x97t\xf6\xa1\x9e\x850\xba\x0c\x9a\x8d\xc8"
1613 b"\x8f\x07\xd7\xae\xc8\xf9+i\xdc\xb9k\xb0>f\x19\xb8\r\xa8\xf8\x1f$\xa5{p"
1614 b"\xc6\x880\xce\xdb\xcf\xca_\x86\xac\x88h6\x8bZ%'\xd0\n\xbf\x0f\x9c\"\xba"
1615 b"\xe5\x86\x9f\x0f7X=mNX[\xcc\x19FU\xc9\x860\xbc\x90a+* \xae_$\x03\x1e\xd3"
1616 b"\xcd_\xa0\x9c\xde\xaf46q\xa5\xc9\x92\xd7\xca\xe3`\x9d\x85}\xb4\xff\xb3"
1617 b"\x83\xfb\xb6\xca\xae`\x0bw\x7f\xfc\xd8\xacVe\x19\xc8\x17\x0bZ\xad\x88"
1618 b"\xeb#\x97\x03\x13\xb1d\x0f{\x0c\x04w\x07\r\x97\xbd\xd6\xc1\xc3B:\x95\x08"
1619 b"^\x10V\xaeaH\x02\xd9\xe3\n\\\x01X\xf6\x9c\x8a\x06u#%\xbe*\xa1\x18v\x85"
1620 b"\xec!\t4\x00\x00\x00"
1621)
1622
1623FILTERS_RAW_4 = [{"id": lzma.FILTER_DELTA, "dist": 4},
1624 {"id": lzma.FILTER_X86, "start_offset": 0x40},
1625 {"id": lzma.FILTER_LZMA2, "preset": 4, "lc": 2}]
1626COMPRESSED_RAW_4 = (
1627 b"\xe0\x07\x80\x06\x0e\\\x00\x05\x14\x07bW\xaah\xdd\x10\xdc'\xd6\x90,\xc6v"
1628 b"Jq \x14l\xb7\x83xB\x0b\x97f=&fx\xba\n>Tn\xbf\x8f\xfb\x1dF\xca\xc3v_\xca?"
1629 b"\xfbV<\x92#\xd4w\xa6\x8a\xeb\xf6\x03\xc0\x01\x94\xd8\x9e\x13\x12\x98\xd1"
1630 b"*\xfa]c\xe8\x1e~\xaf\xb5]Eg\xfb\x9e\x01\"8\xb2\x90\x06=~\xe9\x91W\xcd"
1631 b"\xecD\x12\xc7\xfa\xe1\x91\x06\xc7\x99\xb9\xe3\x901\x87\x19u\x0f\x869\xff"
1632 b"\xc1\xb0hw|\xb0\xdcl\xcck\xb16o7\x85\xee{Y_b\xbf\xbc$\xf3=\x8d\x8bw\xe5Z"
1633 b"\x08@\xc4kmE\xad\xfb\xf6*\xd8\xad\xa1\xfb\xc5{\xdej,)\x1emB\x1f<\xaeca"
1634 b"\x80(\xee\x07 \xdf\xe9\xf8\xeb\x0e-\x97\x86\x90c\xf9\xea'B\xf7`\xd7\xb0"
1635 b"\x92\xbd\xa0\x82]\xbd\x0e\x0eB\x19\xdc\x96\xc6\x19\xd86D\xf0\xd5\x831"
1636 b"\x03\xb7\x1c\xf7&5\x1a\x8f PZ&j\xf8\x98\x1bo\xcc\x86\x9bS\xd3\xa5\xcdu"
1637 b"\xf9$\xcc\x97o\xe5V~\xfb\x97\xb5\x0b\x17\x9c\xfdxW\x10\xfep4\x80\xdaHDY"
1638 b"\xfa)\xfet\xb5\"\xd4\xd3F\x81\xf4\x13\x1f\xec\xdf\xa5\x13\xfc\"\x91x\xb7"
1639 b"\x99\xce\xc8\x92\n\xeb[\x10l*Y\xd8\xb1@\x06\xc8o\x8d7r\xebu\xfd5\x0e\x7f"
1640 b"\xf1$U{\t}\x1fQ\xcfxN\x9d\x9fXX\xe9`\x83\xc1\x06\xf4\x87v-f\x11\xdb/\\"
1641 b"\x06\xff\xd7)B\xf3g\x06\x88#2\x1eB244\x7f4q\t\xc893?mPX\x95\xa6a\xfb)d"
1642 b"\x9b\xfc\x98\x9aj\x04\xae\x9b\x9d\x19w\xba\xf92\xfaA\x11\\\x17\x97C3\xa4"
1643 b"\xbc!\x88\xcdo[\xec:\x030\x91.\x85\xe0@\\4\x16\x12\x9d\xcaJv\x97\xb04"
1644 b"\xack\xcbkf\xa3ss\xfc\x16^\x8ce\x85a\xa5=&\xecr\xb3p\xd1E\xd5\x80y\xc7"
1645 b"\xda\xf6\xfek\xbcT\xbfH\xee\x15o\xc5\x8c\x830\xec\x1d\x01\xae\x0c-e\\"
1646 b"\x91\x90\x94\xb2\xf8\x88\x91\xe8\x0b\xae\xa7>\x98\xf6\x9ck\xd2\xc6\x08"
1647 b"\xe6\xab\t\x98\xf2!\xa0\x8c^\xacqA\x99<\x1cEG\x97\xc8\xf1\xb6\xb9\x82"
1648 b"\x8d\xf7\x08s\x98a\xff\xe3\xcc\x92\x0e\xd2\xb6U\xd7\xd9\x86\x7fa\xe5\x1c"
1649 b"\x8dTG@\t\x1e\x0e7*\xfc\xde\xbc]6N\xf7\xf1\x84\x9e\x9f\xcf\xe9\x1e\xb5'"
1650 b"\xf4<\xdf\x99sq\xd0\x9d\xbd\x99\x0b\xb4%p4\xbf{\xbb\x8a\xd2\x0b\xbc=M"
1651 b"\x94H:\xf5\xa8\xd6\xa4\xc90\xc2D\xb9\xd3\xa8\xb0S\x87 `\xa2\xeb\xf3W\xce"
1652 b" 7\xf9N#\r\xe6\xbe\t\x9d\xe7\x811\xf9\x10\xc1\xc2\x14\xf6\xfc\xcba\xb7"
1653 b"\xb1\x7f\x95l\xe4\tjA\xec:\x10\xe5\xfe\xc2\\=D\xe2\x0c\x0b3]\xf7\xc1\xf7"
1654 b"\xbceZ\xb1A\xea\x16\xe5\xfddgFQ\xed\xaf\x04\xa3\xd3\xf8\xa2q\x19B\xd4r"
1655 b"\xc5\x0c\x9a\x14\x94\xea\x91\xc4o\xe4\xbb\xb4\x99\xf4@\xd1\xe6\x0c\xe3"
1656 b"\xc6d\xa0Q\n\xf2/\xd8\xb8S5\x8a\x18:\xb5g\xac\x95D\xce\x17\x07\xd4z\xda"
1657 b"\x90\xe65\x07\x19H!\t\xfdu\x16\x8e\x0eR\x19\xf4\x8cl\x0c\xf9Q\xf1\x80"
1658 b"\xe3\xbf\xd7O\xf8\x8c\x18\x0b\x9c\xf1\x1fb\xe1\tR\xb2\xf1\xe1A\xea \xcf-"
1659 b"IGE\xf1\x14\x98$\x83\x15\xc9\xd8j\xbf\x19\x0f\xd5\xd1\xaa\xb3\xf3\xa5I2s"
1660 b"\x8d\x145\xca\xd5\xd93\x9c\xb8D0\xe6\xaa%\xd0\xc0P}JO^h\x8e\x08\xadlV."
1661 b"\x18\x88\x13\x05o\xb0\x07\xeaw\xe0\xb6\xa4\xd5*\xe4r\xef\x07G+\xc1\xbei["
1662 b"w\xe8\xab@_\xef\x15y\xe5\x12\xc9W\x1b.\xad\x85-\xc2\xf7\xe3mU6g\x8eSA"
1663 b"\x01(\xd3\xdb\x16\x13=\xde\x92\xf9,D\xb8\x8a\xb2\xb4\xc9\xc3\xefnE\xe8\\"
1664 b"\xa6\xe2Y\xd2\xcf\xcb\x8c\xb6\xd5\xe9\x1d\x1e\x9a\x8b~\xe2\xa6\rE\x84uV"
1665 b"\xed\xc6\x99\xddm<\x10[\x0fu\x1f\xc1\x1d1\n\xcfw\xb2%!\xf0[\xce\x87\x83B"
1666 b"\x08\xaa,\x08%d\xcef\x94\"\xd9g.\xc83\xcbXY+4\xec\x85qA\n\x1d=9\xf0*\xb1"
1667 b"\x1f/\xf3s\xd61b\x7f@\xfb\x9d\xe3FQ\\\xbd\x82\x1e\x00\xf3\xce\xd3\xe1"
1668 b"\xca,E\xfd7[\xab\xb6\xb7\xac!mA}\xbd\x9d3R5\x9cF\xabH\xeb\x92)cc\x13\xd0"
1669 b"\xbd\xee\xe9n{\x1dIJB\xa5\xeb\x11\xe8`w&`\x8b}@Oxe\t\x8a\x07\x02\x95\xf2"
1670 b"\xed\xda|\xb1e\xbe\xaa\xbbg\x19@\xe1Y\x878\x84\x0f\x8c\xe3\xc98\xf2\x9e"
1671 b"\xd5N\xb5J\xef\xab!\xe2\x8dq\xe1\xe5q\xc5\xee\x11W\xb7\xe4k*\x027\xa0"
1672 b"\xa3J\xf4\xd8m\xd0q\x94\xcb\x07\n:\xb6`.\xe4\x9c\x15+\xc0)\xde\x80X\xd4"
1673 b"\xcfQm\x01\xc2cP\x1cA\x85'\xc9\xac\x8b\xe6\xb2)\xe6\x84t\x1c\x92\xe4Z"
1674 b"\x1cR\xb0\x9e\x96\xd1\xfb\x1c\xa6\x8b\xcb`\x10\x12]\xf2gR\x9bFT\xe0\xc8H"
1675 b"S\xfb\xac<\x04\xc7\xc1\xe8\xedP\xf4\x16\xdb\xc0\xd7e\xc2\x17J^\x1f\xab"
1676 b"\xff[\x08\x19\xb4\xf5\xfb\x19\xb4\x04\xe5c~']\xcb\xc2A\xec\x90\xd0\xed"
1677 b"\x06,\xc5K{\x86\x03\xb1\xcdMx\xdeQ\x8c3\xf9\x8a\xea=\x89\xaba\xd2\xc89a"
1678 b"\xd72\xf0\xc3\x19\x8a\xdfs\xd4\xfd\xbb\x81b\xeaE\"\xd8\xf4d\x0cD\xf7IJ!"
1679 b"\xe5d\xbbG\xe9\xcam\xaa\x0f_r\x95\x91NBq\xcaP\xce\xa7\xa9\xb5\x10\x94eP!"
1680 b"|\x856\xcd\xbfIir\xb8e\x9bjP\x97q\xabwS7\x1a\x0ehM\xe7\xca\x86?\xdeP}y~"
1681 b"\x0f\x95I\xfc\x13\xe1<Q\x1b\x868\x1d\x11\xdf\x94\xf4\x82>r\xa9k\x88\xcb"
1682 b"\xfd\xc3v\xe2\xb9\x8a\x02\x8eq\x92I\xf8\xf6\xf1\x03s\x9b\xb8\xe3\"\xe3"
1683 b"\xa9\xa5>D\xb8\x96;\xe7\x92\xd133\xe8\xdd'e\xc9.\xdc;\x17\x1f\xf5H\x13q"
1684 b"\xa4W\x0c\xdb~\x98\x01\xeb\xdf\xe32\x13\x0f\xddx\n6\xa0\t\x10\xb6\xbb"
1685 b"\xb0\xc3\x18\xb6;\x9fj[\xd9\xd5\xc9\x06\x8a\x87\xcd\xe5\xee\xfc\x9c-%@"
1686 b"\xee\xe0\xeb\xd2\xe3\xe8\xfb\xc0\x122\\\xc7\xaf\xc2\xa1Oth\xb3\x8f\x82"
1687 b"\xb3\x18\xa8\x07\xd5\xee_\xbe\xe0\x1cA\x1e_\r\x9a\xb0\x17W&\xa2D\x91\x94"
1688 b"\x1a\xb2\xef\xf2\xdc\x85;X\xb0,\xeb>-7S\xe5\xca\x07)\x1fp\x7f\xcaQBL\xca"
1689 b"\xf3\xb9d\xfc\xb5su\xb0\xc8\x95\x90\xeb*)\xa0v\xe4\x9a{FW\xf4l\xde\xcdj"
1690 b"\x00"
1691)
1692
1693
1694def test_main():
1695 run_unittest(
1696 CompressorDecompressorTestCase,
1697 CompressDecompressFunctionTestCase,
1698 FileTestCase,
Nadeem Vawdae8604042012-06-04 23:38:12 +02001699 OpenTestCase,
Nadeem Vawda3ff069e2011-11-30 00:25:06 +02001700 MiscellaneousTestCase,
1701 )
1702
1703if __name__ == "__main__":
1704 test_main()