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