blob: e4d2cb1ff3b57ac3db177a92dd9fe64983c1b0bf [file] [log] [blame]
Nadeem Vawda3ff069e2011-11-30 00:25:06 +02001from io import BytesIO, UnsupportedOperation
2import os
3import random
4import unittest
5
6from test.support import (
7 _4G, TESTFN, import_module, bigmemtest, run_unittest, unlink
8)
9
10lzma = import_module("lzma")
11from lzma import LZMACompressor, LZMADecompressor, LZMAError, LZMAFile
12
13
14class CompressorDecompressorTestCase(unittest.TestCase):
15
16 # Test error cases.
17
18 def test_simple_bad_args(self):
19 self.assertRaises(TypeError, LZMACompressor, [])
20 self.assertRaises(TypeError, LZMACompressor, format=3.45)
21 self.assertRaises(TypeError, LZMACompressor, check="")
22 self.assertRaises(TypeError, LZMACompressor, preset="asdf")
23 self.assertRaises(TypeError, LZMACompressor, filters=3)
24 # Can't specify FORMAT_AUTO when compressing.
25 self.assertRaises(ValueError, LZMACompressor, format=lzma.FORMAT_AUTO)
26 # Can't specify a preset and a custom filter chain at the same time.
27 with self.assertRaises(ValueError):
28 LZMACompressor(preset=7, filters=[{"id": lzma.FILTER_LZMA2}])
29
30 self.assertRaises(TypeError, LZMADecompressor, ())
31 self.assertRaises(TypeError, LZMADecompressor, memlimit=b"qw")
32 with self.assertRaises(TypeError):
33 LZMADecompressor(lzma.FORMAT_RAW, filters="zzz")
34 # Cannot specify a memory limit with FILTER_RAW.
35 with self.assertRaises(ValueError):
36 LZMADecompressor(lzma.FORMAT_RAW, memlimit=0x1000000)
37 # Can only specify a custom filter chain with FILTER_RAW.
38 self.assertRaises(ValueError, LZMADecompressor, filters=FILTERS_RAW_1)
39 with self.assertRaises(ValueError):
40 LZMADecompressor(format=lzma.FORMAT_XZ, filters=FILTERS_RAW_1)
41 with self.assertRaises(ValueError):
42 LZMADecompressor(format=lzma.FORMAT_ALONE, filters=FILTERS_RAW_1)
43
44 lzc = LZMACompressor()
45 self.assertRaises(TypeError, lzc.compress)
46 self.assertRaises(TypeError, lzc.compress, b"foo", b"bar")
47 self.assertRaises(TypeError, lzc.flush, b"blah")
48 empty = lzc.flush()
49 self.assertRaises(ValueError, lzc.compress, b"quux")
50 self.assertRaises(ValueError, lzc.flush)
51
52 lzd = LZMADecompressor()
53 self.assertRaises(TypeError, lzd.decompress)
54 self.assertRaises(TypeError, lzd.decompress, b"foo", b"bar")
55 lzd.decompress(empty)
56 self.assertRaises(EOFError, lzd.decompress, b"quux")
57
58 def test_bad_filter_spec(self):
59 self.assertRaises(TypeError, LZMACompressor, filters=[b"wobsite"])
60 self.assertRaises(ValueError, LZMACompressor, filters=[{"xyzzy": 3}])
61 self.assertRaises(ValueError, LZMACompressor, filters=[{"id": 98765}])
62 with self.assertRaises(ValueError):
63 LZMACompressor(filters=[{"id": lzma.FILTER_LZMA2, "foo": 0}])
64 with self.assertRaises(ValueError):
65 LZMACompressor(filters=[{"id": lzma.FILTER_DELTA, "foo": 0}])
66 with self.assertRaises(ValueError):
67 LZMACompressor(filters=[{"id": lzma.FILTER_X86, "foo": 0}])
68
69 def test_decompressor_after_eof(self):
70 lzd = LZMADecompressor()
71 lzd.decompress(COMPRESSED_XZ)
72 self.assertRaises(EOFError, lzd.decompress, b"nyan")
73
74 def test_decompressor_memlimit(self):
75 lzd = LZMADecompressor(memlimit=1024)
76 self.assertRaises(LZMAError, lzd.decompress, COMPRESSED_XZ)
77
78 lzd = LZMADecompressor(lzma.FORMAT_XZ, memlimit=1024)
79 self.assertRaises(LZMAError, lzd.decompress, COMPRESSED_XZ)
80
81 lzd = LZMADecompressor(lzma.FORMAT_ALONE, memlimit=1024)
82 self.assertRaises(LZMAError, lzd.decompress, COMPRESSED_ALONE)
83
84 # Test LZMADecompressor on known-good input data.
85
86 def _test_decompressor(self, lzd, data, check, unused_data=b""):
87 self.assertFalse(lzd.eof)
88 out = lzd.decompress(data)
89 self.assertEqual(out, INPUT)
90 self.assertEqual(lzd.check, check)
91 self.assertTrue(lzd.eof)
92 self.assertEqual(lzd.unused_data, unused_data)
93
94 def test_decompressor_auto(self):
95 lzd = LZMADecompressor()
96 self._test_decompressor(lzd, COMPRESSED_XZ, lzma.CHECK_CRC64)
97
98 lzd = LZMADecompressor()
99 self._test_decompressor(lzd, COMPRESSED_ALONE, lzma.CHECK_NONE)
100
101 def test_decompressor_xz(self):
102 lzd = LZMADecompressor(lzma.FORMAT_XZ)
103 self._test_decompressor(lzd, COMPRESSED_XZ, lzma.CHECK_CRC64)
104
105 def test_decompressor_alone(self):
106 lzd = LZMADecompressor(lzma.FORMAT_ALONE)
107 self._test_decompressor(lzd, COMPRESSED_ALONE, lzma.CHECK_NONE)
108
109 def test_decompressor_raw_1(self):
110 lzd = LZMADecompressor(lzma.FORMAT_RAW, filters=FILTERS_RAW_1)
111 self._test_decompressor(lzd, COMPRESSED_RAW_1, lzma.CHECK_NONE)
112
113 def test_decompressor_raw_2(self):
114 lzd = LZMADecompressor(lzma.FORMAT_RAW, filters=FILTERS_RAW_2)
115 self._test_decompressor(lzd, COMPRESSED_RAW_2, lzma.CHECK_NONE)
116
117 def test_decompressor_raw_3(self):
118 lzd = LZMADecompressor(lzma.FORMAT_RAW, filters=FILTERS_RAW_3)
119 self._test_decompressor(lzd, COMPRESSED_RAW_3, lzma.CHECK_NONE)
120
121 def test_decompressor_raw_4(self):
122 lzd = LZMADecompressor(lzma.FORMAT_RAW, filters=FILTERS_RAW_4)
123 self._test_decompressor(lzd, COMPRESSED_RAW_4, lzma.CHECK_NONE)
124
125 def test_decompressor_chunks(self):
126 lzd = LZMADecompressor()
127 out = []
128 for i in range(0, len(COMPRESSED_XZ), 10):
129 self.assertFalse(lzd.eof)
130 out.append(lzd.decompress(COMPRESSED_XZ[i:i+10]))
131 out = b"".join(out)
132 self.assertEqual(out, INPUT)
133 self.assertEqual(lzd.check, lzma.CHECK_CRC64)
134 self.assertTrue(lzd.eof)
135 self.assertEqual(lzd.unused_data, b"")
136
137 def test_decompressor_unused_data(self):
138 lzd = LZMADecompressor()
139 extra = b"fooblibar"
140 self._test_decompressor(lzd, COMPRESSED_XZ + extra, lzma.CHECK_CRC64,
141 unused_data=extra)
142
143 def test_decompressor_bad_input(self):
144 lzd = LZMADecompressor()
145 self.assertRaises(LZMAError, lzd.decompress, COMPRESSED_RAW_1)
146
147 lzd = LZMADecompressor(lzma.FORMAT_XZ)
148 self.assertRaises(LZMAError, lzd.decompress, COMPRESSED_ALONE)
149
150 lzd = LZMADecompressor(lzma.FORMAT_ALONE)
151 self.assertRaises(LZMAError, lzd.decompress, COMPRESSED_XZ)
152
153 lzd = LZMADecompressor(lzma.FORMAT_RAW, filters=FILTERS_RAW_1)
154 self.assertRaises(LZMAError, lzd.decompress, COMPRESSED_XZ)
155
156 # Test that LZMACompressor->LZMADecompressor preserves the input data.
157
158 def test_roundtrip_xz(self):
159 lzc = LZMACompressor()
160 cdata = lzc.compress(INPUT) + lzc.flush()
161 lzd = LZMADecompressor()
162 self._test_decompressor(lzd, cdata, lzma.CHECK_CRC64)
163
164 def test_roundtrip_alone(self):
165 lzc = LZMACompressor(lzma.FORMAT_ALONE)
166 cdata = lzc.compress(INPUT) + lzc.flush()
167 lzd = LZMADecompressor()
168 self._test_decompressor(lzd, cdata, lzma.CHECK_NONE)
169
170 def test_roundtrip_raw(self):
171 lzc = LZMACompressor(lzma.FORMAT_RAW, filters=FILTERS_RAW_4)
172 cdata = lzc.compress(INPUT) + lzc.flush()
173 lzd = LZMADecompressor(lzma.FORMAT_RAW, filters=FILTERS_RAW_4)
174 self._test_decompressor(lzd, cdata, lzma.CHECK_NONE)
175
176 def test_roundtrip_chunks(self):
177 lzc = LZMACompressor()
178 cdata = []
179 for i in range(0, len(INPUT), 10):
180 cdata.append(lzc.compress(INPUT[i:i+10]))
181 cdata.append(lzc.flush())
182 cdata = b"".join(cdata)
183 lzd = LZMADecompressor()
184 self._test_decompressor(lzd, cdata, lzma.CHECK_CRC64)
185
186 # LZMADecompressor intentionally does not handle concatenated streams.
187
188 def test_decompressor_multistream(self):
189 lzd = LZMADecompressor()
190 self._test_decompressor(lzd, COMPRESSED_XZ + COMPRESSED_ALONE,
191 lzma.CHECK_CRC64, unused_data=COMPRESSED_ALONE)
192
193 # Test with inputs larger than 4GiB.
194
195 @bigmemtest(size=_4G + 100, memuse=2)
196 def test_compressor_bigmem(self, size):
197 lzc = LZMACompressor()
198 cdata = lzc.compress(b"x" * size) + lzc.flush()
199 ddata = lzma.decompress(cdata)
200 try:
201 self.assertEqual(len(ddata), size)
202 self.assertEqual(len(ddata.strip(b"x")), 0)
203 finally:
204 ddata = None
205
206 @bigmemtest(size=_4G + 100, memuse=3)
207 def test_decompressor_bigmem(self, size):
208 lzd = LZMADecompressor()
209 blocksize = 10 * 1024 * 1024
210 block = random.getrandbits(blocksize * 8).to_bytes(blocksize, "little")
211 try:
212 input = block * (size // blocksize + 1)
213 cdata = lzma.compress(input)
214 ddata = lzd.decompress(cdata)
215 self.assertEqual(ddata, input)
216 finally:
217 input = cdata = ddata = None
218
219
220class CompressDecompressFunctionTestCase(unittest.TestCase):
221
222 # Test error cases:
223
224 def test_bad_args(self):
225 self.assertRaises(TypeError, lzma.compress)
226 self.assertRaises(TypeError, lzma.compress, [])
227 self.assertRaises(TypeError, lzma.compress, b"", format="xz")
228 self.assertRaises(TypeError, lzma.compress, b"", check="none")
229 self.assertRaises(TypeError, lzma.compress, b"", preset="blah")
230 self.assertRaises(TypeError, lzma.compress, b"", filters=1024)
231 # Can't specify a preset and a custom filter chain at the same time.
232 with self.assertRaises(ValueError):
233 lzma.compress(b"", preset=3, filters=[{"id": lzma.FILTER_LZMA2}])
234
235 self.assertRaises(TypeError, lzma.decompress)
236 self.assertRaises(TypeError, lzma.decompress, [])
237 self.assertRaises(TypeError, lzma.decompress, b"", format="lzma")
238 self.assertRaises(TypeError, lzma.decompress, b"", memlimit=7.3e9)
239 with self.assertRaises(TypeError):
240 lzma.decompress(b"", format=lzma.FORMAT_RAW, filters={})
241 # Cannot specify a memory limit with FILTER_RAW.
242 with self.assertRaises(ValueError):
243 lzma.decompress(b"", format=lzma.FORMAT_RAW, memlimit=0x1000000)
244 # Can only specify a custom filter chain with FILTER_RAW.
245 with self.assertRaises(ValueError):
246 lzma.decompress(b"", filters=FILTERS_RAW_1)
247 with self.assertRaises(ValueError):
248 lzma.decompress(b"", format=lzma.FORMAT_XZ, filters=FILTERS_RAW_1)
249 with self.assertRaises(ValueError):
250 lzma.decompress(
251 b"", format=lzma.FORMAT_ALONE, filters=FILTERS_RAW_1)
252
253 def test_decompress_memlimit(self):
254 with self.assertRaises(LZMAError):
255 lzma.decompress(COMPRESSED_XZ, memlimit=1024)
256 with self.assertRaises(LZMAError):
257 lzma.decompress(
258 COMPRESSED_XZ, format=lzma.FORMAT_XZ, memlimit=1024)
259 with self.assertRaises(LZMAError):
260 lzma.decompress(
261 COMPRESSED_ALONE, format=lzma.FORMAT_ALONE, memlimit=1024)
262
263 # Test LZMADecompressor on known-good input data.
264
265 def test_decompress_good_input(self):
266 ddata = lzma.decompress(COMPRESSED_XZ)
267 self.assertEqual(ddata, INPUT)
268
269 ddata = lzma.decompress(COMPRESSED_ALONE)
270 self.assertEqual(ddata, INPUT)
271
272 ddata = lzma.decompress(COMPRESSED_XZ, lzma.FORMAT_XZ)
273 self.assertEqual(ddata, INPUT)
274
275 ddata = lzma.decompress(COMPRESSED_ALONE, lzma.FORMAT_ALONE)
276 self.assertEqual(ddata, INPUT)
277
278 ddata = lzma.decompress(
279 COMPRESSED_RAW_1, lzma.FORMAT_RAW, filters=FILTERS_RAW_1)
280 self.assertEqual(ddata, INPUT)
281
282 ddata = lzma.decompress(
283 COMPRESSED_RAW_2, lzma.FORMAT_RAW, filters=FILTERS_RAW_2)
284 self.assertEqual(ddata, INPUT)
285
286 ddata = lzma.decompress(
287 COMPRESSED_RAW_3, lzma.FORMAT_RAW, filters=FILTERS_RAW_3)
288 self.assertEqual(ddata, INPUT)
289
290 ddata = lzma.decompress(
291 COMPRESSED_RAW_4, lzma.FORMAT_RAW, filters=FILTERS_RAW_4)
292 self.assertEqual(ddata, INPUT)
293
294 def test_decompress_incomplete_input(self):
295 self.assertRaises(LZMAError, lzma.decompress, COMPRESSED_XZ[:128])
296 self.assertRaises(LZMAError, lzma.decompress, COMPRESSED_ALONE[:128])
297 self.assertRaises(LZMAError, lzma.decompress, COMPRESSED_RAW_1[:128],
298 format=lzma.FORMAT_RAW, filters=FILTERS_RAW_1)
299 self.assertRaises(LZMAError, lzma.decompress, COMPRESSED_RAW_2[:128],
300 format=lzma.FORMAT_RAW, filters=FILTERS_RAW_2)
301 self.assertRaises(LZMAError, lzma.decompress, COMPRESSED_RAW_3[:128],
302 format=lzma.FORMAT_RAW, filters=FILTERS_RAW_3)
303 self.assertRaises(LZMAError, lzma.decompress, COMPRESSED_RAW_4[:128],
304 format=lzma.FORMAT_RAW, filters=FILTERS_RAW_4)
305
306 def test_decompress_bad_input(self):
307 with self.assertRaises(LZMAError):
308 lzma.decompress(COMPRESSED_RAW_1)
309 with self.assertRaises(LZMAError):
310 lzma.decompress(COMPRESSED_ALONE, format=lzma.FORMAT_XZ)
311 with self.assertRaises(LZMAError):
312 lzma.decompress(COMPRESSED_XZ, format=lzma.FORMAT_ALONE)
313 with self.assertRaises(LZMAError):
314 lzma.decompress(COMPRESSED_XZ, format=lzma.FORMAT_RAW,
315 filters=FILTERS_RAW_1)
316
317 # Test that compress()->decompress() preserves the input data.
318
319 def test_roundtrip(self):
320 cdata = lzma.compress(INPUT)
321 ddata = lzma.decompress(cdata)
322 self.assertEqual(ddata, INPUT)
323
324 cdata = lzma.compress(INPUT, lzma.FORMAT_XZ)
325 ddata = lzma.decompress(cdata)
326 self.assertEqual(ddata, INPUT)
327
328 cdata = lzma.compress(INPUT, lzma.FORMAT_ALONE)
329 ddata = lzma.decompress(cdata)
330 self.assertEqual(ddata, INPUT)
331
332 cdata = lzma.compress(INPUT, lzma.FORMAT_RAW, filters=FILTERS_RAW_4)
333 ddata = lzma.decompress(cdata, lzma.FORMAT_RAW, filters=FILTERS_RAW_4)
334 self.assertEqual(ddata, INPUT)
335
336 # Unlike LZMADecompressor, decompress() *does* handle concatenated streams.
337
338 def test_decompress_multistream(self):
339 ddata = lzma.decompress(COMPRESSED_XZ + COMPRESSED_ALONE)
340 self.assertEqual(ddata, INPUT * 2)
341
342
343class TempFile:
344 """Context manager - creates a file, and deletes it on __exit__."""
345
346 def __init__(self, filename, data=b""):
347 self.filename = filename
348 self.data = data
349
350 def __enter__(self):
351 with open(self.filename, "wb") as f:
352 f.write(self.data)
353
354 def __exit__(self, *args):
355 unlink(self.filename)
356
357
358class FileTestCase(unittest.TestCase):
359
360 def test_init(self):
Nadeem Vawda33c34da2012-06-04 23:34:07 +0200361 with LZMAFile(BytesIO(COMPRESSED_XZ)) as f:
Nadeem Vawda3ff069e2011-11-30 00:25:06 +0200362 pass
Nadeem Vawda33c34da2012-06-04 23:34:07 +0200363 with LZMAFile(BytesIO(), "w") as f:
Nadeem Vawda3ff069e2011-11-30 00:25:06 +0200364 pass
Nadeem Vawda33c34da2012-06-04 23:34:07 +0200365 with LZMAFile(BytesIO(), "a") as f:
Nadeem Vawda3ff069e2011-11-30 00:25:06 +0200366 pass
367
368 def test_init_with_filename(self):
369 with TempFile(TESTFN, COMPRESSED_XZ):
370 with LZMAFile(TESTFN) as f:
371 pass
372 with LZMAFile(TESTFN, "w") as f:
373 pass
374 with LZMAFile(TESTFN, "a") as f:
375 pass
376
Nadeem Vawda6cbb20c2012-06-04 23:36:24 +0200377 def test_init_mode(self):
378 with TempFile(TESTFN):
379 with LZMAFile(TESTFN, "r"):
380 pass
381 with LZMAFile(TESTFN, "rb"):
382 pass
383 with LZMAFile(TESTFN, "w"):
384 pass
385 with LZMAFile(TESTFN, "wb"):
386 pass
387 with LZMAFile(TESTFN, "a"):
388 pass
389 with LZMAFile(TESTFN, "ab"):
390 pass
391
Nadeem Vawda3ff069e2011-11-30 00:25:06 +0200392 def test_init_bad_mode(self):
393 with self.assertRaises(ValueError):
Nadeem Vawda33c34da2012-06-04 23:34:07 +0200394 LZMAFile(BytesIO(COMPRESSED_XZ), (3, "x"))
Nadeem Vawda3ff069e2011-11-30 00:25:06 +0200395 with self.assertRaises(ValueError):
Nadeem Vawda33c34da2012-06-04 23:34:07 +0200396 LZMAFile(BytesIO(COMPRESSED_XZ), "")
Nadeem Vawda3ff069e2011-11-30 00:25:06 +0200397 with self.assertRaises(ValueError):
Nadeem Vawda33c34da2012-06-04 23:34:07 +0200398 LZMAFile(BytesIO(COMPRESSED_XZ), "x")
Nadeem Vawda3ff069e2011-11-30 00:25:06 +0200399 with self.assertRaises(ValueError):
Nadeem Vawda6cbb20c2012-06-04 23:36:24 +0200400 LZMAFile(BytesIO(COMPRESSED_XZ), "rt")
Nadeem Vawda3ff069e2011-11-30 00:25:06 +0200401 with self.assertRaises(ValueError):
Nadeem Vawda33c34da2012-06-04 23:34:07 +0200402 LZMAFile(BytesIO(COMPRESSED_XZ), "r+")
Nadeem Vawda3ff069e2011-11-30 00:25:06 +0200403 with self.assertRaises(ValueError):
Nadeem Vawda6cbb20c2012-06-04 23:36:24 +0200404 LZMAFile(BytesIO(COMPRESSED_XZ), "wt")
Nadeem Vawda3ff069e2011-11-30 00:25:06 +0200405 with self.assertRaises(ValueError):
Nadeem Vawda33c34da2012-06-04 23:34:07 +0200406 LZMAFile(BytesIO(COMPRESSED_XZ), "w+")
Nadeem Vawda3ff069e2011-11-30 00:25:06 +0200407 with self.assertRaises(ValueError):
Nadeem Vawda33c34da2012-06-04 23:34:07 +0200408 LZMAFile(BytesIO(COMPRESSED_XZ), "rw")
Nadeem Vawda3ff069e2011-11-30 00:25:06 +0200409
410 def test_init_bad_check(self):
411 with self.assertRaises(TypeError):
Nadeem Vawda33c34da2012-06-04 23:34:07 +0200412 LZMAFile(BytesIO(), "w", check=b"asd")
Nadeem Vawda3ff069e2011-11-30 00:25:06 +0200413 # CHECK_UNKNOWN and anything above CHECK_ID_MAX should be invalid.
414 with self.assertRaises(LZMAError):
Nadeem Vawda33c34da2012-06-04 23:34:07 +0200415 LZMAFile(BytesIO(), "w", check=lzma.CHECK_UNKNOWN)
Nadeem Vawda3ff069e2011-11-30 00:25:06 +0200416 with self.assertRaises(LZMAError):
Nadeem Vawda33c34da2012-06-04 23:34:07 +0200417 LZMAFile(BytesIO(), "w", check=lzma.CHECK_ID_MAX + 3)
Nadeem Vawda3ff069e2011-11-30 00:25:06 +0200418 # Cannot specify a check with mode="r".
419 with self.assertRaises(ValueError):
Nadeem Vawda33c34da2012-06-04 23:34:07 +0200420 LZMAFile(BytesIO(COMPRESSED_XZ), check=lzma.CHECK_NONE)
Nadeem Vawda3ff069e2011-11-30 00:25:06 +0200421 with self.assertRaises(ValueError):
Nadeem Vawda33c34da2012-06-04 23:34:07 +0200422 LZMAFile(BytesIO(COMPRESSED_XZ), check=lzma.CHECK_CRC32)
Nadeem Vawda3ff069e2011-11-30 00:25:06 +0200423 with self.assertRaises(ValueError):
Nadeem Vawda33c34da2012-06-04 23:34:07 +0200424 LZMAFile(BytesIO(COMPRESSED_XZ), check=lzma.CHECK_CRC64)
Nadeem Vawda3ff069e2011-11-30 00:25:06 +0200425 with self.assertRaises(ValueError):
Nadeem Vawda33c34da2012-06-04 23:34:07 +0200426 LZMAFile(BytesIO(COMPRESSED_XZ), check=lzma.CHECK_SHA256)
Nadeem Vawda3ff069e2011-11-30 00:25:06 +0200427 with self.assertRaises(ValueError):
Nadeem Vawda33c34da2012-06-04 23:34:07 +0200428 LZMAFile(BytesIO(COMPRESSED_XZ), check=lzma.CHECK_UNKNOWN)
Nadeem Vawda3ff069e2011-11-30 00:25:06 +0200429
430 def test_init_bad_preset(self):
431 with self.assertRaises(TypeError):
Nadeem Vawda33c34da2012-06-04 23:34:07 +0200432 LZMAFile(BytesIO(), "w", preset=4.39)
Nadeem Vawda3ff069e2011-11-30 00:25:06 +0200433 with self.assertRaises(LZMAError):
Nadeem Vawda33c34da2012-06-04 23:34:07 +0200434 LZMAFile(BytesIO(), "w", preset=10)
Nadeem Vawda3ff069e2011-11-30 00:25:06 +0200435 with self.assertRaises(LZMAError):
Nadeem Vawda33c34da2012-06-04 23:34:07 +0200436 LZMAFile(BytesIO(), "w", preset=23)
Nadeem Vawda3ff069e2011-11-30 00:25:06 +0200437 with self.assertRaises(OverflowError):
Nadeem Vawda33c34da2012-06-04 23:34:07 +0200438 LZMAFile(BytesIO(), "w", preset=-1)
Nadeem Vawda3ff069e2011-11-30 00:25:06 +0200439 with self.assertRaises(OverflowError):
Nadeem Vawda33c34da2012-06-04 23:34:07 +0200440 LZMAFile(BytesIO(), "w", preset=-7)
Nadeem Vawda3ff069e2011-11-30 00:25:06 +0200441 with self.assertRaises(TypeError):
Nadeem Vawda33c34da2012-06-04 23:34:07 +0200442 LZMAFile(BytesIO(), "w", preset="foo")
Nadeem Vawda3ff069e2011-11-30 00:25:06 +0200443 # Cannot specify a preset with mode="r".
444 with self.assertRaises(ValueError):
Nadeem Vawda33c34da2012-06-04 23:34:07 +0200445 LZMAFile(BytesIO(COMPRESSED_XZ), preset=3)
Nadeem Vawda3ff069e2011-11-30 00:25:06 +0200446
447 def test_init_bad_filter_spec(self):
448 with self.assertRaises(TypeError):
Nadeem Vawda33c34da2012-06-04 23:34:07 +0200449 LZMAFile(BytesIO(), "w", filters=[b"wobsite"])
Nadeem Vawda3ff069e2011-11-30 00:25:06 +0200450 with self.assertRaises(ValueError):
Nadeem Vawda33c34da2012-06-04 23:34:07 +0200451 LZMAFile(BytesIO(), "w", filters=[{"xyzzy": 3}])
Nadeem Vawda3ff069e2011-11-30 00:25:06 +0200452 with self.assertRaises(ValueError):
Nadeem Vawda33c34da2012-06-04 23:34:07 +0200453 LZMAFile(BytesIO(), "w", filters=[{"id": 98765}])
Nadeem Vawda3ff069e2011-11-30 00:25:06 +0200454 with self.assertRaises(ValueError):
Nadeem Vawda33c34da2012-06-04 23:34:07 +0200455 LZMAFile(BytesIO(), "w",
Nadeem Vawda3ff069e2011-11-30 00:25:06 +0200456 filters=[{"id": lzma.FILTER_LZMA2, "foo": 0}])
457 with self.assertRaises(ValueError):
Nadeem Vawda33c34da2012-06-04 23:34:07 +0200458 LZMAFile(BytesIO(), "w",
Nadeem Vawda3ff069e2011-11-30 00:25:06 +0200459 filters=[{"id": lzma.FILTER_DELTA, "foo": 0}])
460 with self.assertRaises(ValueError):
Nadeem Vawda33c34da2012-06-04 23:34:07 +0200461 LZMAFile(BytesIO(), "w",
Nadeem Vawda3ff069e2011-11-30 00:25:06 +0200462 filters=[{"id": lzma.FILTER_X86, "foo": 0}])
463
464 def test_init_with_preset_and_filters(self):
465 with self.assertRaises(ValueError):
Nadeem Vawda33c34da2012-06-04 23:34:07 +0200466 LZMAFile(BytesIO(), "w", format=lzma.FORMAT_RAW,
467 preset=6, filters=FILTERS_RAW_1)
Nadeem Vawda3ff069e2011-11-30 00:25:06 +0200468
469 def test_close(self):
470 with BytesIO(COMPRESSED_XZ) as src:
Nadeem Vawda33c34da2012-06-04 23:34:07 +0200471 f = LZMAFile(src)
Nadeem Vawda3ff069e2011-11-30 00:25:06 +0200472 f.close()
473 # LZMAFile.close() should not close the underlying file object.
474 self.assertFalse(src.closed)
475 # Try closing an already-closed LZMAFile.
476 f.close()
477 self.assertFalse(src.closed)
478
479 # Test with a real file on disk, opened directly by LZMAFile.
480 with TempFile(TESTFN, COMPRESSED_XZ):
481 f = LZMAFile(TESTFN)
482 fp = f._fp
483 f.close()
484 # Here, LZMAFile.close() *should* close the underlying file object.
485 self.assertTrue(fp.closed)
486 # Try closing an already-closed LZMAFile.
487 f.close()
488
489 def test_closed(self):
Nadeem Vawda33c34da2012-06-04 23:34:07 +0200490 f = LZMAFile(BytesIO(COMPRESSED_XZ))
Nadeem Vawda3ff069e2011-11-30 00:25:06 +0200491 try:
492 self.assertFalse(f.closed)
493 f.read()
494 self.assertFalse(f.closed)
495 finally:
496 f.close()
497 self.assertTrue(f.closed)
498
Nadeem Vawda33c34da2012-06-04 23:34:07 +0200499 f = LZMAFile(BytesIO(), "w")
Nadeem Vawda3ff069e2011-11-30 00:25:06 +0200500 try:
501 self.assertFalse(f.closed)
502 finally:
503 f.close()
504 self.assertTrue(f.closed)
505
506 def test_fileno(self):
Nadeem Vawda33c34da2012-06-04 23:34:07 +0200507 f = LZMAFile(BytesIO(COMPRESSED_XZ))
Nadeem Vawda3ff069e2011-11-30 00:25:06 +0200508 try:
509 self.assertRaises(UnsupportedOperation, f.fileno)
510 finally:
511 f.close()
512 self.assertRaises(ValueError, f.fileno)
513 with TempFile(TESTFN, COMPRESSED_XZ):
514 f = LZMAFile(TESTFN)
515 try:
516 self.assertEqual(f.fileno(), f._fp.fileno())
517 self.assertIsInstance(f.fileno(), int)
518 finally:
519 f.close()
520 self.assertRaises(ValueError, f.fileno)
521
522 def test_seekable(self):
Nadeem Vawda33c34da2012-06-04 23:34:07 +0200523 f = LZMAFile(BytesIO(COMPRESSED_XZ))
Nadeem Vawda3ff069e2011-11-30 00:25:06 +0200524 try:
525 self.assertTrue(f.seekable())
526 f.read()
527 self.assertTrue(f.seekable())
528 finally:
529 f.close()
530 self.assertRaises(ValueError, f.seekable)
531
Nadeem Vawda33c34da2012-06-04 23:34:07 +0200532 f = LZMAFile(BytesIO(), "w")
Nadeem Vawda3ff069e2011-11-30 00:25:06 +0200533 try:
534 self.assertFalse(f.seekable())
535 finally:
536 f.close()
537 self.assertRaises(ValueError, f.seekable)
538
Nadeem Vawdaae557d72012-02-12 01:51:38 +0200539 src = BytesIO(COMPRESSED_XZ)
540 src.seekable = lambda: False
Nadeem Vawda33c34da2012-06-04 23:34:07 +0200541 f = LZMAFile(src)
Nadeem Vawdaae557d72012-02-12 01:51:38 +0200542 try:
543 self.assertFalse(f.seekable())
544 finally:
545 f.close()
546 self.assertRaises(ValueError, f.seekable)
547
Nadeem Vawda3ff069e2011-11-30 00:25:06 +0200548 def test_readable(self):
Nadeem Vawda33c34da2012-06-04 23:34:07 +0200549 f = LZMAFile(BytesIO(COMPRESSED_XZ))
Nadeem Vawda3ff069e2011-11-30 00:25:06 +0200550 try:
551 self.assertTrue(f.readable())
552 f.read()
553 self.assertTrue(f.readable())
554 finally:
555 f.close()
556 self.assertRaises(ValueError, f.readable)
557
Nadeem Vawda33c34da2012-06-04 23:34:07 +0200558 f = LZMAFile(BytesIO(), "w")
Nadeem Vawda3ff069e2011-11-30 00:25:06 +0200559 try:
560 self.assertFalse(f.readable())
561 finally:
562 f.close()
563 self.assertRaises(ValueError, f.readable)
564
565 def test_writable(self):
Nadeem Vawda33c34da2012-06-04 23:34:07 +0200566 f = LZMAFile(BytesIO(COMPRESSED_XZ))
Nadeem Vawda3ff069e2011-11-30 00:25:06 +0200567 try:
568 self.assertFalse(f.writable())
569 f.read()
570 self.assertFalse(f.writable())
571 finally:
572 f.close()
573 self.assertRaises(ValueError, f.writable)
574
Nadeem Vawda33c34da2012-06-04 23:34:07 +0200575 f = LZMAFile(BytesIO(), "w")
Nadeem Vawda3ff069e2011-11-30 00:25:06 +0200576 try:
577 self.assertTrue(f.writable())
578 finally:
579 f.close()
580 self.assertRaises(ValueError, f.writable)
581
582 def test_read(self):
Nadeem Vawda33c34da2012-06-04 23:34:07 +0200583 with LZMAFile(BytesIO(COMPRESSED_XZ)) as f:
Nadeem Vawda3ff069e2011-11-30 00:25:06 +0200584 self.assertEqual(f.read(), INPUT)
585 self.assertEqual(f.read(), b"")
Nadeem Vawda33c34da2012-06-04 23:34:07 +0200586 with LZMAFile(BytesIO(COMPRESSED_ALONE)) as f:
Nadeem Vawda3ff069e2011-11-30 00:25:06 +0200587 self.assertEqual(f.read(), INPUT)
Nadeem Vawda33c34da2012-06-04 23:34:07 +0200588 with LZMAFile(BytesIO(COMPRESSED_XZ), format=lzma.FORMAT_XZ) as f:
Nadeem Vawda3ff069e2011-11-30 00:25:06 +0200589 self.assertEqual(f.read(), INPUT)
590 self.assertEqual(f.read(), b"")
Nadeem Vawda33c34da2012-06-04 23:34:07 +0200591 with LZMAFile(BytesIO(COMPRESSED_ALONE), format=lzma.FORMAT_ALONE) as f:
Nadeem Vawda3ff069e2011-11-30 00:25:06 +0200592 self.assertEqual(f.read(), INPUT)
593 self.assertEqual(f.read(), b"")
Nadeem Vawda33c34da2012-06-04 23:34:07 +0200594 with LZMAFile(BytesIO(COMPRESSED_RAW_1),
Nadeem Vawda3ff069e2011-11-30 00:25:06 +0200595 format=lzma.FORMAT_RAW, filters=FILTERS_RAW_1) as f:
596 self.assertEqual(f.read(), INPUT)
597 self.assertEqual(f.read(), b"")
Nadeem Vawda33c34da2012-06-04 23:34:07 +0200598 with LZMAFile(BytesIO(COMPRESSED_RAW_2),
Nadeem Vawda3ff069e2011-11-30 00:25:06 +0200599 format=lzma.FORMAT_RAW, filters=FILTERS_RAW_2) as f:
600 self.assertEqual(f.read(), INPUT)
601 self.assertEqual(f.read(), b"")
Nadeem Vawda33c34da2012-06-04 23:34:07 +0200602 with LZMAFile(BytesIO(COMPRESSED_RAW_3),
Nadeem Vawda3ff069e2011-11-30 00:25:06 +0200603 format=lzma.FORMAT_RAW, filters=FILTERS_RAW_3) as f:
604 self.assertEqual(f.read(), INPUT)
605 self.assertEqual(f.read(), b"")
Nadeem Vawda33c34da2012-06-04 23:34:07 +0200606 with LZMAFile(BytesIO(COMPRESSED_RAW_4),
Nadeem Vawda3ff069e2011-11-30 00:25:06 +0200607 format=lzma.FORMAT_RAW, filters=FILTERS_RAW_4) as f:
608 self.assertEqual(f.read(), INPUT)
609 self.assertEqual(f.read(), b"")
610
611 def test_read_0(self):
Nadeem Vawda33c34da2012-06-04 23:34:07 +0200612 with LZMAFile(BytesIO(COMPRESSED_XZ)) as f:
Nadeem Vawda3ff069e2011-11-30 00:25:06 +0200613 self.assertEqual(f.read(0), b"")
Nadeem Vawda33c34da2012-06-04 23:34:07 +0200614 with LZMAFile(BytesIO(COMPRESSED_ALONE)) as f:
Nadeem Vawda3ff069e2011-11-30 00:25:06 +0200615 self.assertEqual(f.read(0), b"")
Nadeem Vawda33c34da2012-06-04 23:34:07 +0200616 with LZMAFile(BytesIO(COMPRESSED_XZ), format=lzma.FORMAT_XZ) as f:
Nadeem Vawda3ff069e2011-11-30 00:25:06 +0200617 self.assertEqual(f.read(0), b"")
Nadeem Vawda33c34da2012-06-04 23:34:07 +0200618 with LZMAFile(BytesIO(COMPRESSED_ALONE), format=lzma.FORMAT_ALONE) as f:
Nadeem Vawda3ff069e2011-11-30 00:25:06 +0200619 self.assertEqual(f.read(0), b"")
620
621 def test_read_10(self):
Nadeem Vawda33c34da2012-06-04 23:34:07 +0200622 with LZMAFile(BytesIO(COMPRESSED_XZ)) as f:
Nadeem Vawda3ff069e2011-11-30 00:25:06 +0200623 chunks = []
624 while True:
625 result = f.read(10)
626 if not result:
627 break
628 self.assertLessEqual(len(result), 10)
629 chunks.append(result)
630 self.assertEqual(b"".join(chunks), INPUT)
631
632 def test_read_multistream(self):
Nadeem Vawda33c34da2012-06-04 23:34:07 +0200633 with LZMAFile(BytesIO(COMPRESSED_XZ * 5)) as f:
Nadeem Vawda3ff069e2011-11-30 00:25:06 +0200634 self.assertEqual(f.read(), INPUT * 5)
Nadeem Vawda33c34da2012-06-04 23:34:07 +0200635 with LZMAFile(BytesIO(COMPRESSED_XZ + COMPRESSED_ALONE)) as f:
Nadeem Vawda3ff069e2011-11-30 00:25:06 +0200636 self.assertEqual(f.read(), INPUT * 2)
Nadeem Vawda33c34da2012-06-04 23:34:07 +0200637 with LZMAFile(BytesIO(COMPRESSED_RAW_3 * 4),
Nadeem Vawda3ff069e2011-11-30 00:25:06 +0200638 format=lzma.FORMAT_RAW, filters=FILTERS_RAW_3) as f:
639 self.assertEqual(f.read(), INPUT * 4)
640
641 def test_read_multistream_buffer_size_aligned(self):
642 # Test the case where a stream boundary coincides with the end
643 # of the raw read buffer.
644 saved_buffer_size = lzma._BUFFER_SIZE
645 lzma._BUFFER_SIZE = len(COMPRESSED_XZ)
646 try:
Nadeem Vawda33c34da2012-06-04 23:34:07 +0200647 with LZMAFile(BytesIO(COMPRESSED_XZ * 5)) as f:
Nadeem Vawda3ff069e2011-11-30 00:25:06 +0200648 self.assertEqual(f.read(), INPUT * 5)
649 finally:
650 lzma._BUFFER_SIZE = saved_buffer_size
651
652 def test_read_from_file(self):
653 with TempFile(TESTFN, COMPRESSED_XZ):
654 with LZMAFile(TESTFN) as f:
655 self.assertEqual(f.read(), INPUT)
656 self.assertEqual(f.read(), b"")
657
658 def test_read_incomplete(self):
Nadeem Vawda33c34da2012-06-04 23:34:07 +0200659 with LZMAFile(BytesIO(COMPRESSED_XZ[:128])) as f:
Nadeem Vawda3ff069e2011-11-30 00:25:06 +0200660 self.assertRaises(EOFError, f.read)
661
662 def test_read_bad_args(self):
Nadeem Vawda33c34da2012-06-04 23:34:07 +0200663 f = LZMAFile(BytesIO(COMPRESSED_XZ))
Nadeem Vawda3ff069e2011-11-30 00:25:06 +0200664 f.close()
665 self.assertRaises(ValueError, f.read)
Nadeem Vawda33c34da2012-06-04 23:34:07 +0200666 with LZMAFile(BytesIO(), "w") as f:
Nadeem Vawda3ff069e2011-11-30 00:25:06 +0200667 self.assertRaises(ValueError, f.read)
Nadeem Vawda33c34da2012-06-04 23:34:07 +0200668 with LZMAFile(BytesIO(COMPRESSED_XZ)) as f:
Nadeem Vawda3ff069e2011-11-30 00:25:06 +0200669 self.assertRaises(TypeError, f.read, None)
670
671 def test_read1(self):
Nadeem Vawda33c34da2012-06-04 23:34:07 +0200672 with LZMAFile(BytesIO(COMPRESSED_XZ)) as f:
Nadeem Vawda3ff069e2011-11-30 00:25:06 +0200673 blocks = []
674 while True:
675 result = f.read1()
676 if not result:
677 break
678 blocks.append(result)
679 self.assertEqual(b"".join(blocks), INPUT)
680 self.assertEqual(f.read1(), b"")
681
682 def test_read1_0(self):
Nadeem Vawda33c34da2012-06-04 23:34:07 +0200683 with LZMAFile(BytesIO(COMPRESSED_XZ)) as f:
Nadeem Vawda3ff069e2011-11-30 00:25:06 +0200684 self.assertEqual(f.read1(0), b"")
685
686 def test_read1_10(self):
Nadeem Vawda33c34da2012-06-04 23:34:07 +0200687 with LZMAFile(BytesIO(COMPRESSED_XZ)) as f:
Nadeem Vawda3ff069e2011-11-30 00:25:06 +0200688 blocks = []
689 while True:
690 result = f.read1(10)
691 if not result:
692 break
693 blocks.append(result)
694 self.assertEqual(b"".join(blocks), INPUT)
695 self.assertEqual(f.read1(), b"")
696
697 def test_read1_multistream(self):
Nadeem Vawda33c34da2012-06-04 23:34:07 +0200698 with LZMAFile(BytesIO(COMPRESSED_XZ * 5)) as f:
Nadeem Vawda3ff069e2011-11-30 00:25:06 +0200699 blocks = []
700 while True:
701 result = f.read1()
702 if not result:
703 break
704 blocks.append(result)
705 self.assertEqual(b"".join(blocks), INPUT * 5)
706 self.assertEqual(f.read1(), b"")
707
708 def test_read1_bad_args(self):
Nadeem Vawda33c34da2012-06-04 23:34:07 +0200709 f = LZMAFile(BytesIO(COMPRESSED_XZ))
Nadeem Vawda3ff069e2011-11-30 00:25:06 +0200710 f.close()
711 self.assertRaises(ValueError, f.read1)
Nadeem Vawda33c34da2012-06-04 23:34:07 +0200712 with LZMAFile(BytesIO(), "w") as f:
Nadeem Vawda3ff069e2011-11-30 00:25:06 +0200713 self.assertRaises(ValueError, f.read1)
Nadeem Vawda33c34da2012-06-04 23:34:07 +0200714 with LZMAFile(BytesIO(COMPRESSED_XZ)) as f:
Nadeem Vawda3ff069e2011-11-30 00:25:06 +0200715 self.assertRaises(TypeError, f.read1, None)
716
717 def test_peek(self):
Nadeem Vawda33c34da2012-06-04 23:34:07 +0200718 with LZMAFile(BytesIO(COMPRESSED_XZ)) as f:
Nadeem Vawda3ff069e2011-11-30 00:25:06 +0200719 result = f.peek()
720 self.assertGreater(len(result), 0)
721 self.assertTrue(INPUT.startswith(result))
722 self.assertEqual(f.read(), INPUT)
Nadeem Vawda33c34da2012-06-04 23:34:07 +0200723 with LZMAFile(BytesIO(COMPRESSED_XZ)) as f:
Nadeem Vawda3ff069e2011-11-30 00:25:06 +0200724 result = f.peek(10)
725 self.assertGreater(len(result), 0)
726 self.assertTrue(INPUT.startswith(result))
727 self.assertEqual(f.read(), INPUT)
728
729 def test_peek_bad_args(self):
Nadeem Vawda33c34da2012-06-04 23:34:07 +0200730 with LZMAFile(BytesIO(), "w") as f:
Nadeem Vawda3ff069e2011-11-30 00:25:06 +0200731 self.assertRaises(ValueError, f.peek)
732
733 def test_iterator(self):
734 with BytesIO(INPUT) as f:
735 lines = f.readlines()
Nadeem Vawda33c34da2012-06-04 23:34:07 +0200736 with LZMAFile(BytesIO(COMPRESSED_XZ)) as f:
Nadeem Vawda3ff069e2011-11-30 00:25:06 +0200737 self.assertListEqual(list(iter(f)), lines)
Nadeem Vawda33c34da2012-06-04 23:34:07 +0200738 with LZMAFile(BytesIO(COMPRESSED_ALONE)) as f:
Nadeem Vawda3ff069e2011-11-30 00:25:06 +0200739 self.assertListEqual(list(iter(f)), lines)
Nadeem Vawda33c34da2012-06-04 23:34:07 +0200740 with LZMAFile(BytesIO(COMPRESSED_XZ), format=lzma.FORMAT_XZ) as f:
Nadeem Vawda3ff069e2011-11-30 00:25:06 +0200741 self.assertListEqual(list(iter(f)), lines)
Nadeem Vawda33c34da2012-06-04 23:34:07 +0200742 with LZMAFile(BytesIO(COMPRESSED_ALONE), format=lzma.FORMAT_ALONE) as f:
Nadeem Vawda3ff069e2011-11-30 00:25:06 +0200743 self.assertListEqual(list(iter(f)), lines)
Nadeem Vawda33c34da2012-06-04 23:34:07 +0200744 with LZMAFile(BytesIO(COMPRESSED_RAW_2),
Nadeem Vawda3ff069e2011-11-30 00:25:06 +0200745 format=lzma.FORMAT_RAW, filters=FILTERS_RAW_2) as f:
746 self.assertListEqual(list(iter(f)), lines)
747
748 def test_readline(self):
749 with BytesIO(INPUT) as f:
750 lines = f.readlines()
Nadeem Vawda33c34da2012-06-04 23:34:07 +0200751 with LZMAFile(BytesIO(COMPRESSED_XZ)) as f:
Nadeem Vawda3ff069e2011-11-30 00:25:06 +0200752 for line in lines:
753 self.assertEqual(f.readline(), line)
754
755 def test_readlines(self):
756 with BytesIO(INPUT) as f:
757 lines = f.readlines()
Nadeem Vawda33c34da2012-06-04 23:34:07 +0200758 with LZMAFile(BytesIO(COMPRESSED_XZ)) as f:
Nadeem Vawda3ff069e2011-11-30 00:25:06 +0200759 self.assertListEqual(f.readlines(), lines)
760
761 def test_write(self):
762 with BytesIO() as dst:
Nadeem Vawda33c34da2012-06-04 23:34:07 +0200763 with LZMAFile(dst, "w") as f:
Nadeem Vawda3ff069e2011-11-30 00:25:06 +0200764 f.write(INPUT)
765 expected = lzma.compress(INPUT)
766 self.assertEqual(dst.getvalue(), expected)
767 with BytesIO() as dst:
Nadeem Vawda33c34da2012-06-04 23:34:07 +0200768 with LZMAFile(dst, "w", format=lzma.FORMAT_XZ) as f:
Nadeem Vawda3ff069e2011-11-30 00:25:06 +0200769 f.write(INPUT)
770 expected = lzma.compress(INPUT, format=lzma.FORMAT_XZ)
771 self.assertEqual(dst.getvalue(), expected)
772 with BytesIO() as dst:
Nadeem Vawda33c34da2012-06-04 23:34:07 +0200773 with LZMAFile(dst, "w", format=lzma.FORMAT_ALONE) as f:
Nadeem Vawda3ff069e2011-11-30 00:25:06 +0200774 f.write(INPUT)
775 expected = lzma.compress(INPUT, format=lzma.FORMAT_ALONE)
776 self.assertEqual(dst.getvalue(), expected)
777 with BytesIO() as dst:
Nadeem Vawda33c34da2012-06-04 23:34:07 +0200778 with LZMAFile(dst, "w", format=lzma.FORMAT_RAW,
Nadeem Vawda3ff069e2011-11-30 00:25:06 +0200779 filters=FILTERS_RAW_2) as f:
780 f.write(INPUT)
781 expected = lzma.compress(INPUT, format=lzma.FORMAT_RAW,
782 filters=FILTERS_RAW_2)
783 self.assertEqual(dst.getvalue(), expected)
784
785 def test_write_10(self):
786 with BytesIO() as dst:
Nadeem Vawda33c34da2012-06-04 23:34:07 +0200787 with LZMAFile(dst, "w") as f:
Nadeem Vawda3ff069e2011-11-30 00:25:06 +0200788 for start in range(0, len(INPUT), 10):
789 f.write(INPUT[start:start+10])
790 expected = lzma.compress(INPUT)
791 self.assertEqual(dst.getvalue(), expected)
792
793 def test_write_append(self):
794 part1 = INPUT[:1024]
795 part2 = INPUT[1024:1536]
796 part3 = INPUT[1536:]
797 expected = b"".join(lzma.compress(x) for x in (part1, part2, part3))
798 with BytesIO() as dst:
Nadeem Vawda33c34da2012-06-04 23:34:07 +0200799 with LZMAFile(dst, "w") as f:
Nadeem Vawda3ff069e2011-11-30 00:25:06 +0200800 f.write(part1)
Nadeem Vawda33c34da2012-06-04 23:34:07 +0200801 with LZMAFile(dst, "a") as f:
Nadeem Vawda3ff069e2011-11-30 00:25:06 +0200802 f.write(part2)
Nadeem Vawda33c34da2012-06-04 23:34:07 +0200803 with LZMAFile(dst, "a") as f:
Nadeem Vawda3ff069e2011-11-30 00:25:06 +0200804 f.write(part3)
805 self.assertEqual(dst.getvalue(), expected)
806
807 def test_write_to_file(self):
808 try:
809 with LZMAFile(TESTFN, "w") as f:
810 f.write(INPUT)
811 expected = lzma.compress(INPUT)
812 with open(TESTFN, "rb") as f:
813 self.assertEqual(f.read(), expected)
814 finally:
815 unlink(TESTFN)
816
817 def test_write_append_to_file(self):
818 part1 = INPUT[:1024]
819 part2 = INPUT[1024:1536]
820 part3 = INPUT[1536:]
821 expected = b"".join(lzma.compress(x) for x in (part1, part2, part3))
822 try:
823 with LZMAFile(TESTFN, "w") as f:
824 f.write(part1)
825 with LZMAFile(TESTFN, "a") as f:
826 f.write(part2)
827 with LZMAFile(TESTFN, "a") as f:
828 f.write(part3)
829 with open(TESTFN, "rb") as f:
830 self.assertEqual(f.read(), expected)
831 finally:
832 unlink(TESTFN)
833
834 def test_write_bad_args(self):
Nadeem Vawda33c34da2012-06-04 23:34:07 +0200835 f = LZMAFile(BytesIO(), "w")
Nadeem Vawda3ff069e2011-11-30 00:25:06 +0200836 f.close()
837 self.assertRaises(ValueError, f.write, b"foo")
Nadeem Vawda33c34da2012-06-04 23:34:07 +0200838 with LZMAFile(BytesIO(COMPRESSED_XZ), "r") as f:
Nadeem Vawda3ff069e2011-11-30 00:25:06 +0200839 self.assertRaises(ValueError, f.write, b"bar")
Nadeem Vawda33c34da2012-06-04 23:34:07 +0200840 with LZMAFile(BytesIO(), "w") as f:
Nadeem Vawda3ff069e2011-11-30 00:25:06 +0200841 self.assertRaises(TypeError, f.write, None)
842 self.assertRaises(TypeError, f.write, "text")
843 self.assertRaises(TypeError, f.write, 789)
844
845 def test_writelines(self):
846 with BytesIO(INPUT) as f:
847 lines = f.readlines()
848 with BytesIO() as dst:
Nadeem Vawda33c34da2012-06-04 23:34:07 +0200849 with LZMAFile(dst, "w") as f:
Nadeem Vawda3ff069e2011-11-30 00:25:06 +0200850 f.writelines(lines)
851 expected = lzma.compress(INPUT)
852 self.assertEqual(dst.getvalue(), expected)
853
854 def test_seek_forward(self):
Nadeem Vawda33c34da2012-06-04 23:34:07 +0200855 with LZMAFile(BytesIO(COMPRESSED_XZ)) as f:
Nadeem Vawda3ff069e2011-11-30 00:25:06 +0200856 f.seek(555)
857 self.assertEqual(f.read(), INPUT[555:])
858
859 def test_seek_forward_across_streams(self):
Nadeem Vawda33c34da2012-06-04 23:34:07 +0200860 with LZMAFile(BytesIO(COMPRESSED_XZ * 2)) as f:
Nadeem Vawda3ff069e2011-11-30 00:25:06 +0200861 f.seek(len(INPUT) + 123)
862 self.assertEqual(f.read(), INPUT[123:])
863
864 def test_seek_forward_relative_to_current(self):
Nadeem Vawda33c34da2012-06-04 23:34:07 +0200865 with LZMAFile(BytesIO(COMPRESSED_XZ)) as f:
Nadeem Vawda3ff069e2011-11-30 00:25:06 +0200866 f.read(100)
867 f.seek(1236, 1)
868 self.assertEqual(f.read(), INPUT[1336:])
869
870 def test_seek_forward_relative_to_end(self):
Nadeem Vawda33c34da2012-06-04 23:34:07 +0200871 with LZMAFile(BytesIO(COMPRESSED_XZ)) as f:
Nadeem Vawda3ff069e2011-11-30 00:25:06 +0200872 f.seek(-555, 2)
873 self.assertEqual(f.read(), INPUT[-555:])
874
875 def test_seek_backward(self):
Nadeem Vawda33c34da2012-06-04 23:34:07 +0200876 with LZMAFile(BytesIO(COMPRESSED_XZ)) as f:
Nadeem Vawda3ff069e2011-11-30 00:25:06 +0200877 f.read(1001)
878 f.seek(211)
879 self.assertEqual(f.read(), INPUT[211:])
880
881 def test_seek_backward_across_streams(self):
Nadeem Vawda33c34da2012-06-04 23:34:07 +0200882 with LZMAFile(BytesIO(COMPRESSED_XZ * 2)) as f:
Nadeem Vawda3ff069e2011-11-30 00:25:06 +0200883 f.read(len(INPUT) + 333)
884 f.seek(737)
885 self.assertEqual(f.read(), INPUT[737:] + INPUT)
886
887 def test_seek_backward_relative_to_end(self):
Nadeem Vawda33c34da2012-06-04 23:34:07 +0200888 with LZMAFile(BytesIO(COMPRESSED_XZ)) as f:
Nadeem Vawda3ff069e2011-11-30 00:25:06 +0200889 f.seek(-150, 2)
890 self.assertEqual(f.read(), INPUT[-150:])
891
892 def test_seek_past_end(self):
Nadeem Vawda33c34da2012-06-04 23:34:07 +0200893 with LZMAFile(BytesIO(COMPRESSED_XZ)) as f:
Nadeem Vawda3ff069e2011-11-30 00:25:06 +0200894 f.seek(len(INPUT) + 9001)
895 self.assertEqual(f.tell(), len(INPUT))
896 self.assertEqual(f.read(), b"")
897
898 def test_seek_past_start(self):
Nadeem Vawda33c34da2012-06-04 23:34:07 +0200899 with LZMAFile(BytesIO(COMPRESSED_XZ)) as f:
Nadeem Vawda3ff069e2011-11-30 00:25:06 +0200900 f.seek(-88)
901 self.assertEqual(f.tell(), 0)
902 self.assertEqual(f.read(), INPUT)
903
904 def test_seek_bad_args(self):
Nadeem Vawda33c34da2012-06-04 23:34:07 +0200905 f = LZMAFile(BytesIO(COMPRESSED_XZ))
Nadeem Vawda3ff069e2011-11-30 00:25:06 +0200906 f.close()
907 self.assertRaises(ValueError, f.seek, 0)
Nadeem Vawda33c34da2012-06-04 23:34:07 +0200908 with LZMAFile(BytesIO(), "w") as f:
Nadeem Vawda3ff069e2011-11-30 00:25:06 +0200909 self.assertRaises(ValueError, f.seek, 0)
Nadeem Vawda33c34da2012-06-04 23:34:07 +0200910 with LZMAFile(BytesIO(COMPRESSED_XZ)) as f:
Nadeem Vawda3ff069e2011-11-30 00:25:06 +0200911 self.assertRaises(ValueError, f.seek, 0, 3)
912 self.assertRaises(ValueError, f.seek, 9, ())
913 self.assertRaises(TypeError, f.seek, None)
914 self.assertRaises(TypeError, f.seek, b"derp")
915
916 def test_tell(self):
Nadeem Vawda33c34da2012-06-04 23:34:07 +0200917 with LZMAFile(BytesIO(COMPRESSED_XZ)) as f:
Nadeem Vawda3ff069e2011-11-30 00:25:06 +0200918 pos = 0
919 while True:
920 self.assertEqual(f.tell(), pos)
921 result = f.read(183)
922 if not result:
923 break
924 pos += len(result)
925 self.assertEqual(f.tell(), len(INPUT))
Nadeem Vawda33c34da2012-06-04 23:34:07 +0200926 with LZMAFile(BytesIO(), "w") as f:
Nadeem Vawda3ff069e2011-11-30 00:25:06 +0200927 for pos in range(0, len(INPUT), 144):
928 self.assertEqual(f.tell(), pos)
929 f.write(INPUT[pos:pos+144])
930 self.assertEqual(f.tell(), len(INPUT))
931
932 def test_tell_bad_args(self):
Nadeem Vawda33c34da2012-06-04 23:34:07 +0200933 f = LZMAFile(BytesIO(COMPRESSED_XZ))
Nadeem Vawda3ff069e2011-11-30 00:25:06 +0200934 f.close()
935 self.assertRaises(ValueError, f.tell)
936
937
938class MiscellaneousTestCase(unittest.TestCase):
939
940 def test_is_check_supported(self):
941 # CHECK_NONE and CHECK_CRC32 should always be supported,
942 # regardless of the options liblzma was compiled with.
Nadeem Vawdabc459bb2012-05-06 23:01:51 +0200943 self.assertTrue(lzma.is_check_supported(lzma.CHECK_NONE))
944 self.assertTrue(lzma.is_check_supported(lzma.CHECK_CRC32))
Nadeem Vawda3ff069e2011-11-30 00:25:06 +0200945
946 # The .xz format spec cannot store check IDs above this value.
Nadeem Vawdabc459bb2012-05-06 23:01:51 +0200947 self.assertFalse(lzma.is_check_supported(lzma.CHECK_ID_MAX + 1))
Nadeem Vawda3ff069e2011-11-30 00:25:06 +0200948
949 # This value should not be a valid check ID.
Nadeem Vawdabc459bb2012-05-06 23:01:51 +0200950 self.assertFalse(lzma.is_check_supported(lzma.CHECK_UNKNOWN))
Nadeem Vawda3ff069e2011-11-30 00:25:06 +0200951
Nadeem Vawdaf55b3292012-05-06 23:01:27 +0200952 def test_encode_filter_properties(self):
953 with self.assertRaises(TypeError):
954 lzma.encode_filter_properties(b"not a dict")
955 with self.assertRaises(ValueError):
956 lzma.encode_filter_properties({"id": 0x100})
957 with self.assertRaises(ValueError):
958 lzma.encode_filter_properties({"id": lzma.FILTER_LZMA2, "junk": 12})
959 with self.assertRaises(lzma.LZMAError):
960 lzma.encode_filter_properties({"id": lzma.FILTER_DELTA,
961 "dist": 9001})
962
963 # Test with parameters used by zipfile module.
964 props = lzma.encode_filter_properties({
965 "id": lzma.FILTER_LZMA1,
966 "pb": 2,
967 "lp": 0,
968 "lc": 3,
969 "dict_size": 8 << 20,
970 })
971 self.assertEqual(props, b"]\x00\x00\x80\x00")
972
973 def test_decode_filter_properties(self):
974 with self.assertRaises(TypeError):
975 lzma.decode_filter_properties(lzma.FILTER_X86, {"should be": bytes})
976 with self.assertRaises(lzma.LZMAError):
977 lzma.decode_filter_properties(lzma.FILTER_DELTA, b"too long")
978
979 # Test with parameters used by zipfile module.
980 filterspec = lzma.decode_filter_properties(
981 lzma.FILTER_LZMA1, b"]\x00\x00\x80\x00")
982 self.assertEqual(filterspec["id"], lzma.FILTER_LZMA1)
983 self.assertEqual(filterspec["pb"], 2)
984 self.assertEqual(filterspec["lp"], 0)
985 self.assertEqual(filterspec["lc"], 3)
986 self.assertEqual(filterspec["dict_size"], 8 << 20)
987
988 def test_filter_properties_roundtrip(self):
989 spec1 = lzma.decode_filter_properties(
990 lzma.FILTER_LZMA1, b"]\x00\x00\x80\x00")
991 reencoded = lzma.encode_filter_properties(spec1)
992 spec2 = lzma.decode_filter_properties(lzma.FILTER_LZMA1, reencoded)
993 self.assertEqual(spec1, spec2)
994
Nadeem Vawda3ff069e2011-11-30 00:25:06 +0200995
996# Test data:
997
998INPUT = b"""
999LAERTES
1000
1001 O, fear me not.
1002 I stay too long: but here my father comes.
1003
1004 Enter POLONIUS
1005
1006 A double blessing is a double grace,
1007 Occasion smiles upon a second leave.
1008
1009LORD POLONIUS
1010
1011 Yet here, Laertes! aboard, aboard, for shame!
1012 The wind sits in the shoulder of your sail,
1013 And you are stay'd for. There; my blessing with thee!
1014 And these few precepts in thy memory
1015 See thou character. Give thy thoughts no tongue,
1016 Nor any unproportioned thought his act.
1017 Be thou familiar, but by no means vulgar.
1018 Those friends thou hast, and their adoption tried,
1019 Grapple them to thy soul with hoops of steel;
1020 But do not dull thy palm with entertainment
1021 Of each new-hatch'd, unfledged comrade. Beware
1022 Of entrance to a quarrel, but being in,
1023 Bear't that the opposed may beware of thee.
1024 Give every man thy ear, but few thy voice;
1025 Take each man's censure, but reserve thy judgment.
1026 Costly thy habit as thy purse can buy,
1027 But not express'd in fancy; rich, not gaudy;
1028 For the apparel oft proclaims the man,
1029 And they in France of the best rank and station
1030 Are of a most select and generous chief in that.
1031 Neither a borrower nor a lender be;
1032 For loan oft loses both itself and friend,
1033 And borrowing dulls the edge of husbandry.
1034 This above all: to thine ownself be true,
1035 And it must follow, as the night the day,
1036 Thou canst not then be false to any man.
1037 Farewell: my blessing season this in thee!
1038
1039LAERTES
1040
1041 Most humbly do I take my leave, my lord.
1042
1043LORD POLONIUS
1044
1045 The time invites you; go; your servants tend.
1046
1047LAERTES
1048
1049 Farewell, Ophelia; and remember well
1050 What I have said to you.
1051
1052OPHELIA
1053
1054 'Tis in my memory lock'd,
1055 And you yourself shall keep the key of it.
1056
1057LAERTES
1058
1059 Farewell.
1060"""
1061
1062COMPRESSED_XZ = (
1063 b"\xfd7zXZ\x00\x00\x04\xe6\xd6\xb4F\x02\x00!\x01\x16\x00\x00\x00t/\xe5\xa3"
1064 b"\xe0\x07\x80\x03\xdf]\x00\x05\x14\x07bX\x19\xcd\xddn\x98\x15\xe4\xb4\x9d"
1065 b"o\x1d\xc4\xe5\n\x03\xcc2h\xc7\\\x86\xff\xf8\xe2\xfc\xe7\xd9\xfe6\xb8("
1066 b"\xa8wd\xc2\"u.n\x1e\xc3\xf2\x8e\x8d\x8f\x02\x17/\xa6=\xf0\xa2\xdf/M\x89"
1067 b"\xbe\xde\xa7\x1cz\x18-]\xd5\xef\x13\x8frZ\x15\x80\x8c\xf8\x8do\xfa\x12"
1068 b"\x9b#z/\xef\xf0\xfaF\x01\x82\xa3M\x8e\xa1t\xca6 BF$\xe5Q\xa4\x98\xee\xde"
1069 b"l\xe8\x7f\xf0\x9d,bn\x0b\x13\xd4\xa8\x81\xe4N\xc8\x86\x153\xf5x2\xa2O"
1070 b"\x13@Q\xa1\x00/\xa5\xd0O\x97\xdco\xae\xf7z\xc4\xcdS\xb6t<\x16\xf2\x9cI#"
1071 b"\x89ud\xc66Y\xd9\xee\xe6\xce\x12]\xe5\xf0\xaa\x96-Pe\xade:\x04\t\x1b\xf7"
1072 b"\xdb7\n\x86\x1fp\xc8J\xba\xf4\xf0V\xa9\xdc\xf0\x02%G\xf9\xdf=?\x15\x1b"
1073 b"\xe1(\xce\x82=\xd6I\xac3\x12\x0cR\xb7\xae\r\xb1i\x03\x95\x01\xbd\xbe\xfa"
1074 b"\x02s\x01P\x9d\x96X\xb12j\xc8L\xa8\x84b\xf6\xc3\xd4c-H\x93oJl\xd0iQ\xe4k"
1075 b"\x84\x0b\xc1\xb7\xbc\xb1\x17\x88\xb1\xca?@\xf6\x07\xea\xe6x\xf1H12P\x0f"
1076 b"\x8a\xc9\xeauw\xe3\xbe\xaai\xa9W\xd0\x80\xcd#cb5\x99\xd8]\xa9d\x0c\xbd"
1077 b"\xa2\xdcWl\xedUG\xbf\x89yF\xf77\x81v\xbd5\x98\xbeh8\x18W\x08\xf0\x1b\x99"
1078 b"5:\x1a?rD\x96\xa1\x04\x0f\xae\xba\x85\xeb\x9d5@\xf5\x83\xd37\x83\x8ac"
1079 b"\x06\xd4\x97i\xcdt\x16S\x82k\xf6K\x01vy\x88\x91\x9b6T\xdae\r\xfd]:k\xbal"
1080 b"\xa9\xbba\xc34\xf9r\xeb}r\xdb\xc7\xdb*\x8f\x03z\xdc8h\xcc\xc9\xd3\xbcl"
1081 b"\xa5-\xcb\xeaK\xa2\xc5\x15\xc0\xe3\xc1\x86Z\xfb\xebL\xe13\xcf\x9c\xe3"
1082 b"\x1d\xc9\xed\xc2\x06\xcc\xce!\x92\xe5\xfe\x9c^\xa59w \x9bP\xa3PK\x08d"
1083 b"\xf9\xe2Z}\xa7\xbf\xed\xeb%$\x0c\x82\xb8/\xb0\x01\xa9&,\xf7qh{Q\x96)\xf2"
1084 b"q\x96\xc3\x80\xb4\x12\xb0\xba\xe6o\xf4!\xb4[\xd4\x8aw\x10\xf7t\x0c\xb3"
1085 b"\xd9\xd5\xc3`^\x81\x11??\\\xa4\x99\x85R\xd4\x8e\x83\xc9\x1eX\xbfa\xf1"
1086 b"\xac\xb0\xea\xea\xd7\xd0\xab\x18\xe2\xf2\xed\xe1\xb7\xc9\x18\xcbS\xe4>"
1087 b"\xc9\x95H\xe8\xcb\t\r%\xeb\xc7$.o\xf1\xf3R\x17\x1db\xbb\xd8U\xa5^\xccS"
1088 b"\x16\x01\x87\xf3/\x93\xd1\xf0v\xc0r\xd7\xcc\xa2Gkz\xca\x80\x0e\xfd\xd0"
1089 b"\x8b\xbb\xd2Ix\xb3\x1ey\xca-0\xe3z^\xd6\xd6\x8f_\xf1\x9dP\x9fi\xa7\xd1"
1090 b"\xe8\x90\x84\xdc\xbf\xcdky\x8e\xdc\x81\x7f\xa3\xb2+\xbf\x04\xef\xd8\\"
1091 b"\xc4\xdf\xe1\xb0\x01\xe9\x93\xe3Y\xf1\x1dY\xe8h\x81\xcf\xf1w\xcc\xb4\xef"
1092 b" \x8b|\x04\xea\x83ej\xbe\x1f\xd4z\x9c`\xd3\x1a\x92A\x06\xe5\x8f\xa9\x13"
1093 b"\t\x9e=\xfa\x1c\xe5_\x9f%v\x1bo\x11ZO\xd8\xf4\t\xddM\x16-\x04\xfc\x18<\""
1094 b"CM\xddg~b\xf6\xef\x8e\x0c\xd0\xde|\xa0'\x8a\x0c\xd6x\xae!J\xa6F\x88\x15u"
1095 b"\x008\x17\xbc7y\xb3\xd8u\xac_\x85\x8d\xe7\xc1@\x9c\xecqc\xa3#\xad\xf1"
1096 b"\x935\xb5)_\r\xec3]\x0fo]5\xd0my\x07\x9b\xee\x81\xb5\x0f\xcfK+\x00\xc0"
1097 b"\xe4b\x10\xe4\x0c\x1a \x9b\xe0\x97t\xf6\xa1\x9e\x850\xba\x0c\x9a\x8d\xc8"
1098 b"\x8f\x07\xd7\xae\xc8\xf9+i\xdc\xb9k\xb0>f\x19\xb8\r\xa8\xf8\x1f$\xa5{p"
1099 b"\xc6\x880\xce\xdb\xcf\xca_\x86\xac\x88h6\x8bZ%'\xd0\n\xbf\x0f\x9c\"\xba"
1100 b"\xe5\x86\x9f\x0f7X=mNX[\xcc\x19FU\xc9\x860\xbc\x90a+* \xae_$\x03\x1e\xd3"
1101 b"\xcd_\xa0\x9c\xde\xaf46q\xa5\xc9\x92\xd7\xca\xe3`\x9d\x85}\xb4\xff\xb3"
1102 b"\x83\xfb\xb6\xca\xae`\x0bw\x7f\xfc\xd8\xacVe\x19\xc8\x17\x0bZ\xad\x88"
1103 b"\xeb#\x97\x03\x13\xb1d\x0f{\x0c\x04w\x07\r\x97\xbd\xd6\xc1\xc3B:\x95\x08"
1104 b"^\x10V\xaeaH\x02\xd9\xe3\n\\\x01X\xf6\x9c\x8a\x06u#%\xbe*\xa1\x18v\x85"
1105 b"\xec!\t4\x00\x00\x00\x00Vj?uLU\xf3\xa6\x00\x01\xfb\x07\x81\x0f\x00\x00tw"
1106 b"\x99P\xb1\xc4g\xfb\x02\x00\x00\x00\x00\x04YZ"
1107)
1108
1109COMPRESSED_ALONE = (
1110 b"]\x00\x00\x80\x00\xff\xff\xff\xff\xff\xff\xff\xff\x00\x05\x14\x07bX\x19"
1111 b"\xcd\xddn\x98\x15\xe4\xb4\x9do\x1d\xc4\xe5\n\x03\xcc2h\xc7\\\x86\xff\xf8"
1112 b"\xe2\xfc\xe7\xd9\xfe6\xb8(\xa8wd\xc2\"u.n\x1e\xc3\xf2\x8e\x8d\x8f\x02"
1113 b"\x17/\xa6=\xf0\xa2\xdf/M\x89\xbe\xde\xa7\x1cz\x18-]\xd5\xef\x13\x8frZ"
1114 b"\x15\x80\x8c\xf8\x8do\xfa\x12\x9b#z/\xef\xf0\xfaF\x01\x82\xa3M\x8e\xa1t"
1115 b"\xca6 BF$\xe5Q\xa4\x98\xee\xdel\xe8\x7f\xf0\x9d,bn\x0b\x13\xd4\xa8\x81"
1116 b"\xe4N\xc8\x86\x153\xf5x2\xa2O\x13@Q\xa1\x00/\xa5\xd0O\x97\xdco\xae\xf7z"
1117 b"\xc4\xcdS\xb6t<\x16\xf2\x9cI#\x89ud\xc66Y\xd9\xee\xe6\xce\x12]\xe5\xf0"
1118 b"\xaa\x96-Pe\xade:\x04\t\x1b\xf7\xdb7\n\x86\x1fp\xc8J\xba\xf4\xf0V\xa9"
1119 b"\xdc\xf0\x02%G\xf9\xdf=?\x15\x1b\xe1(\xce\x82=\xd6I\xac3\x12\x0cR\xb7"
1120 b"\xae\r\xb1i\x03\x95\x01\xbd\xbe\xfa\x02s\x01P\x9d\x96X\xb12j\xc8L\xa8"
1121 b"\x84b\xf8\x1epl\xeajr\xd1=\t\x03\xdd\x13\x1b3!E\xf9vV\xdaF\xf3\xd7\xb4"
1122 b"\x0c\xa9P~\xec\xdeE\xe37\xf6\x1d\xc6\xbb\xddc%\xb6\x0fI\x07\xf0;\xaf\xe7"
1123 b"\xa0\x8b\xa7Z\x99(\xe9\xe2\xf0o\x18>`\xe1\xaa\xa8\xd9\xa1\xb2}\xe7\x8d"
1124 b"\x834T\xb6\xef\xc1\xde\xe3\x98\xbcD\x03MA@\xd8\xed\xdc\xc8\x93\x03\x1a"
1125 b"\x93\x0b\x7f\x94\x12\x0b\x02Sa\x18\xc9\xc5\x9bTJE}\xf6\xc8g\x17#ZV\x01"
1126 b"\xc9\x9dc\x83\x0e>0\x16\x90S\xb8/\x03y_\x18\xfa(\xd7\x0br\xa2\xb0\xba?"
1127 b"\x8c\xe6\x83@\x84\xdf\x02:\xc5z\x9e\xa6\x84\xc9\xf5BeyX\x83\x1a\xf1 :\t"
1128 b"\xf7\x19\xfexD\\&G\xf3\x85Y\xa2J\xf9\x0bv{\x89\xf6\xe7)A\xaf\x04o\x00"
1129 b"\x075\xd3\xe0\x7f\x97\x98F\x0f?v\x93\xedVtTf\xb5\x97\x83\xed\x19\xd7\x1a"
1130 b"'k\xd7\xd9\xc5\\Y\xd1\xdc\x07\x15|w\xbc\xacd\x87\x08d\xec\xa7\xf6\x82"
1131 b"\xfc\xb3\x93\xeb\xb9 \x8d\xbc ,\xb3X\xb0\xd2s\xd7\xd1\xffv\x05\xdf}\xa2"
1132 b"\x96\xfb%\n\xdf\xa2\x7f\x08.\xa16\n\xe0\x19\x93\x7fh\n\x1c\x8c\x0f \x11"
1133 b"\xc6Bl\x95\x19U}\xe4s\xb5\x10H\xea\x86pB\xe88\x95\xbe\x8cZ\xdb\xe4\x94A"
1134 b"\x92\xb9;z\xaa\xa7{\x1c5!\xc0\xaf\xc1A\xf9\xda\xf0$\xb0\x02qg\xc8\xc7/|"
1135 b"\xafr\x99^\x91\x88\xbf\x03\xd9=\xd7n\xda6{>8\n\xc7:\xa9'\xba.\x0b\xe2"
1136 b"\xb5\x1d\x0e\n\x9a\x8e\x06\x8f:\xdd\x82'[\xc3\"wD$\xa7w\xecq\x8c,1\x93"
1137 b"\xd0,\xae2w\x93\x12$Jd\x19mg\x02\x93\x9cA\x95\x9d&\xca8i\x9c\xb0;\xe7NQ"
1138 b"\x1frh\x8beL;\xb0m\xee\x07Q\x9b\xc6\xd8\x03\xb5\xdeN\xd4\xfe\x98\xd0\xdc"
1139 b"\x1a[\x04\xde\x1a\xf6\x91j\xf8EOli\x8eB^\x1d\x82\x07\xb2\xb5R]\xb7\xd7"
1140 b"\xe9\xa6\xc3.\xfb\xf0-\xb4e\x9b\xde\x03\x88\xc6\xc1iN\x0e\x84wbQ\xdf~"
1141 b"\xe9\xa4\x884\x96kM\xbc)T\xf3\x89\x97\x0f\x143\xe7)\xa0\xb3B\x00\xa8\xaf"
1142 b"\x82^\xcb\xc7..\xdb\xc7\t\x9dH\xee5\xe9#\xe6NV\x94\xcb$Kk\xe3\x7f\r\xe3t"
1143 b"\x12\xcf'\xefR\x8b\xf42\xcf-LH\xac\xe5\x1f0~?SO\xeb\xc1E\x1a\x1c]\xf2"
1144 b"\xc4<\x11\x02\x10Z0a*?\xe4r\xff\xfb\xff\xf6\x14nG\xead^\xd6\xef8\xb6uEI"
1145 b"\x99\nV\xe2\xb3\x95\x8e\x83\xf6i!\xb5&1F\xb1DP\xf4 SO3D!w\x99_G\x7f+\x90"
1146 b".\xab\xbb]\x91>\xc9#h;\x0f5J\x91K\xf4^-[\x9e\x8a\\\x94\xca\xaf\xf6\x19"
1147 b"\xd4\xa1\x9b\xc4\xb8p\xa1\xae\x15\xe9r\x84\xe0\xcar.l []\x8b\xaf+0\xf2g"
1148 b"\x01aKY\xdfI\xcf,\n\xe8\xf0\xe7V\x80_#\xb2\xf2\xa9\x06\x8c>w\xe2W,\xf4"
1149 b"\x8c\r\xf963\xf5J\xcc2\x05=kT\xeaUti\xe5_\xce\x1b\xfa\x8dl\x02h\xef\xa8"
1150 b"\xfbf\x7f\xff\xf0\x19\xeax"
1151)
1152
1153FILTERS_RAW_1 = [{"id": lzma.FILTER_LZMA2, "preset": 3}]
1154COMPRESSED_RAW_1 = (
1155 b"\xe0\x07\x80\x03\xfd]\x00\x05\x14\x07bX\x19\xcd\xddn\x96cyq\xa1\xdd\xee"
1156 b"\xf8\xfam\xe3'\x88\xd3\xff\xe4\x9e \xceQ\x91\xa4\x14I\xf6\xb9\x9dVL8\x15"
1157 b"_\x0e\x12\xc3\xeb\xbc\xa5\xcd\nW\x1d$=R;\x1d\xf8k8\t\xb1{\xd4\xc5+\x9d"
1158 b"\x87c\xe5\xef\x98\xb4\xd7S3\xcd\xcc\xd2\xed\xa4\x0em\xe5\xf4\xdd\xd0b"
1159 b"\xbe4*\xaa\x0b\xc5\x08\x10\x85+\x81.\x17\xaf9\xc9b\xeaZrA\xe20\x7fs\"r"
1160 b"\xdaG\x81\xde\x90cu\xa5\xdb\xa9.A\x08l\xb0<\xf6\x03\xddOi\xd0\xc5\xb4"
1161 b"\xec\xecg4t6\"\xa6\xb8o\xb5?\x18^}\xb6}\x03[:\xeb\x03\xa9\n[\x89l\x19g"
1162 b"\x16\xc82\xed\x0b\xfb\x86n\xa2\x857@\x93\xcd6T\xc3u\xb0\t\xf9\x1b\x918"
1163 b"\xfc[\x1b\x1e4\xb3\x14\x06PCV\xa8\"\xf5\x81x~\xe9\xb5N\x9cK\x9f\xc6\xc3%"
1164 b"\xc8k:{6\xe7\xf7\xbd\x05\x02\xb4\xc4\xc3\xd3\xfd\xc3\xa8\\\xfc@\xb1F_"
1165 b"\xc8\x90\xd9sU\x98\xad8\x05\x07\xde7J\x8bM\xd0\xb3;X\xec\x87\xef\xae\xb3"
1166 b"eO,\xb1z,d\x11y\xeejlB\x02\x1d\xf28\x1f#\x896\xce\x0b\xf0\xf5\xa9PK\x0f"
1167 b"\xb3\x13P\xd8\x88\xd2\xa1\x08\x04C?\xdb\x94_\x9a\"\xe9\xe3e\x1d\xde\x9b"
1168 b"\xa1\xe8>H\x98\x10;\xc5\x03#\xb5\x9d4\x01\xe7\xc5\xba%v\xa49\x97A\xe0\""
1169 b"\x8c\xc22\xe3i\xc1\x9d\xab3\xdf\xbe\xfdDm7\x1b\x9d\xab\xb5\x15o:J\x92"
1170 b"\xdb\x816\x17\xc2O\x99\x1b\x0e\x8d\xf3\tQ\xed\x8e\x95S/\x16M\xb2S\x04"
1171 b"\x0f\xc3J\xc6\xc7\xe4\xcb\xc5\xf4\xe7d\x14\xe4=^B\xfb\xd3E\xd3\x1e\xcd"
1172 b"\x91\xa5\xd0G\x8f.\xf6\xf9\x0bb&\xd9\x9f\xc2\xfdj\xa2\x9e\xc4\\\x0e\x1dC"
1173 b"v\xe8\xd2\x8a?^H\xec\xae\xeb>\xfe\xb8\xab\xd4IqY\x8c\xd4K7\x11\xf4D\xd0W"
1174 b"\xa5\xbe\xeaO\xbf\xd0\x04\xfdl\x10\xae5\xd4U\x19\x06\xf9{\xaa\xe0\x81"
1175 b"\x0f\xcf\xa3k{\x95\xbd\x19\xa2\xf8\xe4\xa3\x08O*\xf1\xf1B-\xc7(\x0eR\xfd"
1176 b"@E\x9f\xd3\x1e:\xfdV\xb7\x04Y\x94\xeb]\x83\xc4\xa5\xd7\xc0gX\x98\xcf\x0f"
1177 b"\xcd3\x00]n\x17\xec\xbd\xa3Y\x86\xc5\xf3u\xf6*\xbdT\xedA$A\xd9A\xe7\x98"
1178 b"\xef\x14\x02\x9a\xfdiw\xec\xa0\x87\x11\xd9%\xc5\xeb\x8a=\xae\xc0\xc4\xc6"
1179 b"D\x80\x8f\xa8\xd1\xbbq\xb2\xc0\xa0\xf5Cqp\xeeL\xe3\xe5\xdc \x84\"\xe9"
1180 b"\x80t\x83\x05\xba\xf1\xc5~\x93\xc9\xf0\x01c\xceix\x9d\xed\xc5)l\x16)\xd1"
1181 b"\x03@l\x04\x7f\x87\xa5yn\x1b\x01D\xaa:\xd2\x96\xb4\xb3?\xb0\xf9\xce\x07"
1182 b"\xeb\x81\x00\xe4\xc3\xf5%_\xae\xd4\xf9\xeb\xe2\rh\xb2#\xd67Q\x16D\x82hn"
1183 b"\xd1\xa3_?q\xf0\xe2\xac\xf317\x9e\xd0_\x83|\xf1\xca\xb7\x95S\xabW\x12"
1184 b"\xff\xddt\xf69L\x01\xf2|\xdaW\xda\xees\x98L\x18\xb8_\xe8$\x82\xea\xd6"
1185 b"\xd1F\xd4\x0b\xcdk\x01vf\x88h\xc3\xae\xb91\xc7Q\x9f\xa5G\xd9\xcc\x1f\xe3"
1186 b"5\xb1\xdcy\x7fI\x8bcw\x8e\x10rIp\x02:\x19p_\xc8v\xcea\"\xc1\xd9\x91\x03"
1187 b"\xbfe\xbe\xa6\xb3\xa8\x14\x18\xc3\xabH*m}\xc2\xc1\x9a}>l%\xce\x84\x99"
1188 b"\xb3d\xaf\xd3\x82\x15\xdf\xc1\xfc5fOg\x9b\xfc\x8e^&\t@\xce\x9f\x06J\xb8"
1189 b"\xb5\x86\x1d\xda{\x9f\xae\xb0\xff\x02\x81r\x92z\x8cM\xb7ho\xc9^\x9c\xb6"
1190 b"\x9c\xae\xd1\xc9\xf4\xdfU7\xd6\\!\xea\x0b\x94k\xb9Ud~\x98\xe7\x86\x8az"
1191 b"\x10;\xe3\x1d\xe5PG\xf8\xa4\x12\x05w\x98^\xc4\xb1\xbb\xfb\xcf\xe0\x7f"
1192 b"\x033Sf\x0c \xb1\xf6@\x94\xe5\xa3\xb2\xa7\x10\x9a\xc0\x14\xc3s\xb5xRD"
1193 b"\xf4`W\xd9\xe5\xd3\xcf\x91\rTZ-X\xbe\xbf\xb5\xe2\xee|\x1a\xbf\xfb\x08"
1194 b"\x91\xe1\xfc\x9a\x18\xa3\x8b\xd6^\x89\xf5[\xef\x87\xd1\x06\x1c7\xd6\xa2"
1195 b"\t\tQ5/@S\xc05\xd2VhAK\x03VC\r\x9b\x93\xd6M\xf1xO\xaaO\xed\xb9<\x0c\xdae"
1196 b"*\xd0\x07Hk6\x9fG+\xa1)\xcd\x9cl\x87\xdb\xe1\xe7\xefK}\x875\xab\xa0\x19u"
1197 b"\xf6*F\xb32\x00\x00\x00"
1198)
1199
1200FILTERS_RAW_2 = [{"id": lzma.FILTER_DELTA, "dist": 2},
1201 {"id": lzma.FILTER_LZMA2,
1202 "preset": lzma.PRESET_DEFAULT | lzma.PRESET_EXTREME}]
1203COMPRESSED_RAW_2 = (
1204 b"\xe0\x07\x80\x05\x91]\x00\x05\x14\x06-\xd4\xa8d?\xef\xbe\xafH\xee\x042"
1205 b"\xcb.\xb5g\x8f\xfb\x14\xab\xa5\x9f\x025z\xa4\xdd\xd8\t[}W\xf8\x0c\x1dmH"
1206 b"\xfa\x05\xfcg\xba\xe5\x01Q\x0b\x83R\xb6A\x885\xc0\xba\xee\n\x1cv~\xde:o"
1207 b"\x06:J\xa7\x11Cc\xea\xf7\xe5*o\xf7\x83\\l\xbdE\x19\x1f\r\xa8\x10\xb42"
1208 b"\x0caU{\xd7\xb8w\xdc\xbe\x1b\xfc8\xb4\xcc\xd38\\\xf6\x13\xf6\xe7\x98\xfa"
1209 b"\xc7[\x17_9\x86%\xa8\xf8\xaa\xb8\x8dfs#\x1e=\xed<\x92\x10\\t\xff\x86\xfb"
1210 b"=\x9e7\x18\x1dft\\\xb5\x01\x95Q\xc5\x19\xb38\xe0\xd4\xaa\x07\xc3\x7f\xd8"
1211 b"\xa2\x00>-\xd3\x8e\xa1#\xfa\x83ArAm\xdbJ~\x93\xa3B\x82\xe0\xc7\xcc(\x08`"
1212 b"WK\xad\x1b\x94kaj\x04 \xde\xfc\xe1\xed\xb0\x82\x91\xefS\x84%\x86\xfbi"
1213 b"\x99X\xf1B\xe7\x90;E\xfde\x98\xda\xca\xd6T\xb4bg\xa4\n\x9aj\xd1\x83\x9e]"
1214 b"\"\x7fM\xb5\x0fr\xd2\\\xa5j~P\x10GH\xbfN*Z\x10.\x81\tpE\x8a\x08\xbe1\xbd"
1215 b"\xcd\xa9\xe1\x8d\x1f\x04\xf9\x0eH\xb9\xae\xd6\xc3\xc1\xa5\xa9\x95P\xdc~"
1216 b"\xff\x01\x930\xa9\x04\xf6\x03\xfe\xb5JK\xc3]\xdd9\xb1\xd3\xd7F\xf5\xd1"
1217 b"\x1e\xa0\x1c_\xed[\x0c\xae\xd4\x8b\x946\xeb\xbf\xbb\xe3$kS{\xb5\x80,f:Sj"
1218 b"\x0f\x08z\x1c\xf5\xe8\xe6\xae\x98\xb0Q~r\x0f\xb0\x05?\xb6\x90\x19\x02&"
1219 b"\xcb\x80\t\xc4\xea\x9c|x\xce\x10\x9c\xc5|\xcbdhh+\x0c'\xc5\x81\xc33\xb5"
1220 b"\x14q\xd6\xc5\xe3`Z#\xdc\x8a\xab\xdd\xea\x08\xc2I\xe7\x02l{\xec\x196\x06"
1221 b"\x91\x8d\xdc\xd5\xb3x\xe1hz%\xd1\xf8\xa5\xdd\x98!\x8c\x1c\xc1\x17RUa\xbb"
1222 b"\x95\x0f\xe4X\xea1\x0c\xf1=R\xbe\xc60\xe3\xa4\x9a\x90bd\x97$]B\x01\xdd"
1223 b"\x1f\xe3h2c\x1e\xa0L`4\xc6x\xa3Z\x8a\r\x14]T^\xd8\x89\x1b\x92\r;\xedY"
1224 b"\x0c\xef\x8d9z\xf3o\xb6)f\xa9]$n\rp\x93\xd0\x10\xa4\x08\xb8\xb2\x8b\xb6"
1225 b"\x8f\x80\xae;\xdcQ\xf1\xfa\x9a\x06\x8e\xa5\x0e\x8cK\x9c @\xaa:UcX\n!\xc6"
1226 b"\x02\x12\xcb\x1b\"=\x16.\x1f\x176\xf2g=\xe1Wn\xe9\xe1\xd4\xf1O\xad\x15"
1227 b"\x86\xe9\xa3T\xaf\xa9\xd7D\xb5\xd1W3pnt\x11\xc7VOj\xb7M\xc4i\xa1\xf1$3"
1228 b"\xbb\xdc\x8af\xb0\xc5Y\r\xd1\xfb\xf2\xe7K\xe6\xc5hwO\xfe\x8c2^&\x07\xd5"
1229 b"\x1fV\x19\xfd\r\x14\xd2i=yZ\xe6o\xaf\xc6\xb6\x92\x9d\xc4\r\xb3\xafw\xac%"
1230 b"\xcfc\x1a\xf1`]\xf2\x1a\x9e\x808\xedm\xedQ\xb2\xfe\xe4h`[q\xae\xe0\x0f"
1231 b"\xba0g\xb6\"N\xc3\xfb\xcfR\x11\xc5\x18)(\xc40\\\xa3\x02\xd9G!\xce\x1b"
1232 b"\xc1\x96x\xb5\xc8z\x1f\x01\xb4\xaf\xde\xc2\xcd\x07\xe7H\xb3y\xa8M\n\\A\t"
1233 b"ar\xddM\x8b\x9a\xea\x84\x9b!\xf1\x8d\xb1\xf1~\x1e\r\xa5H\xba\xf1\x84o"
1234 b"\xda\x87\x01h\xe9\xa2\xbe\xbeqN\x9d\x84\x0b!WG\xda\xa1\xa5A\xb7\xc7`j"
1235 b"\x15\xf2\xe9\xdd?\x015B\xd2~E\x06\x11\xe0\x91!\x05^\x80\xdd\xa8y\x15}"
1236 b"\xa1)\xb1)\x81\x18\xf4\xf4\xf8\xc0\xefD\xe3\xdb2f\x1e\x12\xabu\xc9\x97"
1237 b"\xcd\x1e\xa7\x0c\x02x4_6\x03\xc4$t\xf39\x94\x1d=\xcb\xbfv\\\xf5\xa3\x1d"
1238 b"\x9d8jk\x95\x13)ff\xf9n\xc4\xa9\xe3\x01\xb8\xda\xfb\xab\xdfM\x99\xfb\x05"
1239 b"\xe0\xe9\xb0I\xf4E\xab\xe2\x15\xa3\x035\xe7\xdeT\xee\x82p\xb4\x88\xd3"
1240 b"\x893\x9c/\xc0\xd6\x8fou;\xf6\x95PR\xa9\xb2\xc1\xefFj\xe2\xa7$\xf7h\xf1"
1241 b"\xdfK(\xc9c\xba7\xe8\xe3)\xdd\xb2,\x83\xfb\x84\x18.y\x18Qi\x88\xf8`h-"
1242 b"\xef\xd5\xed\x8c\t\xd8\xc3^\x0f\x00\xb7\xd0[!\xafM\x9b\xd7.\x07\xd8\xfb"
1243 b"\xd9\xe2-S+\xaa8,\xa0\x03\x1b \xea\xa8\x00\xc3\xab~\xd0$e\xa5\x7f\xf7"
1244 b"\x95P]\x12\x19i\xd9\x7fo\x0c\xd8g^\rE\xa5\x80\x18\xc5\x01\x80\xaek`\xff~"
1245 b"\xb6y\xe7+\xe5\x11^D\xa7\x85\x18\"!\xd6\xd2\xa7\xf4\x1eT\xdb\x02\xe15"
1246 b"\x02Y\xbc\x174Z\xe7\x9cH\x1c\xbf\x0f\xc6\xe9f]\xcf\x8cx\xbc\xe5\x15\x94"
1247 b"\xfc3\xbc\xa7TUH\xf1\x84\x1b\xf7\xa9y\xc07\x84\xf8X\xd8\xef\xfc \x1c\xd8"
1248 b"( /\xf2\xb7\xec\xc1\\\x8c\xf6\x95\xa1\x03J\x83vP8\xe1\xe3\xbb~\xc24kA"
1249 b"\x98y\xa1\xf2P\xe9\x9d\xc9J\xf8N\x99\xb4\xceaO\xde\x16\x1e\xc2\x19\xa7"
1250 b"\x03\xd2\xe0\x8f:\x15\xf3\x84\x9e\xee\xe6e\xb8\x02q\xc7AC\x1emw\xfd\t"
1251 b"\x9a\x1eu\xc1\xa9\xcaCwUP\x00\xa5\xf78L4w!\x91L2 \x87\xd0\xf2\x06\x81j"
1252 b"\x80;\x03V\x06\x87\x92\xcb\x90lv@E\x8d\x8d\xa5\xa6\xe7Z[\xdf\xd6E\x03`>"
1253 b"\x8f\xde\xa1bZ\x84\xd0\xa9`\x05\x0e{\x80;\xe3\xbef\x8d\x1d\xebk1.\xe3"
1254 b"\xe9N\x15\xf7\xd4(\xfa\xbb\x15\xbdu\xf7\x7f\x86\xae!\x03L\x1d\xb5\xc1"
1255 b"\xb9\x11\xdb\xd0\x93\xe4\x02\xe1\xd2\xcbBjc_\xe8}d\xdb\xc3\xa0Y\xbe\xc9/"
1256 b"\x95\x01\xa3,\xe6bl@\x01\xdbp\xc2\xce\x14\x168\xc2q\xe3uH\x89X\xa4\xa9"
1257 b"\x19\x1d\xc1}\x7fOX\x19\x9f\xdd\xbe\x85\x83\xff\x96\x1ee\x82O`CF=K\xeb$I"
1258 b"\x17_\xefX\x8bJ'v\xde\x1f+\xd9.v\xf8Tv\x17\xf2\x9f5\x19\xe1\xb9\x91\xa8S"
1259 b"\x86\xbd\x1a\"(\xa5x\x8dC\x03X\x81\x91\xa8\x11\xc4pS\x13\xbc\xf2'J\xae!"
1260 b"\xef\xef\x84G\t\x8d\xc4\x10\x132\x00oS\x9e\xe0\xe4d\x8f\xb8y\xac\xa6\x9f"
1261 b",\xb8f\x87\r\xdf\x9eE\x0f\xe1\xd0\\L\x00\xb2\xe1h\x84\xef}\x98\xa8\x11"
1262 b"\xccW#\\\x83\x7fo\xbbz\x8f\x00"
1263)
1264
1265FILTERS_RAW_3 = [{"id": lzma.FILTER_IA64, "start_offset": 0x100},
1266 {"id": lzma.FILTER_LZMA2}]
1267COMPRESSED_RAW_3 = (
1268 b"\xe0\x07\x80\x03\xdf]\x00\x05\x14\x07bX\x19\xcd\xddn\x98\x15\xe4\xb4\x9d"
1269 b"o\x1d\xc4\xe5\n\x03\xcc2h\xc7\\\x86\xff\xf8\xe2\xfc\xe7\xd9\xfe6\xb8("
1270 b"\xa8wd\xc2\"u.n\x1e\xc3\xf2\x8e\x8d\x8f\x02\x17/\xa6=\xf0\xa2\xdf/M\x89"
1271 b"\xbe\xde\xa7\x1cz\x18-]\xd5\xef\x13\x8frZ\x15\x80\x8c\xf8\x8do\xfa\x12"
1272 b"\x9b#z/\xef\xf0\xfaF\x01\x82\xa3M\x8e\xa1t\xca6 BF$\xe5Q\xa4\x98\xee\xde"
1273 b"l\xe8\x7f\xf0\x9d,bn\x0b\x13\xd4\xa8\x81\xe4N\xc8\x86\x153\xf5x2\xa2O"
1274 b"\x13@Q\xa1\x00/\xa5\xd0O\x97\xdco\xae\xf7z\xc4\xcdS\xb6t<\x16\xf2\x9cI#"
1275 b"\x89ud\xc66Y\xd9\xee\xe6\xce\x12]\xe5\xf0\xaa\x96-Pe\xade:\x04\t\x1b\xf7"
1276 b"\xdb7\n\x86\x1fp\xc8J\xba\xf4\xf0V\xa9\xdc\xf0\x02%G\xf9\xdf=?\x15\x1b"
1277 b"\xe1(\xce\x82=\xd6I\xac3\x12\x0cR\xb7\xae\r\xb1i\x03\x95\x01\xbd\xbe\xfa"
1278 b"\x02s\x01P\x9d\x96X\xb12j\xc8L\xa8\x84b\xf6\xc3\xd4c-H\x93oJl\xd0iQ\xe4k"
1279 b"\x84\x0b\xc1\xb7\xbc\xb1\x17\x88\xb1\xca?@\xf6\x07\xea\xe6x\xf1H12P\x0f"
1280 b"\x8a\xc9\xeauw\xe3\xbe\xaai\xa9W\xd0\x80\xcd#cb5\x99\xd8]\xa9d\x0c\xbd"
1281 b"\xa2\xdcWl\xedUG\xbf\x89yF\xf77\x81v\xbd5\x98\xbeh8\x18W\x08\xf0\x1b\x99"
1282 b"5:\x1a?rD\x96\xa1\x04\x0f\xae\xba\x85\xeb\x9d5@\xf5\x83\xd37\x83\x8ac"
1283 b"\x06\xd4\x97i\xcdt\x16S\x82k\xf6K\x01vy\x88\x91\x9b6T\xdae\r\xfd]:k\xbal"
1284 b"\xa9\xbba\xc34\xf9r\xeb}r\xdb\xc7\xdb*\x8f\x03z\xdc8h\xcc\xc9\xd3\xbcl"
1285 b"\xa5-\xcb\xeaK\xa2\xc5\x15\xc0\xe3\xc1\x86Z\xfb\xebL\xe13\xcf\x9c\xe3"
1286 b"\x1d\xc9\xed\xc2\x06\xcc\xce!\x92\xe5\xfe\x9c^\xa59w \x9bP\xa3PK\x08d"
1287 b"\xf9\xe2Z}\xa7\xbf\xed\xeb%$\x0c\x82\xb8/\xb0\x01\xa9&,\xf7qh{Q\x96)\xf2"
1288 b"q\x96\xc3\x80\xb4\x12\xb0\xba\xe6o\xf4!\xb4[\xd4\x8aw\x10\xf7t\x0c\xb3"
1289 b"\xd9\xd5\xc3`^\x81\x11??\\\xa4\x99\x85R\xd4\x8e\x83\xc9\x1eX\xbfa\xf1"
1290 b"\xac\xb0\xea\xea\xd7\xd0\xab\x18\xe2\xf2\xed\xe1\xb7\xc9\x18\xcbS\xe4>"
1291 b"\xc9\x95H\xe8\xcb\t\r%\xeb\xc7$.o\xf1\xf3R\x17\x1db\xbb\xd8U\xa5^\xccS"
1292 b"\x16\x01\x87\xf3/\x93\xd1\xf0v\xc0r\xd7\xcc\xa2Gkz\xca\x80\x0e\xfd\xd0"
1293 b"\x8b\xbb\xd2Ix\xb3\x1ey\xca-0\xe3z^\xd6\xd6\x8f_\xf1\x9dP\x9fi\xa7\xd1"
1294 b"\xe8\x90\x84\xdc\xbf\xcdky\x8e\xdc\x81\x7f\xa3\xb2+\xbf\x04\xef\xd8\\"
1295 b"\xc4\xdf\xe1\xb0\x01\xe9\x93\xe3Y\xf1\x1dY\xe8h\x81\xcf\xf1w\xcc\xb4\xef"
1296 b" \x8b|\x04\xea\x83ej\xbe\x1f\xd4z\x9c`\xd3\x1a\x92A\x06\xe5\x8f\xa9\x13"
1297 b"\t\x9e=\xfa\x1c\xe5_\x9f%v\x1bo\x11ZO\xd8\xf4\t\xddM\x16-\x04\xfc\x18<\""
1298 b"CM\xddg~b\xf6\xef\x8e\x0c\xd0\xde|\xa0'\x8a\x0c\xd6x\xae!J\xa6F\x88\x15u"
1299 b"\x008\x17\xbc7y\xb3\xd8u\xac_\x85\x8d\xe7\xc1@\x9c\xecqc\xa3#\xad\xf1"
1300 b"\x935\xb5)_\r\xec3]\x0fo]5\xd0my\x07\x9b\xee\x81\xb5\x0f\xcfK+\x00\xc0"
1301 b"\xe4b\x10\xe4\x0c\x1a \x9b\xe0\x97t\xf6\xa1\x9e\x850\xba\x0c\x9a\x8d\xc8"
1302 b"\x8f\x07\xd7\xae\xc8\xf9+i\xdc\xb9k\xb0>f\x19\xb8\r\xa8\xf8\x1f$\xa5{p"
1303 b"\xc6\x880\xce\xdb\xcf\xca_\x86\xac\x88h6\x8bZ%'\xd0\n\xbf\x0f\x9c\"\xba"
1304 b"\xe5\x86\x9f\x0f7X=mNX[\xcc\x19FU\xc9\x860\xbc\x90a+* \xae_$\x03\x1e\xd3"
1305 b"\xcd_\xa0\x9c\xde\xaf46q\xa5\xc9\x92\xd7\xca\xe3`\x9d\x85}\xb4\xff\xb3"
1306 b"\x83\xfb\xb6\xca\xae`\x0bw\x7f\xfc\xd8\xacVe\x19\xc8\x17\x0bZ\xad\x88"
1307 b"\xeb#\x97\x03\x13\xb1d\x0f{\x0c\x04w\x07\r\x97\xbd\xd6\xc1\xc3B:\x95\x08"
1308 b"^\x10V\xaeaH\x02\xd9\xe3\n\\\x01X\xf6\x9c\x8a\x06u#%\xbe*\xa1\x18v\x85"
1309 b"\xec!\t4\x00\x00\x00"
1310)
1311
1312FILTERS_RAW_4 = [{"id": lzma.FILTER_DELTA, "dist": 4},
1313 {"id": lzma.FILTER_X86, "start_offset": 0x40},
1314 {"id": lzma.FILTER_LZMA2, "preset": 4, "lc": 2}]
1315COMPRESSED_RAW_4 = (
1316 b"\xe0\x07\x80\x06\x0e\\\x00\x05\x14\x07bW\xaah\xdd\x10\xdc'\xd6\x90,\xc6v"
1317 b"Jq \x14l\xb7\x83xB\x0b\x97f=&fx\xba\n>Tn\xbf\x8f\xfb\x1dF\xca\xc3v_\xca?"
1318 b"\xfbV<\x92#\xd4w\xa6\x8a\xeb\xf6\x03\xc0\x01\x94\xd8\x9e\x13\x12\x98\xd1"
1319 b"*\xfa]c\xe8\x1e~\xaf\xb5]Eg\xfb\x9e\x01\"8\xb2\x90\x06=~\xe9\x91W\xcd"
1320 b"\xecD\x12\xc7\xfa\xe1\x91\x06\xc7\x99\xb9\xe3\x901\x87\x19u\x0f\x869\xff"
1321 b"\xc1\xb0hw|\xb0\xdcl\xcck\xb16o7\x85\xee{Y_b\xbf\xbc$\xf3=\x8d\x8bw\xe5Z"
1322 b"\x08@\xc4kmE\xad\xfb\xf6*\xd8\xad\xa1\xfb\xc5{\xdej,)\x1emB\x1f<\xaeca"
1323 b"\x80(\xee\x07 \xdf\xe9\xf8\xeb\x0e-\x97\x86\x90c\xf9\xea'B\xf7`\xd7\xb0"
1324 b"\x92\xbd\xa0\x82]\xbd\x0e\x0eB\x19\xdc\x96\xc6\x19\xd86D\xf0\xd5\x831"
1325 b"\x03\xb7\x1c\xf7&5\x1a\x8f PZ&j\xf8\x98\x1bo\xcc\x86\x9bS\xd3\xa5\xcdu"
1326 b"\xf9$\xcc\x97o\xe5V~\xfb\x97\xb5\x0b\x17\x9c\xfdxW\x10\xfep4\x80\xdaHDY"
1327 b"\xfa)\xfet\xb5\"\xd4\xd3F\x81\xf4\x13\x1f\xec\xdf\xa5\x13\xfc\"\x91x\xb7"
1328 b"\x99\xce\xc8\x92\n\xeb[\x10l*Y\xd8\xb1@\x06\xc8o\x8d7r\xebu\xfd5\x0e\x7f"
1329 b"\xf1$U{\t}\x1fQ\xcfxN\x9d\x9fXX\xe9`\x83\xc1\x06\xf4\x87v-f\x11\xdb/\\"
1330 b"\x06\xff\xd7)B\xf3g\x06\x88#2\x1eB244\x7f4q\t\xc893?mPX\x95\xa6a\xfb)d"
1331 b"\x9b\xfc\x98\x9aj\x04\xae\x9b\x9d\x19w\xba\xf92\xfaA\x11\\\x17\x97C3\xa4"
1332 b"\xbc!\x88\xcdo[\xec:\x030\x91.\x85\xe0@\\4\x16\x12\x9d\xcaJv\x97\xb04"
1333 b"\xack\xcbkf\xa3ss\xfc\x16^\x8ce\x85a\xa5=&\xecr\xb3p\xd1E\xd5\x80y\xc7"
1334 b"\xda\xf6\xfek\xbcT\xbfH\xee\x15o\xc5\x8c\x830\xec\x1d\x01\xae\x0c-e\\"
1335 b"\x91\x90\x94\xb2\xf8\x88\x91\xe8\x0b\xae\xa7>\x98\xf6\x9ck\xd2\xc6\x08"
1336 b"\xe6\xab\t\x98\xf2!\xa0\x8c^\xacqA\x99<\x1cEG\x97\xc8\xf1\xb6\xb9\x82"
1337 b"\x8d\xf7\x08s\x98a\xff\xe3\xcc\x92\x0e\xd2\xb6U\xd7\xd9\x86\x7fa\xe5\x1c"
1338 b"\x8dTG@\t\x1e\x0e7*\xfc\xde\xbc]6N\xf7\xf1\x84\x9e\x9f\xcf\xe9\x1e\xb5'"
1339 b"\xf4<\xdf\x99sq\xd0\x9d\xbd\x99\x0b\xb4%p4\xbf{\xbb\x8a\xd2\x0b\xbc=M"
1340 b"\x94H:\xf5\xa8\xd6\xa4\xc90\xc2D\xb9\xd3\xa8\xb0S\x87 `\xa2\xeb\xf3W\xce"
1341 b" 7\xf9N#\r\xe6\xbe\t\x9d\xe7\x811\xf9\x10\xc1\xc2\x14\xf6\xfc\xcba\xb7"
1342 b"\xb1\x7f\x95l\xe4\tjA\xec:\x10\xe5\xfe\xc2\\=D\xe2\x0c\x0b3]\xf7\xc1\xf7"
1343 b"\xbceZ\xb1A\xea\x16\xe5\xfddgFQ\xed\xaf\x04\xa3\xd3\xf8\xa2q\x19B\xd4r"
1344 b"\xc5\x0c\x9a\x14\x94\xea\x91\xc4o\xe4\xbb\xb4\x99\xf4@\xd1\xe6\x0c\xe3"
1345 b"\xc6d\xa0Q\n\xf2/\xd8\xb8S5\x8a\x18:\xb5g\xac\x95D\xce\x17\x07\xd4z\xda"
1346 b"\x90\xe65\x07\x19H!\t\xfdu\x16\x8e\x0eR\x19\xf4\x8cl\x0c\xf9Q\xf1\x80"
1347 b"\xe3\xbf\xd7O\xf8\x8c\x18\x0b\x9c\xf1\x1fb\xe1\tR\xb2\xf1\xe1A\xea \xcf-"
1348 b"IGE\xf1\x14\x98$\x83\x15\xc9\xd8j\xbf\x19\x0f\xd5\xd1\xaa\xb3\xf3\xa5I2s"
1349 b"\x8d\x145\xca\xd5\xd93\x9c\xb8D0\xe6\xaa%\xd0\xc0P}JO^h\x8e\x08\xadlV."
1350 b"\x18\x88\x13\x05o\xb0\x07\xeaw\xe0\xb6\xa4\xd5*\xe4r\xef\x07G+\xc1\xbei["
1351 b"w\xe8\xab@_\xef\x15y\xe5\x12\xc9W\x1b.\xad\x85-\xc2\xf7\xe3mU6g\x8eSA"
1352 b"\x01(\xd3\xdb\x16\x13=\xde\x92\xf9,D\xb8\x8a\xb2\xb4\xc9\xc3\xefnE\xe8\\"
1353 b"\xa6\xe2Y\xd2\xcf\xcb\x8c\xb6\xd5\xe9\x1d\x1e\x9a\x8b~\xe2\xa6\rE\x84uV"
1354 b"\xed\xc6\x99\xddm<\x10[\x0fu\x1f\xc1\x1d1\n\xcfw\xb2%!\xf0[\xce\x87\x83B"
1355 b"\x08\xaa,\x08%d\xcef\x94\"\xd9g.\xc83\xcbXY+4\xec\x85qA\n\x1d=9\xf0*\xb1"
1356 b"\x1f/\xf3s\xd61b\x7f@\xfb\x9d\xe3FQ\\\xbd\x82\x1e\x00\xf3\xce\xd3\xe1"
1357 b"\xca,E\xfd7[\xab\xb6\xb7\xac!mA}\xbd\x9d3R5\x9cF\xabH\xeb\x92)cc\x13\xd0"
1358 b"\xbd\xee\xe9n{\x1dIJB\xa5\xeb\x11\xe8`w&`\x8b}@Oxe\t\x8a\x07\x02\x95\xf2"
1359 b"\xed\xda|\xb1e\xbe\xaa\xbbg\x19@\xe1Y\x878\x84\x0f\x8c\xe3\xc98\xf2\x9e"
1360 b"\xd5N\xb5J\xef\xab!\xe2\x8dq\xe1\xe5q\xc5\xee\x11W\xb7\xe4k*\x027\xa0"
1361 b"\xa3J\xf4\xd8m\xd0q\x94\xcb\x07\n:\xb6`.\xe4\x9c\x15+\xc0)\xde\x80X\xd4"
1362 b"\xcfQm\x01\xc2cP\x1cA\x85'\xc9\xac\x8b\xe6\xb2)\xe6\x84t\x1c\x92\xe4Z"
1363 b"\x1cR\xb0\x9e\x96\xd1\xfb\x1c\xa6\x8b\xcb`\x10\x12]\xf2gR\x9bFT\xe0\xc8H"
1364 b"S\xfb\xac<\x04\xc7\xc1\xe8\xedP\xf4\x16\xdb\xc0\xd7e\xc2\x17J^\x1f\xab"
1365 b"\xff[\x08\x19\xb4\xf5\xfb\x19\xb4\x04\xe5c~']\xcb\xc2A\xec\x90\xd0\xed"
1366 b"\x06,\xc5K{\x86\x03\xb1\xcdMx\xdeQ\x8c3\xf9\x8a\xea=\x89\xaba\xd2\xc89a"
1367 b"\xd72\xf0\xc3\x19\x8a\xdfs\xd4\xfd\xbb\x81b\xeaE\"\xd8\xf4d\x0cD\xf7IJ!"
1368 b"\xe5d\xbbG\xe9\xcam\xaa\x0f_r\x95\x91NBq\xcaP\xce\xa7\xa9\xb5\x10\x94eP!"
1369 b"|\x856\xcd\xbfIir\xb8e\x9bjP\x97q\xabwS7\x1a\x0ehM\xe7\xca\x86?\xdeP}y~"
1370 b"\x0f\x95I\xfc\x13\xe1<Q\x1b\x868\x1d\x11\xdf\x94\xf4\x82>r\xa9k\x88\xcb"
1371 b"\xfd\xc3v\xe2\xb9\x8a\x02\x8eq\x92I\xf8\xf6\xf1\x03s\x9b\xb8\xe3\"\xe3"
1372 b"\xa9\xa5>D\xb8\x96;\xe7\x92\xd133\xe8\xdd'e\xc9.\xdc;\x17\x1f\xf5H\x13q"
1373 b"\xa4W\x0c\xdb~\x98\x01\xeb\xdf\xe32\x13\x0f\xddx\n6\xa0\t\x10\xb6\xbb"
1374 b"\xb0\xc3\x18\xb6;\x9fj[\xd9\xd5\xc9\x06\x8a\x87\xcd\xe5\xee\xfc\x9c-%@"
1375 b"\xee\xe0\xeb\xd2\xe3\xe8\xfb\xc0\x122\\\xc7\xaf\xc2\xa1Oth\xb3\x8f\x82"
1376 b"\xb3\x18\xa8\x07\xd5\xee_\xbe\xe0\x1cA\x1e_\r\x9a\xb0\x17W&\xa2D\x91\x94"
1377 b"\x1a\xb2\xef\xf2\xdc\x85;X\xb0,\xeb>-7S\xe5\xca\x07)\x1fp\x7f\xcaQBL\xca"
1378 b"\xf3\xb9d\xfc\xb5su\xb0\xc8\x95\x90\xeb*)\xa0v\xe4\x9a{FW\xf4l\xde\xcdj"
1379 b"\x00"
1380)
1381
1382
1383def test_main():
1384 run_unittest(
1385 CompressorDecompressorTestCase,
1386 CompressDecompressFunctionTestCase,
1387 FileTestCase,
1388 MiscellaneousTestCase,
1389 )
1390
1391if __name__ == "__main__":
1392 test_main()