blob: 3dc2c1e7e3b779e3e54ad598aba15d2a41444dcf [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
336 @bigmemtest(size=_4G + 100, memuse=2)
337 def test_compressor_bigmem(self, size):
338 lzc = LZMACompressor()
339 cdata = lzc.compress(b"x" * size) + lzc.flush()
340 ddata = lzma.decompress(cdata)
341 try:
342 self.assertEqual(len(ddata), size)
343 self.assertEqual(len(ddata.strip(b"x")), 0)
344 finally:
345 ddata = None
346
347 @bigmemtest(size=_4G + 100, memuse=3)
348 def test_decompressor_bigmem(self, size):
349 lzd = LZMADecompressor()
350 blocksize = 10 * 1024 * 1024
351 block = random.getrandbits(blocksize * 8).to_bytes(blocksize, "little")
352 try:
353 input = block * (size // blocksize + 1)
354 cdata = lzma.compress(input)
355 ddata = lzd.decompress(cdata)
356 self.assertEqual(ddata, input)
357 finally:
358 input = cdata = ddata = None
359
Nadeem Vawda37970652013-10-28 21:35:23 +0100360 # Pickling raises an exception; there's no way to serialize an lzma_stream.
361
362 def test_pickle(self):
Serhiy Storchakabad12572014-12-15 14:03:42 +0200363 for proto in range(pickle.HIGHEST_PROTOCOL + 1):
364 with self.assertRaises(TypeError):
365 pickle.dumps(LZMACompressor(), proto)
366 with self.assertRaises(TypeError):
367 pickle.dumps(LZMADecompressor(), proto)
Nadeem Vawda37970652013-10-28 21:35:23 +0100368
Oren Milmand019bc82018-02-13 12:28:33 +0200369 @support.refcount_test
370 def test_refleaks_in_decompressor___init__(self):
371 gettotalrefcount = support.get_attribute(sys, 'gettotalrefcount')
372 lzd = LZMADecompressor()
373 refs_before = gettotalrefcount()
374 for i in range(100):
375 lzd.__init__()
376 self.assertAlmostEqual(gettotalrefcount() - refs_before, 0, delta=10)
377
Nadeem Vawda3ff069e2011-11-30 00:25:06 +0200378
379class CompressDecompressFunctionTestCase(unittest.TestCase):
380
381 # Test error cases:
382
383 def test_bad_args(self):
384 self.assertRaises(TypeError, lzma.compress)
385 self.assertRaises(TypeError, lzma.compress, [])
386 self.assertRaises(TypeError, lzma.compress, b"", format="xz")
387 self.assertRaises(TypeError, lzma.compress, b"", check="none")
388 self.assertRaises(TypeError, lzma.compress, b"", preset="blah")
389 self.assertRaises(TypeError, lzma.compress, b"", filters=1024)
390 # Can't specify a preset and a custom filter chain at the same time.
391 with self.assertRaises(ValueError):
392 lzma.compress(b"", preset=3, filters=[{"id": lzma.FILTER_LZMA2}])
393
394 self.assertRaises(TypeError, lzma.decompress)
395 self.assertRaises(TypeError, lzma.decompress, [])
396 self.assertRaises(TypeError, lzma.decompress, b"", format="lzma")
397 self.assertRaises(TypeError, lzma.decompress, b"", memlimit=7.3e9)
398 with self.assertRaises(TypeError):
399 lzma.decompress(b"", format=lzma.FORMAT_RAW, filters={})
400 # Cannot specify a memory limit with FILTER_RAW.
401 with self.assertRaises(ValueError):
402 lzma.decompress(b"", format=lzma.FORMAT_RAW, memlimit=0x1000000)
403 # Can only specify a custom filter chain with FILTER_RAW.
404 with self.assertRaises(ValueError):
405 lzma.decompress(b"", filters=FILTERS_RAW_1)
406 with self.assertRaises(ValueError):
407 lzma.decompress(b"", format=lzma.FORMAT_XZ, filters=FILTERS_RAW_1)
408 with self.assertRaises(ValueError):
409 lzma.decompress(
410 b"", format=lzma.FORMAT_ALONE, filters=FILTERS_RAW_1)
411
412 def test_decompress_memlimit(self):
413 with self.assertRaises(LZMAError):
414 lzma.decompress(COMPRESSED_XZ, memlimit=1024)
415 with self.assertRaises(LZMAError):
416 lzma.decompress(
417 COMPRESSED_XZ, format=lzma.FORMAT_XZ, memlimit=1024)
418 with self.assertRaises(LZMAError):
419 lzma.decompress(
420 COMPRESSED_ALONE, format=lzma.FORMAT_ALONE, memlimit=1024)
421
422 # Test LZMADecompressor on known-good input data.
423
424 def test_decompress_good_input(self):
425 ddata = lzma.decompress(COMPRESSED_XZ)
426 self.assertEqual(ddata, INPUT)
427
428 ddata = lzma.decompress(COMPRESSED_ALONE)
429 self.assertEqual(ddata, INPUT)
430
431 ddata = lzma.decompress(COMPRESSED_XZ, lzma.FORMAT_XZ)
432 self.assertEqual(ddata, INPUT)
433
434 ddata = lzma.decompress(COMPRESSED_ALONE, lzma.FORMAT_ALONE)
435 self.assertEqual(ddata, INPUT)
436
437 ddata = lzma.decompress(
438 COMPRESSED_RAW_1, lzma.FORMAT_RAW, filters=FILTERS_RAW_1)
439 self.assertEqual(ddata, INPUT)
440
441 ddata = lzma.decompress(
442 COMPRESSED_RAW_2, lzma.FORMAT_RAW, filters=FILTERS_RAW_2)
443 self.assertEqual(ddata, INPUT)
444
445 ddata = lzma.decompress(
446 COMPRESSED_RAW_3, lzma.FORMAT_RAW, filters=FILTERS_RAW_3)
447 self.assertEqual(ddata, INPUT)
448
449 ddata = lzma.decompress(
450 COMPRESSED_RAW_4, lzma.FORMAT_RAW, filters=FILTERS_RAW_4)
451 self.assertEqual(ddata, INPUT)
452
453 def test_decompress_incomplete_input(self):
454 self.assertRaises(LZMAError, lzma.decompress, COMPRESSED_XZ[:128])
455 self.assertRaises(LZMAError, lzma.decompress, COMPRESSED_ALONE[:128])
456 self.assertRaises(LZMAError, lzma.decompress, COMPRESSED_RAW_1[:128],
457 format=lzma.FORMAT_RAW, filters=FILTERS_RAW_1)
458 self.assertRaises(LZMAError, lzma.decompress, COMPRESSED_RAW_2[:128],
459 format=lzma.FORMAT_RAW, filters=FILTERS_RAW_2)
460 self.assertRaises(LZMAError, lzma.decompress, COMPRESSED_RAW_3[:128],
461 format=lzma.FORMAT_RAW, filters=FILTERS_RAW_3)
462 self.assertRaises(LZMAError, lzma.decompress, COMPRESSED_RAW_4[:128],
463 format=lzma.FORMAT_RAW, filters=FILTERS_RAW_4)
464
465 def test_decompress_bad_input(self):
466 with self.assertRaises(LZMAError):
Nadeem Vawda9c72ebc2013-12-04 23:03:49 +0100467 lzma.decompress(COMPRESSED_BOGUS)
468 with self.assertRaises(LZMAError):
Nadeem Vawda3ff069e2011-11-30 00:25:06 +0200469 lzma.decompress(COMPRESSED_RAW_1)
470 with self.assertRaises(LZMAError):
471 lzma.decompress(COMPRESSED_ALONE, format=lzma.FORMAT_XZ)
472 with self.assertRaises(LZMAError):
473 lzma.decompress(COMPRESSED_XZ, format=lzma.FORMAT_ALONE)
474 with self.assertRaises(LZMAError):
475 lzma.decompress(COMPRESSED_XZ, format=lzma.FORMAT_RAW,
476 filters=FILTERS_RAW_1)
477
478 # Test that compress()->decompress() preserves the input data.
479
480 def test_roundtrip(self):
481 cdata = lzma.compress(INPUT)
482 ddata = lzma.decompress(cdata)
483 self.assertEqual(ddata, INPUT)
484
485 cdata = lzma.compress(INPUT, lzma.FORMAT_XZ)
486 ddata = lzma.decompress(cdata)
487 self.assertEqual(ddata, INPUT)
488
489 cdata = lzma.compress(INPUT, lzma.FORMAT_ALONE)
490 ddata = lzma.decompress(cdata)
491 self.assertEqual(ddata, INPUT)
492
493 cdata = lzma.compress(INPUT, lzma.FORMAT_RAW, filters=FILTERS_RAW_4)
494 ddata = lzma.decompress(cdata, lzma.FORMAT_RAW, filters=FILTERS_RAW_4)
495 self.assertEqual(ddata, INPUT)
496
497 # Unlike LZMADecompressor, decompress() *does* handle concatenated streams.
498
499 def test_decompress_multistream(self):
500 ddata = lzma.decompress(COMPRESSED_XZ + COMPRESSED_ALONE)
501 self.assertEqual(ddata, INPUT * 2)
502
Nadeem Vawda9c72ebc2013-12-04 23:03:49 +0100503 # Test robust handling of non-LZMA data following the compressed stream(s).
504
505 def test_decompress_trailing_junk(self):
506 ddata = lzma.decompress(COMPRESSED_XZ + COMPRESSED_BOGUS)
507 self.assertEqual(ddata, INPUT)
508
509 def test_decompress_multistream_trailing_junk(self):
510 ddata = lzma.decompress(COMPRESSED_XZ * 3 + COMPRESSED_BOGUS)
511 self.assertEqual(ddata, INPUT * 3)
512
Nadeem Vawda3ff069e2011-11-30 00:25:06 +0200513
514class TempFile:
515 """Context manager - creates a file, and deletes it on __exit__."""
516
517 def __init__(self, filename, data=b""):
518 self.filename = filename
519 self.data = data
520
521 def __enter__(self):
522 with open(self.filename, "wb") as f:
523 f.write(self.data)
524
525 def __exit__(self, *args):
526 unlink(self.filename)
527
528
529class FileTestCase(unittest.TestCase):
530
531 def test_init(self):
Nadeem Vawda33c34da2012-06-04 23:34:07 +0200532 with LZMAFile(BytesIO(COMPRESSED_XZ)) as f:
Nadeem Vawda3ff069e2011-11-30 00:25:06 +0200533 pass
Nadeem Vawda33c34da2012-06-04 23:34:07 +0200534 with LZMAFile(BytesIO(), "w") as f:
Nadeem Vawda3ff069e2011-11-30 00:25:06 +0200535 pass
Nadeem Vawda42ca9822013-10-19 00:06:19 +0200536 with LZMAFile(BytesIO(), "x") as f:
537 pass
Nadeem Vawda33c34da2012-06-04 23:34:07 +0200538 with LZMAFile(BytesIO(), "a") as f:
Nadeem Vawda3ff069e2011-11-30 00:25:06 +0200539 pass
540
Berker Peksag5f59ddd2016-10-04 20:41:20 +0300541 def test_init_with_PathLike_filename(self):
542 filename = pathlib.Path(TESTFN)
543 with TempFile(filename, COMPRESSED_XZ):
544 with LZMAFile(filename) as f:
545 self.assertEqual(f.read(), INPUT)
546 with LZMAFile(filename, "a") as f:
547 f.write(INPUT)
548 with LZMAFile(filename) as f:
549 self.assertEqual(f.read(), INPUT * 2)
550
Nadeem Vawda3ff069e2011-11-30 00:25:06 +0200551 def test_init_with_filename(self):
552 with TempFile(TESTFN, COMPRESSED_XZ):
553 with LZMAFile(TESTFN) as f:
554 pass
555 with LZMAFile(TESTFN, "w") as f:
556 pass
557 with LZMAFile(TESTFN, "a") as f:
558 pass
559
Nadeem Vawda6cbb20c2012-06-04 23:36:24 +0200560 def test_init_mode(self):
561 with TempFile(TESTFN):
562 with LZMAFile(TESTFN, "r"):
563 pass
564 with LZMAFile(TESTFN, "rb"):
565 pass
566 with LZMAFile(TESTFN, "w"):
567 pass
568 with LZMAFile(TESTFN, "wb"):
569 pass
570 with LZMAFile(TESTFN, "a"):
571 pass
572 with LZMAFile(TESTFN, "ab"):
573 pass
574
Nadeem Vawda42ca9822013-10-19 00:06:19 +0200575 def test_init_with_x_mode(self):
576 self.addCleanup(unlink, TESTFN)
577 for mode in ("x", "xb"):
578 unlink(TESTFN)
579 with LZMAFile(TESTFN, mode):
580 pass
581 with self.assertRaises(FileExistsError):
582 with LZMAFile(TESTFN, mode):
583 pass
584
Nadeem Vawda3ff069e2011-11-30 00:25:06 +0200585 def test_init_bad_mode(self):
586 with self.assertRaises(ValueError):
Nadeem Vawda33c34da2012-06-04 23:34:07 +0200587 LZMAFile(BytesIO(COMPRESSED_XZ), (3, "x"))
Nadeem Vawda3ff069e2011-11-30 00:25:06 +0200588 with self.assertRaises(ValueError):
Nadeem Vawda33c34da2012-06-04 23:34:07 +0200589 LZMAFile(BytesIO(COMPRESSED_XZ), "")
Nadeem Vawda3ff069e2011-11-30 00:25:06 +0200590 with self.assertRaises(ValueError):
Nadeem Vawda42ca9822013-10-19 00:06:19 +0200591 LZMAFile(BytesIO(COMPRESSED_XZ), "xt")
592 with self.assertRaises(ValueError):
593 LZMAFile(BytesIO(COMPRESSED_XZ), "x+")
594 with self.assertRaises(ValueError):
595 LZMAFile(BytesIO(COMPRESSED_XZ), "rx")
596 with self.assertRaises(ValueError):
597 LZMAFile(BytesIO(COMPRESSED_XZ), "wx")
Nadeem Vawda3ff069e2011-11-30 00:25:06 +0200598 with self.assertRaises(ValueError):
Nadeem Vawda6cbb20c2012-06-04 23:36:24 +0200599 LZMAFile(BytesIO(COMPRESSED_XZ), "rt")
Nadeem Vawda3ff069e2011-11-30 00:25:06 +0200600 with self.assertRaises(ValueError):
Nadeem Vawda33c34da2012-06-04 23:34:07 +0200601 LZMAFile(BytesIO(COMPRESSED_XZ), "r+")
Nadeem Vawda3ff069e2011-11-30 00:25:06 +0200602 with self.assertRaises(ValueError):
Nadeem Vawda6cbb20c2012-06-04 23:36:24 +0200603 LZMAFile(BytesIO(COMPRESSED_XZ), "wt")
Nadeem Vawda3ff069e2011-11-30 00:25:06 +0200604 with self.assertRaises(ValueError):
Nadeem Vawda33c34da2012-06-04 23:34:07 +0200605 LZMAFile(BytesIO(COMPRESSED_XZ), "w+")
Nadeem Vawda3ff069e2011-11-30 00:25:06 +0200606 with self.assertRaises(ValueError):
Nadeem Vawda33c34da2012-06-04 23:34:07 +0200607 LZMAFile(BytesIO(COMPRESSED_XZ), "rw")
Nadeem Vawda3ff069e2011-11-30 00:25:06 +0200608
609 def test_init_bad_check(self):
610 with self.assertRaises(TypeError):
Nadeem Vawda33c34da2012-06-04 23:34:07 +0200611 LZMAFile(BytesIO(), "w", check=b"asd")
Nadeem Vawda3ff069e2011-11-30 00:25:06 +0200612 # CHECK_UNKNOWN and anything above CHECK_ID_MAX should be invalid.
613 with self.assertRaises(LZMAError):
Nadeem Vawda33c34da2012-06-04 23:34:07 +0200614 LZMAFile(BytesIO(), "w", check=lzma.CHECK_UNKNOWN)
Nadeem Vawda3ff069e2011-11-30 00:25:06 +0200615 with self.assertRaises(LZMAError):
Nadeem Vawda33c34da2012-06-04 23:34:07 +0200616 LZMAFile(BytesIO(), "w", check=lzma.CHECK_ID_MAX + 3)
Nadeem Vawda3ff069e2011-11-30 00:25:06 +0200617 # Cannot specify a check with mode="r".
618 with self.assertRaises(ValueError):
Nadeem Vawda33c34da2012-06-04 23:34:07 +0200619 LZMAFile(BytesIO(COMPRESSED_XZ), check=lzma.CHECK_NONE)
Nadeem Vawda3ff069e2011-11-30 00:25:06 +0200620 with self.assertRaises(ValueError):
Nadeem Vawda33c34da2012-06-04 23:34:07 +0200621 LZMAFile(BytesIO(COMPRESSED_XZ), check=lzma.CHECK_CRC32)
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_CRC64)
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_SHA256)
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_UNKNOWN)
Nadeem Vawda3ff069e2011-11-30 00:25:06 +0200628
629 def test_init_bad_preset(self):
630 with self.assertRaises(TypeError):
Nadeem Vawda33c34da2012-06-04 23:34:07 +0200631 LZMAFile(BytesIO(), "w", preset=4.39)
Nadeem Vawda3ff069e2011-11-30 00:25:06 +0200632 with self.assertRaises(LZMAError):
Nadeem Vawda33c34da2012-06-04 23:34:07 +0200633 LZMAFile(BytesIO(), "w", preset=10)
Nadeem Vawda3ff069e2011-11-30 00:25:06 +0200634 with self.assertRaises(LZMAError):
Nadeem Vawda33c34da2012-06-04 23:34:07 +0200635 LZMAFile(BytesIO(), "w", preset=23)
Nadeem Vawda3ff069e2011-11-30 00:25:06 +0200636 with self.assertRaises(OverflowError):
Nadeem Vawda33c34da2012-06-04 23:34:07 +0200637 LZMAFile(BytesIO(), "w", preset=-1)
Nadeem Vawda3ff069e2011-11-30 00:25:06 +0200638 with self.assertRaises(OverflowError):
Nadeem Vawda33c34da2012-06-04 23:34:07 +0200639 LZMAFile(BytesIO(), "w", preset=-7)
Nadeem Vawda3ff069e2011-11-30 00:25:06 +0200640 with self.assertRaises(TypeError):
Nadeem Vawda33c34da2012-06-04 23:34:07 +0200641 LZMAFile(BytesIO(), "w", preset="foo")
Nadeem Vawda3ff069e2011-11-30 00:25:06 +0200642 # Cannot specify a preset with mode="r".
643 with self.assertRaises(ValueError):
Nadeem Vawda33c34da2012-06-04 23:34:07 +0200644 LZMAFile(BytesIO(COMPRESSED_XZ), preset=3)
Nadeem Vawda3ff069e2011-11-30 00:25:06 +0200645
646 def test_init_bad_filter_spec(self):
647 with self.assertRaises(TypeError):
Nadeem Vawda33c34da2012-06-04 23:34:07 +0200648 LZMAFile(BytesIO(), "w", filters=[b"wobsite"])
Nadeem Vawda3ff069e2011-11-30 00:25:06 +0200649 with self.assertRaises(ValueError):
Nadeem Vawda33c34da2012-06-04 23:34:07 +0200650 LZMAFile(BytesIO(), "w", filters=[{"xyzzy": 3}])
Nadeem Vawda3ff069e2011-11-30 00:25:06 +0200651 with self.assertRaises(ValueError):
Nadeem Vawda33c34da2012-06-04 23:34:07 +0200652 LZMAFile(BytesIO(), "w", filters=[{"id": 98765}])
Nadeem Vawda3ff069e2011-11-30 00:25:06 +0200653 with self.assertRaises(ValueError):
Nadeem Vawda33c34da2012-06-04 23:34:07 +0200654 LZMAFile(BytesIO(), "w",
Nadeem Vawda3ff069e2011-11-30 00:25:06 +0200655 filters=[{"id": lzma.FILTER_LZMA2, "foo": 0}])
656 with self.assertRaises(ValueError):
Nadeem Vawda33c34da2012-06-04 23:34:07 +0200657 LZMAFile(BytesIO(), "w",
Nadeem Vawda3ff069e2011-11-30 00:25:06 +0200658 filters=[{"id": lzma.FILTER_DELTA, "foo": 0}])
659 with self.assertRaises(ValueError):
Nadeem Vawda33c34da2012-06-04 23:34:07 +0200660 LZMAFile(BytesIO(), "w",
Nadeem Vawda3ff069e2011-11-30 00:25:06 +0200661 filters=[{"id": lzma.FILTER_X86, "foo": 0}])
662
663 def test_init_with_preset_and_filters(self):
664 with self.assertRaises(ValueError):
Nadeem Vawda33c34da2012-06-04 23:34:07 +0200665 LZMAFile(BytesIO(), "w", format=lzma.FORMAT_RAW,
666 preset=6, filters=FILTERS_RAW_1)
Nadeem Vawda3ff069e2011-11-30 00:25:06 +0200667
668 def test_close(self):
669 with BytesIO(COMPRESSED_XZ) as src:
Nadeem Vawda33c34da2012-06-04 23:34:07 +0200670 f = LZMAFile(src)
Nadeem Vawda3ff069e2011-11-30 00:25:06 +0200671 f.close()
672 # LZMAFile.close() should not close the underlying file object.
673 self.assertFalse(src.closed)
674 # Try closing an already-closed LZMAFile.
675 f.close()
676 self.assertFalse(src.closed)
677
678 # Test with a real file on disk, opened directly by LZMAFile.
679 with TempFile(TESTFN, COMPRESSED_XZ):
680 f = LZMAFile(TESTFN)
681 fp = f._fp
682 f.close()
683 # Here, LZMAFile.close() *should* close the underlying file object.
684 self.assertTrue(fp.closed)
685 # Try closing an already-closed LZMAFile.
686 f.close()
687
688 def test_closed(self):
Nadeem Vawda33c34da2012-06-04 23:34:07 +0200689 f = LZMAFile(BytesIO(COMPRESSED_XZ))
Nadeem Vawda3ff069e2011-11-30 00:25:06 +0200690 try:
691 self.assertFalse(f.closed)
692 f.read()
693 self.assertFalse(f.closed)
694 finally:
695 f.close()
696 self.assertTrue(f.closed)
697
Nadeem Vawda33c34da2012-06-04 23:34:07 +0200698 f = LZMAFile(BytesIO(), "w")
Nadeem Vawda3ff069e2011-11-30 00:25:06 +0200699 try:
700 self.assertFalse(f.closed)
701 finally:
702 f.close()
703 self.assertTrue(f.closed)
704
705 def test_fileno(self):
Nadeem Vawda33c34da2012-06-04 23:34:07 +0200706 f = LZMAFile(BytesIO(COMPRESSED_XZ))
Nadeem Vawda3ff069e2011-11-30 00:25:06 +0200707 try:
708 self.assertRaises(UnsupportedOperation, f.fileno)
709 finally:
710 f.close()
711 self.assertRaises(ValueError, f.fileno)
712 with TempFile(TESTFN, COMPRESSED_XZ):
713 f = LZMAFile(TESTFN)
714 try:
715 self.assertEqual(f.fileno(), f._fp.fileno())
716 self.assertIsInstance(f.fileno(), int)
717 finally:
718 f.close()
719 self.assertRaises(ValueError, f.fileno)
720
721 def test_seekable(self):
Nadeem Vawda33c34da2012-06-04 23:34:07 +0200722 f = LZMAFile(BytesIO(COMPRESSED_XZ))
Nadeem Vawda3ff069e2011-11-30 00:25:06 +0200723 try:
724 self.assertTrue(f.seekable())
725 f.read()
726 self.assertTrue(f.seekable())
727 finally:
728 f.close()
729 self.assertRaises(ValueError, f.seekable)
730
Nadeem Vawda33c34da2012-06-04 23:34:07 +0200731 f = LZMAFile(BytesIO(), "w")
Nadeem Vawda3ff069e2011-11-30 00:25:06 +0200732 try:
733 self.assertFalse(f.seekable())
734 finally:
735 f.close()
736 self.assertRaises(ValueError, f.seekable)
737
Nadeem Vawdaae557d72012-02-12 01:51:38 +0200738 src = BytesIO(COMPRESSED_XZ)
739 src.seekable = lambda: False
Nadeem Vawda33c34da2012-06-04 23:34:07 +0200740 f = LZMAFile(src)
Nadeem Vawdaae557d72012-02-12 01:51:38 +0200741 try:
742 self.assertFalse(f.seekable())
743 finally:
744 f.close()
745 self.assertRaises(ValueError, f.seekable)
746
Nadeem Vawda3ff069e2011-11-30 00:25:06 +0200747 def test_readable(self):
Nadeem Vawda33c34da2012-06-04 23:34:07 +0200748 f = LZMAFile(BytesIO(COMPRESSED_XZ))
Nadeem Vawda3ff069e2011-11-30 00:25:06 +0200749 try:
750 self.assertTrue(f.readable())
751 f.read()
752 self.assertTrue(f.readable())
753 finally:
754 f.close()
755 self.assertRaises(ValueError, f.readable)
756
Nadeem Vawda33c34da2012-06-04 23:34:07 +0200757 f = LZMAFile(BytesIO(), "w")
Nadeem Vawda3ff069e2011-11-30 00:25:06 +0200758 try:
759 self.assertFalse(f.readable())
760 finally:
761 f.close()
762 self.assertRaises(ValueError, f.readable)
763
764 def test_writable(self):
Nadeem Vawda33c34da2012-06-04 23:34:07 +0200765 f = LZMAFile(BytesIO(COMPRESSED_XZ))
Nadeem Vawda3ff069e2011-11-30 00:25:06 +0200766 try:
767 self.assertFalse(f.writable())
768 f.read()
769 self.assertFalse(f.writable())
770 finally:
771 f.close()
772 self.assertRaises(ValueError, f.writable)
773
Nadeem Vawda33c34da2012-06-04 23:34:07 +0200774 f = LZMAFile(BytesIO(), "w")
Nadeem Vawda3ff069e2011-11-30 00:25:06 +0200775 try:
776 self.assertTrue(f.writable())
777 finally:
778 f.close()
779 self.assertRaises(ValueError, f.writable)
780
781 def test_read(self):
Nadeem Vawda33c34da2012-06-04 23:34:07 +0200782 with LZMAFile(BytesIO(COMPRESSED_XZ)) as f:
Nadeem Vawda3ff069e2011-11-30 00:25:06 +0200783 self.assertEqual(f.read(), INPUT)
784 self.assertEqual(f.read(), b"")
Nadeem Vawda33c34da2012-06-04 23:34:07 +0200785 with LZMAFile(BytesIO(COMPRESSED_ALONE)) as f:
Nadeem Vawda3ff069e2011-11-30 00:25:06 +0200786 self.assertEqual(f.read(), INPUT)
Nadeem Vawda33c34da2012-06-04 23:34:07 +0200787 with LZMAFile(BytesIO(COMPRESSED_XZ), format=lzma.FORMAT_XZ) as f:
Nadeem Vawda3ff069e2011-11-30 00:25:06 +0200788 self.assertEqual(f.read(), INPUT)
789 self.assertEqual(f.read(), b"")
Nadeem Vawda33c34da2012-06-04 23:34:07 +0200790 with LZMAFile(BytesIO(COMPRESSED_ALONE), format=lzma.FORMAT_ALONE) as f:
Nadeem Vawda3ff069e2011-11-30 00:25:06 +0200791 self.assertEqual(f.read(), INPUT)
792 self.assertEqual(f.read(), b"")
Nadeem Vawda33c34da2012-06-04 23:34:07 +0200793 with LZMAFile(BytesIO(COMPRESSED_RAW_1),
Nadeem Vawda3ff069e2011-11-30 00:25:06 +0200794 format=lzma.FORMAT_RAW, filters=FILTERS_RAW_1) as f:
795 self.assertEqual(f.read(), INPUT)
796 self.assertEqual(f.read(), b"")
Nadeem Vawda33c34da2012-06-04 23:34:07 +0200797 with LZMAFile(BytesIO(COMPRESSED_RAW_2),
Nadeem Vawda3ff069e2011-11-30 00:25:06 +0200798 format=lzma.FORMAT_RAW, filters=FILTERS_RAW_2) as f:
799 self.assertEqual(f.read(), INPUT)
800 self.assertEqual(f.read(), b"")
Nadeem Vawda33c34da2012-06-04 23:34:07 +0200801 with LZMAFile(BytesIO(COMPRESSED_RAW_3),
Nadeem Vawda3ff069e2011-11-30 00:25:06 +0200802 format=lzma.FORMAT_RAW, filters=FILTERS_RAW_3) as f:
803 self.assertEqual(f.read(), INPUT)
804 self.assertEqual(f.read(), b"")
Nadeem Vawda33c34da2012-06-04 23:34:07 +0200805 with LZMAFile(BytesIO(COMPRESSED_RAW_4),
Nadeem Vawda3ff069e2011-11-30 00:25:06 +0200806 format=lzma.FORMAT_RAW, filters=FILTERS_RAW_4) as f:
807 self.assertEqual(f.read(), INPUT)
808 self.assertEqual(f.read(), b"")
809
810 def test_read_0(self):
Nadeem Vawda33c34da2012-06-04 23:34:07 +0200811 with LZMAFile(BytesIO(COMPRESSED_XZ)) as f:
Nadeem Vawda3ff069e2011-11-30 00:25:06 +0200812 self.assertEqual(f.read(0), b"")
Nadeem Vawda33c34da2012-06-04 23:34:07 +0200813 with LZMAFile(BytesIO(COMPRESSED_ALONE)) 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_XZ), format=lzma.FORMAT_XZ) 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_ALONE), format=lzma.FORMAT_ALONE) as f:
Nadeem Vawda3ff069e2011-11-30 00:25:06 +0200818 self.assertEqual(f.read(0), b"")
819
820 def test_read_10(self):
Nadeem Vawda33c34da2012-06-04 23:34:07 +0200821 with LZMAFile(BytesIO(COMPRESSED_XZ)) as f:
Nadeem Vawda3ff069e2011-11-30 00:25:06 +0200822 chunks = []
823 while True:
824 result = f.read(10)
825 if not result:
826 break
827 self.assertLessEqual(len(result), 10)
828 chunks.append(result)
829 self.assertEqual(b"".join(chunks), INPUT)
830
831 def test_read_multistream(self):
Nadeem Vawda33c34da2012-06-04 23:34:07 +0200832 with LZMAFile(BytesIO(COMPRESSED_XZ * 5)) as f:
Nadeem Vawda3ff069e2011-11-30 00:25:06 +0200833 self.assertEqual(f.read(), INPUT * 5)
Nadeem Vawda33c34da2012-06-04 23:34:07 +0200834 with LZMAFile(BytesIO(COMPRESSED_XZ + COMPRESSED_ALONE)) as f:
Nadeem Vawda3ff069e2011-11-30 00:25:06 +0200835 self.assertEqual(f.read(), INPUT * 2)
Nadeem Vawda33c34da2012-06-04 23:34:07 +0200836 with LZMAFile(BytesIO(COMPRESSED_RAW_3 * 4),
Nadeem Vawda3ff069e2011-11-30 00:25:06 +0200837 format=lzma.FORMAT_RAW, filters=FILTERS_RAW_3) as f:
838 self.assertEqual(f.read(), INPUT * 4)
839
840 def test_read_multistream_buffer_size_aligned(self):
841 # Test the case where a stream boundary coincides with the end
842 # of the raw read buffer.
Antoine Pitrou2dbc6e62015-04-11 00:31:01 +0200843 saved_buffer_size = _compression.BUFFER_SIZE
844 _compression.BUFFER_SIZE = len(COMPRESSED_XZ)
Nadeem Vawda3ff069e2011-11-30 00:25:06 +0200845 try:
Nadeem Vawda33c34da2012-06-04 23:34:07 +0200846 with LZMAFile(BytesIO(COMPRESSED_XZ * 5)) as f:
Nadeem Vawda3ff069e2011-11-30 00:25:06 +0200847 self.assertEqual(f.read(), INPUT * 5)
848 finally:
Antoine Pitrou2dbc6e62015-04-11 00:31:01 +0200849 _compression.BUFFER_SIZE = saved_buffer_size
Nadeem Vawda3ff069e2011-11-30 00:25:06 +0200850
Nadeem Vawda9c72ebc2013-12-04 23:03:49 +0100851 def test_read_trailing_junk(self):
852 with LZMAFile(BytesIO(COMPRESSED_XZ + COMPRESSED_BOGUS)) as f:
853 self.assertEqual(f.read(), INPUT)
854
855 def test_read_multistream_trailing_junk(self):
856 with LZMAFile(BytesIO(COMPRESSED_XZ * 5 + COMPRESSED_BOGUS)) as f:
857 self.assertEqual(f.read(), INPUT * 5)
858
Nadeem Vawda3ff069e2011-11-30 00:25:06 +0200859 def test_read_from_file(self):
860 with TempFile(TESTFN, COMPRESSED_XZ):
861 with LZMAFile(TESTFN) as f:
862 self.assertEqual(f.read(), INPUT)
863 self.assertEqual(f.read(), b"")
864
Nadeem Vawda10c87912012-06-20 01:48:50 +0200865 def test_read_from_file_with_bytes_filename(self):
866 try:
867 bytes_filename = TESTFN.encode("ascii")
868 except UnicodeEncodeError:
869 self.skipTest("Temporary file name needs to be ASCII")
870 with TempFile(TESTFN, COMPRESSED_XZ):
871 with LZMAFile(bytes_filename) as f:
872 self.assertEqual(f.read(), INPUT)
873 self.assertEqual(f.read(), b"")
874
Nadeem Vawda3ff069e2011-11-30 00:25:06 +0200875 def test_read_incomplete(self):
Nadeem Vawda33c34da2012-06-04 23:34:07 +0200876 with LZMAFile(BytesIO(COMPRESSED_XZ[:128])) as f:
Nadeem Vawda3ff069e2011-11-30 00:25:06 +0200877 self.assertRaises(EOFError, f.read)
878
Serhiy Storchaka57f9b7a2013-01-22 17:07:49 +0200879 def test_read_truncated(self):
880 # Drop stream footer: CRC (4 bytes), index size (4 bytes),
Serhiy Storchaka70ea7fa2013-02-08 11:24:16 +0200881 # flags (2 bytes) and magic number (2 bytes).
Serhiy Storchaka57f9b7a2013-01-22 17:07:49 +0200882 truncated = COMPRESSED_XZ[:-12]
883 with LZMAFile(BytesIO(truncated)) as f:
884 self.assertRaises(EOFError, f.read)
885 with LZMAFile(BytesIO(truncated)) as f:
886 self.assertEqual(f.read(len(INPUT)), INPUT)
887 self.assertRaises(EOFError, f.read, 1)
888 # Incomplete 12-byte header.
889 for i in range(12):
890 with LZMAFile(BytesIO(truncated[:i])) as f:
891 self.assertRaises(EOFError, f.read, 1)
892
Nadeem Vawda3ff069e2011-11-30 00:25:06 +0200893 def test_read_bad_args(self):
Nadeem Vawda33c34da2012-06-04 23:34:07 +0200894 f = LZMAFile(BytesIO(COMPRESSED_XZ))
Nadeem Vawda3ff069e2011-11-30 00:25:06 +0200895 f.close()
896 self.assertRaises(ValueError, f.read)
Nadeem Vawda33c34da2012-06-04 23:34:07 +0200897 with LZMAFile(BytesIO(), "w") as f:
Nadeem Vawda3ff069e2011-11-30 00:25:06 +0200898 self.assertRaises(ValueError, f.read)
Nadeem Vawda33c34da2012-06-04 23:34:07 +0200899 with LZMAFile(BytesIO(COMPRESSED_XZ)) as f:
Antoine Pitrou2dbc6e62015-04-11 00:31:01 +0200900 self.assertRaises(TypeError, f.read, float())
Nadeem Vawda3ff069e2011-11-30 00:25:06 +0200901
Nadeem Vawda9c72ebc2013-12-04 23:03:49 +0100902 def test_read_bad_data(self):
903 with LZMAFile(BytesIO(COMPRESSED_BOGUS)) as f:
904 self.assertRaises(LZMAError, f.read)
905
Nadeem Vawda3ff069e2011-11-30 00:25:06 +0200906 def test_read1(self):
Nadeem Vawda33c34da2012-06-04 23:34:07 +0200907 with LZMAFile(BytesIO(COMPRESSED_XZ)) as f:
Nadeem Vawda3ff069e2011-11-30 00:25:06 +0200908 blocks = []
909 while True:
910 result = f.read1()
911 if not result:
912 break
913 blocks.append(result)
914 self.assertEqual(b"".join(blocks), INPUT)
915 self.assertEqual(f.read1(), b"")
916
917 def test_read1_0(self):
Nadeem Vawda33c34da2012-06-04 23:34:07 +0200918 with LZMAFile(BytesIO(COMPRESSED_XZ)) as f:
Nadeem Vawda3ff069e2011-11-30 00:25:06 +0200919 self.assertEqual(f.read1(0), b"")
920
921 def test_read1_10(self):
Nadeem Vawda33c34da2012-06-04 23:34:07 +0200922 with LZMAFile(BytesIO(COMPRESSED_XZ)) as f:
Nadeem Vawda3ff069e2011-11-30 00:25:06 +0200923 blocks = []
924 while True:
925 result = f.read1(10)
926 if not result:
927 break
928 blocks.append(result)
929 self.assertEqual(b"".join(blocks), INPUT)
930 self.assertEqual(f.read1(), b"")
931
932 def test_read1_multistream(self):
Nadeem Vawda33c34da2012-06-04 23:34:07 +0200933 with LZMAFile(BytesIO(COMPRESSED_XZ * 5)) as f:
Nadeem Vawda3ff069e2011-11-30 00:25:06 +0200934 blocks = []
935 while True:
936 result = f.read1()
937 if not result:
938 break
939 blocks.append(result)
940 self.assertEqual(b"".join(blocks), INPUT * 5)
941 self.assertEqual(f.read1(), b"")
942
943 def test_read1_bad_args(self):
Nadeem Vawda33c34da2012-06-04 23:34:07 +0200944 f = LZMAFile(BytesIO(COMPRESSED_XZ))
Nadeem Vawda3ff069e2011-11-30 00:25:06 +0200945 f.close()
946 self.assertRaises(ValueError, f.read1)
Nadeem Vawda33c34da2012-06-04 23:34:07 +0200947 with LZMAFile(BytesIO(), "w") as f:
Nadeem Vawda3ff069e2011-11-30 00:25:06 +0200948 self.assertRaises(ValueError, f.read1)
Nadeem Vawda33c34da2012-06-04 23:34:07 +0200949 with LZMAFile(BytesIO(COMPRESSED_XZ)) as f:
Nadeem Vawda3ff069e2011-11-30 00:25:06 +0200950 self.assertRaises(TypeError, f.read1, None)
951
952 def test_peek(self):
Nadeem Vawda33c34da2012-06-04 23:34:07 +0200953 with LZMAFile(BytesIO(COMPRESSED_XZ)) as f:
Nadeem Vawda3ff069e2011-11-30 00:25:06 +0200954 result = f.peek()
955 self.assertGreater(len(result), 0)
956 self.assertTrue(INPUT.startswith(result))
957 self.assertEqual(f.read(), INPUT)
Nadeem Vawda33c34da2012-06-04 23:34:07 +0200958 with LZMAFile(BytesIO(COMPRESSED_XZ)) as f:
Nadeem Vawda3ff069e2011-11-30 00:25:06 +0200959 result = f.peek(10)
960 self.assertGreater(len(result), 0)
961 self.assertTrue(INPUT.startswith(result))
962 self.assertEqual(f.read(), INPUT)
963
964 def test_peek_bad_args(self):
Nadeem Vawda33c34da2012-06-04 23:34:07 +0200965 with LZMAFile(BytesIO(), "w") as f:
Nadeem Vawda3ff069e2011-11-30 00:25:06 +0200966 self.assertRaises(ValueError, f.peek)
967
968 def test_iterator(self):
969 with BytesIO(INPUT) as f:
970 lines = f.readlines()
Nadeem Vawda33c34da2012-06-04 23:34:07 +0200971 with LZMAFile(BytesIO(COMPRESSED_XZ)) as f:
Nadeem Vawda3ff069e2011-11-30 00:25:06 +0200972 self.assertListEqual(list(iter(f)), lines)
Nadeem Vawda33c34da2012-06-04 23:34:07 +0200973 with LZMAFile(BytesIO(COMPRESSED_ALONE)) 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_XZ), format=lzma.FORMAT_XZ) 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_ALONE), format=lzma.FORMAT_ALONE) 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_RAW_2),
Nadeem Vawda3ff069e2011-11-30 00:25:06 +0200980 format=lzma.FORMAT_RAW, filters=FILTERS_RAW_2) as f:
981 self.assertListEqual(list(iter(f)), lines)
982
983 def test_readline(self):
984 with BytesIO(INPUT) as f:
985 lines = f.readlines()
Nadeem Vawda33c34da2012-06-04 23:34:07 +0200986 with LZMAFile(BytesIO(COMPRESSED_XZ)) as f:
Nadeem Vawda3ff069e2011-11-30 00:25:06 +0200987 for line in lines:
988 self.assertEqual(f.readline(), line)
989
990 def test_readlines(self):
991 with BytesIO(INPUT) as f:
992 lines = f.readlines()
Nadeem Vawda33c34da2012-06-04 23:34:07 +0200993 with LZMAFile(BytesIO(COMPRESSED_XZ)) as f:
Nadeem Vawda3ff069e2011-11-30 00:25:06 +0200994 self.assertListEqual(f.readlines(), lines)
995
Antoine Pitrou2dbc6e62015-04-11 00:31:01 +0200996 def test_decompress_limited(self):
997 """Decompressed data buffering should be limited"""
Serhiy Storchaka5f1a5182016-09-11 14:41:02 +0300998 bomb = lzma.compress(b'\0' * int(2e6), preset=6)
Antoine Pitrou2dbc6e62015-04-11 00:31:01 +0200999 self.assertLess(len(bomb), _compression.BUFFER_SIZE)
1000
1001 decomp = LZMAFile(BytesIO(bomb))
Serhiy Storchaka5f1a5182016-09-11 14:41:02 +03001002 self.assertEqual(decomp.read(1), b'\0')
Antoine Pitrou2dbc6e62015-04-11 00:31:01 +02001003 max_decomp = 1 + DEFAULT_BUFFER_SIZE
1004 self.assertLessEqual(decomp._buffer.raw.tell(), max_decomp,
1005 "Excessive amount of data was decompressed")
1006
Nadeem Vawda3ff069e2011-11-30 00:25:06 +02001007 def test_write(self):
1008 with BytesIO() as dst:
Nadeem Vawda33c34da2012-06-04 23:34:07 +02001009 with LZMAFile(dst, "w") as f:
Nadeem Vawda3ff069e2011-11-30 00:25:06 +02001010 f.write(INPUT)
1011 expected = lzma.compress(INPUT)
1012 self.assertEqual(dst.getvalue(), expected)
1013 with BytesIO() as dst:
Nadeem Vawda33c34da2012-06-04 23:34:07 +02001014 with LZMAFile(dst, "w", format=lzma.FORMAT_XZ) as f:
Nadeem Vawda3ff069e2011-11-30 00:25:06 +02001015 f.write(INPUT)
1016 expected = lzma.compress(INPUT, format=lzma.FORMAT_XZ)
1017 self.assertEqual(dst.getvalue(), expected)
1018 with BytesIO() as dst:
Nadeem Vawda33c34da2012-06-04 23:34:07 +02001019 with LZMAFile(dst, "w", format=lzma.FORMAT_ALONE) as f:
Nadeem Vawda3ff069e2011-11-30 00:25:06 +02001020 f.write(INPUT)
1021 expected = lzma.compress(INPUT, format=lzma.FORMAT_ALONE)
1022 self.assertEqual(dst.getvalue(), expected)
1023 with BytesIO() as dst:
Nadeem Vawda33c34da2012-06-04 23:34:07 +02001024 with LZMAFile(dst, "w", format=lzma.FORMAT_RAW,
Nadeem Vawda3ff069e2011-11-30 00:25:06 +02001025 filters=FILTERS_RAW_2) as f:
1026 f.write(INPUT)
1027 expected = lzma.compress(INPUT, format=lzma.FORMAT_RAW,
1028 filters=FILTERS_RAW_2)
1029 self.assertEqual(dst.getvalue(), expected)
1030
1031 def test_write_10(self):
1032 with BytesIO() as dst:
Nadeem Vawda33c34da2012-06-04 23:34:07 +02001033 with LZMAFile(dst, "w") as f:
Nadeem Vawda3ff069e2011-11-30 00:25:06 +02001034 for start in range(0, len(INPUT), 10):
1035 f.write(INPUT[start:start+10])
1036 expected = lzma.compress(INPUT)
1037 self.assertEqual(dst.getvalue(), expected)
1038
1039 def test_write_append(self):
1040 part1 = INPUT[:1024]
1041 part2 = INPUT[1024:1536]
1042 part3 = INPUT[1536:]
1043 expected = b"".join(lzma.compress(x) for x in (part1, part2, part3))
1044 with BytesIO() as dst:
Nadeem Vawda33c34da2012-06-04 23:34:07 +02001045 with LZMAFile(dst, "w") as f:
Nadeem Vawda3ff069e2011-11-30 00:25:06 +02001046 f.write(part1)
Nadeem Vawda33c34da2012-06-04 23:34:07 +02001047 with LZMAFile(dst, "a") as f:
Nadeem Vawda3ff069e2011-11-30 00:25:06 +02001048 f.write(part2)
Nadeem Vawda33c34da2012-06-04 23:34:07 +02001049 with LZMAFile(dst, "a") as f:
Nadeem Vawda3ff069e2011-11-30 00:25:06 +02001050 f.write(part3)
1051 self.assertEqual(dst.getvalue(), expected)
1052
1053 def test_write_to_file(self):
1054 try:
1055 with LZMAFile(TESTFN, "w") as f:
1056 f.write(INPUT)
1057 expected = lzma.compress(INPUT)
1058 with open(TESTFN, "rb") as f:
1059 self.assertEqual(f.read(), expected)
1060 finally:
1061 unlink(TESTFN)
1062
Nadeem Vawda10c87912012-06-20 01:48:50 +02001063 def test_write_to_file_with_bytes_filename(self):
1064 try:
1065 bytes_filename = TESTFN.encode("ascii")
1066 except UnicodeEncodeError:
1067 self.skipTest("Temporary file name needs to be ASCII")
1068 try:
1069 with LZMAFile(bytes_filename, "w") as f:
1070 f.write(INPUT)
1071 expected = lzma.compress(INPUT)
1072 with open(TESTFN, "rb") as f:
1073 self.assertEqual(f.read(), expected)
1074 finally:
1075 unlink(TESTFN)
1076
Nadeem Vawda3ff069e2011-11-30 00:25:06 +02001077 def test_write_append_to_file(self):
1078 part1 = INPUT[:1024]
1079 part2 = INPUT[1024:1536]
1080 part3 = INPUT[1536:]
1081 expected = b"".join(lzma.compress(x) for x in (part1, part2, part3))
1082 try:
1083 with LZMAFile(TESTFN, "w") as f:
1084 f.write(part1)
1085 with LZMAFile(TESTFN, "a") as f:
1086 f.write(part2)
1087 with LZMAFile(TESTFN, "a") as f:
1088 f.write(part3)
1089 with open(TESTFN, "rb") as f:
1090 self.assertEqual(f.read(), expected)
1091 finally:
1092 unlink(TESTFN)
1093
1094 def test_write_bad_args(self):
Nadeem Vawda33c34da2012-06-04 23:34:07 +02001095 f = LZMAFile(BytesIO(), "w")
Nadeem Vawda3ff069e2011-11-30 00:25:06 +02001096 f.close()
1097 self.assertRaises(ValueError, f.write, b"foo")
Nadeem Vawda33c34da2012-06-04 23:34:07 +02001098 with LZMAFile(BytesIO(COMPRESSED_XZ), "r") as f:
Nadeem Vawda3ff069e2011-11-30 00:25:06 +02001099 self.assertRaises(ValueError, f.write, b"bar")
Nadeem Vawda33c34da2012-06-04 23:34:07 +02001100 with LZMAFile(BytesIO(), "w") as f:
Nadeem Vawda3ff069e2011-11-30 00:25:06 +02001101 self.assertRaises(TypeError, f.write, None)
1102 self.assertRaises(TypeError, f.write, "text")
1103 self.assertRaises(TypeError, f.write, 789)
1104
1105 def test_writelines(self):
1106 with BytesIO(INPUT) as f:
1107 lines = f.readlines()
1108 with BytesIO() as dst:
Nadeem Vawda33c34da2012-06-04 23:34:07 +02001109 with LZMAFile(dst, "w") as f:
Nadeem Vawda3ff069e2011-11-30 00:25:06 +02001110 f.writelines(lines)
1111 expected = lzma.compress(INPUT)
1112 self.assertEqual(dst.getvalue(), expected)
1113
1114 def test_seek_forward(self):
Nadeem Vawda33c34da2012-06-04 23:34:07 +02001115 with LZMAFile(BytesIO(COMPRESSED_XZ)) as f:
Nadeem Vawda3ff069e2011-11-30 00:25:06 +02001116 f.seek(555)
1117 self.assertEqual(f.read(), INPUT[555:])
1118
1119 def test_seek_forward_across_streams(self):
Nadeem Vawda33c34da2012-06-04 23:34:07 +02001120 with LZMAFile(BytesIO(COMPRESSED_XZ * 2)) as f:
Nadeem Vawda3ff069e2011-11-30 00:25:06 +02001121 f.seek(len(INPUT) + 123)
1122 self.assertEqual(f.read(), INPUT[123:])
1123
1124 def test_seek_forward_relative_to_current(self):
Nadeem Vawda33c34da2012-06-04 23:34:07 +02001125 with LZMAFile(BytesIO(COMPRESSED_XZ)) as f:
Nadeem Vawda3ff069e2011-11-30 00:25:06 +02001126 f.read(100)
1127 f.seek(1236, 1)
1128 self.assertEqual(f.read(), INPUT[1336:])
1129
1130 def test_seek_forward_relative_to_end(self):
Nadeem Vawda33c34da2012-06-04 23:34:07 +02001131 with LZMAFile(BytesIO(COMPRESSED_XZ)) as f:
Nadeem Vawda3ff069e2011-11-30 00:25:06 +02001132 f.seek(-555, 2)
1133 self.assertEqual(f.read(), INPUT[-555:])
1134
1135 def test_seek_backward(self):
Nadeem Vawda33c34da2012-06-04 23:34:07 +02001136 with LZMAFile(BytesIO(COMPRESSED_XZ)) as f:
Nadeem Vawda3ff069e2011-11-30 00:25:06 +02001137 f.read(1001)
1138 f.seek(211)
1139 self.assertEqual(f.read(), INPUT[211:])
1140
1141 def test_seek_backward_across_streams(self):
Nadeem Vawda33c34da2012-06-04 23:34:07 +02001142 with LZMAFile(BytesIO(COMPRESSED_XZ * 2)) as f:
Nadeem Vawda3ff069e2011-11-30 00:25:06 +02001143 f.read(len(INPUT) + 333)
1144 f.seek(737)
1145 self.assertEqual(f.read(), INPUT[737:] + INPUT)
1146
1147 def test_seek_backward_relative_to_end(self):
Nadeem Vawda33c34da2012-06-04 23:34:07 +02001148 with LZMAFile(BytesIO(COMPRESSED_XZ)) as f:
Nadeem Vawda3ff069e2011-11-30 00:25:06 +02001149 f.seek(-150, 2)
1150 self.assertEqual(f.read(), INPUT[-150:])
1151
1152 def test_seek_past_end(self):
Nadeem Vawda33c34da2012-06-04 23:34:07 +02001153 with LZMAFile(BytesIO(COMPRESSED_XZ)) as f:
Nadeem Vawda3ff069e2011-11-30 00:25:06 +02001154 f.seek(len(INPUT) + 9001)
1155 self.assertEqual(f.tell(), len(INPUT))
1156 self.assertEqual(f.read(), b"")
1157
1158 def test_seek_past_start(self):
Nadeem Vawda33c34da2012-06-04 23:34:07 +02001159 with LZMAFile(BytesIO(COMPRESSED_XZ)) as f:
Nadeem Vawda3ff069e2011-11-30 00:25:06 +02001160 f.seek(-88)
1161 self.assertEqual(f.tell(), 0)
1162 self.assertEqual(f.read(), INPUT)
1163
1164 def test_seek_bad_args(self):
Nadeem Vawda33c34da2012-06-04 23:34:07 +02001165 f = LZMAFile(BytesIO(COMPRESSED_XZ))
Nadeem Vawda3ff069e2011-11-30 00:25:06 +02001166 f.close()
1167 self.assertRaises(ValueError, f.seek, 0)
Nadeem Vawda33c34da2012-06-04 23:34:07 +02001168 with LZMAFile(BytesIO(), "w") as f:
Nadeem Vawda3ff069e2011-11-30 00:25:06 +02001169 self.assertRaises(ValueError, f.seek, 0)
Nadeem Vawda33c34da2012-06-04 23:34:07 +02001170 with LZMAFile(BytesIO(COMPRESSED_XZ)) as f:
Nadeem Vawda3ff069e2011-11-30 00:25:06 +02001171 self.assertRaises(ValueError, f.seek, 0, 3)
Antoine Pitrou2dbc6e62015-04-11 00:31:01 +02001172 # io.BufferedReader raises TypeError instead of ValueError
1173 self.assertRaises((TypeError, ValueError), f.seek, 9, ())
Nadeem Vawda3ff069e2011-11-30 00:25:06 +02001174 self.assertRaises(TypeError, f.seek, None)
1175 self.assertRaises(TypeError, f.seek, b"derp")
1176
1177 def test_tell(self):
Nadeem Vawda33c34da2012-06-04 23:34:07 +02001178 with LZMAFile(BytesIO(COMPRESSED_XZ)) as f:
Nadeem Vawda3ff069e2011-11-30 00:25:06 +02001179 pos = 0
1180 while True:
1181 self.assertEqual(f.tell(), pos)
1182 result = f.read(183)
1183 if not result:
1184 break
1185 pos += len(result)
1186 self.assertEqual(f.tell(), len(INPUT))
Nadeem Vawda33c34da2012-06-04 23:34:07 +02001187 with LZMAFile(BytesIO(), "w") as f:
Nadeem Vawda3ff069e2011-11-30 00:25:06 +02001188 for pos in range(0, len(INPUT), 144):
1189 self.assertEqual(f.tell(), pos)
1190 f.write(INPUT[pos:pos+144])
1191 self.assertEqual(f.tell(), len(INPUT))
1192
1193 def test_tell_bad_args(self):
Nadeem Vawda33c34da2012-06-04 23:34:07 +02001194 f = LZMAFile(BytesIO(COMPRESSED_XZ))
Nadeem Vawda3ff069e2011-11-30 00:25:06 +02001195 f.close()
1196 self.assertRaises(ValueError, f.tell)
1197
1198
Nadeem Vawdae8604042012-06-04 23:38:12 +02001199class OpenTestCase(unittest.TestCase):
1200
1201 def test_binary_modes(self):
1202 with lzma.open(BytesIO(COMPRESSED_XZ), "rb") as f:
1203 self.assertEqual(f.read(), INPUT)
1204 with BytesIO() as bio:
1205 with lzma.open(bio, "wb") as f:
1206 f.write(INPUT)
1207 file_data = lzma.decompress(bio.getvalue())
1208 self.assertEqual(file_data, INPUT)
1209 with lzma.open(bio, "ab") as f:
1210 f.write(INPUT)
1211 file_data = lzma.decompress(bio.getvalue())
1212 self.assertEqual(file_data, INPUT * 2)
1213
1214 def test_text_modes(self):
1215 uncompressed = INPUT.decode("ascii")
1216 uncompressed_raw = uncompressed.replace("\n", os.linesep)
1217 with lzma.open(BytesIO(COMPRESSED_XZ), "rt") as f:
1218 self.assertEqual(f.read(), uncompressed)
1219 with BytesIO() as bio:
1220 with lzma.open(bio, "wt") as f:
1221 f.write(uncompressed)
1222 file_data = lzma.decompress(bio.getvalue()).decode("ascii")
1223 self.assertEqual(file_data, uncompressed_raw)
1224 with lzma.open(bio, "at") as f:
1225 f.write(uncompressed)
1226 file_data = lzma.decompress(bio.getvalue()).decode("ascii")
1227 self.assertEqual(file_data, uncompressed_raw * 2)
1228
1229 def test_filename(self):
1230 with TempFile(TESTFN):
1231 with lzma.open(TESTFN, "wb") as f:
1232 f.write(INPUT)
1233 with open(TESTFN, "rb") as f:
1234 file_data = lzma.decompress(f.read())
1235 self.assertEqual(file_data, INPUT)
1236 with lzma.open(TESTFN, "rb") as f:
1237 self.assertEqual(f.read(), INPUT)
1238 with lzma.open(TESTFN, "ab") as f:
1239 f.write(INPUT)
1240 with lzma.open(TESTFN, "rb") as f:
1241 self.assertEqual(f.read(), INPUT * 2)
1242
Berker Peksag5f59ddd2016-10-04 20:41:20 +03001243 def test_with_pathlike_filename(self):
1244 filename = pathlib.Path(TESTFN)
1245 with TempFile(filename):
1246 with lzma.open(filename, "wb") as f:
1247 f.write(INPUT)
1248 with open(filename, "rb") as f:
1249 file_data = lzma.decompress(f.read())
1250 self.assertEqual(file_data, INPUT)
1251 with lzma.open(filename, "rb") as f:
1252 self.assertEqual(f.read(), INPUT)
1253
Nadeem Vawdae8604042012-06-04 23:38:12 +02001254 def test_bad_params(self):
1255 # Test invalid parameter combinations.
1256 with self.assertRaises(ValueError):
1257 lzma.open(TESTFN, "")
1258 with self.assertRaises(ValueError):
Nadeem Vawdae8604042012-06-04 23:38:12 +02001259 lzma.open(TESTFN, "rbt")
1260 with self.assertRaises(ValueError):
1261 lzma.open(TESTFN, "rb", encoding="utf-8")
1262 with self.assertRaises(ValueError):
1263 lzma.open(TESTFN, "rb", errors="ignore")
1264 with self.assertRaises(ValueError):
1265 lzma.open(TESTFN, "rb", newline="\n")
1266
1267 def test_format_and_filters(self):
1268 # Test non-default format and filter chain.
1269 options = {"format": lzma.FORMAT_RAW, "filters": FILTERS_RAW_1}
1270 with lzma.open(BytesIO(COMPRESSED_RAW_1), "rb", **options) as f:
1271 self.assertEqual(f.read(), INPUT)
1272 with BytesIO() as bio:
1273 with lzma.open(bio, "wb", **options) as f:
1274 f.write(INPUT)
1275 file_data = lzma.decompress(bio.getvalue(), **options)
1276 self.assertEqual(file_data, INPUT)
1277
1278 def test_encoding(self):
1279 # Test non-default encoding.
1280 uncompressed = INPUT.decode("ascii")
1281 uncompressed_raw = uncompressed.replace("\n", os.linesep)
1282 with BytesIO() as bio:
1283 with lzma.open(bio, "wt", encoding="utf-16-le") as f:
1284 f.write(uncompressed)
1285 file_data = lzma.decompress(bio.getvalue()).decode("utf-16-le")
1286 self.assertEqual(file_data, uncompressed_raw)
1287 bio.seek(0)
1288 with lzma.open(bio, "rt", encoding="utf-16-le") as f:
1289 self.assertEqual(f.read(), uncompressed)
1290
1291 def test_encoding_error_handler(self):
Martin Panter46f50722016-05-26 05:35:26 +00001292 # Test with non-default encoding error handler.
Nadeem Vawdae8604042012-06-04 23:38:12 +02001293 with BytesIO(lzma.compress(b"foo\xffbar")) as bio:
1294 with lzma.open(bio, "rt", encoding="ascii", errors="ignore") as f:
1295 self.assertEqual(f.read(), "foobar")
1296
1297 def test_newline(self):
1298 # Test with explicit newline (universal newline mode disabled).
1299 text = INPUT.decode("ascii")
1300 with BytesIO() as bio:
1301 with lzma.open(bio, "wt", newline="\n") as f:
1302 f.write(text)
1303 bio.seek(0)
1304 with lzma.open(bio, "rt", newline="\r") as f:
1305 self.assertEqual(f.readlines(), [text])
1306
Nadeem Vawda42ca9822013-10-19 00:06:19 +02001307 def test_x_mode(self):
1308 self.addCleanup(unlink, TESTFN)
1309 for mode in ("x", "xb", "xt"):
1310 unlink(TESTFN)
1311 with lzma.open(TESTFN, mode):
1312 pass
1313 with self.assertRaises(FileExistsError):
1314 with lzma.open(TESTFN, mode):
1315 pass
1316
Nadeem Vawdae8604042012-06-04 23:38:12 +02001317
Nadeem Vawda3ff069e2011-11-30 00:25:06 +02001318class MiscellaneousTestCase(unittest.TestCase):
1319
1320 def test_is_check_supported(self):
1321 # CHECK_NONE and CHECK_CRC32 should always be supported,
1322 # regardless of the options liblzma was compiled with.
Nadeem Vawdabc459bb2012-05-06 23:01:51 +02001323 self.assertTrue(lzma.is_check_supported(lzma.CHECK_NONE))
1324 self.assertTrue(lzma.is_check_supported(lzma.CHECK_CRC32))
Nadeem Vawda3ff069e2011-11-30 00:25:06 +02001325
1326 # The .xz format spec cannot store check IDs above this value.
Nadeem Vawdabc459bb2012-05-06 23:01:51 +02001327 self.assertFalse(lzma.is_check_supported(lzma.CHECK_ID_MAX + 1))
Nadeem Vawda3ff069e2011-11-30 00:25:06 +02001328
1329 # This value should not be a valid check ID.
Nadeem Vawdabc459bb2012-05-06 23:01:51 +02001330 self.assertFalse(lzma.is_check_supported(lzma.CHECK_UNKNOWN))
Nadeem Vawda3ff069e2011-11-30 00:25:06 +02001331
Nadeem Vawdaa425c3d2012-06-21 23:36:48 +02001332 def test__encode_filter_properties(self):
Nadeem Vawdaf55b3292012-05-06 23:01:27 +02001333 with self.assertRaises(TypeError):
Nadeem Vawdaa425c3d2012-06-21 23:36:48 +02001334 lzma._encode_filter_properties(b"not a dict")
Nadeem Vawdaf55b3292012-05-06 23:01:27 +02001335 with self.assertRaises(ValueError):
Nadeem Vawdaa425c3d2012-06-21 23:36:48 +02001336 lzma._encode_filter_properties({"id": 0x100})
Nadeem Vawdaf55b3292012-05-06 23:01:27 +02001337 with self.assertRaises(ValueError):
Nadeem Vawdaa425c3d2012-06-21 23:36:48 +02001338 lzma._encode_filter_properties({"id": lzma.FILTER_LZMA2, "junk": 12})
Nadeem Vawdaf55b3292012-05-06 23:01:27 +02001339 with self.assertRaises(lzma.LZMAError):
Nadeem Vawdaa425c3d2012-06-21 23:36:48 +02001340 lzma._encode_filter_properties({"id": lzma.FILTER_DELTA,
Nadeem Vawdaf55b3292012-05-06 23:01:27 +02001341 "dist": 9001})
1342
1343 # Test with parameters used by zipfile module.
Nadeem Vawdaa425c3d2012-06-21 23:36:48 +02001344 props = lzma._encode_filter_properties({
Nadeem Vawdaf55b3292012-05-06 23:01:27 +02001345 "id": lzma.FILTER_LZMA1,
1346 "pb": 2,
1347 "lp": 0,
1348 "lc": 3,
1349 "dict_size": 8 << 20,
1350 })
1351 self.assertEqual(props, b"]\x00\x00\x80\x00")
1352
Nadeem Vawdaa425c3d2012-06-21 23:36:48 +02001353 def test__decode_filter_properties(self):
Nadeem Vawdaf55b3292012-05-06 23:01:27 +02001354 with self.assertRaises(TypeError):
Nadeem Vawdaa425c3d2012-06-21 23:36:48 +02001355 lzma._decode_filter_properties(lzma.FILTER_X86, {"should be": bytes})
Nadeem Vawdaf55b3292012-05-06 23:01:27 +02001356 with self.assertRaises(lzma.LZMAError):
Nadeem Vawdaa425c3d2012-06-21 23:36:48 +02001357 lzma._decode_filter_properties(lzma.FILTER_DELTA, b"too long")
Nadeem Vawdaf55b3292012-05-06 23:01:27 +02001358
1359 # Test with parameters used by zipfile module.
Nadeem Vawdaa425c3d2012-06-21 23:36:48 +02001360 filterspec = lzma._decode_filter_properties(
Nadeem Vawdaf55b3292012-05-06 23:01:27 +02001361 lzma.FILTER_LZMA1, b"]\x00\x00\x80\x00")
1362 self.assertEqual(filterspec["id"], lzma.FILTER_LZMA1)
1363 self.assertEqual(filterspec["pb"], 2)
1364 self.assertEqual(filterspec["lp"], 0)
1365 self.assertEqual(filterspec["lc"], 3)
1366 self.assertEqual(filterspec["dict_size"], 8 << 20)
1367
1368 def test_filter_properties_roundtrip(self):
Nadeem Vawdaa425c3d2012-06-21 23:36:48 +02001369 spec1 = lzma._decode_filter_properties(
Nadeem Vawdaf55b3292012-05-06 23:01:27 +02001370 lzma.FILTER_LZMA1, b"]\x00\x00\x80\x00")
Nadeem Vawdaa425c3d2012-06-21 23:36:48 +02001371 reencoded = lzma._encode_filter_properties(spec1)
1372 spec2 = lzma._decode_filter_properties(lzma.FILTER_LZMA1, reencoded)
Nadeem Vawdaf55b3292012-05-06 23:01:27 +02001373 self.assertEqual(spec1, spec2)
1374
Nadeem Vawda3ff069e2011-11-30 00:25:06 +02001375
1376# Test data:
1377
1378INPUT = b"""
1379LAERTES
1380
1381 O, fear me not.
1382 I stay too long: but here my father comes.
1383
1384 Enter POLONIUS
1385
1386 A double blessing is a double grace,
1387 Occasion smiles upon a second leave.
1388
1389LORD POLONIUS
1390
1391 Yet here, Laertes! aboard, aboard, for shame!
1392 The wind sits in the shoulder of your sail,
1393 And you are stay'd for. There; my blessing with thee!
1394 And these few precepts in thy memory
1395 See thou character. Give thy thoughts no tongue,
1396 Nor any unproportioned thought his act.
1397 Be thou familiar, but by no means vulgar.
1398 Those friends thou hast, and their adoption tried,
1399 Grapple them to thy soul with hoops of steel;
1400 But do not dull thy palm with entertainment
1401 Of each new-hatch'd, unfledged comrade. Beware
1402 Of entrance to a quarrel, but being in,
1403 Bear't that the opposed may beware of thee.
1404 Give every man thy ear, but few thy voice;
1405 Take each man's censure, but reserve thy judgment.
1406 Costly thy habit as thy purse can buy,
1407 But not express'd in fancy; rich, not gaudy;
1408 For the apparel oft proclaims the man,
1409 And they in France of the best rank and station
1410 Are of a most select and generous chief in that.
1411 Neither a borrower nor a lender be;
1412 For loan oft loses both itself and friend,
1413 And borrowing dulls the edge of husbandry.
1414 This above all: to thine ownself be true,
1415 And it must follow, as the night the day,
1416 Thou canst not then be false to any man.
1417 Farewell: my blessing season this in thee!
1418
1419LAERTES
1420
1421 Most humbly do I take my leave, my lord.
1422
1423LORD POLONIUS
1424
1425 The time invites you; go; your servants tend.
1426
1427LAERTES
1428
1429 Farewell, Ophelia; and remember well
1430 What I have said to you.
1431
1432OPHELIA
1433
1434 'Tis in my memory lock'd,
1435 And you yourself shall keep the key of it.
1436
1437LAERTES
1438
1439 Farewell.
1440"""
1441
Nadeem Vawda9c72ebc2013-12-04 23:03:49 +01001442COMPRESSED_BOGUS = b"this is not a valid lzma stream"
1443
Nadeem Vawda3ff069e2011-11-30 00:25:06 +02001444COMPRESSED_XZ = (
1445 b"\xfd7zXZ\x00\x00\x04\xe6\xd6\xb4F\x02\x00!\x01\x16\x00\x00\x00t/\xe5\xa3"
1446 b"\xe0\x07\x80\x03\xdf]\x00\x05\x14\x07bX\x19\xcd\xddn\x98\x15\xe4\xb4\x9d"
1447 b"o\x1d\xc4\xe5\n\x03\xcc2h\xc7\\\x86\xff\xf8\xe2\xfc\xe7\xd9\xfe6\xb8("
1448 b"\xa8wd\xc2\"u.n\x1e\xc3\xf2\x8e\x8d\x8f\x02\x17/\xa6=\xf0\xa2\xdf/M\x89"
1449 b"\xbe\xde\xa7\x1cz\x18-]\xd5\xef\x13\x8frZ\x15\x80\x8c\xf8\x8do\xfa\x12"
1450 b"\x9b#z/\xef\xf0\xfaF\x01\x82\xa3M\x8e\xa1t\xca6 BF$\xe5Q\xa4\x98\xee\xde"
1451 b"l\xe8\x7f\xf0\x9d,bn\x0b\x13\xd4\xa8\x81\xe4N\xc8\x86\x153\xf5x2\xa2O"
1452 b"\x13@Q\xa1\x00/\xa5\xd0O\x97\xdco\xae\xf7z\xc4\xcdS\xb6t<\x16\xf2\x9cI#"
1453 b"\x89ud\xc66Y\xd9\xee\xe6\xce\x12]\xe5\xf0\xaa\x96-Pe\xade:\x04\t\x1b\xf7"
1454 b"\xdb7\n\x86\x1fp\xc8J\xba\xf4\xf0V\xa9\xdc\xf0\x02%G\xf9\xdf=?\x15\x1b"
1455 b"\xe1(\xce\x82=\xd6I\xac3\x12\x0cR\xb7\xae\r\xb1i\x03\x95\x01\xbd\xbe\xfa"
1456 b"\x02s\x01P\x9d\x96X\xb12j\xc8L\xa8\x84b\xf6\xc3\xd4c-H\x93oJl\xd0iQ\xe4k"
1457 b"\x84\x0b\xc1\xb7\xbc\xb1\x17\x88\xb1\xca?@\xf6\x07\xea\xe6x\xf1H12P\x0f"
1458 b"\x8a\xc9\xeauw\xe3\xbe\xaai\xa9W\xd0\x80\xcd#cb5\x99\xd8]\xa9d\x0c\xbd"
1459 b"\xa2\xdcWl\xedUG\xbf\x89yF\xf77\x81v\xbd5\x98\xbeh8\x18W\x08\xf0\x1b\x99"
1460 b"5:\x1a?rD\x96\xa1\x04\x0f\xae\xba\x85\xeb\x9d5@\xf5\x83\xd37\x83\x8ac"
1461 b"\x06\xd4\x97i\xcdt\x16S\x82k\xf6K\x01vy\x88\x91\x9b6T\xdae\r\xfd]:k\xbal"
1462 b"\xa9\xbba\xc34\xf9r\xeb}r\xdb\xc7\xdb*\x8f\x03z\xdc8h\xcc\xc9\xd3\xbcl"
1463 b"\xa5-\xcb\xeaK\xa2\xc5\x15\xc0\xe3\xc1\x86Z\xfb\xebL\xe13\xcf\x9c\xe3"
1464 b"\x1d\xc9\xed\xc2\x06\xcc\xce!\x92\xe5\xfe\x9c^\xa59w \x9bP\xa3PK\x08d"
1465 b"\xf9\xe2Z}\xa7\xbf\xed\xeb%$\x0c\x82\xb8/\xb0\x01\xa9&,\xf7qh{Q\x96)\xf2"
1466 b"q\x96\xc3\x80\xb4\x12\xb0\xba\xe6o\xf4!\xb4[\xd4\x8aw\x10\xf7t\x0c\xb3"
1467 b"\xd9\xd5\xc3`^\x81\x11??\\\xa4\x99\x85R\xd4\x8e\x83\xc9\x1eX\xbfa\xf1"
1468 b"\xac\xb0\xea\xea\xd7\xd0\xab\x18\xe2\xf2\xed\xe1\xb7\xc9\x18\xcbS\xe4>"
1469 b"\xc9\x95H\xe8\xcb\t\r%\xeb\xc7$.o\xf1\xf3R\x17\x1db\xbb\xd8U\xa5^\xccS"
1470 b"\x16\x01\x87\xf3/\x93\xd1\xf0v\xc0r\xd7\xcc\xa2Gkz\xca\x80\x0e\xfd\xd0"
1471 b"\x8b\xbb\xd2Ix\xb3\x1ey\xca-0\xe3z^\xd6\xd6\x8f_\xf1\x9dP\x9fi\xa7\xd1"
1472 b"\xe8\x90\x84\xdc\xbf\xcdky\x8e\xdc\x81\x7f\xa3\xb2+\xbf\x04\xef\xd8\\"
1473 b"\xc4\xdf\xe1\xb0\x01\xe9\x93\xe3Y\xf1\x1dY\xe8h\x81\xcf\xf1w\xcc\xb4\xef"
1474 b" \x8b|\x04\xea\x83ej\xbe\x1f\xd4z\x9c`\xd3\x1a\x92A\x06\xe5\x8f\xa9\x13"
1475 b"\t\x9e=\xfa\x1c\xe5_\x9f%v\x1bo\x11ZO\xd8\xf4\t\xddM\x16-\x04\xfc\x18<\""
1476 b"CM\xddg~b\xf6\xef\x8e\x0c\xd0\xde|\xa0'\x8a\x0c\xd6x\xae!J\xa6F\x88\x15u"
1477 b"\x008\x17\xbc7y\xb3\xd8u\xac_\x85\x8d\xe7\xc1@\x9c\xecqc\xa3#\xad\xf1"
1478 b"\x935\xb5)_\r\xec3]\x0fo]5\xd0my\x07\x9b\xee\x81\xb5\x0f\xcfK+\x00\xc0"
1479 b"\xe4b\x10\xe4\x0c\x1a \x9b\xe0\x97t\xf6\xa1\x9e\x850\xba\x0c\x9a\x8d\xc8"
1480 b"\x8f\x07\xd7\xae\xc8\xf9+i\xdc\xb9k\xb0>f\x19\xb8\r\xa8\xf8\x1f$\xa5{p"
1481 b"\xc6\x880\xce\xdb\xcf\xca_\x86\xac\x88h6\x8bZ%'\xd0\n\xbf\x0f\x9c\"\xba"
1482 b"\xe5\x86\x9f\x0f7X=mNX[\xcc\x19FU\xc9\x860\xbc\x90a+* \xae_$\x03\x1e\xd3"
1483 b"\xcd_\xa0\x9c\xde\xaf46q\xa5\xc9\x92\xd7\xca\xe3`\x9d\x85}\xb4\xff\xb3"
1484 b"\x83\xfb\xb6\xca\xae`\x0bw\x7f\xfc\xd8\xacVe\x19\xc8\x17\x0bZ\xad\x88"
1485 b"\xeb#\x97\x03\x13\xb1d\x0f{\x0c\x04w\x07\r\x97\xbd\xd6\xc1\xc3B:\x95\x08"
1486 b"^\x10V\xaeaH\x02\xd9\xe3\n\\\x01X\xf6\x9c\x8a\x06u#%\xbe*\xa1\x18v\x85"
1487 b"\xec!\t4\x00\x00\x00\x00Vj?uLU\xf3\xa6\x00\x01\xfb\x07\x81\x0f\x00\x00tw"
1488 b"\x99P\xb1\xc4g\xfb\x02\x00\x00\x00\x00\x04YZ"
1489)
1490
1491COMPRESSED_ALONE = (
1492 b"]\x00\x00\x80\x00\xff\xff\xff\xff\xff\xff\xff\xff\x00\x05\x14\x07bX\x19"
1493 b"\xcd\xddn\x98\x15\xe4\xb4\x9do\x1d\xc4\xe5\n\x03\xcc2h\xc7\\\x86\xff\xf8"
1494 b"\xe2\xfc\xe7\xd9\xfe6\xb8(\xa8wd\xc2\"u.n\x1e\xc3\xf2\x8e\x8d\x8f\x02"
1495 b"\x17/\xa6=\xf0\xa2\xdf/M\x89\xbe\xde\xa7\x1cz\x18-]\xd5\xef\x13\x8frZ"
1496 b"\x15\x80\x8c\xf8\x8do\xfa\x12\x9b#z/\xef\xf0\xfaF\x01\x82\xa3M\x8e\xa1t"
1497 b"\xca6 BF$\xe5Q\xa4\x98\xee\xdel\xe8\x7f\xf0\x9d,bn\x0b\x13\xd4\xa8\x81"
1498 b"\xe4N\xc8\x86\x153\xf5x2\xa2O\x13@Q\xa1\x00/\xa5\xd0O\x97\xdco\xae\xf7z"
1499 b"\xc4\xcdS\xb6t<\x16\xf2\x9cI#\x89ud\xc66Y\xd9\xee\xe6\xce\x12]\xe5\xf0"
1500 b"\xaa\x96-Pe\xade:\x04\t\x1b\xf7\xdb7\n\x86\x1fp\xc8J\xba\xf4\xf0V\xa9"
1501 b"\xdc\xf0\x02%G\xf9\xdf=?\x15\x1b\xe1(\xce\x82=\xd6I\xac3\x12\x0cR\xb7"
1502 b"\xae\r\xb1i\x03\x95\x01\xbd\xbe\xfa\x02s\x01P\x9d\x96X\xb12j\xc8L\xa8"
1503 b"\x84b\xf8\x1epl\xeajr\xd1=\t\x03\xdd\x13\x1b3!E\xf9vV\xdaF\xf3\xd7\xb4"
1504 b"\x0c\xa9P~\xec\xdeE\xe37\xf6\x1d\xc6\xbb\xddc%\xb6\x0fI\x07\xf0;\xaf\xe7"
1505 b"\xa0\x8b\xa7Z\x99(\xe9\xe2\xf0o\x18>`\xe1\xaa\xa8\xd9\xa1\xb2}\xe7\x8d"
1506 b"\x834T\xb6\xef\xc1\xde\xe3\x98\xbcD\x03MA@\xd8\xed\xdc\xc8\x93\x03\x1a"
1507 b"\x93\x0b\x7f\x94\x12\x0b\x02Sa\x18\xc9\xc5\x9bTJE}\xf6\xc8g\x17#ZV\x01"
1508 b"\xc9\x9dc\x83\x0e>0\x16\x90S\xb8/\x03y_\x18\xfa(\xd7\x0br\xa2\xb0\xba?"
1509 b"\x8c\xe6\x83@\x84\xdf\x02:\xc5z\x9e\xa6\x84\xc9\xf5BeyX\x83\x1a\xf1 :\t"
1510 b"\xf7\x19\xfexD\\&G\xf3\x85Y\xa2J\xf9\x0bv{\x89\xf6\xe7)A\xaf\x04o\x00"
1511 b"\x075\xd3\xe0\x7f\x97\x98F\x0f?v\x93\xedVtTf\xb5\x97\x83\xed\x19\xd7\x1a"
1512 b"'k\xd7\xd9\xc5\\Y\xd1\xdc\x07\x15|w\xbc\xacd\x87\x08d\xec\xa7\xf6\x82"
1513 b"\xfc\xb3\x93\xeb\xb9 \x8d\xbc ,\xb3X\xb0\xd2s\xd7\xd1\xffv\x05\xdf}\xa2"
1514 b"\x96\xfb%\n\xdf\xa2\x7f\x08.\xa16\n\xe0\x19\x93\x7fh\n\x1c\x8c\x0f \x11"
1515 b"\xc6Bl\x95\x19U}\xe4s\xb5\x10H\xea\x86pB\xe88\x95\xbe\x8cZ\xdb\xe4\x94A"
1516 b"\x92\xb9;z\xaa\xa7{\x1c5!\xc0\xaf\xc1A\xf9\xda\xf0$\xb0\x02qg\xc8\xc7/|"
1517 b"\xafr\x99^\x91\x88\xbf\x03\xd9=\xd7n\xda6{>8\n\xc7:\xa9'\xba.\x0b\xe2"
1518 b"\xb5\x1d\x0e\n\x9a\x8e\x06\x8f:\xdd\x82'[\xc3\"wD$\xa7w\xecq\x8c,1\x93"
1519 b"\xd0,\xae2w\x93\x12$Jd\x19mg\x02\x93\x9cA\x95\x9d&\xca8i\x9c\xb0;\xe7NQ"
1520 b"\x1frh\x8beL;\xb0m\xee\x07Q\x9b\xc6\xd8\x03\xb5\xdeN\xd4\xfe\x98\xd0\xdc"
1521 b"\x1a[\x04\xde\x1a\xf6\x91j\xf8EOli\x8eB^\x1d\x82\x07\xb2\xb5R]\xb7\xd7"
1522 b"\xe9\xa6\xc3.\xfb\xf0-\xb4e\x9b\xde\x03\x88\xc6\xc1iN\x0e\x84wbQ\xdf~"
1523 b"\xe9\xa4\x884\x96kM\xbc)T\xf3\x89\x97\x0f\x143\xe7)\xa0\xb3B\x00\xa8\xaf"
1524 b"\x82^\xcb\xc7..\xdb\xc7\t\x9dH\xee5\xe9#\xe6NV\x94\xcb$Kk\xe3\x7f\r\xe3t"
1525 b"\x12\xcf'\xefR\x8b\xf42\xcf-LH\xac\xe5\x1f0~?SO\xeb\xc1E\x1a\x1c]\xf2"
1526 b"\xc4<\x11\x02\x10Z0a*?\xe4r\xff\xfb\xff\xf6\x14nG\xead^\xd6\xef8\xb6uEI"
1527 b"\x99\nV\xe2\xb3\x95\x8e\x83\xf6i!\xb5&1F\xb1DP\xf4 SO3D!w\x99_G\x7f+\x90"
1528 b".\xab\xbb]\x91>\xc9#h;\x0f5J\x91K\xf4^-[\x9e\x8a\\\x94\xca\xaf\xf6\x19"
1529 b"\xd4\xa1\x9b\xc4\xb8p\xa1\xae\x15\xe9r\x84\xe0\xcar.l []\x8b\xaf+0\xf2g"
1530 b"\x01aKY\xdfI\xcf,\n\xe8\xf0\xe7V\x80_#\xb2\xf2\xa9\x06\x8c>w\xe2W,\xf4"
1531 b"\x8c\r\xf963\xf5J\xcc2\x05=kT\xeaUti\xe5_\xce\x1b\xfa\x8dl\x02h\xef\xa8"
1532 b"\xfbf\x7f\xff\xf0\x19\xeax"
1533)
1534
1535FILTERS_RAW_1 = [{"id": lzma.FILTER_LZMA2, "preset": 3}]
1536COMPRESSED_RAW_1 = (
1537 b"\xe0\x07\x80\x03\xfd]\x00\x05\x14\x07bX\x19\xcd\xddn\x96cyq\xa1\xdd\xee"
1538 b"\xf8\xfam\xe3'\x88\xd3\xff\xe4\x9e \xceQ\x91\xa4\x14I\xf6\xb9\x9dVL8\x15"
1539 b"_\x0e\x12\xc3\xeb\xbc\xa5\xcd\nW\x1d$=R;\x1d\xf8k8\t\xb1{\xd4\xc5+\x9d"
1540 b"\x87c\xe5\xef\x98\xb4\xd7S3\xcd\xcc\xd2\xed\xa4\x0em\xe5\xf4\xdd\xd0b"
1541 b"\xbe4*\xaa\x0b\xc5\x08\x10\x85+\x81.\x17\xaf9\xc9b\xeaZrA\xe20\x7fs\"r"
1542 b"\xdaG\x81\xde\x90cu\xa5\xdb\xa9.A\x08l\xb0<\xf6\x03\xddOi\xd0\xc5\xb4"
1543 b"\xec\xecg4t6\"\xa6\xb8o\xb5?\x18^}\xb6}\x03[:\xeb\x03\xa9\n[\x89l\x19g"
1544 b"\x16\xc82\xed\x0b\xfb\x86n\xa2\x857@\x93\xcd6T\xc3u\xb0\t\xf9\x1b\x918"
1545 b"\xfc[\x1b\x1e4\xb3\x14\x06PCV\xa8\"\xf5\x81x~\xe9\xb5N\x9cK\x9f\xc6\xc3%"
1546 b"\xc8k:{6\xe7\xf7\xbd\x05\x02\xb4\xc4\xc3\xd3\xfd\xc3\xa8\\\xfc@\xb1F_"
1547 b"\xc8\x90\xd9sU\x98\xad8\x05\x07\xde7J\x8bM\xd0\xb3;X\xec\x87\xef\xae\xb3"
1548 b"eO,\xb1z,d\x11y\xeejlB\x02\x1d\xf28\x1f#\x896\xce\x0b\xf0\xf5\xa9PK\x0f"
1549 b"\xb3\x13P\xd8\x88\xd2\xa1\x08\x04C?\xdb\x94_\x9a\"\xe9\xe3e\x1d\xde\x9b"
1550 b"\xa1\xe8>H\x98\x10;\xc5\x03#\xb5\x9d4\x01\xe7\xc5\xba%v\xa49\x97A\xe0\""
1551 b"\x8c\xc22\xe3i\xc1\x9d\xab3\xdf\xbe\xfdDm7\x1b\x9d\xab\xb5\x15o:J\x92"
1552 b"\xdb\x816\x17\xc2O\x99\x1b\x0e\x8d\xf3\tQ\xed\x8e\x95S/\x16M\xb2S\x04"
1553 b"\x0f\xc3J\xc6\xc7\xe4\xcb\xc5\xf4\xe7d\x14\xe4=^B\xfb\xd3E\xd3\x1e\xcd"
1554 b"\x91\xa5\xd0G\x8f.\xf6\xf9\x0bb&\xd9\x9f\xc2\xfdj\xa2\x9e\xc4\\\x0e\x1dC"
1555 b"v\xe8\xd2\x8a?^H\xec\xae\xeb>\xfe\xb8\xab\xd4IqY\x8c\xd4K7\x11\xf4D\xd0W"
1556 b"\xa5\xbe\xeaO\xbf\xd0\x04\xfdl\x10\xae5\xd4U\x19\x06\xf9{\xaa\xe0\x81"
1557 b"\x0f\xcf\xa3k{\x95\xbd\x19\xa2\xf8\xe4\xa3\x08O*\xf1\xf1B-\xc7(\x0eR\xfd"
1558 b"@E\x9f\xd3\x1e:\xfdV\xb7\x04Y\x94\xeb]\x83\xc4\xa5\xd7\xc0gX\x98\xcf\x0f"
1559 b"\xcd3\x00]n\x17\xec\xbd\xa3Y\x86\xc5\xf3u\xf6*\xbdT\xedA$A\xd9A\xe7\x98"
1560 b"\xef\x14\x02\x9a\xfdiw\xec\xa0\x87\x11\xd9%\xc5\xeb\x8a=\xae\xc0\xc4\xc6"
1561 b"D\x80\x8f\xa8\xd1\xbbq\xb2\xc0\xa0\xf5Cqp\xeeL\xe3\xe5\xdc \x84\"\xe9"
1562 b"\x80t\x83\x05\xba\xf1\xc5~\x93\xc9\xf0\x01c\xceix\x9d\xed\xc5)l\x16)\xd1"
1563 b"\x03@l\x04\x7f\x87\xa5yn\x1b\x01D\xaa:\xd2\x96\xb4\xb3?\xb0\xf9\xce\x07"
1564 b"\xeb\x81\x00\xe4\xc3\xf5%_\xae\xd4\xf9\xeb\xe2\rh\xb2#\xd67Q\x16D\x82hn"
1565 b"\xd1\xa3_?q\xf0\xe2\xac\xf317\x9e\xd0_\x83|\xf1\xca\xb7\x95S\xabW\x12"
1566 b"\xff\xddt\xf69L\x01\xf2|\xdaW\xda\xees\x98L\x18\xb8_\xe8$\x82\xea\xd6"
1567 b"\xd1F\xd4\x0b\xcdk\x01vf\x88h\xc3\xae\xb91\xc7Q\x9f\xa5G\xd9\xcc\x1f\xe3"
1568 b"5\xb1\xdcy\x7fI\x8bcw\x8e\x10rIp\x02:\x19p_\xc8v\xcea\"\xc1\xd9\x91\x03"
1569 b"\xbfe\xbe\xa6\xb3\xa8\x14\x18\xc3\xabH*m}\xc2\xc1\x9a}>l%\xce\x84\x99"
1570 b"\xb3d\xaf\xd3\x82\x15\xdf\xc1\xfc5fOg\x9b\xfc\x8e^&\t@\xce\x9f\x06J\xb8"
1571 b"\xb5\x86\x1d\xda{\x9f\xae\xb0\xff\x02\x81r\x92z\x8cM\xb7ho\xc9^\x9c\xb6"
1572 b"\x9c\xae\xd1\xc9\xf4\xdfU7\xd6\\!\xea\x0b\x94k\xb9Ud~\x98\xe7\x86\x8az"
1573 b"\x10;\xe3\x1d\xe5PG\xf8\xa4\x12\x05w\x98^\xc4\xb1\xbb\xfb\xcf\xe0\x7f"
1574 b"\x033Sf\x0c \xb1\xf6@\x94\xe5\xa3\xb2\xa7\x10\x9a\xc0\x14\xc3s\xb5xRD"
1575 b"\xf4`W\xd9\xe5\xd3\xcf\x91\rTZ-X\xbe\xbf\xb5\xe2\xee|\x1a\xbf\xfb\x08"
1576 b"\x91\xe1\xfc\x9a\x18\xa3\x8b\xd6^\x89\xf5[\xef\x87\xd1\x06\x1c7\xd6\xa2"
1577 b"\t\tQ5/@S\xc05\xd2VhAK\x03VC\r\x9b\x93\xd6M\xf1xO\xaaO\xed\xb9<\x0c\xdae"
1578 b"*\xd0\x07Hk6\x9fG+\xa1)\xcd\x9cl\x87\xdb\xe1\xe7\xefK}\x875\xab\xa0\x19u"
1579 b"\xf6*F\xb32\x00\x00\x00"
1580)
1581
1582FILTERS_RAW_2 = [{"id": lzma.FILTER_DELTA, "dist": 2},
1583 {"id": lzma.FILTER_LZMA2,
1584 "preset": lzma.PRESET_DEFAULT | lzma.PRESET_EXTREME}]
1585COMPRESSED_RAW_2 = (
1586 b"\xe0\x07\x80\x05\x91]\x00\x05\x14\x06-\xd4\xa8d?\xef\xbe\xafH\xee\x042"
1587 b"\xcb.\xb5g\x8f\xfb\x14\xab\xa5\x9f\x025z\xa4\xdd\xd8\t[}W\xf8\x0c\x1dmH"
1588 b"\xfa\x05\xfcg\xba\xe5\x01Q\x0b\x83R\xb6A\x885\xc0\xba\xee\n\x1cv~\xde:o"
1589 b"\x06:J\xa7\x11Cc\xea\xf7\xe5*o\xf7\x83\\l\xbdE\x19\x1f\r\xa8\x10\xb42"
1590 b"\x0caU{\xd7\xb8w\xdc\xbe\x1b\xfc8\xb4\xcc\xd38\\\xf6\x13\xf6\xe7\x98\xfa"
1591 b"\xc7[\x17_9\x86%\xa8\xf8\xaa\xb8\x8dfs#\x1e=\xed<\x92\x10\\t\xff\x86\xfb"
1592 b"=\x9e7\x18\x1dft\\\xb5\x01\x95Q\xc5\x19\xb38\xe0\xd4\xaa\x07\xc3\x7f\xd8"
1593 b"\xa2\x00>-\xd3\x8e\xa1#\xfa\x83ArAm\xdbJ~\x93\xa3B\x82\xe0\xc7\xcc(\x08`"
1594 b"WK\xad\x1b\x94kaj\x04 \xde\xfc\xe1\xed\xb0\x82\x91\xefS\x84%\x86\xfbi"
1595 b"\x99X\xf1B\xe7\x90;E\xfde\x98\xda\xca\xd6T\xb4bg\xa4\n\x9aj\xd1\x83\x9e]"
1596 b"\"\x7fM\xb5\x0fr\xd2\\\xa5j~P\x10GH\xbfN*Z\x10.\x81\tpE\x8a\x08\xbe1\xbd"
1597 b"\xcd\xa9\xe1\x8d\x1f\x04\xf9\x0eH\xb9\xae\xd6\xc3\xc1\xa5\xa9\x95P\xdc~"
1598 b"\xff\x01\x930\xa9\x04\xf6\x03\xfe\xb5JK\xc3]\xdd9\xb1\xd3\xd7F\xf5\xd1"
1599 b"\x1e\xa0\x1c_\xed[\x0c\xae\xd4\x8b\x946\xeb\xbf\xbb\xe3$kS{\xb5\x80,f:Sj"
1600 b"\x0f\x08z\x1c\xf5\xe8\xe6\xae\x98\xb0Q~r\x0f\xb0\x05?\xb6\x90\x19\x02&"
1601 b"\xcb\x80\t\xc4\xea\x9c|x\xce\x10\x9c\xc5|\xcbdhh+\x0c'\xc5\x81\xc33\xb5"
1602 b"\x14q\xd6\xc5\xe3`Z#\xdc\x8a\xab\xdd\xea\x08\xc2I\xe7\x02l{\xec\x196\x06"
1603 b"\x91\x8d\xdc\xd5\xb3x\xe1hz%\xd1\xf8\xa5\xdd\x98!\x8c\x1c\xc1\x17RUa\xbb"
1604 b"\x95\x0f\xe4X\xea1\x0c\xf1=R\xbe\xc60\xe3\xa4\x9a\x90bd\x97$]B\x01\xdd"
1605 b"\x1f\xe3h2c\x1e\xa0L`4\xc6x\xa3Z\x8a\r\x14]T^\xd8\x89\x1b\x92\r;\xedY"
1606 b"\x0c\xef\x8d9z\xf3o\xb6)f\xa9]$n\rp\x93\xd0\x10\xa4\x08\xb8\xb2\x8b\xb6"
1607 b"\x8f\x80\xae;\xdcQ\xf1\xfa\x9a\x06\x8e\xa5\x0e\x8cK\x9c @\xaa:UcX\n!\xc6"
1608 b"\x02\x12\xcb\x1b\"=\x16.\x1f\x176\xf2g=\xe1Wn\xe9\xe1\xd4\xf1O\xad\x15"
1609 b"\x86\xe9\xa3T\xaf\xa9\xd7D\xb5\xd1W3pnt\x11\xc7VOj\xb7M\xc4i\xa1\xf1$3"
1610 b"\xbb\xdc\x8af\xb0\xc5Y\r\xd1\xfb\xf2\xe7K\xe6\xc5hwO\xfe\x8c2^&\x07\xd5"
1611 b"\x1fV\x19\xfd\r\x14\xd2i=yZ\xe6o\xaf\xc6\xb6\x92\x9d\xc4\r\xb3\xafw\xac%"
1612 b"\xcfc\x1a\xf1`]\xf2\x1a\x9e\x808\xedm\xedQ\xb2\xfe\xe4h`[q\xae\xe0\x0f"
1613 b"\xba0g\xb6\"N\xc3\xfb\xcfR\x11\xc5\x18)(\xc40\\\xa3\x02\xd9G!\xce\x1b"
1614 b"\xc1\x96x\xb5\xc8z\x1f\x01\xb4\xaf\xde\xc2\xcd\x07\xe7H\xb3y\xa8M\n\\A\t"
1615 b"ar\xddM\x8b\x9a\xea\x84\x9b!\xf1\x8d\xb1\xf1~\x1e\r\xa5H\xba\xf1\x84o"
1616 b"\xda\x87\x01h\xe9\xa2\xbe\xbeqN\x9d\x84\x0b!WG\xda\xa1\xa5A\xb7\xc7`j"
1617 b"\x15\xf2\xe9\xdd?\x015B\xd2~E\x06\x11\xe0\x91!\x05^\x80\xdd\xa8y\x15}"
1618 b"\xa1)\xb1)\x81\x18\xf4\xf4\xf8\xc0\xefD\xe3\xdb2f\x1e\x12\xabu\xc9\x97"
1619 b"\xcd\x1e\xa7\x0c\x02x4_6\x03\xc4$t\xf39\x94\x1d=\xcb\xbfv\\\xf5\xa3\x1d"
1620 b"\x9d8jk\x95\x13)ff\xf9n\xc4\xa9\xe3\x01\xb8\xda\xfb\xab\xdfM\x99\xfb\x05"
1621 b"\xe0\xe9\xb0I\xf4E\xab\xe2\x15\xa3\x035\xe7\xdeT\xee\x82p\xb4\x88\xd3"
1622 b"\x893\x9c/\xc0\xd6\x8fou;\xf6\x95PR\xa9\xb2\xc1\xefFj\xe2\xa7$\xf7h\xf1"
1623 b"\xdfK(\xc9c\xba7\xe8\xe3)\xdd\xb2,\x83\xfb\x84\x18.y\x18Qi\x88\xf8`h-"
1624 b"\xef\xd5\xed\x8c\t\xd8\xc3^\x0f\x00\xb7\xd0[!\xafM\x9b\xd7.\x07\xd8\xfb"
1625 b"\xd9\xe2-S+\xaa8,\xa0\x03\x1b \xea\xa8\x00\xc3\xab~\xd0$e\xa5\x7f\xf7"
1626 b"\x95P]\x12\x19i\xd9\x7fo\x0c\xd8g^\rE\xa5\x80\x18\xc5\x01\x80\xaek`\xff~"
1627 b"\xb6y\xe7+\xe5\x11^D\xa7\x85\x18\"!\xd6\xd2\xa7\xf4\x1eT\xdb\x02\xe15"
1628 b"\x02Y\xbc\x174Z\xe7\x9cH\x1c\xbf\x0f\xc6\xe9f]\xcf\x8cx\xbc\xe5\x15\x94"
1629 b"\xfc3\xbc\xa7TUH\xf1\x84\x1b\xf7\xa9y\xc07\x84\xf8X\xd8\xef\xfc \x1c\xd8"
1630 b"( /\xf2\xb7\xec\xc1\\\x8c\xf6\x95\xa1\x03J\x83vP8\xe1\xe3\xbb~\xc24kA"
1631 b"\x98y\xa1\xf2P\xe9\x9d\xc9J\xf8N\x99\xb4\xceaO\xde\x16\x1e\xc2\x19\xa7"
1632 b"\x03\xd2\xe0\x8f:\x15\xf3\x84\x9e\xee\xe6e\xb8\x02q\xc7AC\x1emw\xfd\t"
1633 b"\x9a\x1eu\xc1\xa9\xcaCwUP\x00\xa5\xf78L4w!\x91L2 \x87\xd0\xf2\x06\x81j"
1634 b"\x80;\x03V\x06\x87\x92\xcb\x90lv@E\x8d\x8d\xa5\xa6\xe7Z[\xdf\xd6E\x03`>"
1635 b"\x8f\xde\xa1bZ\x84\xd0\xa9`\x05\x0e{\x80;\xe3\xbef\x8d\x1d\xebk1.\xe3"
1636 b"\xe9N\x15\xf7\xd4(\xfa\xbb\x15\xbdu\xf7\x7f\x86\xae!\x03L\x1d\xb5\xc1"
1637 b"\xb9\x11\xdb\xd0\x93\xe4\x02\xe1\xd2\xcbBjc_\xe8}d\xdb\xc3\xa0Y\xbe\xc9/"
1638 b"\x95\x01\xa3,\xe6bl@\x01\xdbp\xc2\xce\x14\x168\xc2q\xe3uH\x89X\xa4\xa9"
1639 b"\x19\x1d\xc1}\x7fOX\x19\x9f\xdd\xbe\x85\x83\xff\x96\x1ee\x82O`CF=K\xeb$I"
1640 b"\x17_\xefX\x8bJ'v\xde\x1f+\xd9.v\xf8Tv\x17\xf2\x9f5\x19\xe1\xb9\x91\xa8S"
1641 b"\x86\xbd\x1a\"(\xa5x\x8dC\x03X\x81\x91\xa8\x11\xc4pS\x13\xbc\xf2'J\xae!"
1642 b"\xef\xef\x84G\t\x8d\xc4\x10\x132\x00oS\x9e\xe0\xe4d\x8f\xb8y\xac\xa6\x9f"
1643 b",\xb8f\x87\r\xdf\x9eE\x0f\xe1\xd0\\L\x00\xb2\xe1h\x84\xef}\x98\xa8\x11"
1644 b"\xccW#\\\x83\x7fo\xbbz\x8f\x00"
1645)
1646
1647FILTERS_RAW_3 = [{"id": lzma.FILTER_IA64, "start_offset": 0x100},
1648 {"id": lzma.FILTER_LZMA2}]
1649COMPRESSED_RAW_3 = (
1650 b"\xe0\x07\x80\x03\xdf]\x00\x05\x14\x07bX\x19\xcd\xddn\x98\x15\xe4\xb4\x9d"
1651 b"o\x1d\xc4\xe5\n\x03\xcc2h\xc7\\\x86\xff\xf8\xe2\xfc\xe7\xd9\xfe6\xb8("
1652 b"\xa8wd\xc2\"u.n\x1e\xc3\xf2\x8e\x8d\x8f\x02\x17/\xa6=\xf0\xa2\xdf/M\x89"
1653 b"\xbe\xde\xa7\x1cz\x18-]\xd5\xef\x13\x8frZ\x15\x80\x8c\xf8\x8do\xfa\x12"
1654 b"\x9b#z/\xef\xf0\xfaF\x01\x82\xa3M\x8e\xa1t\xca6 BF$\xe5Q\xa4\x98\xee\xde"
1655 b"l\xe8\x7f\xf0\x9d,bn\x0b\x13\xd4\xa8\x81\xe4N\xc8\x86\x153\xf5x2\xa2O"
1656 b"\x13@Q\xa1\x00/\xa5\xd0O\x97\xdco\xae\xf7z\xc4\xcdS\xb6t<\x16\xf2\x9cI#"
1657 b"\x89ud\xc66Y\xd9\xee\xe6\xce\x12]\xe5\xf0\xaa\x96-Pe\xade:\x04\t\x1b\xf7"
1658 b"\xdb7\n\x86\x1fp\xc8J\xba\xf4\xf0V\xa9\xdc\xf0\x02%G\xf9\xdf=?\x15\x1b"
1659 b"\xe1(\xce\x82=\xd6I\xac3\x12\x0cR\xb7\xae\r\xb1i\x03\x95\x01\xbd\xbe\xfa"
1660 b"\x02s\x01P\x9d\x96X\xb12j\xc8L\xa8\x84b\xf6\xc3\xd4c-H\x93oJl\xd0iQ\xe4k"
1661 b"\x84\x0b\xc1\xb7\xbc\xb1\x17\x88\xb1\xca?@\xf6\x07\xea\xe6x\xf1H12P\x0f"
1662 b"\x8a\xc9\xeauw\xe3\xbe\xaai\xa9W\xd0\x80\xcd#cb5\x99\xd8]\xa9d\x0c\xbd"
1663 b"\xa2\xdcWl\xedUG\xbf\x89yF\xf77\x81v\xbd5\x98\xbeh8\x18W\x08\xf0\x1b\x99"
1664 b"5:\x1a?rD\x96\xa1\x04\x0f\xae\xba\x85\xeb\x9d5@\xf5\x83\xd37\x83\x8ac"
1665 b"\x06\xd4\x97i\xcdt\x16S\x82k\xf6K\x01vy\x88\x91\x9b6T\xdae\r\xfd]:k\xbal"
1666 b"\xa9\xbba\xc34\xf9r\xeb}r\xdb\xc7\xdb*\x8f\x03z\xdc8h\xcc\xc9\xd3\xbcl"
1667 b"\xa5-\xcb\xeaK\xa2\xc5\x15\xc0\xe3\xc1\x86Z\xfb\xebL\xe13\xcf\x9c\xe3"
1668 b"\x1d\xc9\xed\xc2\x06\xcc\xce!\x92\xe5\xfe\x9c^\xa59w \x9bP\xa3PK\x08d"
1669 b"\xf9\xe2Z}\xa7\xbf\xed\xeb%$\x0c\x82\xb8/\xb0\x01\xa9&,\xf7qh{Q\x96)\xf2"
1670 b"q\x96\xc3\x80\xb4\x12\xb0\xba\xe6o\xf4!\xb4[\xd4\x8aw\x10\xf7t\x0c\xb3"
1671 b"\xd9\xd5\xc3`^\x81\x11??\\\xa4\x99\x85R\xd4\x8e\x83\xc9\x1eX\xbfa\xf1"
1672 b"\xac\xb0\xea\xea\xd7\xd0\xab\x18\xe2\xf2\xed\xe1\xb7\xc9\x18\xcbS\xe4>"
1673 b"\xc9\x95H\xe8\xcb\t\r%\xeb\xc7$.o\xf1\xf3R\x17\x1db\xbb\xd8U\xa5^\xccS"
1674 b"\x16\x01\x87\xf3/\x93\xd1\xf0v\xc0r\xd7\xcc\xa2Gkz\xca\x80\x0e\xfd\xd0"
1675 b"\x8b\xbb\xd2Ix\xb3\x1ey\xca-0\xe3z^\xd6\xd6\x8f_\xf1\x9dP\x9fi\xa7\xd1"
1676 b"\xe8\x90\x84\xdc\xbf\xcdky\x8e\xdc\x81\x7f\xa3\xb2+\xbf\x04\xef\xd8\\"
1677 b"\xc4\xdf\xe1\xb0\x01\xe9\x93\xe3Y\xf1\x1dY\xe8h\x81\xcf\xf1w\xcc\xb4\xef"
1678 b" \x8b|\x04\xea\x83ej\xbe\x1f\xd4z\x9c`\xd3\x1a\x92A\x06\xe5\x8f\xa9\x13"
1679 b"\t\x9e=\xfa\x1c\xe5_\x9f%v\x1bo\x11ZO\xd8\xf4\t\xddM\x16-\x04\xfc\x18<\""
1680 b"CM\xddg~b\xf6\xef\x8e\x0c\xd0\xde|\xa0'\x8a\x0c\xd6x\xae!J\xa6F\x88\x15u"
1681 b"\x008\x17\xbc7y\xb3\xd8u\xac_\x85\x8d\xe7\xc1@\x9c\xecqc\xa3#\xad\xf1"
1682 b"\x935\xb5)_\r\xec3]\x0fo]5\xd0my\x07\x9b\xee\x81\xb5\x0f\xcfK+\x00\xc0"
1683 b"\xe4b\x10\xe4\x0c\x1a \x9b\xe0\x97t\xf6\xa1\x9e\x850\xba\x0c\x9a\x8d\xc8"
1684 b"\x8f\x07\xd7\xae\xc8\xf9+i\xdc\xb9k\xb0>f\x19\xb8\r\xa8\xf8\x1f$\xa5{p"
1685 b"\xc6\x880\xce\xdb\xcf\xca_\x86\xac\x88h6\x8bZ%'\xd0\n\xbf\x0f\x9c\"\xba"
1686 b"\xe5\x86\x9f\x0f7X=mNX[\xcc\x19FU\xc9\x860\xbc\x90a+* \xae_$\x03\x1e\xd3"
1687 b"\xcd_\xa0\x9c\xde\xaf46q\xa5\xc9\x92\xd7\xca\xe3`\x9d\x85}\xb4\xff\xb3"
1688 b"\x83\xfb\xb6\xca\xae`\x0bw\x7f\xfc\xd8\xacVe\x19\xc8\x17\x0bZ\xad\x88"
1689 b"\xeb#\x97\x03\x13\xb1d\x0f{\x0c\x04w\x07\r\x97\xbd\xd6\xc1\xc3B:\x95\x08"
1690 b"^\x10V\xaeaH\x02\xd9\xe3\n\\\x01X\xf6\x9c\x8a\x06u#%\xbe*\xa1\x18v\x85"
1691 b"\xec!\t4\x00\x00\x00"
1692)
1693
1694FILTERS_RAW_4 = [{"id": lzma.FILTER_DELTA, "dist": 4},
1695 {"id": lzma.FILTER_X86, "start_offset": 0x40},
1696 {"id": lzma.FILTER_LZMA2, "preset": 4, "lc": 2}]
1697COMPRESSED_RAW_4 = (
1698 b"\xe0\x07\x80\x06\x0e\\\x00\x05\x14\x07bW\xaah\xdd\x10\xdc'\xd6\x90,\xc6v"
1699 b"Jq \x14l\xb7\x83xB\x0b\x97f=&fx\xba\n>Tn\xbf\x8f\xfb\x1dF\xca\xc3v_\xca?"
1700 b"\xfbV<\x92#\xd4w\xa6\x8a\xeb\xf6\x03\xc0\x01\x94\xd8\x9e\x13\x12\x98\xd1"
1701 b"*\xfa]c\xe8\x1e~\xaf\xb5]Eg\xfb\x9e\x01\"8\xb2\x90\x06=~\xe9\x91W\xcd"
1702 b"\xecD\x12\xc7\xfa\xe1\x91\x06\xc7\x99\xb9\xe3\x901\x87\x19u\x0f\x869\xff"
1703 b"\xc1\xb0hw|\xb0\xdcl\xcck\xb16o7\x85\xee{Y_b\xbf\xbc$\xf3=\x8d\x8bw\xe5Z"
1704 b"\x08@\xc4kmE\xad\xfb\xf6*\xd8\xad\xa1\xfb\xc5{\xdej,)\x1emB\x1f<\xaeca"
1705 b"\x80(\xee\x07 \xdf\xe9\xf8\xeb\x0e-\x97\x86\x90c\xf9\xea'B\xf7`\xd7\xb0"
1706 b"\x92\xbd\xa0\x82]\xbd\x0e\x0eB\x19\xdc\x96\xc6\x19\xd86D\xf0\xd5\x831"
1707 b"\x03\xb7\x1c\xf7&5\x1a\x8f PZ&j\xf8\x98\x1bo\xcc\x86\x9bS\xd3\xa5\xcdu"
1708 b"\xf9$\xcc\x97o\xe5V~\xfb\x97\xb5\x0b\x17\x9c\xfdxW\x10\xfep4\x80\xdaHDY"
1709 b"\xfa)\xfet\xb5\"\xd4\xd3F\x81\xf4\x13\x1f\xec\xdf\xa5\x13\xfc\"\x91x\xb7"
1710 b"\x99\xce\xc8\x92\n\xeb[\x10l*Y\xd8\xb1@\x06\xc8o\x8d7r\xebu\xfd5\x0e\x7f"
1711 b"\xf1$U{\t}\x1fQ\xcfxN\x9d\x9fXX\xe9`\x83\xc1\x06\xf4\x87v-f\x11\xdb/\\"
1712 b"\x06\xff\xd7)B\xf3g\x06\x88#2\x1eB244\x7f4q\t\xc893?mPX\x95\xa6a\xfb)d"
1713 b"\x9b\xfc\x98\x9aj\x04\xae\x9b\x9d\x19w\xba\xf92\xfaA\x11\\\x17\x97C3\xa4"
1714 b"\xbc!\x88\xcdo[\xec:\x030\x91.\x85\xe0@\\4\x16\x12\x9d\xcaJv\x97\xb04"
1715 b"\xack\xcbkf\xa3ss\xfc\x16^\x8ce\x85a\xa5=&\xecr\xb3p\xd1E\xd5\x80y\xc7"
1716 b"\xda\xf6\xfek\xbcT\xbfH\xee\x15o\xc5\x8c\x830\xec\x1d\x01\xae\x0c-e\\"
1717 b"\x91\x90\x94\xb2\xf8\x88\x91\xe8\x0b\xae\xa7>\x98\xf6\x9ck\xd2\xc6\x08"
1718 b"\xe6\xab\t\x98\xf2!\xa0\x8c^\xacqA\x99<\x1cEG\x97\xc8\xf1\xb6\xb9\x82"
1719 b"\x8d\xf7\x08s\x98a\xff\xe3\xcc\x92\x0e\xd2\xb6U\xd7\xd9\x86\x7fa\xe5\x1c"
1720 b"\x8dTG@\t\x1e\x0e7*\xfc\xde\xbc]6N\xf7\xf1\x84\x9e\x9f\xcf\xe9\x1e\xb5'"
1721 b"\xf4<\xdf\x99sq\xd0\x9d\xbd\x99\x0b\xb4%p4\xbf{\xbb\x8a\xd2\x0b\xbc=M"
1722 b"\x94H:\xf5\xa8\xd6\xa4\xc90\xc2D\xb9\xd3\xa8\xb0S\x87 `\xa2\xeb\xf3W\xce"
1723 b" 7\xf9N#\r\xe6\xbe\t\x9d\xe7\x811\xf9\x10\xc1\xc2\x14\xf6\xfc\xcba\xb7"
1724 b"\xb1\x7f\x95l\xe4\tjA\xec:\x10\xe5\xfe\xc2\\=D\xe2\x0c\x0b3]\xf7\xc1\xf7"
1725 b"\xbceZ\xb1A\xea\x16\xe5\xfddgFQ\xed\xaf\x04\xa3\xd3\xf8\xa2q\x19B\xd4r"
1726 b"\xc5\x0c\x9a\x14\x94\xea\x91\xc4o\xe4\xbb\xb4\x99\xf4@\xd1\xe6\x0c\xe3"
1727 b"\xc6d\xa0Q\n\xf2/\xd8\xb8S5\x8a\x18:\xb5g\xac\x95D\xce\x17\x07\xd4z\xda"
1728 b"\x90\xe65\x07\x19H!\t\xfdu\x16\x8e\x0eR\x19\xf4\x8cl\x0c\xf9Q\xf1\x80"
1729 b"\xe3\xbf\xd7O\xf8\x8c\x18\x0b\x9c\xf1\x1fb\xe1\tR\xb2\xf1\xe1A\xea \xcf-"
1730 b"IGE\xf1\x14\x98$\x83\x15\xc9\xd8j\xbf\x19\x0f\xd5\xd1\xaa\xb3\xf3\xa5I2s"
1731 b"\x8d\x145\xca\xd5\xd93\x9c\xb8D0\xe6\xaa%\xd0\xc0P}JO^h\x8e\x08\xadlV."
1732 b"\x18\x88\x13\x05o\xb0\x07\xeaw\xe0\xb6\xa4\xd5*\xe4r\xef\x07G+\xc1\xbei["
1733 b"w\xe8\xab@_\xef\x15y\xe5\x12\xc9W\x1b.\xad\x85-\xc2\xf7\xe3mU6g\x8eSA"
1734 b"\x01(\xd3\xdb\x16\x13=\xde\x92\xf9,D\xb8\x8a\xb2\xb4\xc9\xc3\xefnE\xe8\\"
1735 b"\xa6\xe2Y\xd2\xcf\xcb\x8c\xb6\xd5\xe9\x1d\x1e\x9a\x8b~\xe2\xa6\rE\x84uV"
1736 b"\xed\xc6\x99\xddm<\x10[\x0fu\x1f\xc1\x1d1\n\xcfw\xb2%!\xf0[\xce\x87\x83B"
1737 b"\x08\xaa,\x08%d\xcef\x94\"\xd9g.\xc83\xcbXY+4\xec\x85qA\n\x1d=9\xf0*\xb1"
1738 b"\x1f/\xf3s\xd61b\x7f@\xfb\x9d\xe3FQ\\\xbd\x82\x1e\x00\xf3\xce\xd3\xe1"
1739 b"\xca,E\xfd7[\xab\xb6\xb7\xac!mA}\xbd\x9d3R5\x9cF\xabH\xeb\x92)cc\x13\xd0"
1740 b"\xbd\xee\xe9n{\x1dIJB\xa5\xeb\x11\xe8`w&`\x8b}@Oxe\t\x8a\x07\x02\x95\xf2"
1741 b"\xed\xda|\xb1e\xbe\xaa\xbbg\x19@\xe1Y\x878\x84\x0f\x8c\xe3\xc98\xf2\x9e"
1742 b"\xd5N\xb5J\xef\xab!\xe2\x8dq\xe1\xe5q\xc5\xee\x11W\xb7\xe4k*\x027\xa0"
1743 b"\xa3J\xf4\xd8m\xd0q\x94\xcb\x07\n:\xb6`.\xe4\x9c\x15+\xc0)\xde\x80X\xd4"
1744 b"\xcfQm\x01\xc2cP\x1cA\x85'\xc9\xac\x8b\xe6\xb2)\xe6\x84t\x1c\x92\xe4Z"
1745 b"\x1cR\xb0\x9e\x96\xd1\xfb\x1c\xa6\x8b\xcb`\x10\x12]\xf2gR\x9bFT\xe0\xc8H"
1746 b"S\xfb\xac<\x04\xc7\xc1\xe8\xedP\xf4\x16\xdb\xc0\xd7e\xc2\x17J^\x1f\xab"
1747 b"\xff[\x08\x19\xb4\xf5\xfb\x19\xb4\x04\xe5c~']\xcb\xc2A\xec\x90\xd0\xed"
1748 b"\x06,\xc5K{\x86\x03\xb1\xcdMx\xdeQ\x8c3\xf9\x8a\xea=\x89\xaba\xd2\xc89a"
1749 b"\xd72\xf0\xc3\x19\x8a\xdfs\xd4\xfd\xbb\x81b\xeaE\"\xd8\xf4d\x0cD\xf7IJ!"
1750 b"\xe5d\xbbG\xe9\xcam\xaa\x0f_r\x95\x91NBq\xcaP\xce\xa7\xa9\xb5\x10\x94eP!"
1751 b"|\x856\xcd\xbfIir\xb8e\x9bjP\x97q\xabwS7\x1a\x0ehM\xe7\xca\x86?\xdeP}y~"
1752 b"\x0f\x95I\xfc\x13\xe1<Q\x1b\x868\x1d\x11\xdf\x94\xf4\x82>r\xa9k\x88\xcb"
1753 b"\xfd\xc3v\xe2\xb9\x8a\x02\x8eq\x92I\xf8\xf6\xf1\x03s\x9b\xb8\xe3\"\xe3"
1754 b"\xa9\xa5>D\xb8\x96;\xe7\x92\xd133\xe8\xdd'e\xc9.\xdc;\x17\x1f\xf5H\x13q"
1755 b"\xa4W\x0c\xdb~\x98\x01\xeb\xdf\xe32\x13\x0f\xddx\n6\xa0\t\x10\xb6\xbb"
1756 b"\xb0\xc3\x18\xb6;\x9fj[\xd9\xd5\xc9\x06\x8a\x87\xcd\xe5\xee\xfc\x9c-%@"
1757 b"\xee\xe0\xeb\xd2\xe3\xe8\xfb\xc0\x122\\\xc7\xaf\xc2\xa1Oth\xb3\x8f\x82"
1758 b"\xb3\x18\xa8\x07\xd5\xee_\xbe\xe0\x1cA\x1e_\r\x9a\xb0\x17W&\xa2D\x91\x94"
1759 b"\x1a\xb2\xef\xf2\xdc\x85;X\xb0,\xeb>-7S\xe5\xca\x07)\x1fp\x7f\xcaQBL\xca"
1760 b"\xf3\xb9d\xfc\xb5su\xb0\xc8\x95\x90\xeb*)\xa0v\xe4\x9a{FW\xf4l\xde\xcdj"
1761 b"\x00"
1762)
1763
1764
1765def test_main():
1766 run_unittest(
1767 CompressorDecompressorTestCase,
1768 CompressDecompressFunctionTestCase,
1769 FileTestCase,
Nadeem Vawdae8604042012-06-04 23:38:12 +02001770 OpenTestCase,
Nadeem Vawda3ff069e2011-11-30 00:25:06 +02001771 MiscellaneousTestCase,
1772 )
1773
1774if __name__ == "__main__":
1775 test_main()