blob: 1e2066b89168f419ebcab08b705ce0231e479785 [file] [log] [blame]
Antoine Pitrou2dbc6e62015-04-11 00:31:01 +02001import _compression
Miss Islington (bot)01858fb2021-06-22 06:59:53 -07002import array
Antoine Pitrou2dbc6e62015-04-11 00:31:01 +02003from io import BytesIO, UnsupportedOperation, DEFAULT_BUFFER_SIZE
Nadeem Vawda3ff069e2011-11-30 00:25:06 +02004import os
Berker Peksag5f59ddd2016-10-04 20:41:20 +03005import pathlib
Nadeem Vawda37970652013-10-28 21:35:23 +01006import pickle
Nadeem Vawda3ff069e2011-11-30 00:25:06 +02007import random
Oren Milmand019bc82018-02-13 12:28:33 +02008import sys
9from test import support
Nadeem Vawda3ff069e2011-11-30 00:25:06 +020010import unittest
11
12from test.support import (
Hai Shi0c4f0f32020-06-30 21:46:31 +080013 _4G, bigmemtest, run_unittest
14)
15from test.support.import_helper import import_module
16from test.support.os_helper import (
17 TESTFN, unlink
Nadeem Vawda3ff069e2011-11-30 00:25:06 +020018)
19
20lzma = import_module("lzma")
21from lzma import LZMACompressor, LZMADecompressor, LZMAError, LZMAFile
22
23
24class CompressorDecompressorTestCase(unittest.TestCase):
25
26 # Test error cases.
27
28 def test_simple_bad_args(self):
29 self.assertRaises(TypeError, LZMACompressor, [])
30 self.assertRaises(TypeError, LZMACompressor, format=3.45)
31 self.assertRaises(TypeError, LZMACompressor, check="")
32 self.assertRaises(TypeError, LZMACompressor, preset="asdf")
33 self.assertRaises(TypeError, LZMACompressor, filters=3)
34 # Can't specify FORMAT_AUTO when compressing.
35 self.assertRaises(ValueError, LZMACompressor, format=lzma.FORMAT_AUTO)
36 # Can't specify a preset and a custom filter chain at the same time.
37 with self.assertRaises(ValueError):
38 LZMACompressor(preset=7, filters=[{"id": lzma.FILTER_LZMA2}])
39
40 self.assertRaises(TypeError, LZMADecompressor, ())
41 self.assertRaises(TypeError, LZMADecompressor, memlimit=b"qw")
42 with self.assertRaises(TypeError):
43 LZMADecompressor(lzma.FORMAT_RAW, filters="zzz")
44 # Cannot specify a memory limit with FILTER_RAW.
45 with self.assertRaises(ValueError):
46 LZMADecompressor(lzma.FORMAT_RAW, memlimit=0x1000000)
47 # Can only specify a custom filter chain with FILTER_RAW.
48 self.assertRaises(ValueError, LZMADecompressor, filters=FILTERS_RAW_1)
49 with self.assertRaises(ValueError):
50 LZMADecompressor(format=lzma.FORMAT_XZ, filters=FILTERS_RAW_1)
51 with self.assertRaises(ValueError):
52 LZMADecompressor(format=lzma.FORMAT_ALONE, filters=FILTERS_RAW_1)
53
54 lzc = LZMACompressor()
55 self.assertRaises(TypeError, lzc.compress)
56 self.assertRaises(TypeError, lzc.compress, b"foo", b"bar")
57 self.assertRaises(TypeError, lzc.flush, b"blah")
58 empty = lzc.flush()
59 self.assertRaises(ValueError, lzc.compress, b"quux")
60 self.assertRaises(ValueError, lzc.flush)
61
62 lzd = LZMADecompressor()
63 self.assertRaises(TypeError, lzd.decompress)
64 self.assertRaises(TypeError, lzd.decompress, b"foo", b"bar")
65 lzd.decompress(empty)
66 self.assertRaises(EOFError, lzd.decompress, b"quux")
67
68 def test_bad_filter_spec(self):
69 self.assertRaises(TypeError, LZMACompressor, filters=[b"wobsite"])
70 self.assertRaises(ValueError, LZMACompressor, filters=[{"xyzzy": 3}])
71 self.assertRaises(ValueError, LZMACompressor, filters=[{"id": 98765}])
72 with self.assertRaises(ValueError):
73 LZMACompressor(filters=[{"id": lzma.FILTER_LZMA2, "foo": 0}])
74 with self.assertRaises(ValueError):
75 LZMACompressor(filters=[{"id": lzma.FILTER_DELTA, "foo": 0}])
76 with self.assertRaises(ValueError):
77 LZMACompressor(filters=[{"id": lzma.FILTER_X86, "foo": 0}])
78
79 def test_decompressor_after_eof(self):
80 lzd = LZMADecompressor()
81 lzd.decompress(COMPRESSED_XZ)
82 self.assertRaises(EOFError, lzd.decompress, b"nyan")
83
84 def test_decompressor_memlimit(self):
85 lzd = LZMADecompressor(memlimit=1024)
86 self.assertRaises(LZMAError, lzd.decompress, COMPRESSED_XZ)
87
88 lzd = LZMADecompressor(lzma.FORMAT_XZ, memlimit=1024)
89 self.assertRaises(LZMAError, lzd.decompress, COMPRESSED_XZ)
90
91 lzd = LZMADecompressor(lzma.FORMAT_ALONE, memlimit=1024)
92 self.assertRaises(LZMAError, lzd.decompress, COMPRESSED_ALONE)
93
94 # Test LZMADecompressor on known-good input data.
95
96 def _test_decompressor(self, lzd, data, check, unused_data=b""):
97 self.assertFalse(lzd.eof)
98 out = lzd.decompress(data)
99 self.assertEqual(out, INPUT)
100 self.assertEqual(lzd.check, check)
101 self.assertTrue(lzd.eof)
102 self.assertEqual(lzd.unused_data, unused_data)
103
104 def test_decompressor_auto(self):
105 lzd = LZMADecompressor()
106 self._test_decompressor(lzd, COMPRESSED_XZ, lzma.CHECK_CRC64)
107
108 lzd = LZMADecompressor()
109 self._test_decompressor(lzd, COMPRESSED_ALONE, lzma.CHECK_NONE)
110
111 def test_decompressor_xz(self):
112 lzd = LZMADecompressor(lzma.FORMAT_XZ)
113 self._test_decompressor(lzd, COMPRESSED_XZ, lzma.CHECK_CRC64)
114
115 def test_decompressor_alone(self):
116 lzd = LZMADecompressor(lzma.FORMAT_ALONE)
117 self._test_decompressor(lzd, COMPRESSED_ALONE, lzma.CHECK_NONE)
118
119 def test_decompressor_raw_1(self):
120 lzd = LZMADecompressor(lzma.FORMAT_RAW, filters=FILTERS_RAW_1)
121 self._test_decompressor(lzd, COMPRESSED_RAW_1, lzma.CHECK_NONE)
122
123 def test_decompressor_raw_2(self):
124 lzd = LZMADecompressor(lzma.FORMAT_RAW, filters=FILTERS_RAW_2)
125 self._test_decompressor(lzd, COMPRESSED_RAW_2, lzma.CHECK_NONE)
126
127 def test_decompressor_raw_3(self):
128 lzd = LZMADecompressor(lzma.FORMAT_RAW, filters=FILTERS_RAW_3)
129 self._test_decompressor(lzd, COMPRESSED_RAW_3, lzma.CHECK_NONE)
130
131 def test_decompressor_raw_4(self):
132 lzd = LZMADecompressor(lzma.FORMAT_RAW, filters=FILTERS_RAW_4)
133 self._test_decompressor(lzd, COMPRESSED_RAW_4, lzma.CHECK_NONE)
134
135 def test_decompressor_chunks(self):
136 lzd = LZMADecompressor()
137 out = []
138 for i in range(0, len(COMPRESSED_XZ), 10):
139 self.assertFalse(lzd.eof)
140 out.append(lzd.decompress(COMPRESSED_XZ[i:i+10]))
141 out = b"".join(out)
142 self.assertEqual(out, INPUT)
143 self.assertEqual(lzd.check, lzma.CHECK_CRC64)
144 self.assertTrue(lzd.eof)
145 self.assertEqual(lzd.unused_data, b"")
146
Serhiy Storchaka04f17f12016-10-31 08:30:09 +0200147 def test_decompressor_chunks_empty(self):
148 lzd = LZMADecompressor()
149 out = []
150 for i in range(0, len(COMPRESSED_XZ), 10):
151 self.assertFalse(lzd.eof)
152 out.append(lzd.decompress(b''))
153 out.append(lzd.decompress(b''))
154 out.append(lzd.decompress(b''))
155 out.append(lzd.decompress(COMPRESSED_XZ[i:i+10]))
156 out = b"".join(out)
157 self.assertEqual(out, INPUT)
158 self.assertEqual(lzd.check, lzma.CHECK_CRC64)
159 self.assertTrue(lzd.eof)
160 self.assertEqual(lzd.unused_data, b"")
161
Antoine Pitrou26795ba2015-01-17 16:22:18 +0100162 def test_decompressor_chunks_maxsize(self):
163 lzd = LZMADecompressor()
164 max_length = 100
165 out = []
166
167 # Feed first half the input
168 len_ = len(COMPRESSED_XZ) // 2
169 out.append(lzd.decompress(COMPRESSED_XZ[:len_],
170 max_length=max_length))
171 self.assertFalse(lzd.needs_input)
172 self.assertEqual(len(out[-1]), max_length)
173
174 # Retrieve more data without providing more input
175 out.append(lzd.decompress(b'', max_length=max_length))
176 self.assertFalse(lzd.needs_input)
177 self.assertEqual(len(out[-1]), max_length)
178
179 # Retrieve more data while providing more input
180 out.append(lzd.decompress(COMPRESSED_XZ[len_:],
181 max_length=max_length))
182 self.assertLessEqual(len(out[-1]), max_length)
183
184 # Retrieve remaining uncompressed data
185 while not lzd.eof:
186 out.append(lzd.decompress(b'', max_length=max_length))
187 self.assertLessEqual(len(out[-1]), max_length)
188
189 out = b"".join(out)
190 self.assertEqual(out, INPUT)
191 self.assertEqual(lzd.check, lzma.CHECK_CRC64)
192 self.assertEqual(lzd.unused_data, b"")
193
194 def test_decompressor_inputbuf_1(self):
195 # Test reusing input buffer after moving existing
196 # contents to beginning
197 lzd = LZMADecompressor()
198 out = []
199
200 # Create input buffer and fill it
201 self.assertEqual(lzd.decompress(COMPRESSED_XZ[:100],
202 max_length=0), b'')
203
204 # Retrieve some results, freeing capacity at beginning
205 # of input buffer
206 out.append(lzd.decompress(b'', 2))
207
208 # Add more data that fits into input buffer after
209 # moving existing data to beginning
210 out.append(lzd.decompress(COMPRESSED_XZ[100:105], 15))
211
212 # Decompress rest of data
213 out.append(lzd.decompress(COMPRESSED_XZ[105:]))
214 self.assertEqual(b''.join(out), INPUT)
215
216 def test_decompressor_inputbuf_2(self):
217 # Test reusing input buffer by appending data at the
218 # end right away
219 lzd = LZMADecompressor()
220 out = []
221
222 # Create input buffer and empty it
223 self.assertEqual(lzd.decompress(COMPRESSED_XZ[:200],
224 max_length=0), b'')
225 out.append(lzd.decompress(b''))
226
227 # Fill buffer with new data
228 out.append(lzd.decompress(COMPRESSED_XZ[200:280], 2))
229
230 # Append some more data, not enough to require resize
231 out.append(lzd.decompress(COMPRESSED_XZ[280:300], 2))
232
233 # Decompress rest of data
234 out.append(lzd.decompress(COMPRESSED_XZ[300:]))
235 self.assertEqual(b''.join(out), INPUT)
236
237 def test_decompressor_inputbuf_3(self):
238 # Test reusing input buffer after extending it
239
240 lzd = LZMADecompressor()
241 out = []
242
243 # Create almost full input buffer
244 out.append(lzd.decompress(COMPRESSED_XZ[:200], 5))
245
246 # Add even more data to it, requiring resize
247 out.append(lzd.decompress(COMPRESSED_XZ[200:300], 5))
248
249 # Decompress rest of data
250 out.append(lzd.decompress(COMPRESSED_XZ[300:]))
251 self.assertEqual(b''.join(out), INPUT)
252
Nadeem Vawda3ff069e2011-11-30 00:25:06 +0200253 def test_decompressor_unused_data(self):
254 lzd = LZMADecompressor()
255 extra = b"fooblibar"
256 self._test_decompressor(lzd, COMPRESSED_XZ + extra, lzma.CHECK_CRC64,
257 unused_data=extra)
258
259 def test_decompressor_bad_input(self):
260 lzd = LZMADecompressor()
261 self.assertRaises(LZMAError, lzd.decompress, COMPRESSED_RAW_1)
262
263 lzd = LZMADecompressor(lzma.FORMAT_XZ)
264 self.assertRaises(LZMAError, lzd.decompress, COMPRESSED_ALONE)
265
266 lzd = LZMADecompressor(lzma.FORMAT_ALONE)
267 self.assertRaises(LZMAError, lzd.decompress, COMPRESSED_XZ)
268
269 lzd = LZMADecompressor(lzma.FORMAT_RAW, filters=FILTERS_RAW_1)
270 self.assertRaises(LZMAError, lzd.decompress, COMPRESSED_XZ)
271
Serhiy Storchakac0b70372016-09-27 20:14:26 +0300272 def test_decompressor_bug_28275(self):
273 # Test coverage for Issue 28275
274 lzd = LZMADecompressor()
Martin Panter38317d32016-10-01 02:45:17 +0000275 self.assertRaises(LZMAError, lzd.decompress, COMPRESSED_RAW_1)
276 # Previously, a second call could crash due to internal inconsistency
277 self.assertRaises(LZMAError, lzd.decompress, COMPRESSED_RAW_1)
Serhiy Storchakac0b70372016-09-27 20:14:26 +0300278
Nadeem Vawda3ff069e2011-11-30 00:25:06 +0200279 # Test that LZMACompressor->LZMADecompressor preserves the input data.
280
281 def test_roundtrip_xz(self):
282 lzc = LZMACompressor()
283 cdata = lzc.compress(INPUT) + lzc.flush()
284 lzd = LZMADecompressor()
285 self._test_decompressor(lzd, cdata, lzma.CHECK_CRC64)
286
287 def test_roundtrip_alone(self):
288 lzc = LZMACompressor(lzma.FORMAT_ALONE)
289 cdata = lzc.compress(INPUT) + lzc.flush()
290 lzd = LZMADecompressor()
291 self._test_decompressor(lzd, cdata, lzma.CHECK_NONE)
292
293 def test_roundtrip_raw(self):
294 lzc = LZMACompressor(lzma.FORMAT_RAW, filters=FILTERS_RAW_4)
295 cdata = lzc.compress(INPUT) + lzc.flush()
296 lzd = LZMADecompressor(lzma.FORMAT_RAW, filters=FILTERS_RAW_4)
297 self._test_decompressor(lzd, cdata, lzma.CHECK_NONE)
298
Serhiy Storchaka04f17f12016-10-31 08:30:09 +0200299 def test_roundtrip_raw_empty(self):
300 lzc = LZMACompressor(lzma.FORMAT_RAW, filters=FILTERS_RAW_4)
301 cdata = lzc.compress(INPUT)
302 cdata += lzc.compress(b'')
303 cdata += lzc.compress(b'')
304 cdata += lzc.compress(b'')
305 cdata += lzc.flush()
306 lzd = LZMADecompressor(lzma.FORMAT_RAW, filters=FILTERS_RAW_4)
307 self._test_decompressor(lzd, cdata, lzma.CHECK_NONE)
308
Nadeem Vawda3ff069e2011-11-30 00:25:06 +0200309 def test_roundtrip_chunks(self):
310 lzc = LZMACompressor()
311 cdata = []
312 for i in range(0, len(INPUT), 10):
313 cdata.append(lzc.compress(INPUT[i:i+10]))
314 cdata.append(lzc.flush())
315 cdata = b"".join(cdata)
316 lzd = LZMADecompressor()
317 self._test_decompressor(lzd, cdata, lzma.CHECK_CRC64)
318
Serhiy Storchaka04f17f12016-10-31 08:30:09 +0200319 def test_roundtrip_empty_chunks(self):
320 lzc = LZMACompressor()
321 cdata = []
322 for i in range(0, len(INPUT), 10):
323 cdata.append(lzc.compress(INPUT[i:i+10]))
324 cdata.append(lzc.compress(b''))
325 cdata.append(lzc.compress(b''))
326 cdata.append(lzc.compress(b''))
327 cdata.append(lzc.flush())
328 cdata = b"".join(cdata)
329 lzd = LZMADecompressor()
330 self._test_decompressor(lzd, cdata, lzma.CHECK_CRC64)
331
Nadeem Vawda3ff069e2011-11-30 00:25:06 +0200332 # LZMADecompressor intentionally does not handle concatenated streams.
333
334 def test_decompressor_multistream(self):
335 lzd = LZMADecompressor()
336 self._test_decompressor(lzd, COMPRESSED_XZ + COMPRESSED_ALONE,
337 lzma.CHECK_CRC64, unused_data=COMPRESSED_ALONE)
338
339 # Test with inputs larger than 4GiB.
340
Neil Schemenauer52a48e62019-07-30 11:08:18 -0700341 @support.skip_if_pgo_task
Nadeem Vawda3ff069e2011-11-30 00:25:06 +0200342 @bigmemtest(size=_4G + 100, memuse=2)
343 def test_compressor_bigmem(self, size):
344 lzc = LZMACompressor()
345 cdata = lzc.compress(b"x" * size) + lzc.flush()
346 ddata = lzma.decompress(cdata)
347 try:
348 self.assertEqual(len(ddata), size)
349 self.assertEqual(len(ddata.strip(b"x")), 0)
350 finally:
351 ddata = None
352
Neil Schemenauer52a48e62019-07-30 11:08:18 -0700353 @support.skip_if_pgo_task
Nadeem Vawda3ff069e2011-11-30 00:25:06 +0200354 @bigmemtest(size=_4G + 100, memuse=3)
355 def test_decompressor_bigmem(self, size):
356 lzd = LZMADecompressor()
357 blocksize = 10 * 1024 * 1024
Victor Stinner87502dd2020-04-17 22:54:38 +0200358 block = random.randbytes(blocksize)
Nadeem Vawda3ff069e2011-11-30 00:25:06 +0200359 try:
360 input = block * (size // blocksize + 1)
361 cdata = lzma.compress(input)
362 ddata = lzd.decompress(cdata)
363 self.assertEqual(ddata, input)
364 finally:
365 input = cdata = ddata = None
366
Nadeem Vawda37970652013-10-28 21:35:23 +0100367 # Pickling raises an exception; there's no way to serialize an lzma_stream.
368
369 def test_pickle(self):
Serhiy Storchakabad12572014-12-15 14:03:42 +0200370 for proto in range(pickle.HIGHEST_PROTOCOL + 1):
371 with self.assertRaises(TypeError):
372 pickle.dumps(LZMACompressor(), proto)
373 with self.assertRaises(TypeError):
374 pickle.dumps(LZMADecompressor(), proto)
Nadeem Vawda37970652013-10-28 21:35:23 +0100375
Oren Milmand019bc82018-02-13 12:28:33 +0200376 @support.refcount_test
377 def test_refleaks_in_decompressor___init__(self):
378 gettotalrefcount = support.get_attribute(sys, 'gettotalrefcount')
379 lzd = LZMADecompressor()
380 refs_before = gettotalrefcount()
381 for i in range(100):
382 lzd.__init__()
383 self.assertAlmostEqual(gettotalrefcount() - refs_before, 0, delta=10)
384
Nadeem Vawda3ff069e2011-11-30 00:25:06 +0200385
386class CompressDecompressFunctionTestCase(unittest.TestCase):
387
388 # Test error cases:
389
390 def test_bad_args(self):
391 self.assertRaises(TypeError, lzma.compress)
392 self.assertRaises(TypeError, lzma.compress, [])
393 self.assertRaises(TypeError, lzma.compress, b"", format="xz")
394 self.assertRaises(TypeError, lzma.compress, b"", check="none")
395 self.assertRaises(TypeError, lzma.compress, b"", preset="blah")
396 self.assertRaises(TypeError, lzma.compress, b"", filters=1024)
397 # Can't specify a preset and a custom filter chain at the same time.
398 with self.assertRaises(ValueError):
399 lzma.compress(b"", preset=3, filters=[{"id": lzma.FILTER_LZMA2}])
400
401 self.assertRaises(TypeError, lzma.decompress)
402 self.assertRaises(TypeError, lzma.decompress, [])
403 self.assertRaises(TypeError, lzma.decompress, b"", format="lzma")
404 self.assertRaises(TypeError, lzma.decompress, b"", memlimit=7.3e9)
405 with self.assertRaises(TypeError):
406 lzma.decompress(b"", format=lzma.FORMAT_RAW, filters={})
407 # Cannot specify a memory limit with FILTER_RAW.
408 with self.assertRaises(ValueError):
409 lzma.decompress(b"", format=lzma.FORMAT_RAW, memlimit=0x1000000)
410 # Can only specify a custom filter chain with FILTER_RAW.
411 with self.assertRaises(ValueError):
412 lzma.decompress(b"", filters=FILTERS_RAW_1)
413 with self.assertRaises(ValueError):
414 lzma.decompress(b"", format=lzma.FORMAT_XZ, filters=FILTERS_RAW_1)
415 with self.assertRaises(ValueError):
416 lzma.decompress(
417 b"", format=lzma.FORMAT_ALONE, filters=FILTERS_RAW_1)
418
419 def test_decompress_memlimit(self):
420 with self.assertRaises(LZMAError):
421 lzma.decompress(COMPRESSED_XZ, memlimit=1024)
422 with self.assertRaises(LZMAError):
423 lzma.decompress(
424 COMPRESSED_XZ, format=lzma.FORMAT_XZ, memlimit=1024)
425 with self.assertRaises(LZMAError):
426 lzma.decompress(
427 COMPRESSED_ALONE, format=lzma.FORMAT_ALONE, memlimit=1024)
428
429 # Test LZMADecompressor on known-good input data.
430
431 def test_decompress_good_input(self):
432 ddata = lzma.decompress(COMPRESSED_XZ)
433 self.assertEqual(ddata, INPUT)
434
435 ddata = lzma.decompress(COMPRESSED_ALONE)
436 self.assertEqual(ddata, INPUT)
437
438 ddata = lzma.decompress(COMPRESSED_XZ, lzma.FORMAT_XZ)
439 self.assertEqual(ddata, INPUT)
440
441 ddata = lzma.decompress(COMPRESSED_ALONE, lzma.FORMAT_ALONE)
442 self.assertEqual(ddata, INPUT)
443
444 ddata = lzma.decompress(
445 COMPRESSED_RAW_1, lzma.FORMAT_RAW, filters=FILTERS_RAW_1)
446 self.assertEqual(ddata, INPUT)
447
448 ddata = lzma.decompress(
449 COMPRESSED_RAW_2, lzma.FORMAT_RAW, filters=FILTERS_RAW_2)
450 self.assertEqual(ddata, INPUT)
451
452 ddata = lzma.decompress(
453 COMPRESSED_RAW_3, lzma.FORMAT_RAW, filters=FILTERS_RAW_3)
454 self.assertEqual(ddata, INPUT)
455
456 ddata = lzma.decompress(
457 COMPRESSED_RAW_4, lzma.FORMAT_RAW, filters=FILTERS_RAW_4)
458 self.assertEqual(ddata, INPUT)
459
460 def test_decompress_incomplete_input(self):
461 self.assertRaises(LZMAError, lzma.decompress, COMPRESSED_XZ[:128])
462 self.assertRaises(LZMAError, lzma.decompress, COMPRESSED_ALONE[:128])
463 self.assertRaises(LZMAError, lzma.decompress, COMPRESSED_RAW_1[:128],
464 format=lzma.FORMAT_RAW, filters=FILTERS_RAW_1)
465 self.assertRaises(LZMAError, lzma.decompress, COMPRESSED_RAW_2[:128],
466 format=lzma.FORMAT_RAW, filters=FILTERS_RAW_2)
467 self.assertRaises(LZMAError, lzma.decompress, COMPRESSED_RAW_3[:128],
468 format=lzma.FORMAT_RAW, filters=FILTERS_RAW_3)
469 self.assertRaises(LZMAError, lzma.decompress, COMPRESSED_RAW_4[:128],
470 format=lzma.FORMAT_RAW, filters=FILTERS_RAW_4)
471
472 def test_decompress_bad_input(self):
473 with self.assertRaises(LZMAError):
Nadeem Vawda9c72ebc2013-12-04 23:03:49 +0100474 lzma.decompress(COMPRESSED_BOGUS)
475 with self.assertRaises(LZMAError):
Nadeem Vawda3ff069e2011-11-30 00:25:06 +0200476 lzma.decompress(COMPRESSED_RAW_1)
477 with self.assertRaises(LZMAError):
478 lzma.decompress(COMPRESSED_ALONE, format=lzma.FORMAT_XZ)
479 with self.assertRaises(LZMAError):
480 lzma.decompress(COMPRESSED_XZ, format=lzma.FORMAT_ALONE)
481 with self.assertRaises(LZMAError):
482 lzma.decompress(COMPRESSED_XZ, format=lzma.FORMAT_RAW,
483 filters=FILTERS_RAW_1)
484
485 # Test that compress()->decompress() preserves the input data.
486
487 def test_roundtrip(self):
488 cdata = lzma.compress(INPUT)
489 ddata = lzma.decompress(cdata)
490 self.assertEqual(ddata, INPUT)
491
492 cdata = lzma.compress(INPUT, lzma.FORMAT_XZ)
493 ddata = lzma.decompress(cdata)
494 self.assertEqual(ddata, INPUT)
495
496 cdata = lzma.compress(INPUT, lzma.FORMAT_ALONE)
497 ddata = lzma.decompress(cdata)
498 self.assertEqual(ddata, INPUT)
499
500 cdata = lzma.compress(INPUT, lzma.FORMAT_RAW, filters=FILTERS_RAW_4)
501 ddata = lzma.decompress(cdata, lzma.FORMAT_RAW, filters=FILTERS_RAW_4)
502 self.assertEqual(ddata, INPUT)
503
504 # Unlike LZMADecompressor, decompress() *does* handle concatenated streams.
505
506 def test_decompress_multistream(self):
507 ddata = lzma.decompress(COMPRESSED_XZ + COMPRESSED_ALONE)
508 self.assertEqual(ddata, INPUT * 2)
509
Nadeem Vawda9c72ebc2013-12-04 23:03:49 +0100510 # Test robust handling of non-LZMA data following the compressed stream(s).
511
512 def test_decompress_trailing_junk(self):
513 ddata = lzma.decompress(COMPRESSED_XZ + COMPRESSED_BOGUS)
514 self.assertEqual(ddata, INPUT)
515
516 def test_decompress_multistream_trailing_junk(self):
517 ddata = lzma.decompress(COMPRESSED_XZ * 3 + COMPRESSED_BOGUS)
518 self.assertEqual(ddata, INPUT * 3)
519
Nadeem Vawda3ff069e2011-11-30 00:25:06 +0200520
521class TempFile:
522 """Context manager - creates a file, and deletes it on __exit__."""
523
524 def __init__(self, filename, data=b""):
525 self.filename = filename
526 self.data = data
527
528 def __enter__(self):
529 with open(self.filename, "wb") as f:
530 f.write(self.data)
531
532 def __exit__(self, *args):
533 unlink(self.filename)
534
535
536class FileTestCase(unittest.TestCase):
537
538 def test_init(self):
Nadeem Vawda33c34da2012-06-04 23:34:07 +0200539 with LZMAFile(BytesIO(COMPRESSED_XZ)) as f:
Nadeem Vawda3ff069e2011-11-30 00:25:06 +0200540 pass
Nadeem Vawda33c34da2012-06-04 23:34:07 +0200541 with LZMAFile(BytesIO(), "w") as f:
Nadeem Vawda3ff069e2011-11-30 00:25:06 +0200542 pass
Nadeem Vawda42ca9822013-10-19 00:06:19 +0200543 with LZMAFile(BytesIO(), "x") as f:
544 pass
Nadeem Vawda33c34da2012-06-04 23:34:07 +0200545 with LZMAFile(BytesIO(), "a") as f:
Nadeem Vawda3ff069e2011-11-30 00:25:06 +0200546 pass
547
Berker Peksag5f59ddd2016-10-04 20:41:20 +0300548 def test_init_with_PathLike_filename(self):
549 filename = pathlib.Path(TESTFN)
550 with TempFile(filename, COMPRESSED_XZ):
551 with LZMAFile(filename) as f:
552 self.assertEqual(f.read(), INPUT)
553 with LZMAFile(filename, "a") as f:
554 f.write(INPUT)
555 with LZMAFile(filename) as f:
556 self.assertEqual(f.read(), INPUT * 2)
557
Nadeem Vawda3ff069e2011-11-30 00:25:06 +0200558 def test_init_with_filename(self):
559 with TempFile(TESTFN, COMPRESSED_XZ):
560 with LZMAFile(TESTFN) as f:
561 pass
562 with LZMAFile(TESTFN, "w") as f:
563 pass
564 with LZMAFile(TESTFN, "a") as f:
565 pass
566
Nadeem Vawda6cbb20c2012-06-04 23:36:24 +0200567 def test_init_mode(self):
568 with TempFile(TESTFN):
569 with LZMAFile(TESTFN, "r"):
570 pass
571 with LZMAFile(TESTFN, "rb"):
572 pass
573 with LZMAFile(TESTFN, "w"):
574 pass
575 with LZMAFile(TESTFN, "wb"):
576 pass
577 with LZMAFile(TESTFN, "a"):
578 pass
579 with LZMAFile(TESTFN, "ab"):
580 pass
581
Nadeem Vawda42ca9822013-10-19 00:06:19 +0200582 def test_init_with_x_mode(self):
583 self.addCleanup(unlink, TESTFN)
584 for mode in ("x", "xb"):
585 unlink(TESTFN)
586 with LZMAFile(TESTFN, mode):
587 pass
588 with self.assertRaises(FileExistsError):
589 with LZMAFile(TESTFN, mode):
590 pass
591
Nadeem Vawda3ff069e2011-11-30 00:25:06 +0200592 def test_init_bad_mode(self):
593 with self.assertRaises(ValueError):
Nadeem Vawda33c34da2012-06-04 23:34:07 +0200594 LZMAFile(BytesIO(COMPRESSED_XZ), (3, "x"))
Nadeem Vawda3ff069e2011-11-30 00:25:06 +0200595 with self.assertRaises(ValueError):
Nadeem Vawda33c34da2012-06-04 23:34:07 +0200596 LZMAFile(BytesIO(COMPRESSED_XZ), "")
Nadeem Vawda3ff069e2011-11-30 00:25:06 +0200597 with self.assertRaises(ValueError):
Nadeem Vawda42ca9822013-10-19 00:06:19 +0200598 LZMAFile(BytesIO(COMPRESSED_XZ), "xt")
599 with self.assertRaises(ValueError):
600 LZMAFile(BytesIO(COMPRESSED_XZ), "x+")
601 with self.assertRaises(ValueError):
602 LZMAFile(BytesIO(COMPRESSED_XZ), "rx")
603 with self.assertRaises(ValueError):
604 LZMAFile(BytesIO(COMPRESSED_XZ), "wx")
Nadeem Vawda3ff069e2011-11-30 00:25:06 +0200605 with self.assertRaises(ValueError):
Nadeem Vawda6cbb20c2012-06-04 23:36:24 +0200606 LZMAFile(BytesIO(COMPRESSED_XZ), "rt")
Nadeem Vawda3ff069e2011-11-30 00:25:06 +0200607 with self.assertRaises(ValueError):
Nadeem Vawda33c34da2012-06-04 23:34:07 +0200608 LZMAFile(BytesIO(COMPRESSED_XZ), "r+")
Nadeem Vawda3ff069e2011-11-30 00:25:06 +0200609 with self.assertRaises(ValueError):
Nadeem Vawda6cbb20c2012-06-04 23:36:24 +0200610 LZMAFile(BytesIO(COMPRESSED_XZ), "wt")
Nadeem Vawda3ff069e2011-11-30 00:25:06 +0200611 with self.assertRaises(ValueError):
Nadeem Vawda33c34da2012-06-04 23:34:07 +0200612 LZMAFile(BytesIO(COMPRESSED_XZ), "w+")
Nadeem Vawda3ff069e2011-11-30 00:25:06 +0200613 with self.assertRaises(ValueError):
Nadeem Vawda33c34da2012-06-04 23:34:07 +0200614 LZMAFile(BytesIO(COMPRESSED_XZ), "rw")
Nadeem Vawda3ff069e2011-11-30 00:25:06 +0200615
616 def test_init_bad_check(self):
617 with self.assertRaises(TypeError):
Nadeem Vawda33c34da2012-06-04 23:34:07 +0200618 LZMAFile(BytesIO(), "w", check=b"asd")
Nadeem Vawda3ff069e2011-11-30 00:25:06 +0200619 # CHECK_UNKNOWN and anything above CHECK_ID_MAX should be invalid.
620 with self.assertRaises(LZMAError):
Nadeem Vawda33c34da2012-06-04 23:34:07 +0200621 LZMAFile(BytesIO(), "w", check=lzma.CHECK_UNKNOWN)
Nadeem Vawda3ff069e2011-11-30 00:25:06 +0200622 with self.assertRaises(LZMAError):
Nadeem Vawda33c34da2012-06-04 23:34:07 +0200623 LZMAFile(BytesIO(), "w", check=lzma.CHECK_ID_MAX + 3)
Nadeem Vawda3ff069e2011-11-30 00:25:06 +0200624 # Cannot specify a check with mode="r".
625 with self.assertRaises(ValueError):
Nadeem Vawda33c34da2012-06-04 23:34:07 +0200626 LZMAFile(BytesIO(COMPRESSED_XZ), check=lzma.CHECK_NONE)
Nadeem Vawda3ff069e2011-11-30 00:25:06 +0200627 with self.assertRaises(ValueError):
Nadeem Vawda33c34da2012-06-04 23:34:07 +0200628 LZMAFile(BytesIO(COMPRESSED_XZ), check=lzma.CHECK_CRC32)
Nadeem Vawda3ff069e2011-11-30 00:25:06 +0200629 with self.assertRaises(ValueError):
Nadeem Vawda33c34da2012-06-04 23:34:07 +0200630 LZMAFile(BytesIO(COMPRESSED_XZ), check=lzma.CHECK_CRC64)
Nadeem Vawda3ff069e2011-11-30 00:25:06 +0200631 with self.assertRaises(ValueError):
Nadeem Vawda33c34da2012-06-04 23:34:07 +0200632 LZMAFile(BytesIO(COMPRESSED_XZ), check=lzma.CHECK_SHA256)
Nadeem Vawda3ff069e2011-11-30 00:25:06 +0200633 with self.assertRaises(ValueError):
Nadeem Vawda33c34da2012-06-04 23:34:07 +0200634 LZMAFile(BytesIO(COMPRESSED_XZ), check=lzma.CHECK_UNKNOWN)
Nadeem Vawda3ff069e2011-11-30 00:25:06 +0200635
636 def test_init_bad_preset(self):
637 with self.assertRaises(TypeError):
Nadeem Vawda33c34da2012-06-04 23:34:07 +0200638 LZMAFile(BytesIO(), "w", preset=4.39)
Nadeem Vawda3ff069e2011-11-30 00:25:06 +0200639 with self.assertRaises(LZMAError):
Nadeem Vawda33c34da2012-06-04 23:34:07 +0200640 LZMAFile(BytesIO(), "w", preset=10)
Nadeem Vawda3ff069e2011-11-30 00:25:06 +0200641 with self.assertRaises(LZMAError):
Nadeem Vawda33c34da2012-06-04 23:34:07 +0200642 LZMAFile(BytesIO(), "w", preset=23)
Nadeem Vawda3ff069e2011-11-30 00:25:06 +0200643 with self.assertRaises(OverflowError):
Nadeem Vawda33c34da2012-06-04 23:34:07 +0200644 LZMAFile(BytesIO(), "w", preset=-1)
Nadeem Vawda3ff069e2011-11-30 00:25:06 +0200645 with self.assertRaises(OverflowError):
Nadeem Vawda33c34da2012-06-04 23:34:07 +0200646 LZMAFile(BytesIO(), "w", preset=-7)
Nadeem Vawda3ff069e2011-11-30 00:25:06 +0200647 with self.assertRaises(TypeError):
Nadeem Vawda33c34da2012-06-04 23:34:07 +0200648 LZMAFile(BytesIO(), "w", preset="foo")
Nadeem Vawda3ff069e2011-11-30 00:25:06 +0200649 # Cannot specify a preset with mode="r".
650 with self.assertRaises(ValueError):
Nadeem Vawda33c34da2012-06-04 23:34:07 +0200651 LZMAFile(BytesIO(COMPRESSED_XZ), preset=3)
Nadeem Vawda3ff069e2011-11-30 00:25:06 +0200652
653 def test_init_bad_filter_spec(self):
654 with self.assertRaises(TypeError):
Nadeem Vawda33c34da2012-06-04 23:34:07 +0200655 LZMAFile(BytesIO(), "w", filters=[b"wobsite"])
Nadeem Vawda3ff069e2011-11-30 00:25:06 +0200656 with self.assertRaises(ValueError):
Nadeem Vawda33c34da2012-06-04 23:34:07 +0200657 LZMAFile(BytesIO(), "w", filters=[{"xyzzy": 3}])
Nadeem Vawda3ff069e2011-11-30 00:25:06 +0200658 with self.assertRaises(ValueError):
Nadeem Vawda33c34da2012-06-04 23:34:07 +0200659 LZMAFile(BytesIO(), "w", filters=[{"id": 98765}])
Nadeem Vawda3ff069e2011-11-30 00:25:06 +0200660 with self.assertRaises(ValueError):
Nadeem Vawda33c34da2012-06-04 23:34:07 +0200661 LZMAFile(BytesIO(), "w",
Nadeem Vawda3ff069e2011-11-30 00:25:06 +0200662 filters=[{"id": lzma.FILTER_LZMA2, "foo": 0}])
663 with self.assertRaises(ValueError):
Nadeem Vawda33c34da2012-06-04 23:34:07 +0200664 LZMAFile(BytesIO(), "w",
Nadeem Vawda3ff069e2011-11-30 00:25:06 +0200665 filters=[{"id": lzma.FILTER_DELTA, "foo": 0}])
666 with self.assertRaises(ValueError):
Nadeem Vawda33c34da2012-06-04 23:34:07 +0200667 LZMAFile(BytesIO(), "w",
Nadeem Vawda3ff069e2011-11-30 00:25:06 +0200668 filters=[{"id": lzma.FILTER_X86, "foo": 0}])
669
670 def test_init_with_preset_and_filters(self):
671 with self.assertRaises(ValueError):
Nadeem Vawda33c34da2012-06-04 23:34:07 +0200672 LZMAFile(BytesIO(), "w", format=lzma.FORMAT_RAW,
673 preset=6, filters=FILTERS_RAW_1)
Nadeem Vawda3ff069e2011-11-30 00:25:06 +0200674
675 def test_close(self):
676 with BytesIO(COMPRESSED_XZ) as src:
Nadeem Vawda33c34da2012-06-04 23:34:07 +0200677 f = LZMAFile(src)
Nadeem Vawda3ff069e2011-11-30 00:25:06 +0200678 f.close()
679 # LZMAFile.close() should not close the underlying file object.
680 self.assertFalse(src.closed)
681 # Try closing an already-closed LZMAFile.
682 f.close()
683 self.assertFalse(src.closed)
684
685 # Test with a real file on disk, opened directly by LZMAFile.
686 with TempFile(TESTFN, COMPRESSED_XZ):
687 f = LZMAFile(TESTFN)
688 fp = f._fp
689 f.close()
690 # Here, LZMAFile.close() *should* close the underlying file object.
691 self.assertTrue(fp.closed)
692 # Try closing an already-closed LZMAFile.
693 f.close()
694
695 def test_closed(self):
Nadeem Vawda33c34da2012-06-04 23:34:07 +0200696 f = LZMAFile(BytesIO(COMPRESSED_XZ))
Nadeem Vawda3ff069e2011-11-30 00:25:06 +0200697 try:
698 self.assertFalse(f.closed)
699 f.read()
700 self.assertFalse(f.closed)
701 finally:
702 f.close()
703 self.assertTrue(f.closed)
704
Nadeem Vawda33c34da2012-06-04 23:34:07 +0200705 f = LZMAFile(BytesIO(), "w")
Nadeem Vawda3ff069e2011-11-30 00:25:06 +0200706 try:
707 self.assertFalse(f.closed)
708 finally:
709 f.close()
710 self.assertTrue(f.closed)
711
712 def test_fileno(self):
Nadeem Vawda33c34da2012-06-04 23:34:07 +0200713 f = LZMAFile(BytesIO(COMPRESSED_XZ))
Nadeem Vawda3ff069e2011-11-30 00:25:06 +0200714 try:
715 self.assertRaises(UnsupportedOperation, f.fileno)
716 finally:
717 f.close()
718 self.assertRaises(ValueError, f.fileno)
719 with TempFile(TESTFN, COMPRESSED_XZ):
720 f = LZMAFile(TESTFN)
721 try:
722 self.assertEqual(f.fileno(), f._fp.fileno())
723 self.assertIsInstance(f.fileno(), int)
724 finally:
725 f.close()
726 self.assertRaises(ValueError, f.fileno)
727
728 def test_seekable(self):
Nadeem Vawda33c34da2012-06-04 23:34:07 +0200729 f = LZMAFile(BytesIO(COMPRESSED_XZ))
Nadeem Vawda3ff069e2011-11-30 00:25:06 +0200730 try:
731 self.assertTrue(f.seekable())
732 f.read()
733 self.assertTrue(f.seekable())
734 finally:
735 f.close()
736 self.assertRaises(ValueError, f.seekable)
737
Nadeem Vawda33c34da2012-06-04 23:34:07 +0200738 f = LZMAFile(BytesIO(), "w")
Nadeem Vawda3ff069e2011-11-30 00:25:06 +0200739 try:
740 self.assertFalse(f.seekable())
741 finally:
742 f.close()
743 self.assertRaises(ValueError, f.seekable)
744
Nadeem Vawdaae557d72012-02-12 01:51:38 +0200745 src = BytesIO(COMPRESSED_XZ)
746 src.seekable = lambda: False
Nadeem Vawda33c34da2012-06-04 23:34:07 +0200747 f = LZMAFile(src)
Nadeem Vawdaae557d72012-02-12 01:51:38 +0200748 try:
749 self.assertFalse(f.seekable())
750 finally:
751 f.close()
752 self.assertRaises(ValueError, f.seekable)
753
Nadeem Vawda3ff069e2011-11-30 00:25:06 +0200754 def test_readable(self):
Nadeem Vawda33c34da2012-06-04 23:34:07 +0200755 f = LZMAFile(BytesIO(COMPRESSED_XZ))
Nadeem Vawda3ff069e2011-11-30 00:25:06 +0200756 try:
757 self.assertTrue(f.readable())
758 f.read()
759 self.assertTrue(f.readable())
760 finally:
761 f.close()
762 self.assertRaises(ValueError, f.readable)
763
Nadeem Vawda33c34da2012-06-04 23:34:07 +0200764 f = LZMAFile(BytesIO(), "w")
Nadeem Vawda3ff069e2011-11-30 00:25:06 +0200765 try:
766 self.assertFalse(f.readable())
767 finally:
768 f.close()
769 self.assertRaises(ValueError, f.readable)
770
771 def test_writable(self):
Nadeem Vawda33c34da2012-06-04 23:34:07 +0200772 f = LZMAFile(BytesIO(COMPRESSED_XZ))
Nadeem Vawda3ff069e2011-11-30 00:25:06 +0200773 try:
774 self.assertFalse(f.writable())
775 f.read()
776 self.assertFalse(f.writable())
777 finally:
778 f.close()
779 self.assertRaises(ValueError, f.writable)
780
Nadeem Vawda33c34da2012-06-04 23:34:07 +0200781 f = LZMAFile(BytesIO(), "w")
Nadeem Vawda3ff069e2011-11-30 00:25:06 +0200782 try:
783 self.assertTrue(f.writable())
784 finally:
785 f.close()
786 self.assertRaises(ValueError, f.writable)
787
788 def test_read(self):
Nadeem Vawda33c34da2012-06-04 23:34:07 +0200789 with LZMAFile(BytesIO(COMPRESSED_XZ)) as f:
Nadeem Vawda3ff069e2011-11-30 00:25:06 +0200790 self.assertEqual(f.read(), INPUT)
791 self.assertEqual(f.read(), b"")
Nadeem Vawda33c34da2012-06-04 23:34:07 +0200792 with LZMAFile(BytesIO(COMPRESSED_ALONE)) as f:
Nadeem Vawda3ff069e2011-11-30 00:25:06 +0200793 self.assertEqual(f.read(), INPUT)
Nadeem Vawda33c34da2012-06-04 23:34:07 +0200794 with LZMAFile(BytesIO(COMPRESSED_XZ), format=lzma.FORMAT_XZ) as f:
Nadeem Vawda3ff069e2011-11-30 00:25:06 +0200795 self.assertEqual(f.read(), INPUT)
796 self.assertEqual(f.read(), b"")
Nadeem Vawda33c34da2012-06-04 23:34:07 +0200797 with LZMAFile(BytesIO(COMPRESSED_ALONE), format=lzma.FORMAT_ALONE) as f:
Nadeem Vawda3ff069e2011-11-30 00:25:06 +0200798 self.assertEqual(f.read(), INPUT)
799 self.assertEqual(f.read(), b"")
Nadeem Vawda33c34da2012-06-04 23:34:07 +0200800 with LZMAFile(BytesIO(COMPRESSED_RAW_1),
Nadeem Vawda3ff069e2011-11-30 00:25:06 +0200801 format=lzma.FORMAT_RAW, filters=FILTERS_RAW_1) as f:
802 self.assertEqual(f.read(), INPUT)
803 self.assertEqual(f.read(), b"")
Nadeem Vawda33c34da2012-06-04 23:34:07 +0200804 with LZMAFile(BytesIO(COMPRESSED_RAW_2),
Nadeem Vawda3ff069e2011-11-30 00:25:06 +0200805 format=lzma.FORMAT_RAW, filters=FILTERS_RAW_2) as f:
806 self.assertEqual(f.read(), INPUT)
807 self.assertEqual(f.read(), b"")
Nadeem Vawda33c34da2012-06-04 23:34:07 +0200808 with LZMAFile(BytesIO(COMPRESSED_RAW_3),
Nadeem Vawda3ff069e2011-11-30 00:25:06 +0200809 format=lzma.FORMAT_RAW, filters=FILTERS_RAW_3) as f:
810 self.assertEqual(f.read(), INPUT)
811 self.assertEqual(f.read(), b"")
Nadeem Vawda33c34da2012-06-04 23:34:07 +0200812 with LZMAFile(BytesIO(COMPRESSED_RAW_4),
Nadeem Vawda3ff069e2011-11-30 00:25:06 +0200813 format=lzma.FORMAT_RAW, filters=FILTERS_RAW_4) as f:
814 self.assertEqual(f.read(), INPUT)
815 self.assertEqual(f.read(), b"")
816
817 def test_read_0(self):
Nadeem Vawda33c34da2012-06-04 23:34:07 +0200818 with LZMAFile(BytesIO(COMPRESSED_XZ)) as f:
Nadeem Vawda3ff069e2011-11-30 00:25:06 +0200819 self.assertEqual(f.read(0), b"")
Nadeem Vawda33c34da2012-06-04 23:34:07 +0200820 with LZMAFile(BytesIO(COMPRESSED_ALONE)) as f:
Nadeem Vawda3ff069e2011-11-30 00:25:06 +0200821 self.assertEqual(f.read(0), b"")
Nadeem Vawda33c34da2012-06-04 23:34:07 +0200822 with LZMAFile(BytesIO(COMPRESSED_XZ), format=lzma.FORMAT_XZ) as f:
Nadeem Vawda3ff069e2011-11-30 00:25:06 +0200823 self.assertEqual(f.read(0), b"")
Nadeem Vawda33c34da2012-06-04 23:34:07 +0200824 with LZMAFile(BytesIO(COMPRESSED_ALONE), format=lzma.FORMAT_ALONE) as f:
Nadeem Vawda3ff069e2011-11-30 00:25:06 +0200825 self.assertEqual(f.read(0), b"")
826
827 def test_read_10(self):
Nadeem Vawda33c34da2012-06-04 23:34:07 +0200828 with LZMAFile(BytesIO(COMPRESSED_XZ)) as f:
Nadeem Vawda3ff069e2011-11-30 00:25:06 +0200829 chunks = []
830 while True:
831 result = f.read(10)
832 if not result:
833 break
834 self.assertLessEqual(len(result), 10)
835 chunks.append(result)
836 self.assertEqual(b"".join(chunks), INPUT)
837
838 def test_read_multistream(self):
Nadeem Vawda33c34da2012-06-04 23:34:07 +0200839 with LZMAFile(BytesIO(COMPRESSED_XZ * 5)) as f:
Nadeem Vawda3ff069e2011-11-30 00:25:06 +0200840 self.assertEqual(f.read(), INPUT * 5)
Nadeem Vawda33c34da2012-06-04 23:34:07 +0200841 with LZMAFile(BytesIO(COMPRESSED_XZ + COMPRESSED_ALONE)) as f:
Nadeem Vawda3ff069e2011-11-30 00:25:06 +0200842 self.assertEqual(f.read(), INPUT * 2)
Nadeem Vawda33c34da2012-06-04 23:34:07 +0200843 with LZMAFile(BytesIO(COMPRESSED_RAW_3 * 4),
Nadeem Vawda3ff069e2011-11-30 00:25:06 +0200844 format=lzma.FORMAT_RAW, filters=FILTERS_RAW_3) as f:
845 self.assertEqual(f.read(), INPUT * 4)
846
847 def test_read_multistream_buffer_size_aligned(self):
848 # Test the case where a stream boundary coincides with the end
849 # of the raw read buffer.
Antoine Pitrou2dbc6e62015-04-11 00:31:01 +0200850 saved_buffer_size = _compression.BUFFER_SIZE
851 _compression.BUFFER_SIZE = len(COMPRESSED_XZ)
Nadeem Vawda3ff069e2011-11-30 00:25:06 +0200852 try:
Nadeem Vawda33c34da2012-06-04 23:34:07 +0200853 with LZMAFile(BytesIO(COMPRESSED_XZ * 5)) as f:
Nadeem Vawda3ff069e2011-11-30 00:25:06 +0200854 self.assertEqual(f.read(), INPUT * 5)
855 finally:
Antoine Pitrou2dbc6e62015-04-11 00:31:01 +0200856 _compression.BUFFER_SIZE = saved_buffer_size
Nadeem Vawda3ff069e2011-11-30 00:25:06 +0200857
Nadeem Vawda9c72ebc2013-12-04 23:03:49 +0100858 def test_read_trailing_junk(self):
859 with LZMAFile(BytesIO(COMPRESSED_XZ + COMPRESSED_BOGUS)) as f:
860 self.assertEqual(f.read(), INPUT)
861
862 def test_read_multistream_trailing_junk(self):
863 with LZMAFile(BytesIO(COMPRESSED_XZ * 5 + COMPRESSED_BOGUS)) as f:
864 self.assertEqual(f.read(), INPUT * 5)
865
Nadeem Vawda3ff069e2011-11-30 00:25:06 +0200866 def test_read_from_file(self):
867 with TempFile(TESTFN, COMPRESSED_XZ):
868 with LZMAFile(TESTFN) as f:
869 self.assertEqual(f.read(), INPUT)
870 self.assertEqual(f.read(), b"")
871
Nadeem Vawda10c87912012-06-20 01:48:50 +0200872 def test_read_from_file_with_bytes_filename(self):
873 try:
874 bytes_filename = TESTFN.encode("ascii")
875 except UnicodeEncodeError:
876 self.skipTest("Temporary file name needs to be ASCII")
877 with TempFile(TESTFN, COMPRESSED_XZ):
878 with LZMAFile(bytes_filename) as f:
879 self.assertEqual(f.read(), INPUT)
880 self.assertEqual(f.read(), b"")
881
Nadeem Vawda3ff069e2011-11-30 00:25:06 +0200882 def test_read_incomplete(self):
Nadeem Vawda33c34da2012-06-04 23:34:07 +0200883 with LZMAFile(BytesIO(COMPRESSED_XZ[:128])) as f:
Nadeem Vawda3ff069e2011-11-30 00:25:06 +0200884 self.assertRaises(EOFError, f.read)
885
Serhiy Storchaka57f9b7a2013-01-22 17:07:49 +0200886 def test_read_truncated(self):
887 # Drop stream footer: CRC (4 bytes), index size (4 bytes),
Serhiy Storchaka70ea7fa2013-02-08 11:24:16 +0200888 # flags (2 bytes) and magic number (2 bytes).
Serhiy Storchaka57f9b7a2013-01-22 17:07:49 +0200889 truncated = COMPRESSED_XZ[:-12]
890 with LZMAFile(BytesIO(truncated)) as f:
891 self.assertRaises(EOFError, f.read)
892 with LZMAFile(BytesIO(truncated)) as f:
893 self.assertEqual(f.read(len(INPUT)), INPUT)
894 self.assertRaises(EOFError, f.read, 1)
895 # Incomplete 12-byte header.
896 for i in range(12):
897 with LZMAFile(BytesIO(truncated[:i])) as f:
898 self.assertRaises(EOFError, f.read, 1)
899
Nadeem Vawda3ff069e2011-11-30 00:25:06 +0200900 def test_read_bad_args(self):
Nadeem Vawda33c34da2012-06-04 23:34:07 +0200901 f = LZMAFile(BytesIO(COMPRESSED_XZ))
Nadeem Vawda3ff069e2011-11-30 00:25:06 +0200902 f.close()
903 self.assertRaises(ValueError, f.read)
Nadeem Vawda33c34da2012-06-04 23:34:07 +0200904 with LZMAFile(BytesIO(), "w") as f:
Nadeem Vawda3ff069e2011-11-30 00:25:06 +0200905 self.assertRaises(ValueError, f.read)
Nadeem Vawda33c34da2012-06-04 23:34:07 +0200906 with LZMAFile(BytesIO(COMPRESSED_XZ)) as f:
Antoine Pitrou2dbc6e62015-04-11 00:31:01 +0200907 self.assertRaises(TypeError, f.read, float())
Nadeem Vawda3ff069e2011-11-30 00:25:06 +0200908
Nadeem Vawda9c72ebc2013-12-04 23:03:49 +0100909 def test_read_bad_data(self):
910 with LZMAFile(BytesIO(COMPRESSED_BOGUS)) as f:
911 self.assertRaises(LZMAError, f.read)
912
Nadeem Vawda3ff069e2011-11-30 00:25:06 +0200913 def test_read1(self):
Nadeem Vawda33c34da2012-06-04 23:34:07 +0200914 with LZMAFile(BytesIO(COMPRESSED_XZ)) as f:
Nadeem Vawda3ff069e2011-11-30 00:25:06 +0200915 blocks = []
916 while True:
917 result = f.read1()
918 if not result:
919 break
920 blocks.append(result)
921 self.assertEqual(b"".join(blocks), INPUT)
922 self.assertEqual(f.read1(), b"")
923
924 def test_read1_0(self):
Nadeem Vawda33c34da2012-06-04 23:34:07 +0200925 with LZMAFile(BytesIO(COMPRESSED_XZ)) as f:
Nadeem Vawda3ff069e2011-11-30 00:25:06 +0200926 self.assertEqual(f.read1(0), b"")
927
928 def test_read1_10(self):
Nadeem Vawda33c34da2012-06-04 23:34:07 +0200929 with LZMAFile(BytesIO(COMPRESSED_XZ)) as f:
Nadeem Vawda3ff069e2011-11-30 00:25:06 +0200930 blocks = []
931 while True:
932 result = f.read1(10)
933 if not result:
934 break
935 blocks.append(result)
936 self.assertEqual(b"".join(blocks), INPUT)
937 self.assertEqual(f.read1(), b"")
938
939 def test_read1_multistream(self):
Nadeem Vawda33c34da2012-06-04 23:34:07 +0200940 with LZMAFile(BytesIO(COMPRESSED_XZ * 5)) as f:
Nadeem Vawda3ff069e2011-11-30 00:25:06 +0200941 blocks = []
942 while True:
943 result = f.read1()
944 if not result:
945 break
946 blocks.append(result)
947 self.assertEqual(b"".join(blocks), INPUT * 5)
948 self.assertEqual(f.read1(), b"")
949
950 def test_read1_bad_args(self):
Nadeem Vawda33c34da2012-06-04 23:34:07 +0200951 f = LZMAFile(BytesIO(COMPRESSED_XZ))
Nadeem Vawda3ff069e2011-11-30 00:25:06 +0200952 f.close()
953 self.assertRaises(ValueError, f.read1)
Nadeem Vawda33c34da2012-06-04 23:34:07 +0200954 with LZMAFile(BytesIO(), "w") as f:
Nadeem Vawda3ff069e2011-11-30 00:25:06 +0200955 self.assertRaises(ValueError, f.read1)
Nadeem Vawda33c34da2012-06-04 23:34:07 +0200956 with LZMAFile(BytesIO(COMPRESSED_XZ)) as f:
Nadeem Vawda3ff069e2011-11-30 00:25:06 +0200957 self.assertRaises(TypeError, f.read1, None)
958
959 def test_peek(self):
Nadeem Vawda33c34da2012-06-04 23:34:07 +0200960 with LZMAFile(BytesIO(COMPRESSED_XZ)) as f:
Nadeem Vawda3ff069e2011-11-30 00:25:06 +0200961 result = f.peek()
962 self.assertGreater(len(result), 0)
963 self.assertTrue(INPUT.startswith(result))
964 self.assertEqual(f.read(), INPUT)
Nadeem Vawda33c34da2012-06-04 23:34:07 +0200965 with LZMAFile(BytesIO(COMPRESSED_XZ)) as f:
Nadeem Vawda3ff069e2011-11-30 00:25:06 +0200966 result = f.peek(10)
967 self.assertGreater(len(result), 0)
968 self.assertTrue(INPUT.startswith(result))
969 self.assertEqual(f.read(), INPUT)
970
971 def test_peek_bad_args(self):
Nadeem Vawda33c34da2012-06-04 23:34:07 +0200972 with LZMAFile(BytesIO(), "w") as f:
Nadeem Vawda3ff069e2011-11-30 00:25:06 +0200973 self.assertRaises(ValueError, f.peek)
974
975 def test_iterator(self):
976 with BytesIO(INPUT) as f:
977 lines = f.readlines()
Nadeem Vawda33c34da2012-06-04 23:34:07 +0200978 with LZMAFile(BytesIO(COMPRESSED_XZ)) as f:
Nadeem Vawda3ff069e2011-11-30 00:25:06 +0200979 self.assertListEqual(list(iter(f)), lines)
Nadeem Vawda33c34da2012-06-04 23:34:07 +0200980 with LZMAFile(BytesIO(COMPRESSED_ALONE)) as f:
Nadeem Vawda3ff069e2011-11-30 00:25:06 +0200981 self.assertListEqual(list(iter(f)), lines)
Nadeem Vawda33c34da2012-06-04 23:34:07 +0200982 with LZMAFile(BytesIO(COMPRESSED_XZ), format=lzma.FORMAT_XZ) as f:
Nadeem Vawda3ff069e2011-11-30 00:25:06 +0200983 self.assertListEqual(list(iter(f)), lines)
Nadeem Vawda33c34da2012-06-04 23:34:07 +0200984 with LZMAFile(BytesIO(COMPRESSED_ALONE), format=lzma.FORMAT_ALONE) as f:
Nadeem Vawda3ff069e2011-11-30 00:25:06 +0200985 self.assertListEqual(list(iter(f)), lines)
Nadeem Vawda33c34da2012-06-04 23:34:07 +0200986 with LZMAFile(BytesIO(COMPRESSED_RAW_2),
Nadeem Vawda3ff069e2011-11-30 00:25:06 +0200987 format=lzma.FORMAT_RAW, filters=FILTERS_RAW_2) as f:
988 self.assertListEqual(list(iter(f)), lines)
989
990 def test_readline(self):
991 with BytesIO(INPUT) as f:
992 lines = f.readlines()
Nadeem Vawda33c34da2012-06-04 23:34:07 +0200993 with LZMAFile(BytesIO(COMPRESSED_XZ)) as f:
Nadeem Vawda3ff069e2011-11-30 00:25:06 +0200994 for line in lines:
995 self.assertEqual(f.readline(), line)
996
997 def test_readlines(self):
998 with BytesIO(INPUT) as f:
999 lines = f.readlines()
Nadeem Vawda33c34da2012-06-04 23:34:07 +02001000 with LZMAFile(BytesIO(COMPRESSED_XZ)) as f:
Nadeem Vawda3ff069e2011-11-30 00:25:06 +02001001 self.assertListEqual(f.readlines(), lines)
1002
Antoine Pitrou2dbc6e62015-04-11 00:31:01 +02001003 def test_decompress_limited(self):
1004 """Decompressed data buffering should be limited"""
Serhiy Storchaka5f1a5182016-09-11 14:41:02 +03001005 bomb = lzma.compress(b'\0' * int(2e6), preset=6)
Antoine Pitrou2dbc6e62015-04-11 00:31:01 +02001006 self.assertLess(len(bomb), _compression.BUFFER_SIZE)
1007
1008 decomp = LZMAFile(BytesIO(bomb))
Serhiy Storchaka5f1a5182016-09-11 14:41:02 +03001009 self.assertEqual(decomp.read(1), b'\0')
Antoine Pitrou2dbc6e62015-04-11 00:31:01 +02001010 max_decomp = 1 + DEFAULT_BUFFER_SIZE
1011 self.assertLessEqual(decomp._buffer.raw.tell(), max_decomp,
1012 "Excessive amount of data was decompressed")
1013
Nadeem Vawda3ff069e2011-11-30 00:25:06 +02001014 def test_write(self):
1015 with BytesIO() as dst:
Nadeem Vawda33c34da2012-06-04 23:34:07 +02001016 with LZMAFile(dst, "w") as f:
Nadeem Vawda3ff069e2011-11-30 00:25:06 +02001017 f.write(INPUT)
1018 expected = lzma.compress(INPUT)
1019 self.assertEqual(dst.getvalue(), expected)
1020 with BytesIO() as dst:
Nadeem Vawda33c34da2012-06-04 23:34:07 +02001021 with LZMAFile(dst, "w", format=lzma.FORMAT_XZ) as f:
Nadeem Vawda3ff069e2011-11-30 00:25:06 +02001022 f.write(INPUT)
1023 expected = lzma.compress(INPUT, format=lzma.FORMAT_XZ)
1024 self.assertEqual(dst.getvalue(), expected)
1025 with BytesIO() as dst:
Nadeem Vawda33c34da2012-06-04 23:34:07 +02001026 with LZMAFile(dst, "w", format=lzma.FORMAT_ALONE) as f:
Nadeem Vawda3ff069e2011-11-30 00:25:06 +02001027 f.write(INPUT)
1028 expected = lzma.compress(INPUT, format=lzma.FORMAT_ALONE)
1029 self.assertEqual(dst.getvalue(), expected)
1030 with BytesIO() as dst:
Nadeem Vawda33c34da2012-06-04 23:34:07 +02001031 with LZMAFile(dst, "w", format=lzma.FORMAT_RAW,
Nadeem Vawda3ff069e2011-11-30 00:25:06 +02001032 filters=FILTERS_RAW_2) as f:
1033 f.write(INPUT)
1034 expected = lzma.compress(INPUT, format=lzma.FORMAT_RAW,
1035 filters=FILTERS_RAW_2)
1036 self.assertEqual(dst.getvalue(), expected)
1037
1038 def test_write_10(self):
1039 with BytesIO() as dst:
Nadeem Vawda33c34da2012-06-04 23:34:07 +02001040 with LZMAFile(dst, "w") as f:
Nadeem Vawda3ff069e2011-11-30 00:25:06 +02001041 for start in range(0, len(INPUT), 10):
1042 f.write(INPUT[start:start+10])
1043 expected = lzma.compress(INPUT)
1044 self.assertEqual(dst.getvalue(), expected)
1045
1046 def test_write_append(self):
1047 part1 = INPUT[:1024]
1048 part2 = INPUT[1024:1536]
1049 part3 = INPUT[1536:]
1050 expected = b"".join(lzma.compress(x) for x in (part1, part2, part3))
1051 with BytesIO() as dst:
Nadeem Vawda33c34da2012-06-04 23:34:07 +02001052 with LZMAFile(dst, "w") as f:
Nadeem Vawda3ff069e2011-11-30 00:25:06 +02001053 f.write(part1)
Nadeem Vawda33c34da2012-06-04 23:34:07 +02001054 with LZMAFile(dst, "a") as f:
Nadeem Vawda3ff069e2011-11-30 00:25:06 +02001055 f.write(part2)
Nadeem Vawda33c34da2012-06-04 23:34:07 +02001056 with LZMAFile(dst, "a") as f:
Nadeem Vawda3ff069e2011-11-30 00:25:06 +02001057 f.write(part3)
1058 self.assertEqual(dst.getvalue(), expected)
1059
1060 def test_write_to_file(self):
1061 try:
1062 with LZMAFile(TESTFN, "w") as f:
1063 f.write(INPUT)
1064 expected = lzma.compress(INPUT)
1065 with open(TESTFN, "rb") as f:
1066 self.assertEqual(f.read(), expected)
1067 finally:
1068 unlink(TESTFN)
1069
Nadeem Vawda10c87912012-06-20 01:48:50 +02001070 def test_write_to_file_with_bytes_filename(self):
1071 try:
1072 bytes_filename = TESTFN.encode("ascii")
1073 except UnicodeEncodeError:
1074 self.skipTest("Temporary file name needs to be ASCII")
1075 try:
1076 with LZMAFile(bytes_filename, "w") as f:
1077 f.write(INPUT)
1078 expected = lzma.compress(INPUT)
1079 with open(TESTFN, "rb") as f:
1080 self.assertEqual(f.read(), expected)
1081 finally:
1082 unlink(TESTFN)
1083
Nadeem Vawda3ff069e2011-11-30 00:25:06 +02001084 def test_write_append_to_file(self):
1085 part1 = INPUT[:1024]
1086 part2 = INPUT[1024:1536]
1087 part3 = INPUT[1536:]
1088 expected = b"".join(lzma.compress(x) for x in (part1, part2, part3))
1089 try:
1090 with LZMAFile(TESTFN, "w") as f:
1091 f.write(part1)
1092 with LZMAFile(TESTFN, "a") as f:
1093 f.write(part2)
1094 with LZMAFile(TESTFN, "a") as f:
1095 f.write(part3)
1096 with open(TESTFN, "rb") as f:
1097 self.assertEqual(f.read(), expected)
1098 finally:
1099 unlink(TESTFN)
1100
1101 def test_write_bad_args(self):
Nadeem Vawda33c34da2012-06-04 23:34:07 +02001102 f = LZMAFile(BytesIO(), "w")
Nadeem Vawda3ff069e2011-11-30 00:25:06 +02001103 f.close()
1104 self.assertRaises(ValueError, f.write, b"foo")
Nadeem Vawda33c34da2012-06-04 23:34:07 +02001105 with LZMAFile(BytesIO(COMPRESSED_XZ), "r") as f:
Nadeem Vawda3ff069e2011-11-30 00:25:06 +02001106 self.assertRaises(ValueError, f.write, b"bar")
Nadeem Vawda33c34da2012-06-04 23:34:07 +02001107 with LZMAFile(BytesIO(), "w") as f:
Nadeem Vawda3ff069e2011-11-30 00:25:06 +02001108 self.assertRaises(TypeError, f.write, None)
1109 self.assertRaises(TypeError, f.write, "text")
1110 self.assertRaises(TypeError, f.write, 789)
1111
1112 def test_writelines(self):
1113 with BytesIO(INPUT) as f:
1114 lines = f.readlines()
1115 with BytesIO() as dst:
Nadeem Vawda33c34da2012-06-04 23:34:07 +02001116 with LZMAFile(dst, "w") as f:
Nadeem Vawda3ff069e2011-11-30 00:25:06 +02001117 f.writelines(lines)
1118 expected = lzma.compress(INPUT)
1119 self.assertEqual(dst.getvalue(), expected)
1120
1121 def test_seek_forward(self):
Nadeem Vawda33c34da2012-06-04 23:34:07 +02001122 with LZMAFile(BytesIO(COMPRESSED_XZ)) as f:
Nadeem Vawda3ff069e2011-11-30 00:25:06 +02001123 f.seek(555)
1124 self.assertEqual(f.read(), INPUT[555:])
1125
1126 def test_seek_forward_across_streams(self):
Nadeem Vawda33c34da2012-06-04 23:34:07 +02001127 with LZMAFile(BytesIO(COMPRESSED_XZ * 2)) as f:
Nadeem Vawda3ff069e2011-11-30 00:25:06 +02001128 f.seek(len(INPUT) + 123)
1129 self.assertEqual(f.read(), INPUT[123:])
1130
1131 def test_seek_forward_relative_to_current(self):
Nadeem Vawda33c34da2012-06-04 23:34:07 +02001132 with LZMAFile(BytesIO(COMPRESSED_XZ)) as f:
Nadeem Vawda3ff069e2011-11-30 00:25:06 +02001133 f.read(100)
1134 f.seek(1236, 1)
1135 self.assertEqual(f.read(), INPUT[1336:])
1136
1137 def test_seek_forward_relative_to_end(self):
Nadeem Vawda33c34da2012-06-04 23:34:07 +02001138 with LZMAFile(BytesIO(COMPRESSED_XZ)) as f:
Nadeem Vawda3ff069e2011-11-30 00:25:06 +02001139 f.seek(-555, 2)
1140 self.assertEqual(f.read(), INPUT[-555:])
1141
1142 def test_seek_backward(self):
Nadeem Vawda33c34da2012-06-04 23:34:07 +02001143 with LZMAFile(BytesIO(COMPRESSED_XZ)) as f:
Nadeem Vawda3ff069e2011-11-30 00:25:06 +02001144 f.read(1001)
1145 f.seek(211)
1146 self.assertEqual(f.read(), INPUT[211:])
1147
1148 def test_seek_backward_across_streams(self):
Nadeem Vawda33c34da2012-06-04 23:34:07 +02001149 with LZMAFile(BytesIO(COMPRESSED_XZ * 2)) as f:
Nadeem Vawda3ff069e2011-11-30 00:25:06 +02001150 f.read(len(INPUT) + 333)
1151 f.seek(737)
1152 self.assertEqual(f.read(), INPUT[737:] + INPUT)
1153
1154 def test_seek_backward_relative_to_end(self):
Nadeem Vawda33c34da2012-06-04 23:34:07 +02001155 with LZMAFile(BytesIO(COMPRESSED_XZ)) as f:
Nadeem Vawda3ff069e2011-11-30 00:25:06 +02001156 f.seek(-150, 2)
1157 self.assertEqual(f.read(), INPUT[-150:])
1158
1159 def test_seek_past_end(self):
Nadeem Vawda33c34da2012-06-04 23:34:07 +02001160 with LZMAFile(BytesIO(COMPRESSED_XZ)) as f:
Nadeem Vawda3ff069e2011-11-30 00:25:06 +02001161 f.seek(len(INPUT) + 9001)
1162 self.assertEqual(f.tell(), len(INPUT))
1163 self.assertEqual(f.read(), b"")
1164
1165 def test_seek_past_start(self):
Nadeem Vawda33c34da2012-06-04 23:34:07 +02001166 with LZMAFile(BytesIO(COMPRESSED_XZ)) as f:
Nadeem Vawda3ff069e2011-11-30 00:25:06 +02001167 f.seek(-88)
1168 self.assertEqual(f.tell(), 0)
1169 self.assertEqual(f.read(), INPUT)
1170
1171 def test_seek_bad_args(self):
Nadeem Vawda33c34da2012-06-04 23:34:07 +02001172 f = LZMAFile(BytesIO(COMPRESSED_XZ))
Nadeem Vawda3ff069e2011-11-30 00:25:06 +02001173 f.close()
1174 self.assertRaises(ValueError, f.seek, 0)
Nadeem Vawda33c34da2012-06-04 23:34:07 +02001175 with LZMAFile(BytesIO(), "w") as f:
Nadeem Vawda3ff069e2011-11-30 00:25:06 +02001176 self.assertRaises(ValueError, f.seek, 0)
Nadeem Vawda33c34da2012-06-04 23:34:07 +02001177 with LZMAFile(BytesIO(COMPRESSED_XZ)) as f:
Nadeem Vawda3ff069e2011-11-30 00:25:06 +02001178 self.assertRaises(ValueError, f.seek, 0, 3)
Antoine Pitrou2dbc6e62015-04-11 00:31:01 +02001179 # io.BufferedReader raises TypeError instead of ValueError
1180 self.assertRaises((TypeError, ValueError), f.seek, 9, ())
Nadeem Vawda3ff069e2011-11-30 00:25:06 +02001181 self.assertRaises(TypeError, f.seek, None)
1182 self.assertRaises(TypeError, f.seek, b"derp")
1183
1184 def test_tell(self):
Nadeem Vawda33c34da2012-06-04 23:34:07 +02001185 with LZMAFile(BytesIO(COMPRESSED_XZ)) as f:
Nadeem Vawda3ff069e2011-11-30 00:25:06 +02001186 pos = 0
1187 while True:
1188 self.assertEqual(f.tell(), pos)
1189 result = f.read(183)
1190 if not result:
1191 break
1192 pos += len(result)
1193 self.assertEqual(f.tell(), len(INPUT))
Nadeem Vawda33c34da2012-06-04 23:34:07 +02001194 with LZMAFile(BytesIO(), "w") as f:
Nadeem Vawda3ff069e2011-11-30 00:25:06 +02001195 for pos in range(0, len(INPUT), 144):
1196 self.assertEqual(f.tell(), pos)
1197 f.write(INPUT[pos:pos+144])
1198 self.assertEqual(f.tell(), len(INPUT))
1199
1200 def test_tell_bad_args(self):
Nadeem Vawda33c34da2012-06-04 23:34:07 +02001201 f = LZMAFile(BytesIO(COMPRESSED_XZ))
Nadeem Vawda3ff069e2011-11-30 00:25:06 +02001202 f.close()
1203 self.assertRaises(ValueError, f.tell)
1204
animalize4ffd05d2019-09-12 22:20:37 +08001205 def test_issue21872(self):
1206 # sometimes decompress data incompletely
1207
1208 # ---------------------
1209 # when max_length == -1
1210 # ---------------------
1211 d1 = LZMADecompressor()
1212 entire = d1.decompress(ISSUE_21872_DAT, max_length=-1)
1213 self.assertEqual(len(entire), 13160)
1214 self.assertTrue(d1.eof)
1215
1216 # ---------------------
1217 # when max_length > 0
1218 # ---------------------
1219 d2 = LZMADecompressor()
1220
1221 # When this value of max_length is used, the input and output
1222 # buffers are exhausted at the same time, and lzs's internal
1223 # state still have 11 bytes can be output.
1224 out1 = d2.decompress(ISSUE_21872_DAT, max_length=13149)
1225 self.assertFalse(d2.needs_input) # ensure needs_input mechanism works
1226 self.assertFalse(d2.eof)
1227
1228 # simulate needs_input mechanism
1229 # output internal state's 11 bytes
1230 out2 = d2.decompress(b'')
1231 self.assertEqual(len(out2), 11)
1232 self.assertTrue(d2.eof)
1233 self.assertEqual(out1 + out2, entire)
1234
Miss Islington (bot)01858fb2021-06-22 06:59:53 -07001235 def test_issue44439(self):
1236 q = array.array('Q', [1, 2, 3, 4, 5])
1237 LENGTH = len(q) * q.itemsize
1238
1239 with LZMAFile(BytesIO(), 'w') as f:
1240 self.assertEqual(f.write(q), LENGTH)
1241 self.assertEqual(f.tell(), LENGTH)
1242
Nadeem Vawda3ff069e2011-11-30 00:25:06 +02001243
Nadeem Vawdae8604042012-06-04 23:38:12 +02001244class OpenTestCase(unittest.TestCase):
1245
1246 def test_binary_modes(self):
1247 with lzma.open(BytesIO(COMPRESSED_XZ), "rb") as f:
1248 self.assertEqual(f.read(), INPUT)
1249 with BytesIO() as bio:
1250 with lzma.open(bio, "wb") as f:
1251 f.write(INPUT)
1252 file_data = lzma.decompress(bio.getvalue())
1253 self.assertEqual(file_data, INPUT)
1254 with lzma.open(bio, "ab") as f:
1255 f.write(INPUT)
1256 file_data = lzma.decompress(bio.getvalue())
1257 self.assertEqual(file_data, INPUT * 2)
1258
1259 def test_text_modes(self):
1260 uncompressed = INPUT.decode("ascii")
1261 uncompressed_raw = uncompressed.replace("\n", os.linesep)
Inada Naoki4663e5f2021-04-06 13:02:22 +09001262 with lzma.open(BytesIO(COMPRESSED_XZ), "rt", encoding="ascii") as f:
Nadeem Vawdae8604042012-06-04 23:38:12 +02001263 self.assertEqual(f.read(), uncompressed)
1264 with BytesIO() as bio:
Inada Naoki4663e5f2021-04-06 13:02:22 +09001265 with lzma.open(bio, "wt", encoding="ascii") as f:
Nadeem Vawdae8604042012-06-04 23:38:12 +02001266 f.write(uncompressed)
1267 file_data = lzma.decompress(bio.getvalue()).decode("ascii")
1268 self.assertEqual(file_data, uncompressed_raw)
Inada Naoki4663e5f2021-04-06 13:02:22 +09001269 with lzma.open(bio, "at", encoding="ascii") as f:
Nadeem Vawdae8604042012-06-04 23:38:12 +02001270 f.write(uncompressed)
1271 file_data = lzma.decompress(bio.getvalue()).decode("ascii")
1272 self.assertEqual(file_data, uncompressed_raw * 2)
1273
1274 def test_filename(self):
1275 with TempFile(TESTFN):
1276 with lzma.open(TESTFN, "wb") as f:
1277 f.write(INPUT)
1278 with open(TESTFN, "rb") as f:
1279 file_data = lzma.decompress(f.read())
1280 self.assertEqual(file_data, INPUT)
1281 with lzma.open(TESTFN, "rb") as f:
1282 self.assertEqual(f.read(), INPUT)
1283 with lzma.open(TESTFN, "ab") as f:
1284 f.write(INPUT)
1285 with lzma.open(TESTFN, "rb") as f:
1286 self.assertEqual(f.read(), INPUT * 2)
1287
Berker Peksag5f59ddd2016-10-04 20:41:20 +03001288 def test_with_pathlike_filename(self):
1289 filename = pathlib.Path(TESTFN)
1290 with TempFile(filename):
1291 with lzma.open(filename, "wb") as f:
1292 f.write(INPUT)
1293 with open(filename, "rb") as f:
1294 file_data = lzma.decompress(f.read())
1295 self.assertEqual(file_data, INPUT)
1296 with lzma.open(filename, "rb") as f:
1297 self.assertEqual(f.read(), INPUT)
1298
Nadeem Vawdae8604042012-06-04 23:38:12 +02001299 def test_bad_params(self):
1300 # Test invalid parameter combinations.
1301 with self.assertRaises(ValueError):
1302 lzma.open(TESTFN, "")
1303 with self.assertRaises(ValueError):
Nadeem Vawdae8604042012-06-04 23:38:12 +02001304 lzma.open(TESTFN, "rbt")
1305 with self.assertRaises(ValueError):
1306 lzma.open(TESTFN, "rb", encoding="utf-8")
1307 with self.assertRaises(ValueError):
1308 lzma.open(TESTFN, "rb", errors="ignore")
1309 with self.assertRaises(ValueError):
1310 lzma.open(TESTFN, "rb", newline="\n")
1311
1312 def test_format_and_filters(self):
1313 # Test non-default format and filter chain.
1314 options = {"format": lzma.FORMAT_RAW, "filters": FILTERS_RAW_1}
1315 with lzma.open(BytesIO(COMPRESSED_RAW_1), "rb", **options) as f:
1316 self.assertEqual(f.read(), INPUT)
1317 with BytesIO() as bio:
1318 with lzma.open(bio, "wb", **options) as f:
1319 f.write(INPUT)
1320 file_data = lzma.decompress(bio.getvalue(), **options)
1321 self.assertEqual(file_data, INPUT)
1322
1323 def test_encoding(self):
1324 # Test non-default encoding.
1325 uncompressed = INPUT.decode("ascii")
1326 uncompressed_raw = uncompressed.replace("\n", os.linesep)
1327 with BytesIO() as bio:
1328 with lzma.open(bio, "wt", encoding="utf-16-le") as f:
1329 f.write(uncompressed)
1330 file_data = lzma.decompress(bio.getvalue()).decode("utf-16-le")
1331 self.assertEqual(file_data, uncompressed_raw)
1332 bio.seek(0)
1333 with lzma.open(bio, "rt", encoding="utf-16-le") as f:
1334 self.assertEqual(f.read(), uncompressed)
1335
1336 def test_encoding_error_handler(self):
Martin Panter46f50722016-05-26 05:35:26 +00001337 # Test with non-default encoding error handler.
Nadeem Vawdae8604042012-06-04 23:38:12 +02001338 with BytesIO(lzma.compress(b"foo\xffbar")) as bio:
1339 with lzma.open(bio, "rt", encoding="ascii", errors="ignore") as f:
1340 self.assertEqual(f.read(), "foobar")
1341
1342 def test_newline(self):
1343 # Test with explicit newline (universal newline mode disabled).
1344 text = INPUT.decode("ascii")
1345 with BytesIO() as bio:
Inada Naoki4663e5f2021-04-06 13:02:22 +09001346 with lzma.open(bio, "wt", encoding="ascii", newline="\n") as f:
Nadeem Vawdae8604042012-06-04 23:38:12 +02001347 f.write(text)
1348 bio.seek(0)
Inada Naoki4663e5f2021-04-06 13:02:22 +09001349 with lzma.open(bio, "rt", encoding="ascii", newline="\r") as f:
Nadeem Vawdae8604042012-06-04 23:38:12 +02001350 self.assertEqual(f.readlines(), [text])
1351
Nadeem Vawda42ca9822013-10-19 00:06:19 +02001352 def test_x_mode(self):
1353 self.addCleanup(unlink, TESTFN)
1354 for mode in ("x", "xb", "xt"):
1355 unlink(TESTFN)
Inada Naoki4663e5f2021-04-06 13:02:22 +09001356 encoding = "ascii" if "t" in mode else None
1357 with lzma.open(TESTFN, mode, encoding=encoding):
Nadeem Vawda42ca9822013-10-19 00:06:19 +02001358 pass
1359 with self.assertRaises(FileExistsError):
1360 with lzma.open(TESTFN, mode):
1361 pass
1362
Nadeem Vawdae8604042012-06-04 23:38:12 +02001363
Nadeem Vawda3ff069e2011-11-30 00:25:06 +02001364class MiscellaneousTestCase(unittest.TestCase):
1365
1366 def test_is_check_supported(self):
1367 # CHECK_NONE and CHECK_CRC32 should always be supported,
1368 # regardless of the options liblzma was compiled with.
Nadeem Vawdabc459bb2012-05-06 23:01:51 +02001369 self.assertTrue(lzma.is_check_supported(lzma.CHECK_NONE))
1370 self.assertTrue(lzma.is_check_supported(lzma.CHECK_CRC32))
Nadeem Vawda3ff069e2011-11-30 00:25:06 +02001371
1372 # The .xz format spec cannot store check IDs above this value.
Nadeem Vawdabc459bb2012-05-06 23:01:51 +02001373 self.assertFalse(lzma.is_check_supported(lzma.CHECK_ID_MAX + 1))
Nadeem Vawda3ff069e2011-11-30 00:25:06 +02001374
1375 # This value should not be a valid check ID.
Nadeem Vawdabc459bb2012-05-06 23:01:51 +02001376 self.assertFalse(lzma.is_check_supported(lzma.CHECK_UNKNOWN))
Nadeem Vawda3ff069e2011-11-30 00:25:06 +02001377
Nadeem Vawdaa425c3d2012-06-21 23:36:48 +02001378 def test__encode_filter_properties(self):
Nadeem Vawdaf55b3292012-05-06 23:01:27 +02001379 with self.assertRaises(TypeError):
Nadeem Vawdaa425c3d2012-06-21 23:36:48 +02001380 lzma._encode_filter_properties(b"not a dict")
Nadeem Vawdaf55b3292012-05-06 23:01:27 +02001381 with self.assertRaises(ValueError):
Nadeem Vawdaa425c3d2012-06-21 23:36:48 +02001382 lzma._encode_filter_properties({"id": 0x100})
Nadeem Vawdaf55b3292012-05-06 23:01:27 +02001383 with self.assertRaises(ValueError):
Nadeem Vawdaa425c3d2012-06-21 23:36:48 +02001384 lzma._encode_filter_properties({"id": lzma.FILTER_LZMA2, "junk": 12})
Nadeem Vawdaf55b3292012-05-06 23:01:27 +02001385 with self.assertRaises(lzma.LZMAError):
Nadeem Vawdaa425c3d2012-06-21 23:36:48 +02001386 lzma._encode_filter_properties({"id": lzma.FILTER_DELTA,
Nadeem Vawdaf55b3292012-05-06 23:01:27 +02001387 "dist": 9001})
1388
1389 # Test with parameters used by zipfile module.
Nadeem Vawdaa425c3d2012-06-21 23:36:48 +02001390 props = lzma._encode_filter_properties({
Nadeem Vawdaf55b3292012-05-06 23:01:27 +02001391 "id": lzma.FILTER_LZMA1,
1392 "pb": 2,
1393 "lp": 0,
1394 "lc": 3,
1395 "dict_size": 8 << 20,
1396 })
1397 self.assertEqual(props, b"]\x00\x00\x80\x00")
1398
Nadeem Vawdaa425c3d2012-06-21 23:36:48 +02001399 def test__decode_filter_properties(self):
Nadeem Vawdaf55b3292012-05-06 23:01:27 +02001400 with self.assertRaises(TypeError):
Nadeem Vawdaa425c3d2012-06-21 23:36:48 +02001401 lzma._decode_filter_properties(lzma.FILTER_X86, {"should be": bytes})
Nadeem Vawdaf55b3292012-05-06 23:01:27 +02001402 with self.assertRaises(lzma.LZMAError):
Nadeem Vawdaa425c3d2012-06-21 23:36:48 +02001403 lzma._decode_filter_properties(lzma.FILTER_DELTA, b"too long")
Nadeem Vawdaf55b3292012-05-06 23:01:27 +02001404
1405 # Test with parameters used by zipfile module.
Nadeem Vawdaa425c3d2012-06-21 23:36:48 +02001406 filterspec = lzma._decode_filter_properties(
Nadeem Vawdaf55b3292012-05-06 23:01:27 +02001407 lzma.FILTER_LZMA1, b"]\x00\x00\x80\x00")
1408 self.assertEqual(filterspec["id"], lzma.FILTER_LZMA1)
1409 self.assertEqual(filterspec["pb"], 2)
1410 self.assertEqual(filterspec["lp"], 0)
1411 self.assertEqual(filterspec["lc"], 3)
1412 self.assertEqual(filterspec["dict_size"], 8 << 20)
1413
1414 def test_filter_properties_roundtrip(self):
Nadeem Vawdaa425c3d2012-06-21 23:36:48 +02001415 spec1 = lzma._decode_filter_properties(
Nadeem Vawdaf55b3292012-05-06 23:01:27 +02001416 lzma.FILTER_LZMA1, b"]\x00\x00\x80\x00")
Nadeem Vawdaa425c3d2012-06-21 23:36:48 +02001417 reencoded = lzma._encode_filter_properties(spec1)
1418 spec2 = lzma._decode_filter_properties(lzma.FILTER_LZMA1, reencoded)
Nadeem Vawdaf55b3292012-05-06 23:01:27 +02001419 self.assertEqual(spec1, spec2)
1420
Nadeem Vawda3ff069e2011-11-30 00:25:06 +02001421
1422# Test data:
1423
1424INPUT = b"""
1425LAERTES
1426
1427 O, fear me not.
1428 I stay too long: but here my father comes.
1429
1430 Enter POLONIUS
1431
1432 A double blessing is a double grace,
1433 Occasion smiles upon a second leave.
1434
1435LORD POLONIUS
1436
1437 Yet here, Laertes! aboard, aboard, for shame!
1438 The wind sits in the shoulder of your sail,
1439 And you are stay'd for. There; my blessing with thee!
1440 And these few precepts in thy memory
1441 See thou character. Give thy thoughts no tongue,
1442 Nor any unproportioned thought his act.
1443 Be thou familiar, but by no means vulgar.
1444 Those friends thou hast, and their adoption tried,
1445 Grapple them to thy soul with hoops of steel;
1446 But do not dull thy palm with entertainment
1447 Of each new-hatch'd, unfledged comrade. Beware
1448 Of entrance to a quarrel, but being in,
1449 Bear't that the opposed may beware of thee.
1450 Give every man thy ear, but few thy voice;
1451 Take each man's censure, but reserve thy judgment.
1452 Costly thy habit as thy purse can buy,
1453 But not express'd in fancy; rich, not gaudy;
1454 For the apparel oft proclaims the man,
1455 And they in France of the best rank and station
1456 Are of a most select and generous chief in that.
1457 Neither a borrower nor a lender be;
1458 For loan oft loses both itself and friend,
1459 And borrowing dulls the edge of husbandry.
1460 This above all: to thine ownself be true,
1461 And it must follow, as the night the day,
1462 Thou canst not then be false to any man.
1463 Farewell: my blessing season this in thee!
1464
1465LAERTES
1466
1467 Most humbly do I take my leave, my lord.
1468
1469LORD POLONIUS
1470
1471 The time invites you; go; your servants tend.
1472
1473LAERTES
1474
1475 Farewell, Ophelia; and remember well
1476 What I have said to you.
1477
1478OPHELIA
1479
1480 'Tis in my memory lock'd,
1481 And you yourself shall keep the key of it.
1482
1483LAERTES
1484
1485 Farewell.
1486"""
1487
Nadeem Vawda9c72ebc2013-12-04 23:03:49 +01001488COMPRESSED_BOGUS = b"this is not a valid lzma stream"
1489
Nadeem Vawda3ff069e2011-11-30 00:25:06 +02001490COMPRESSED_XZ = (
1491 b"\xfd7zXZ\x00\x00\x04\xe6\xd6\xb4F\x02\x00!\x01\x16\x00\x00\x00t/\xe5\xa3"
1492 b"\xe0\x07\x80\x03\xdf]\x00\x05\x14\x07bX\x19\xcd\xddn\x98\x15\xe4\xb4\x9d"
1493 b"o\x1d\xc4\xe5\n\x03\xcc2h\xc7\\\x86\xff\xf8\xe2\xfc\xe7\xd9\xfe6\xb8("
1494 b"\xa8wd\xc2\"u.n\x1e\xc3\xf2\x8e\x8d\x8f\x02\x17/\xa6=\xf0\xa2\xdf/M\x89"
1495 b"\xbe\xde\xa7\x1cz\x18-]\xd5\xef\x13\x8frZ\x15\x80\x8c\xf8\x8do\xfa\x12"
1496 b"\x9b#z/\xef\xf0\xfaF\x01\x82\xa3M\x8e\xa1t\xca6 BF$\xe5Q\xa4\x98\xee\xde"
1497 b"l\xe8\x7f\xf0\x9d,bn\x0b\x13\xd4\xa8\x81\xe4N\xc8\x86\x153\xf5x2\xa2O"
1498 b"\x13@Q\xa1\x00/\xa5\xd0O\x97\xdco\xae\xf7z\xc4\xcdS\xb6t<\x16\xf2\x9cI#"
1499 b"\x89ud\xc66Y\xd9\xee\xe6\xce\x12]\xe5\xf0\xaa\x96-Pe\xade:\x04\t\x1b\xf7"
1500 b"\xdb7\n\x86\x1fp\xc8J\xba\xf4\xf0V\xa9\xdc\xf0\x02%G\xf9\xdf=?\x15\x1b"
1501 b"\xe1(\xce\x82=\xd6I\xac3\x12\x0cR\xb7\xae\r\xb1i\x03\x95\x01\xbd\xbe\xfa"
1502 b"\x02s\x01P\x9d\x96X\xb12j\xc8L\xa8\x84b\xf6\xc3\xd4c-H\x93oJl\xd0iQ\xe4k"
1503 b"\x84\x0b\xc1\xb7\xbc\xb1\x17\x88\xb1\xca?@\xf6\x07\xea\xe6x\xf1H12P\x0f"
1504 b"\x8a\xc9\xeauw\xe3\xbe\xaai\xa9W\xd0\x80\xcd#cb5\x99\xd8]\xa9d\x0c\xbd"
1505 b"\xa2\xdcWl\xedUG\xbf\x89yF\xf77\x81v\xbd5\x98\xbeh8\x18W\x08\xf0\x1b\x99"
1506 b"5:\x1a?rD\x96\xa1\x04\x0f\xae\xba\x85\xeb\x9d5@\xf5\x83\xd37\x83\x8ac"
1507 b"\x06\xd4\x97i\xcdt\x16S\x82k\xf6K\x01vy\x88\x91\x9b6T\xdae\r\xfd]:k\xbal"
1508 b"\xa9\xbba\xc34\xf9r\xeb}r\xdb\xc7\xdb*\x8f\x03z\xdc8h\xcc\xc9\xd3\xbcl"
1509 b"\xa5-\xcb\xeaK\xa2\xc5\x15\xc0\xe3\xc1\x86Z\xfb\xebL\xe13\xcf\x9c\xe3"
1510 b"\x1d\xc9\xed\xc2\x06\xcc\xce!\x92\xe5\xfe\x9c^\xa59w \x9bP\xa3PK\x08d"
1511 b"\xf9\xe2Z}\xa7\xbf\xed\xeb%$\x0c\x82\xb8/\xb0\x01\xa9&,\xf7qh{Q\x96)\xf2"
1512 b"q\x96\xc3\x80\xb4\x12\xb0\xba\xe6o\xf4!\xb4[\xd4\x8aw\x10\xf7t\x0c\xb3"
1513 b"\xd9\xd5\xc3`^\x81\x11??\\\xa4\x99\x85R\xd4\x8e\x83\xc9\x1eX\xbfa\xf1"
1514 b"\xac\xb0\xea\xea\xd7\xd0\xab\x18\xe2\xf2\xed\xe1\xb7\xc9\x18\xcbS\xe4>"
1515 b"\xc9\x95H\xe8\xcb\t\r%\xeb\xc7$.o\xf1\xf3R\x17\x1db\xbb\xd8U\xa5^\xccS"
1516 b"\x16\x01\x87\xf3/\x93\xd1\xf0v\xc0r\xd7\xcc\xa2Gkz\xca\x80\x0e\xfd\xd0"
1517 b"\x8b\xbb\xd2Ix\xb3\x1ey\xca-0\xe3z^\xd6\xd6\x8f_\xf1\x9dP\x9fi\xa7\xd1"
1518 b"\xe8\x90\x84\xdc\xbf\xcdky\x8e\xdc\x81\x7f\xa3\xb2+\xbf\x04\xef\xd8\\"
1519 b"\xc4\xdf\xe1\xb0\x01\xe9\x93\xe3Y\xf1\x1dY\xe8h\x81\xcf\xf1w\xcc\xb4\xef"
1520 b" \x8b|\x04\xea\x83ej\xbe\x1f\xd4z\x9c`\xd3\x1a\x92A\x06\xe5\x8f\xa9\x13"
1521 b"\t\x9e=\xfa\x1c\xe5_\x9f%v\x1bo\x11ZO\xd8\xf4\t\xddM\x16-\x04\xfc\x18<\""
1522 b"CM\xddg~b\xf6\xef\x8e\x0c\xd0\xde|\xa0'\x8a\x0c\xd6x\xae!J\xa6F\x88\x15u"
1523 b"\x008\x17\xbc7y\xb3\xd8u\xac_\x85\x8d\xe7\xc1@\x9c\xecqc\xa3#\xad\xf1"
1524 b"\x935\xb5)_\r\xec3]\x0fo]5\xd0my\x07\x9b\xee\x81\xb5\x0f\xcfK+\x00\xc0"
1525 b"\xe4b\x10\xe4\x0c\x1a \x9b\xe0\x97t\xf6\xa1\x9e\x850\xba\x0c\x9a\x8d\xc8"
1526 b"\x8f\x07\xd7\xae\xc8\xf9+i\xdc\xb9k\xb0>f\x19\xb8\r\xa8\xf8\x1f$\xa5{p"
1527 b"\xc6\x880\xce\xdb\xcf\xca_\x86\xac\x88h6\x8bZ%'\xd0\n\xbf\x0f\x9c\"\xba"
1528 b"\xe5\x86\x9f\x0f7X=mNX[\xcc\x19FU\xc9\x860\xbc\x90a+* \xae_$\x03\x1e\xd3"
1529 b"\xcd_\xa0\x9c\xde\xaf46q\xa5\xc9\x92\xd7\xca\xe3`\x9d\x85}\xb4\xff\xb3"
1530 b"\x83\xfb\xb6\xca\xae`\x0bw\x7f\xfc\xd8\xacVe\x19\xc8\x17\x0bZ\xad\x88"
1531 b"\xeb#\x97\x03\x13\xb1d\x0f{\x0c\x04w\x07\r\x97\xbd\xd6\xc1\xc3B:\x95\x08"
1532 b"^\x10V\xaeaH\x02\xd9\xe3\n\\\x01X\xf6\x9c\x8a\x06u#%\xbe*\xa1\x18v\x85"
1533 b"\xec!\t4\x00\x00\x00\x00Vj?uLU\xf3\xa6\x00\x01\xfb\x07\x81\x0f\x00\x00tw"
1534 b"\x99P\xb1\xc4g\xfb\x02\x00\x00\x00\x00\x04YZ"
1535)
1536
1537COMPRESSED_ALONE = (
1538 b"]\x00\x00\x80\x00\xff\xff\xff\xff\xff\xff\xff\xff\x00\x05\x14\x07bX\x19"
1539 b"\xcd\xddn\x98\x15\xe4\xb4\x9do\x1d\xc4\xe5\n\x03\xcc2h\xc7\\\x86\xff\xf8"
1540 b"\xe2\xfc\xe7\xd9\xfe6\xb8(\xa8wd\xc2\"u.n\x1e\xc3\xf2\x8e\x8d\x8f\x02"
1541 b"\x17/\xa6=\xf0\xa2\xdf/M\x89\xbe\xde\xa7\x1cz\x18-]\xd5\xef\x13\x8frZ"
1542 b"\x15\x80\x8c\xf8\x8do\xfa\x12\x9b#z/\xef\xf0\xfaF\x01\x82\xa3M\x8e\xa1t"
1543 b"\xca6 BF$\xe5Q\xa4\x98\xee\xdel\xe8\x7f\xf0\x9d,bn\x0b\x13\xd4\xa8\x81"
1544 b"\xe4N\xc8\x86\x153\xf5x2\xa2O\x13@Q\xa1\x00/\xa5\xd0O\x97\xdco\xae\xf7z"
1545 b"\xc4\xcdS\xb6t<\x16\xf2\x9cI#\x89ud\xc66Y\xd9\xee\xe6\xce\x12]\xe5\xf0"
1546 b"\xaa\x96-Pe\xade:\x04\t\x1b\xf7\xdb7\n\x86\x1fp\xc8J\xba\xf4\xf0V\xa9"
1547 b"\xdc\xf0\x02%G\xf9\xdf=?\x15\x1b\xe1(\xce\x82=\xd6I\xac3\x12\x0cR\xb7"
1548 b"\xae\r\xb1i\x03\x95\x01\xbd\xbe\xfa\x02s\x01P\x9d\x96X\xb12j\xc8L\xa8"
1549 b"\x84b\xf8\x1epl\xeajr\xd1=\t\x03\xdd\x13\x1b3!E\xf9vV\xdaF\xf3\xd7\xb4"
1550 b"\x0c\xa9P~\xec\xdeE\xe37\xf6\x1d\xc6\xbb\xddc%\xb6\x0fI\x07\xf0;\xaf\xe7"
1551 b"\xa0\x8b\xa7Z\x99(\xe9\xe2\xf0o\x18>`\xe1\xaa\xa8\xd9\xa1\xb2}\xe7\x8d"
1552 b"\x834T\xb6\xef\xc1\xde\xe3\x98\xbcD\x03MA@\xd8\xed\xdc\xc8\x93\x03\x1a"
1553 b"\x93\x0b\x7f\x94\x12\x0b\x02Sa\x18\xc9\xc5\x9bTJE}\xf6\xc8g\x17#ZV\x01"
1554 b"\xc9\x9dc\x83\x0e>0\x16\x90S\xb8/\x03y_\x18\xfa(\xd7\x0br\xa2\xb0\xba?"
1555 b"\x8c\xe6\x83@\x84\xdf\x02:\xc5z\x9e\xa6\x84\xc9\xf5BeyX\x83\x1a\xf1 :\t"
1556 b"\xf7\x19\xfexD\\&G\xf3\x85Y\xa2J\xf9\x0bv{\x89\xf6\xe7)A\xaf\x04o\x00"
1557 b"\x075\xd3\xe0\x7f\x97\x98F\x0f?v\x93\xedVtTf\xb5\x97\x83\xed\x19\xd7\x1a"
1558 b"'k\xd7\xd9\xc5\\Y\xd1\xdc\x07\x15|w\xbc\xacd\x87\x08d\xec\xa7\xf6\x82"
1559 b"\xfc\xb3\x93\xeb\xb9 \x8d\xbc ,\xb3X\xb0\xd2s\xd7\xd1\xffv\x05\xdf}\xa2"
1560 b"\x96\xfb%\n\xdf\xa2\x7f\x08.\xa16\n\xe0\x19\x93\x7fh\n\x1c\x8c\x0f \x11"
1561 b"\xc6Bl\x95\x19U}\xe4s\xb5\x10H\xea\x86pB\xe88\x95\xbe\x8cZ\xdb\xe4\x94A"
1562 b"\x92\xb9;z\xaa\xa7{\x1c5!\xc0\xaf\xc1A\xf9\xda\xf0$\xb0\x02qg\xc8\xc7/|"
1563 b"\xafr\x99^\x91\x88\xbf\x03\xd9=\xd7n\xda6{>8\n\xc7:\xa9'\xba.\x0b\xe2"
1564 b"\xb5\x1d\x0e\n\x9a\x8e\x06\x8f:\xdd\x82'[\xc3\"wD$\xa7w\xecq\x8c,1\x93"
1565 b"\xd0,\xae2w\x93\x12$Jd\x19mg\x02\x93\x9cA\x95\x9d&\xca8i\x9c\xb0;\xe7NQ"
1566 b"\x1frh\x8beL;\xb0m\xee\x07Q\x9b\xc6\xd8\x03\xb5\xdeN\xd4\xfe\x98\xd0\xdc"
1567 b"\x1a[\x04\xde\x1a\xf6\x91j\xf8EOli\x8eB^\x1d\x82\x07\xb2\xb5R]\xb7\xd7"
1568 b"\xe9\xa6\xc3.\xfb\xf0-\xb4e\x9b\xde\x03\x88\xc6\xc1iN\x0e\x84wbQ\xdf~"
1569 b"\xe9\xa4\x884\x96kM\xbc)T\xf3\x89\x97\x0f\x143\xe7)\xa0\xb3B\x00\xa8\xaf"
1570 b"\x82^\xcb\xc7..\xdb\xc7\t\x9dH\xee5\xe9#\xe6NV\x94\xcb$Kk\xe3\x7f\r\xe3t"
1571 b"\x12\xcf'\xefR\x8b\xf42\xcf-LH\xac\xe5\x1f0~?SO\xeb\xc1E\x1a\x1c]\xf2"
1572 b"\xc4<\x11\x02\x10Z0a*?\xe4r\xff\xfb\xff\xf6\x14nG\xead^\xd6\xef8\xb6uEI"
1573 b"\x99\nV\xe2\xb3\x95\x8e\x83\xf6i!\xb5&1F\xb1DP\xf4 SO3D!w\x99_G\x7f+\x90"
1574 b".\xab\xbb]\x91>\xc9#h;\x0f5J\x91K\xf4^-[\x9e\x8a\\\x94\xca\xaf\xf6\x19"
1575 b"\xd4\xa1\x9b\xc4\xb8p\xa1\xae\x15\xe9r\x84\xe0\xcar.l []\x8b\xaf+0\xf2g"
1576 b"\x01aKY\xdfI\xcf,\n\xe8\xf0\xe7V\x80_#\xb2\xf2\xa9\x06\x8c>w\xe2W,\xf4"
1577 b"\x8c\r\xf963\xf5J\xcc2\x05=kT\xeaUti\xe5_\xce\x1b\xfa\x8dl\x02h\xef\xa8"
1578 b"\xfbf\x7f\xff\xf0\x19\xeax"
1579)
1580
1581FILTERS_RAW_1 = [{"id": lzma.FILTER_LZMA2, "preset": 3}]
1582COMPRESSED_RAW_1 = (
1583 b"\xe0\x07\x80\x03\xfd]\x00\x05\x14\x07bX\x19\xcd\xddn\x96cyq\xa1\xdd\xee"
1584 b"\xf8\xfam\xe3'\x88\xd3\xff\xe4\x9e \xceQ\x91\xa4\x14I\xf6\xb9\x9dVL8\x15"
1585 b"_\x0e\x12\xc3\xeb\xbc\xa5\xcd\nW\x1d$=R;\x1d\xf8k8\t\xb1{\xd4\xc5+\x9d"
1586 b"\x87c\xe5\xef\x98\xb4\xd7S3\xcd\xcc\xd2\xed\xa4\x0em\xe5\xf4\xdd\xd0b"
1587 b"\xbe4*\xaa\x0b\xc5\x08\x10\x85+\x81.\x17\xaf9\xc9b\xeaZrA\xe20\x7fs\"r"
1588 b"\xdaG\x81\xde\x90cu\xa5\xdb\xa9.A\x08l\xb0<\xf6\x03\xddOi\xd0\xc5\xb4"
1589 b"\xec\xecg4t6\"\xa6\xb8o\xb5?\x18^}\xb6}\x03[:\xeb\x03\xa9\n[\x89l\x19g"
1590 b"\x16\xc82\xed\x0b\xfb\x86n\xa2\x857@\x93\xcd6T\xc3u\xb0\t\xf9\x1b\x918"
1591 b"\xfc[\x1b\x1e4\xb3\x14\x06PCV\xa8\"\xf5\x81x~\xe9\xb5N\x9cK\x9f\xc6\xc3%"
1592 b"\xc8k:{6\xe7\xf7\xbd\x05\x02\xb4\xc4\xc3\xd3\xfd\xc3\xa8\\\xfc@\xb1F_"
1593 b"\xc8\x90\xd9sU\x98\xad8\x05\x07\xde7J\x8bM\xd0\xb3;X\xec\x87\xef\xae\xb3"
1594 b"eO,\xb1z,d\x11y\xeejlB\x02\x1d\xf28\x1f#\x896\xce\x0b\xf0\xf5\xa9PK\x0f"
1595 b"\xb3\x13P\xd8\x88\xd2\xa1\x08\x04C?\xdb\x94_\x9a\"\xe9\xe3e\x1d\xde\x9b"
1596 b"\xa1\xe8>H\x98\x10;\xc5\x03#\xb5\x9d4\x01\xe7\xc5\xba%v\xa49\x97A\xe0\""
1597 b"\x8c\xc22\xe3i\xc1\x9d\xab3\xdf\xbe\xfdDm7\x1b\x9d\xab\xb5\x15o:J\x92"
1598 b"\xdb\x816\x17\xc2O\x99\x1b\x0e\x8d\xf3\tQ\xed\x8e\x95S/\x16M\xb2S\x04"
1599 b"\x0f\xc3J\xc6\xc7\xe4\xcb\xc5\xf4\xe7d\x14\xe4=^B\xfb\xd3E\xd3\x1e\xcd"
1600 b"\x91\xa5\xd0G\x8f.\xf6\xf9\x0bb&\xd9\x9f\xc2\xfdj\xa2\x9e\xc4\\\x0e\x1dC"
1601 b"v\xe8\xd2\x8a?^H\xec\xae\xeb>\xfe\xb8\xab\xd4IqY\x8c\xd4K7\x11\xf4D\xd0W"
1602 b"\xa5\xbe\xeaO\xbf\xd0\x04\xfdl\x10\xae5\xd4U\x19\x06\xf9{\xaa\xe0\x81"
1603 b"\x0f\xcf\xa3k{\x95\xbd\x19\xa2\xf8\xe4\xa3\x08O*\xf1\xf1B-\xc7(\x0eR\xfd"
1604 b"@E\x9f\xd3\x1e:\xfdV\xb7\x04Y\x94\xeb]\x83\xc4\xa5\xd7\xc0gX\x98\xcf\x0f"
1605 b"\xcd3\x00]n\x17\xec\xbd\xa3Y\x86\xc5\xf3u\xf6*\xbdT\xedA$A\xd9A\xe7\x98"
1606 b"\xef\x14\x02\x9a\xfdiw\xec\xa0\x87\x11\xd9%\xc5\xeb\x8a=\xae\xc0\xc4\xc6"
1607 b"D\x80\x8f\xa8\xd1\xbbq\xb2\xc0\xa0\xf5Cqp\xeeL\xe3\xe5\xdc \x84\"\xe9"
1608 b"\x80t\x83\x05\xba\xf1\xc5~\x93\xc9\xf0\x01c\xceix\x9d\xed\xc5)l\x16)\xd1"
1609 b"\x03@l\x04\x7f\x87\xa5yn\x1b\x01D\xaa:\xd2\x96\xb4\xb3?\xb0\xf9\xce\x07"
1610 b"\xeb\x81\x00\xe4\xc3\xf5%_\xae\xd4\xf9\xeb\xe2\rh\xb2#\xd67Q\x16D\x82hn"
1611 b"\xd1\xa3_?q\xf0\xe2\xac\xf317\x9e\xd0_\x83|\xf1\xca\xb7\x95S\xabW\x12"
1612 b"\xff\xddt\xf69L\x01\xf2|\xdaW\xda\xees\x98L\x18\xb8_\xe8$\x82\xea\xd6"
1613 b"\xd1F\xd4\x0b\xcdk\x01vf\x88h\xc3\xae\xb91\xc7Q\x9f\xa5G\xd9\xcc\x1f\xe3"
1614 b"5\xb1\xdcy\x7fI\x8bcw\x8e\x10rIp\x02:\x19p_\xc8v\xcea\"\xc1\xd9\x91\x03"
1615 b"\xbfe\xbe\xa6\xb3\xa8\x14\x18\xc3\xabH*m}\xc2\xc1\x9a}>l%\xce\x84\x99"
1616 b"\xb3d\xaf\xd3\x82\x15\xdf\xc1\xfc5fOg\x9b\xfc\x8e^&\t@\xce\x9f\x06J\xb8"
1617 b"\xb5\x86\x1d\xda{\x9f\xae\xb0\xff\x02\x81r\x92z\x8cM\xb7ho\xc9^\x9c\xb6"
1618 b"\x9c\xae\xd1\xc9\xf4\xdfU7\xd6\\!\xea\x0b\x94k\xb9Ud~\x98\xe7\x86\x8az"
1619 b"\x10;\xe3\x1d\xe5PG\xf8\xa4\x12\x05w\x98^\xc4\xb1\xbb\xfb\xcf\xe0\x7f"
1620 b"\x033Sf\x0c \xb1\xf6@\x94\xe5\xa3\xb2\xa7\x10\x9a\xc0\x14\xc3s\xb5xRD"
1621 b"\xf4`W\xd9\xe5\xd3\xcf\x91\rTZ-X\xbe\xbf\xb5\xe2\xee|\x1a\xbf\xfb\x08"
1622 b"\x91\xe1\xfc\x9a\x18\xa3\x8b\xd6^\x89\xf5[\xef\x87\xd1\x06\x1c7\xd6\xa2"
1623 b"\t\tQ5/@S\xc05\xd2VhAK\x03VC\r\x9b\x93\xd6M\xf1xO\xaaO\xed\xb9<\x0c\xdae"
1624 b"*\xd0\x07Hk6\x9fG+\xa1)\xcd\x9cl\x87\xdb\xe1\xe7\xefK}\x875\xab\xa0\x19u"
1625 b"\xf6*F\xb32\x00\x00\x00"
1626)
1627
1628FILTERS_RAW_2 = [{"id": lzma.FILTER_DELTA, "dist": 2},
1629 {"id": lzma.FILTER_LZMA2,
1630 "preset": lzma.PRESET_DEFAULT | lzma.PRESET_EXTREME}]
1631COMPRESSED_RAW_2 = (
1632 b"\xe0\x07\x80\x05\x91]\x00\x05\x14\x06-\xd4\xa8d?\xef\xbe\xafH\xee\x042"
1633 b"\xcb.\xb5g\x8f\xfb\x14\xab\xa5\x9f\x025z\xa4\xdd\xd8\t[}W\xf8\x0c\x1dmH"
1634 b"\xfa\x05\xfcg\xba\xe5\x01Q\x0b\x83R\xb6A\x885\xc0\xba\xee\n\x1cv~\xde:o"
1635 b"\x06:J\xa7\x11Cc\xea\xf7\xe5*o\xf7\x83\\l\xbdE\x19\x1f\r\xa8\x10\xb42"
1636 b"\x0caU{\xd7\xb8w\xdc\xbe\x1b\xfc8\xb4\xcc\xd38\\\xf6\x13\xf6\xe7\x98\xfa"
1637 b"\xc7[\x17_9\x86%\xa8\xf8\xaa\xb8\x8dfs#\x1e=\xed<\x92\x10\\t\xff\x86\xfb"
1638 b"=\x9e7\x18\x1dft\\\xb5\x01\x95Q\xc5\x19\xb38\xe0\xd4\xaa\x07\xc3\x7f\xd8"
1639 b"\xa2\x00>-\xd3\x8e\xa1#\xfa\x83ArAm\xdbJ~\x93\xa3B\x82\xe0\xc7\xcc(\x08`"
1640 b"WK\xad\x1b\x94kaj\x04 \xde\xfc\xe1\xed\xb0\x82\x91\xefS\x84%\x86\xfbi"
1641 b"\x99X\xf1B\xe7\x90;E\xfde\x98\xda\xca\xd6T\xb4bg\xa4\n\x9aj\xd1\x83\x9e]"
1642 b"\"\x7fM\xb5\x0fr\xd2\\\xa5j~P\x10GH\xbfN*Z\x10.\x81\tpE\x8a\x08\xbe1\xbd"
1643 b"\xcd\xa9\xe1\x8d\x1f\x04\xf9\x0eH\xb9\xae\xd6\xc3\xc1\xa5\xa9\x95P\xdc~"
1644 b"\xff\x01\x930\xa9\x04\xf6\x03\xfe\xb5JK\xc3]\xdd9\xb1\xd3\xd7F\xf5\xd1"
1645 b"\x1e\xa0\x1c_\xed[\x0c\xae\xd4\x8b\x946\xeb\xbf\xbb\xe3$kS{\xb5\x80,f:Sj"
1646 b"\x0f\x08z\x1c\xf5\xe8\xe6\xae\x98\xb0Q~r\x0f\xb0\x05?\xb6\x90\x19\x02&"
1647 b"\xcb\x80\t\xc4\xea\x9c|x\xce\x10\x9c\xc5|\xcbdhh+\x0c'\xc5\x81\xc33\xb5"
1648 b"\x14q\xd6\xc5\xe3`Z#\xdc\x8a\xab\xdd\xea\x08\xc2I\xe7\x02l{\xec\x196\x06"
1649 b"\x91\x8d\xdc\xd5\xb3x\xe1hz%\xd1\xf8\xa5\xdd\x98!\x8c\x1c\xc1\x17RUa\xbb"
1650 b"\x95\x0f\xe4X\xea1\x0c\xf1=R\xbe\xc60\xe3\xa4\x9a\x90bd\x97$]B\x01\xdd"
1651 b"\x1f\xe3h2c\x1e\xa0L`4\xc6x\xa3Z\x8a\r\x14]T^\xd8\x89\x1b\x92\r;\xedY"
1652 b"\x0c\xef\x8d9z\xf3o\xb6)f\xa9]$n\rp\x93\xd0\x10\xa4\x08\xb8\xb2\x8b\xb6"
1653 b"\x8f\x80\xae;\xdcQ\xf1\xfa\x9a\x06\x8e\xa5\x0e\x8cK\x9c @\xaa:UcX\n!\xc6"
1654 b"\x02\x12\xcb\x1b\"=\x16.\x1f\x176\xf2g=\xe1Wn\xe9\xe1\xd4\xf1O\xad\x15"
1655 b"\x86\xe9\xa3T\xaf\xa9\xd7D\xb5\xd1W3pnt\x11\xc7VOj\xb7M\xc4i\xa1\xf1$3"
1656 b"\xbb\xdc\x8af\xb0\xc5Y\r\xd1\xfb\xf2\xe7K\xe6\xc5hwO\xfe\x8c2^&\x07\xd5"
1657 b"\x1fV\x19\xfd\r\x14\xd2i=yZ\xe6o\xaf\xc6\xb6\x92\x9d\xc4\r\xb3\xafw\xac%"
1658 b"\xcfc\x1a\xf1`]\xf2\x1a\x9e\x808\xedm\xedQ\xb2\xfe\xe4h`[q\xae\xe0\x0f"
1659 b"\xba0g\xb6\"N\xc3\xfb\xcfR\x11\xc5\x18)(\xc40\\\xa3\x02\xd9G!\xce\x1b"
1660 b"\xc1\x96x\xb5\xc8z\x1f\x01\xb4\xaf\xde\xc2\xcd\x07\xe7H\xb3y\xa8M\n\\A\t"
1661 b"ar\xddM\x8b\x9a\xea\x84\x9b!\xf1\x8d\xb1\xf1~\x1e\r\xa5H\xba\xf1\x84o"
1662 b"\xda\x87\x01h\xe9\xa2\xbe\xbeqN\x9d\x84\x0b!WG\xda\xa1\xa5A\xb7\xc7`j"
1663 b"\x15\xf2\xe9\xdd?\x015B\xd2~E\x06\x11\xe0\x91!\x05^\x80\xdd\xa8y\x15}"
1664 b"\xa1)\xb1)\x81\x18\xf4\xf4\xf8\xc0\xefD\xe3\xdb2f\x1e\x12\xabu\xc9\x97"
1665 b"\xcd\x1e\xa7\x0c\x02x4_6\x03\xc4$t\xf39\x94\x1d=\xcb\xbfv\\\xf5\xa3\x1d"
1666 b"\x9d8jk\x95\x13)ff\xf9n\xc4\xa9\xe3\x01\xb8\xda\xfb\xab\xdfM\x99\xfb\x05"
1667 b"\xe0\xe9\xb0I\xf4E\xab\xe2\x15\xa3\x035\xe7\xdeT\xee\x82p\xb4\x88\xd3"
1668 b"\x893\x9c/\xc0\xd6\x8fou;\xf6\x95PR\xa9\xb2\xc1\xefFj\xe2\xa7$\xf7h\xf1"
1669 b"\xdfK(\xc9c\xba7\xe8\xe3)\xdd\xb2,\x83\xfb\x84\x18.y\x18Qi\x88\xf8`h-"
1670 b"\xef\xd5\xed\x8c\t\xd8\xc3^\x0f\x00\xb7\xd0[!\xafM\x9b\xd7.\x07\xd8\xfb"
1671 b"\xd9\xe2-S+\xaa8,\xa0\x03\x1b \xea\xa8\x00\xc3\xab~\xd0$e\xa5\x7f\xf7"
1672 b"\x95P]\x12\x19i\xd9\x7fo\x0c\xd8g^\rE\xa5\x80\x18\xc5\x01\x80\xaek`\xff~"
1673 b"\xb6y\xe7+\xe5\x11^D\xa7\x85\x18\"!\xd6\xd2\xa7\xf4\x1eT\xdb\x02\xe15"
1674 b"\x02Y\xbc\x174Z\xe7\x9cH\x1c\xbf\x0f\xc6\xe9f]\xcf\x8cx\xbc\xe5\x15\x94"
1675 b"\xfc3\xbc\xa7TUH\xf1\x84\x1b\xf7\xa9y\xc07\x84\xf8X\xd8\xef\xfc \x1c\xd8"
1676 b"( /\xf2\xb7\xec\xc1\\\x8c\xf6\x95\xa1\x03J\x83vP8\xe1\xe3\xbb~\xc24kA"
1677 b"\x98y\xa1\xf2P\xe9\x9d\xc9J\xf8N\x99\xb4\xceaO\xde\x16\x1e\xc2\x19\xa7"
1678 b"\x03\xd2\xe0\x8f:\x15\xf3\x84\x9e\xee\xe6e\xb8\x02q\xc7AC\x1emw\xfd\t"
1679 b"\x9a\x1eu\xc1\xa9\xcaCwUP\x00\xa5\xf78L4w!\x91L2 \x87\xd0\xf2\x06\x81j"
1680 b"\x80;\x03V\x06\x87\x92\xcb\x90lv@E\x8d\x8d\xa5\xa6\xe7Z[\xdf\xd6E\x03`>"
1681 b"\x8f\xde\xa1bZ\x84\xd0\xa9`\x05\x0e{\x80;\xe3\xbef\x8d\x1d\xebk1.\xe3"
1682 b"\xe9N\x15\xf7\xd4(\xfa\xbb\x15\xbdu\xf7\x7f\x86\xae!\x03L\x1d\xb5\xc1"
1683 b"\xb9\x11\xdb\xd0\x93\xe4\x02\xe1\xd2\xcbBjc_\xe8}d\xdb\xc3\xa0Y\xbe\xc9/"
1684 b"\x95\x01\xa3,\xe6bl@\x01\xdbp\xc2\xce\x14\x168\xc2q\xe3uH\x89X\xa4\xa9"
1685 b"\x19\x1d\xc1}\x7fOX\x19\x9f\xdd\xbe\x85\x83\xff\x96\x1ee\x82O`CF=K\xeb$I"
1686 b"\x17_\xefX\x8bJ'v\xde\x1f+\xd9.v\xf8Tv\x17\xf2\x9f5\x19\xe1\xb9\x91\xa8S"
1687 b"\x86\xbd\x1a\"(\xa5x\x8dC\x03X\x81\x91\xa8\x11\xc4pS\x13\xbc\xf2'J\xae!"
1688 b"\xef\xef\x84G\t\x8d\xc4\x10\x132\x00oS\x9e\xe0\xe4d\x8f\xb8y\xac\xa6\x9f"
1689 b",\xb8f\x87\r\xdf\x9eE\x0f\xe1\xd0\\L\x00\xb2\xe1h\x84\xef}\x98\xa8\x11"
1690 b"\xccW#\\\x83\x7fo\xbbz\x8f\x00"
1691)
1692
1693FILTERS_RAW_3 = [{"id": lzma.FILTER_IA64, "start_offset": 0x100},
1694 {"id": lzma.FILTER_LZMA2}]
1695COMPRESSED_RAW_3 = (
1696 b"\xe0\x07\x80\x03\xdf]\x00\x05\x14\x07bX\x19\xcd\xddn\x98\x15\xe4\xb4\x9d"
1697 b"o\x1d\xc4\xe5\n\x03\xcc2h\xc7\\\x86\xff\xf8\xe2\xfc\xe7\xd9\xfe6\xb8("
1698 b"\xa8wd\xc2\"u.n\x1e\xc3\xf2\x8e\x8d\x8f\x02\x17/\xa6=\xf0\xa2\xdf/M\x89"
1699 b"\xbe\xde\xa7\x1cz\x18-]\xd5\xef\x13\x8frZ\x15\x80\x8c\xf8\x8do\xfa\x12"
1700 b"\x9b#z/\xef\xf0\xfaF\x01\x82\xa3M\x8e\xa1t\xca6 BF$\xe5Q\xa4\x98\xee\xde"
1701 b"l\xe8\x7f\xf0\x9d,bn\x0b\x13\xd4\xa8\x81\xe4N\xc8\x86\x153\xf5x2\xa2O"
1702 b"\x13@Q\xa1\x00/\xa5\xd0O\x97\xdco\xae\xf7z\xc4\xcdS\xb6t<\x16\xf2\x9cI#"
1703 b"\x89ud\xc66Y\xd9\xee\xe6\xce\x12]\xe5\xf0\xaa\x96-Pe\xade:\x04\t\x1b\xf7"
1704 b"\xdb7\n\x86\x1fp\xc8J\xba\xf4\xf0V\xa9\xdc\xf0\x02%G\xf9\xdf=?\x15\x1b"
1705 b"\xe1(\xce\x82=\xd6I\xac3\x12\x0cR\xb7\xae\r\xb1i\x03\x95\x01\xbd\xbe\xfa"
1706 b"\x02s\x01P\x9d\x96X\xb12j\xc8L\xa8\x84b\xf6\xc3\xd4c-H\x93oJl\xd0iQ\xe4k"
1707 b"\x84\x0b\xc1\xb7\xbc\xb1\x17\x88\xb1\xca?@\xf6\x07\xea\xe6x\xf1H12P\x0f"
1708 b"\x8a\xc9\xeauw\xe3\xbe\xaai\xa9W\xd0\x80\xcd#cb5\x99\xd8]\xa9d\x0c\xbd"
1709 b"\xa2\xdcWl\xedUG\xbf\x89yF\xf77\x81v\xbd5\x98\xbeh8\x18W\x08\xf0\x1b\x99"
1710 b"5:\x1a?rD\x96\xa1\x04\x0f\xae\xba\x85\xeb\x9d5@\xf5\x83\xd37\x83\x8ac"
1711 b"\x06\xd4\x97i\xcdt\x16S\x82k\xf6K\x01vy\x88\x91\x9b6T\xdae\r\xfd]:k\xbal"
1712 b"\xa9\xbba\xc34\xf9r\xeb}r\xdb\xc7\xdb*\x8f\x03z\xdc8h\xcc\xc9\xd3\xbcl"
1713 b"\xa5-\xcb\xeaK\xa2\xc5\x15\xc0\xe3\xc1\x86Z\xfb\xebL\xe13\xcf\x9c\xe3"
1714 b"\x1d\xc9\xed\xc2\x06\xcc\xce!\x92\xe5\xfe\x9c^\xa59w \x9bP\xa3PK\x08d"
1715 b"\xf9\xe2Z}\xa7\xbf\xed\xeb%$\x0c\x82\xb8/\xb0\x01\xa9&,\xf7qh{Q\x96)\xf2"
1716 b"q\x96\xc3\x80\xb4\x12\xb0\xba\xe6o\xf4!\xb4[\xd4\x8aw\x10\xf7t\x0c\xb3"
1717 b"\xd9\xd5\xc3`^\x81\x11??\\\xa4\x99\x85R\xd4\x8e\x83\xc9\x1eX\xbfa\xf1"
1718 b"\xac\xb0\xea\xea\xd7\xd0\xab\x18\xe2\xf2\xed\xe1\xb7\xc9\x18\xcbS\xe4>"
1719 b"\xc9\x95H\xe8\xcb\t\r%\xeb\xc7$.o\xf1\xf3R\x17\x1db\xbb\xd8U\xa5^\xccS"
1720 b"\x16\x01\x87\xf3/\x93\xd1\xf0v\xc0r\xd7\xcc\xa2Gkz\xca\x80\x0e\xfd\xd0"
1721 b"\x8b\xbb\xd2Ix\xb3\x1ey\xca-0\xe3z^\xd6\xd6\x8f_\xf1\x9dP\x9fi\xa7\xd1"
1722 b"\xe8\x90\x84\xdc\xbf\xcdky\x8e\xdc\x81\x7f\xa3\xb2+\xbf\x04\xef\xd8\\"
1723 b"\xc4\xdf\xe1\xb0\x01\xe9\x93\xe3Y\xf1\x1dY\xe8h\x81\xcf\xf1w\xcc\xb4\xef"
1724 b" \x8b|\x04\xea\x83ej\xbe\x1f\xd4z\x9c`\xd3\x1a\x92A\x06\xe5\x8f\xa9\x13"
1725 b"\t\x9e=\xfa\x1c\xe5_\x9f%v\x1bo\x11ZO\xd8\xf4\t\xddM\x16-\x04\xfc\x18<\""
1726 b"CM\xddg~b\xf6\xef\x8e\x0c\xd0\xde|\xa0'\x8a\x0c\xd6x\xae!J\xa6F\x88\x15u"
1727 b"\x008\x17\xbc7y\xb3\xd8u\xac_\x85\x8d\xe7\xc1@\x9c\xecqc\xa3#\xad\xf1"
1728 b"\x935\xb5)_\r\xec3]\x0fo]5\xd0my\x07\x9b\xee\x81\xb5\x0f\xcfK+\x00\xc0"
1729 b"\xe4b\x10\xe4\x0c\x1a \x9b\xe0\x97t\xf6\xa1\x9e\x850\xba\x0c\x9a\x8d\xc8"
1730 b"\x8f\x07\xd7\xae\xc8\xf9+i\xdc\xb9k\xb0>f\x19\xb8\r\xa8\xf8\x1f$\xa5{p"
1731 b"\xc6\x880\xce\xdb\xcf\xca_\x86\xac\x88h6\x8bZ%'\xd0\n\xbf\x0f\x9c\"\xba"
1732 b"\xe5\x86\x9f\x0f7X=mNX[\xcc\x19FU\xc9\x860\xbc\x90a+* \xae_$\x03\x1e\xd3"
1733 b"\xcd_\xa0\x9c\xde\xaf46q\xa5\xc9\x92\xd7\xca\xe3`\x9d\x85}\xb4\xff\xb3"
1734 b"\x83\xfb\xb6\xca\xae`\x0bw\x7f\xfc\xd8\xacVe\x19\xc8\x17\x0bZ\xad\x88"
1735 b"\xeb#\x97\x03\x13\xb1d\x0f{\x0c\x04w\x07\r\x97\xbd\xd6\xc1\xc3B:\x95\x08"
1736 b"^\x10V\xaeaH\x02\xd9\xe3\n\\\x01X\xf6\x9c\x8a\x06u#%\xbe*\xa1\x18v\x85"
1737 b"\xec!\t4\x00\x00\x00"
1738)
1739
1740FILTERS_RAW_4 = [{"id": lzma.FILTER_DELTA, "dist": 4},
1741 {"id": lzma.FILTER_X86, "start_offset": 0x40},
1742 {"id": lzma.FILTER_LZMA2, "preset": 4, "lc": 2}]
1743COMPRESSED_RAW_4 = (
1744 b"\xe0\x07\x80\x06\x0e\\\x00\x05\x14\x07bW\xaah\xdd\x10\xdc'\xd6\x90,\xc6v"
1745 b"Jq \x14l\xb7\x83xB\x0b\x97f=&fx\xba\n>Tn\xbf\x8f\xfb\x1dF\xca\xc3v_\xca?"
1746 b"\xfbV<\x92#\xd4w\xa6\x8a\xeb\xf6\x03\xc0\x01\x94\xd8\x9e\x13\x12\x98\xd1"
1747 b"*\xfa]c\xe8\x1e~\xaf\xb5]Eg\xfb\x9e\x01\"8\xb2\x90\x06=~\xe9\x91W\xcd"
1748 b"\xecD\x12\xc7\xfa\xe1\x91\x06\xc7\x99\xb9\xe3\x901\x87\x19u\x0f\x869\xff"
1749 b"\xc1\xb0hw|\xb0\xdcl\xcck\xb16o7\x85\xee{Y_b\xbf\xbc$\xf3=\x8d\x8bw\xe5Z"
1750 b"\x08@\xc4kmE\xad\xfb\xf6*\xd8\xad\xa1\xfb\xc5{\xdej,)\x1emB\x1f<\xaeca"
1751 b"\x80(\xee\x07 \xdf\xe9\xf8\xeb\x0e-\x97\x86\x90c\xf9\xea'B\xf7`\xd7\xb0"
1752 b"\x92\xbd\xa0\x82]\xbd\x0e\x0eB\x19\xdc\x96\xc6\x19\xd86D\xf0\xd5\x831"
1753 b"\x03\xb7\x1c\xf7&5\x1a\x8f PZ&j\xf8\x98\x1bo\xcc\x86\x9bS\xd3\xa5\xcdu"
1754 b"\xf9$\xcc\x97o\xe5V~\xfb\x97\xb5\x0b\x17\x9c\xfdxW\x10\xfep4\x80\xdaHDY"
1755 b"\xfa)\xfet\xb5\"\xd4\xd3F\x81\xf4\x13\x1f\xec\xdf\xa5\x13\xfc\"\x91x\xb7"
1756 b"\x99\xce\xc8\x92\n\xeb[\x10l*Y\xd8\xb1@\x06\xc8o\x8d7r\xebu\xfd5\x0e\x7f"
1757 b"\xf1$U{\t}\x1fQ\xcfxN\x9d\x9fXX\xe9`\x83\xc1\x06\xf4\x87v-f\x11\xdb/\\"
1758 b"\x06\xff\xd7)B\xf3g\x06\x88#2\x1eB244\x7f4q\t\xc893?mPX\x95\xa6a\xfb)d"
1759 b"\x9b\xfc\x98\x9aj\x04\xae\x9b\x9d\x19w\xba\xf92\xfaA\x11\\\x17\x97C3\xa4"
1760 b"\xbc!\x88\xcdo[\xec:\x030\x91.\x85\xe0@\\4\x16\x12\x9d\xcaJv\x97\xb04"
1761 b"\xack\xcbkf\xa3ss\xfc\x16^\x8ce\x85a\xa5=&\xecr\xb3p\xd1E\xd5\x80y\xc7"
1762 b"\xda\xf6\xfek\xbcT\xbfH\xee\x15o\xc5\x8c\x830\xec\x1d\x01\xae\x0c-e\\"
1763 b"\x91\x90\x94\xb2\xf8\x88\x91\xe8\x0b\xae\xa7>\x98\xf6\x9ck\xd2\xc6\x08"
1764 b"\xe6\xab\t\x98\xf2!\xa0\x8c^\xacqA\x99<\x1cEG\x97\xc8\xf1\xb6\xb9\x82"
1765 b"\x8d\xf7\x08s\x98a\xff\xe3\xcc\x92\x0e\xd2\xb6U\xd7\xd9\x86\x7fa\xe5\x1c"
1766 b"\x8dTG@\t\x1e\x0e7*\xfc\xde\xbc]6N\xf7\xf1\x84\x9e\x9f\xcf\xe9\x1e\xb5'"
1767 b"\xf4<\xdf\x99sq\xd0\x9d\xbd\x99\x0b\xb4%p4\xbf{\xbb\x8a\xd2\x0b\xbc=M"
1768 b"\x94H:\xf5\xa8\xd6\xa4\xc90\xc2D\xb9\xd3\xa8\xb0S\x87 `\xa2\xeb\xf3W\xce"
1769 b" 7\xf9N#\r\xe6\xbe\t\x9d\xe7\x811\xf9\x10\xc1\xc2\x14\xf6\xfc\xcba\xb7"
1770 b"\xb1\x7f\x95l\xe4\tjA\xec:\x10\xe5\xfe\xc2\\=D\xe2\x0c\x0b3]\xf7\xc1\xf7"
1771 b"\xbceZ\xb1A\xea\x16\xe5\xfddgFQ\xed\xaf\x04\xa3\xd3\xf8\xa2q\x19B\xd4r"
1772 b"\xc5\x0c\x9a\x14\x94\xea\x91\xc4o\xe4\xbb\xb4\x99\xf4@\xd1\xe6\x0c\xe3"
1773 b"\xc6d\xa0Q\n\xf2/\xd8\xb8S5\x8a\x18:\xb5g\xac\x95D\xce\x17\x07\xd4z\xda"
1774 b"\x90\xe65\x07\x19H!\t\xfdu\x16\x8e\x0eR\x19\xf4\x8cl\x0c\xf9Q\xf1\x80"
1775 b"\xe3\xbf\xd7O\xf8\x8c\x18\x0b\x9c\xf1\x1fb\xe1\tR\xb2\xf1\xe1A\xea \xcf-"
1776 b"IGE\xf1\x14\x98$\x83\x15\xc9\xd8j\xbf\x19\x0f\xd5\xd1\xaa\xb3\xf3\xa5I2s"
1777 b"\x8d\x145\xca\xd5\xd93\x9c\xb8D0\xe6\xaa%\xd0\xc0P}JO^h\x8e\x08\xadlV."
1778 b"\x18\x88\x13\x05o\xb0\x07\xeaw\xe0\xb6\xa4\xd5*\xe4r\xef\x07G+\xc1\xbei["
1779 b"w\xe8\xab@_\xef\x15y\xe5\x12\xc9W\x1b.\xad\x85-\xc2\xf7\xe3mU6g\x8eSA"
1780 b"\x01(\xd3\xdb\x16\x13=\xde\x92\xf9,D\xb8\x8a\xb2\xb4\xc9\xc3\xefnE\xe8\\"
1781 b"\xa6\xe2Y\xd2\xcf\xcb\x8c\xb6\xd5\xe9\x1d\x1e\x9a\x8b~\xe2\xa6\rE\x84uV"
1782 b"\xed\xc6\x99\xddm<\x10[\x0fu\x1f\xc1\x1d1\n\xcfw\xb2%!\xf0[\xce\x87\x83B"
1783 b"\x08\xaa,\x08%d\xcef\x94\"\xd9g.\xc83\xcbXY+4\xec\x85qA\n\x1d=9\xf0*\xb1"
1784 b"\x1f/\xf3s\xd61b\x7f@\xfb\x9d\xe3FQ\\\xbd\x82\x1e\x00\xf3\xce\xd3\xe1"
1785 b"\xca,E\xfd7[\xab\xb6\xb7\xac!mA}\xbd\x9d3R5\x9cF\xabH\xeb\x92)cc\x13\xd0"
1786 b"\xbd\xee\xe9n{\x1dIJB\xa5\xeb\x11\xe8`w&`\x8b}@Oxe\t\x8a\x07\x02\x95\xf2"
1787 b"\xed\xda|\xb1e\xbe\xaa\xbbg\x19@\xe1Y\x878\x84\x0f\x8c\xe3\xc98\xf2\x9e"
1788 b"\xd5N\xb5J\xef\xab!\xe2\x8dq\xe1\xe5q\xc5\xee\x11W\xb7\xe4k*\x027\xa0"
1789 b"\xa3J\xf4\xd8m\xd0q\x94\xcb\x07\n:\xb6`.\xe4\x9c\x15+\xc0)\xde\x80X\xd4"
1790 b"\xcfQm\x01\xc2cP\x1cA\x85'\xc9\xac\x8b\xe6\xb2)\xe6\x84t\x1c\x92\xe4Z"
1791 b"\x1cR\xb0\x9e\x96\xd1\xfb\x1c\xa6\x8b\xcb`\x10\x12]\xf2gR\x9bFT\xe0\xc8H"
1792 b"S\xfb\xac<\x04\xc7\xc1\xe8\xedP\xf4\x16\xdb\xc0\xd7e\xc2\x17J^\x1f\xab"
1793 b"\xff[\x08\x19\xb4\xf5\xfb\x19\xb4\x04\xe5c~']\xcb\xc2A\xec\x90\xd0\xed"
1794 b"\x06,\xc5K{\x86\x03\xb1\xcdMx\xdeQ\x8c3\xf9\x8a\xea=\x89\xaba\xd2\xc89a"
1795 b"\xd72\xf0\xc3\x19\x8a\xdfs\xd4\xfd\xbb\x81b\xeaE\"\xd8\xf4d\x0cD\xf7IJ!"
1796 b"\xe5d\xbbG\xe9\xcam\xaa\x0f_r\x95\x91NBq\xcaP\xce\xa7\xa9\xb5\x10\x94eP!"
1797 b"|\x856\xcd\xbfIir\xb8e\x9bjP\x97q\xabwS7\x1a\x0ehM\xe7\xca\x86?\xdeP}y~"
1798 b"\x0f\x95I\xfc\x13\xe1<Q\x1b\x868\x1d\x11\xdf\x94\xf4\x82>r\xa9k\x88\xcb"
1799 b"\xfd\xc3v\xe2\xb9\x8a\x02\x8eq\x92I\xf8\xf6\xf1\x03s\x9b\xb8\xe3\"\xe3"
1800 b"\xa9\xa5>D\xb8\x96;\xe7\x92\xd133\xe8\xdd'e\xc9.\xdc;\x17\x1f\xf5H\x13q"
1801 b"\xa4W\x0c\xdb~\x98\x01\xeb\xdf\xe32\x13\x0f\xddx\n6\xa0\t\x10\xb6\xbb"
1802 b"\xb0\xc3\x18\xb6;\x9fj[\xd9\xd5\xc9\x06\x8a\x87\xcd\xe5\xee\xfc\x9c-%@"
1803 b"\xee\xe0\xeb\xd2\xe3\xe8\xfb\xc0\x122\\\xc7\xaf\xc2\xa1Oth\xb3\x8f\x82"
1804 b"\xb3\x18\xa8\x07\xd5\xee_\xbe\xe0\x1cA\x1e_\r\x9a\xb0\x17W&\xa2D\x91\x94"
1805 b"\x1a\xb2\xef\xf2\xdc\x85;X\xb0,\xeb>-7S\xe5\xca\x07)\x1fp\x7f\xcaQBL\xca"
1806 b"\xf3\xb9d\xfc\xb5su\xb0\xc8\x95\x90\xeb*)\xa0v\xe4\x9a{FW\xf4l\xde\xcdj"
1807 b"\x00"
1808)
1809
animalize4ffd05d2019-09-12 22:20:37 +08001810ISSUE_21872_DAT = (
1811 b']\x00\x00@\x00h3\x00\x00\x00\x00\x00\x00\x00\x00`D\x0c\x99\xc8'
1812 b'\xd1\xbbZ^\xc43+\x83\xcd\xf1\xc6g\xec-\x061F\xb1\xbb\xc7\x17%-\xea'
1813 b'\xfap\xfb\x8fs\x128\xb2,\x88\xe4\xc0\x12|*x\xd0\xa2\xc4b\x1b!\x02c'
1814 b'\xab\xd9\x87U\xb8n \xfaVJ\x9a"\xb78\xff%_\x17`?@*\xc2\x82'
1815 b"\xf2^\x1b\xb8\x04&\xc0\xbb\x03g\x9d\xca\xe9\xa4\xc9\xaf'\xe5\x8e}"
1816 b'F\xdd\x11\xf3\x86\xbe\x1fN\x95\\\xef\xa2Mz-\xcb\x9a\xe3O@'
1817 b"\x19\x07\xf6\xee\x9e\x9ag\xc6\xa5w\rnG'\x99\xfd\xfeGI\xb0"
1818 b'\xbb\xf9\xc2\xe1\xff\xc5r\xcf\x85y[\x01\xa1\xbd\xcc/\xa3\x1b\x83\xaa'
1819 b'\xc6\xf9\x99\x0c\xb6_\xc9MQ+x\xa2F\xda]\xdd\xe8\xfb\x1a&'
1820 b',\xc4\x19\x1df\x81\x1e\x90\xf3\xb8Hgr\x85v\xbe\xa3qx\x01Y\xb5\x9fF'
1821 b"\x13\x18\x01\xe69\x9b\xc8'\x1e\x9d\xd6\xe4F\x84\xac\xf8d<\x11\xd5"
1822 b'\\\x0b\xeb\x0e\x82\xab\xb1\xe6\x1fka\xe1i\xc4 C\xb1"4)\xd6\xa7`\x02'
1823 b'\xec\x11\x8c\xf0\x14\xb0\x1d\x1c\xecy\xf0\xb7|\x11j\x85X\xb2!\x1c'
1824 b'\xac\xb5N\xc7\x85j\x9ev\xf5\xe6\x0b\xc1]c\xc15\x16\x9f\xd5\x99'
1825 b"\xfei^\xd2G\x9b\xbdl\xab:\xbe,\xa9'4\x82\xe5\xee\xb3\xc1"
1826 b'$\x93\x95\xa8Y\x16\xf5\xbf\xacw\x91\x04\x1d\x18\x06\xe9\xc5\xfdk\x06'
1827 b'\xe8\xfck\xc5\x86>\x8b~\xa4\xcb\xf1\xb3\x04\xf1\x04G5\xe2\xcc]'
1828 b'\x16\xbf\x140d\x18\xe2\xedw#(3\xca\xa1\x80bX\x7f\xb3\x84'
1829 b'\x9d\xdb\xe7\x08\x97\xcd\x16\xb9\xf1\xd5r+m\x1e\xcb3q\xc5\x9e\x92'
1830 b"\x7f\x8e*\xc7\xde\xe9\xe26\xcds\xb1\x10-\xf6r\x02?\x9d\xddCgJN'"
1831 b'\x11M\xfa\nQ\n\xe6`m\xb8N\xbbq\x8el\x0b\x02\xc7:q\x04G\xa1T'
1832 b'\xf1\xfe!0\x85~\xe5\x884\xe9\x89\xfb\x13J8\x15\xe42\xb6\xad'
1833 b'\x877A\x9a\xa6\xbft]\xd0\xe35M\xb0\x0cK\xc8\xf6\x88\xae\xed\xa9,j7'
1834 b'\x81\x13\xa0(\xcb\xe1\xe9l2\x7f\xcd\xda\x95(\xa70B\xbd\xf4\xe3'
1835 b'hp\x94\xbdJ\xd7\t\xc7g\xffo?\x89?\xf8}\x7f\xbc\x1c\x87'
1836 b'\x14\xc0\xcf\x8cV:\x9a\x0e\xd0\xb2\x1ck\xffk\xb9\xe0=\xc7\x8d/'
1837 b'\xb8\xff\x7f\x1d\x87`\x19.\x98X*~\xa7j\xb9\x0b"\xf4\xe4;V`\xb9\xd7'
1838 b'\x03\x1e\xd0t0\xd3\xde\x1fd\xb9\xe2)\x16\x81}\xb1\\b\x7fJ'
1839 b'\x92\xf4\xff\n+V!\xe9\xde\x98\xa0\x8fK\xdf7\xb9\xc0\x12\x1f\xe2'
1840 b'\xe9\xb0`\xae\x14\r\xa7\xc4\x81~\xd8\x8d\xc5\x06\xd8m\xb0Y\x8a)'
1841 b'\x06/\xbb\xf9\xac\xeaP\xe0\x91\x05m[\xe5z\xe6Z\xf3\x9f\xc7\xd0'
1842 b'\xd3\x8b\xf3\x8a\x1b\xfa\xe4Pf\xbc0\x17\x10\xa9\xd0\x95J{\xb3\xc3'
1843 b'\xfdW\x9bop\x0f\xbe\xaee\xa3]\x93\x9c\xda\xb75<\xf6g!\xcc\xb1\xfc\\'
1844 b'7\x152Mc\x17\x84\x9d\xcd35\r0\xacL-\xf3\xfb\xcb\x96\x1e\xe9U\x7f'
1845 b'\xd7\xca\xb0\xcc\x89\x0c*\xce\x14\xd1P\xf1\x03\xb6.~9o?\xe8'
1846 b'\r\x86\xe0\x92\x87}\xa3\x84\x03P\xe0\xc2\x7f\n;m\x9d\x9e\xb4|'
1847 b'\x8c\x18\xc0#0\xfe3\x07<\xda\xd8\xcf^\xd4Hi\xd6\xb3\x0bT'
1848 b'\x1dF\x88\x85q}\x02\xc6&\xc4\xae\xce\x9cU\xfa\x0f\xcc\xb6\x1f\x11'
1849 b'drw\x9eN\x19\xbd\xffz\x0f\xf0\x04s\xadR\xc1\xc0\xbfl\xf1\xba\xf95^'
1850 b'e\xb1\xfbVY\xd9\x9f\x1c\xbf*\xc4\xa86\x08+\xd6\x88[\xc4_rc\xf0f'
1851 b'\xb8\xd4\xec\x1dx\x19|\xbf\xa7\xe0\x82\x0b\x8c~\x10L/\x90\xd6\xfb'
1852 b'\x81\xdb\x98\xcc\x02\x14\xa5C\xb2\xa7i\xfd\xcd\x1fO\xf7\xe9\x89t\xf0'
1853 b'\x17\xa5\x1c\xad\xfe<Q`%\x075k\n7\x9eI\x82<#)&\x04\xc2\xf0C\xd4`!'
1854 b'\xcb\xa9\xf9\xb3F\x86\xb5\xc3M\xbeu\x12\xb2\xca\x95e\x10\x0b\xb1\xcc'
1855 b'\x01b\x9bXa\x1b[B\x8c\x07\x11Of;\xeaC\xebr\x8eb\xd9\x9c\xe4i]<z\x9a'
1856 b'\x03T\x8b9pF\x10\x8c\x84\xc7\x0e\xeaPw\xe5\xa0\x94\x1f\x84\xdd'
1857 b'a\xe8\x85\xc2\x00\xebq\xe7&Wo5q8\xc2t\x98\xab\xb7\x7f\xe64-H'
1858 b'\t\xb4d\xbe\x06\xe3Q\x8b\xa9J\xb0\x00\xd7s.\x85"\xc0p\x05'
1859 b'\x1c\x06N\x87\xa5\xf8\xc3g\x1b}\x0f\x0f\xc3|\x90\xea\xefd3X'
1860 b'[\xab\x04E\xf2\xf2\xc9\x08\x8a\xa8+W\xa2v\xec\x15G\x08/I<L\\1'
1861 b'\xff\x15O\xaa\x89{\xd1mW\x13\xbd~\xe1\x90^\xc4@\r\xed\xb5D@\xb4\x08'
1862 b'A\x90\xe69;\xc7BO\xdb\xda\xebu\x9e\xa9tN\xae\x8aJ5\xcd\x11\x1d\xea'
1863 b"\xe5\xa7\x04\xe6\x82Z\xc7O\xe46[7\xdco*[\xbe\x0b\xc9\xb7a\xab'\xf6"
1864 b"\xd1u\xdb\xd9q\xf5+y\x1b\x00\xb4\xf3a\xae\xf1M\xc4\xbc\xd00'\x06pQ"
1865 b'\x8dH\xaa\xaa\xc4\xd2K\x9b\xc0\xe9\xec=n\xa9\x1a\x8a\xc2\xe8\x18\xbc'
1866 b'\x93\xb8F\xa1\x8fOY\xe7\xda\xcf0\t\xff|\xd9\xe5\xcf\xe7\xf6\xbe'
1867 b'\xf8\x04\x17\xf2\xe5P\xa7y~\xce\x11h0\x81\x80d[\x00_v\xbbc\xdbI'
1868 b'3\xbc`W\xc0yrkB\xf5\x9f\xe9i\xc5\x8a^\x8d\xd4\x81\xd9\x05\xc1\xfc>'
1869 b'"\xd1v`\x82\xd5$\x89\xcf^\xd52.\xafd\xe8d@\xaa\xd5Y|\x90\x84'
1870 b'j\xdb}\x84riV\x8e\xf0X4rB\xf2NPS[\x8e\x88\xd4\x0fI\xb8'
1871 b'\xdd\xcb\x1d\xf2(\xdf;9\x9e|\xef^0;.*[\x9fl\x7f\xa2_X\xaff!\xbb\x03'
1872 b'\xff\x19\x8f\x88\xb5\xb6\x884\xa3\x05\xde3D{\xe3\xcb\xce\xe4t]'
1873 b'\x875\xe3Uf\xae\xea\x88\x1c\x03b\n\xb1,Q\xec\xcf\x08\t\xde@\x83\xaa<'
1874 b',-\xe4\xee\x9b\x843\xe5\x007\tK\xac\x057\xd6*X\xa3\xc6~\xba\xe6O'
1875 b'\x81kz"\xbe\xe43sL\xf1\xfa;\xf4^\x1e\xb4\x80\xe2\xbd\xaa\x17Z\xe1f'
1876 b'\xda\xa6\xb9\x07:]}\x9fa\x0b?\xba\xe7\xf15\x04M\xe3\n}M\xa4\xcb\r'
1877 b'2\x8a\x88\xa9\xa7\x92\x93\x84\x81Yo\x00\xcc\xc4\xab\x9aT\x96\x0b\xbe'
1878 b'U\xac\x1d\x8d\x1b\x98"\xf8\x8f\xf1u\xc1n\xcc\xfcA\xcc\x90\xb7i'
1879 b'\x83\x9c\x9c~\x1d4\xa2\xf0*J\xe7t\x12\xb4\xe3\xa0u\xd7\x95Z'
1880 b'\xf7\xafG\x96~ST,\xa7\rC\x06\xf4\xf0\xeb`2\x9e>Q\x0e\xf6\xf5\xc5'
1881 b'\x9b\xb5\xaf\xbe\xa3\x8f\xc0\xa3hu\x14\x12 \x97\x99\x04b\x8e\xc7\x1b'
1882 b'VKc\xc1\xf3 \xde\x85-:\xdc\x1f\xac\xce*\x06\xb3\x80;`'
1883 b'\xdb\xdd\x97\xfdg\xbf\xe7\xa8S\x08}\xf55e7\xb8/\xf0!\xc8'
1884 b"Y\xa8\x9a\x07'\xe2\xde\r\x02\xe1\xb2\x0c\xf4C\xcd\xf9\xcb(\xe8\x90"
1885 b'\xd3bTD\x15_\xf6\xc3\xfb\xb3E\xfc\xd6\x98{\xc6\\fz\x81\xa99\x85\xcb'
1886 b'\xa5\xb1\x1d\x94bqW\x1a!;z~\x18\x88\xe8i\xdb\x1b\x8d\x8d'
1887 b'\x06\xaa\x0e\x99s+5k\x00\xe4\xffh\xfe\xdbt\xa6\x1bU\xde\xa3'
1888 b'\xef\xcb\x86\x9e\x81\x16j\n\x9d\xbc\xbbC\x80?\x010\xc7Jj;'
1889 b'\xc4\xe5\x86\xd5\x0e0d#\xc6;\xb8\xd1\xc7c\xb5&8?\xd9J\xe5\xden\xb9'
1890 b'\xe9cb4\xbb\xe6\x14\xe0\xe7l\x1b\x85\x94\x1fh\xf1n\xdeZ\xbe'
1891 b'\x88\xff\xc2e\xca\xdc,B-\x8ac\xc9\xdf\xf5|&\xe4LL\xf0\x1f\xaa8\xbd'
1892 b'\xc26\x94bVi\xd3\x0c\x1c\xb6\xbb\x99F\x8f\x0e\xcc\x8e4\xc6/^W\xf5?'
1893 b'\xdc\x84(\x14dO\x9aD6\x0f4\xa3,\x0c\x0bS\x9fJ\xe1\xacc^\x8a0\t\x80D['
1894 b'\xb8\xe6\x86\xb0\xe8\xd4\xf9\x1en\xf1\xf5^\xeb\xb8\xb8\xf8'
1895 b')\xa8\xbf\xaa\x84\x86\xb1a \x95\x16\x08\x1c\xbb@\xbd+\r/\xfb'
1896 b'\x92\xfbh\xf1\x8d3\xf9\x92\xde`\xf1\x86\x03\xaa+\xd9\xd9\xc6P\xaf'
1897 b'\xe3-\xea\xa5\x0fB\xca\xde\xd5n^\xe3/\xbf\xa6w\xc8\x0e<M'
1898 b'\xc2\x1e!\xd4\xc6E\xf2\xad\x0c\xbc\x1d\x88Y\x03\x98<\x92\xd9\xa6B'
1899 b'\xc7\x83\xb5"\x97D|&\xc4\xd4\xfad\x0e\xde\x06\xa3\xc2\x9c`\xf2'
1900 b'7\x03\x1a\xed\xd80\x10\xe9\x0co\x10\xcf\x18\x16\xa7\x1c'
1901 b"\xe5\x96\xa4\xd9\xe1\xa5v;]\xb7\xa9\xdc'hA\xe3\x9c&\x98\x0b9\xdf~@"
1902 b'\xf8\xact\x87<\xf94\x0c\x9d\x93\xb0)\xe1\xa2\x0f\x1e=:&\xd56\xa5A+'
1903 b'\xab\xc4\x00\x8d\x81\x93\xd4\xd8<\x82k\\d\xd8v\xab\xbd^l5C?\xd4\xa0'
1904 b'M\x12C\xc8\x80\r\xc83\xe8\xc0\xf5\xdf\xca\x05\xf4BPjy\xbe\x91\x9bzE'
1905 b"\xd8[\x93oT\r\x13\x16'\x1a\xbd*H\xd6\xfe\r\xf3\x91M\x8b\xee\x8f7f"
1906 b"\x0b;\xaa\x85\xf2\xdd'\x0fwM \xbd\x13\xb9\xe5\xb8\xb7 D+P\x1c\xe4g"
1907 b'n\xd2\xf1kc\x15\xaf\xc6\x90V\x03\xc2UovfZ\xcc\xd23^\xb3\xe7\xbf'
1908 b'\xacv\x1d\x82\xedx\xa3J\xa9\xb7\xcf\x0c\xe6j\x96n*o\x18>'
1909 b'\xc6\xfd\x97_+D{\x03\x15\xe8s\xb1\xc8HAG\xcf\xf4\x1a\xdd'
1910 b'\xad\x11\xbf\x157q+\xdeW\x89g"X\x82\xfd~\xf7\xab4\xf6`\xab\xf1q'
1911 b')\x82\x10K\xe9sV\xfe\xe45\xafs*\x14\xa7;\xac{\x06\x9d<@\x93G'
1912 b'j\x1d\xefL\xe9\xd8\x92\x19&\xa1\x16\x19\x04\tu5\x01]\xf6\xf4'
1913 b'\xcd\\\xd8A|I\xd4\xeb\x05\x88C\xc6e\xacQ\xe9*\x97~\x9au\xf8Xy'
1914 b"\x17P\x10\x9f\n\x8c\xe2fZEu>\x9b\x1e\x91\x0b'`\xbd\xc0\xa8\x86c\x1d"
1915 b'Z\xe2\xdc8j\x95\xffU\x90\x1e\xf4o\xbc\xe5\xe3e>\xd2R\xc0b#\xbc\x15'
1916 b'H-\xb9!\xde\x9d\x90k\xdew\x9b{\x99\xde\xf7/K)A\xfd\xf5\xe6:\xda'
1917 b'UM\xcc\xbb\xa2\x0b\x9a\x93\xf5{9\xc0 \xd2((6i\xc0\xbbu\xd8\x9e\x8d'
1918 b'\xf8\x04q\x10\xd4\x14\x9e7-\xb9B\xea\x01Q8\xc8v\x9a\x12A\x88Cd\x92'
1919 b"\x1c\x8c!\xf4\x94\x87'\xe3\xcd\xae\xf7\xd8\x93\xfa\xde\xa8b\x9e\xee2"
1920 b'K\xdb\x00l\x9d\t\xb1|D\x05U\xbb\xf4>\xf1w\x887\xd1}W\x9d|g|1\xb0\x13'
1921 b"\xa3 \xe5\xbfm@\xc06+\xb7\t\xcf\x15D\x9a \x1fM\x1f\xd2\xb5'\xa9\xbb"
1922 b'~Co\x82\xfa\xc2\t\xe6f\xfc\xbeI\xae1\x8e\xbe\xb8\xcf\x86\x17'
1923 b'\x9f\xe2`\xbd\xaf\xba\xb9\xbc\x1b\xa3\xcd\x82\x8fwc\xefd\xa9\xd5\x14'
1924 b'\xe2C\xafUE\xb6\x11MJH\xd0=\x05\xd4*I\xff"\r\x1b^\xcaS6=\xec@\xd5'
1925 b'\x11,\xe0\x87Gr\xaa[\xb8\xbc>n\xbd\x81\x0c\x07<\xe9\x92('
1926 b'\xb2\xff\xac}\xe7\xb6\x15\x90\x9f~4\x9a\xe6\xd6\xd8s\xed\x99tf'
1927 b'\xa0f\xf8\xf1\x87\t\x96/)\x85\xb6\n\xd7\xb2w\x0b\xbc\xba\x99\xee'
1928 b'Q\xeen\x1d\xad\x03\xc3s\xd1\xfd\xa2\xc6\xb7\x9a\x9c(G<6\xad[~H '
1929 b'\x16\x89\x89\xd0\xc3\xd2\xca~\xac\xea\xa5\xed\xe5\xfb\r:'
1930 b'\x8e\xa6\xf1e\xbb\xba\xbd\xe0(\xa3\x89_\x01(\xb5c\xcc\x9f\x1fg'
1931 b'v\xfd\x17\xb3\x08S=S\xee\xfc\x85>\x91\x8d\x8d\nYR\xb3G\xd1A\xa2\xb1'
1932 b'\xec\xb0\x01\xd2\xcd\xf9\xfe\x82\x06O\xb3\xecd\xa9c\xe0\x8eP\x90\xce'
1933 b'\xe0\xcd\xd8\xd8\xdc\x9f\xaa\x01"[Q~\xe4\x88\xa1#\xc1\x12C\xcf'
1934 b'\xbe\x80\x11H\xbf\x86\xd8\xbem\xcfWFQ(X\x01DK\xdfB\xaa\x10.-'
1935 b'\xd5\x9e|\x86\x15\x86N]\xc7Z\x17\xcd=\xd7)M\xde\x15\xa4LTi\xa0\x15'
1936 b'\xd1\xe7\xbdN\xa4?\xd1\xe7\x02\xfe4\xe4O\x89\x98&\x96\x0f\x02\x9c'
1937 b'\x9e\x19\xaa\x13u7\xbd0\xdc\xd8\x93\xf4BNE\x1d\x93\x82\x81\x16'
1938 b'\xe5y\xcf\x98D\xca\x9a\xe2\xfd\xcdL\xcc\xd1\xfc_\x0b\x1c\xa0]\xdc'
1939 b'\xa91 \xc9c\xd8\xbf\x97\xcfp\xe6\x19-\xad\xff\xcc\xd1N(\xe8'
1940 b'\xeb#\x182\x96I\xf7l\xf3r\x00'
1941)
1942
Nadeem Vawda3ff069e2011-11-30 00:25:06 +02001943
1944def test_main():
1945 run_unittest(
1946 CompressorDecompressorTestCase,
1947 CompressDecompressFunctionTestCase,
1948 FileTestCase,
Nadeem Vawdae8604042012-06-04 23:38:12 +02001949 OpenTestCase,
Nadeem Vawda3ff069e2011-11-30 00:25:06 +02001950 MiscellaneousTestCase,
1951 )
1952
1953if __name__ == "__main__":
1954 test_main()