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