blob: ad9045604e3bcd1cdc099f8703be9209aed7e803 [file] [log] [blame]
Nadeem Vawda3ff069e2011-11-30 00:25:06 +02001from io import BytesIO, UnsupportedOperation
2import os
Nadeem Vawda37970652013-10-28 21:35:23 +01003import pickle
Nadeem Vawda3ff069e2011-11-30 00:25:06 +02004import random
5import unittest
6
7from test.support import (
8 _4G, TESTFN, import_module, bigmemtest, run_unittest, unlink
9)
10
11lzma = import_module("lzma")
12from lzma import LZMACompressor, LZMADecompressor, LZMAError, LZMAFile
13
14
15class CompressorDecompressorTestCase(unittest.TestCase):
16
17 # Test error cases.
18
19 def test_simple_bad_args(self):
20 self.assertRaises(TypeError, LZMACompressor, [])
21 self.assertRaises(TypeError, LZMACompressor, format=3.45)
22 self.assertRaises(TypeError, LZMACompressor, check="")
23 self.assertRaises(TypeError, LZMACompressor, preset="asdf")
24 self.assertRaises(TypeError, LZMACompressor, filters=3)
25 # Can't specify FORMAT_AUTO when compressing.
26 self.assertRaises(ValueError, LZMACompressor, format=lzma.FORMAT_AUTO)
27 # Can't specify a preset and a custom filter chain at the same time.
28 with self.assertRaises(ValueError):
29 LZMACompressor(preset=7, filters=[{"id": lzma.FILTER_LZMA2}])
30
31 self.assertRaises(TypeError, LZMADecompressor, ())
32 self.assertRaises(TypeError, LZMADecompressor, memlimit=b"qw")
33 with self.assertRaises(TypeError):
34 LZMADecompressor(lzma.FORMAT_RAW, filters="zzz")
35 # Cannot specify a memory limit with FILTER_RAW.
36 with self.assertRaises(ValueError):
37 LZMADecompressor(lzma.FORMAT_RAW, memlimit=0x1000000)
38 # Can only specify a custom filter chain with FILTER_RAW.
39 self.assertRaises(ValueError, LZMADecompressor, filters=FILTERS_RAW_1)
40 with self.assertRaises(ValueError):
41 LZMADecompressor(format=lzma.FORMAT_XZ, filters=FILTERS_RAW_1)
42 with self.assertRaises(ValueError):
43 LZMADecompressor(format=lzma.FORMAT_ALONE, filters=FILTERS_RAW_1)
44
45 lzc = LZMACompressor()
46 self.assertRaises(TypeError, lzc.compress)
47 self.assertRaises(TypeError, lzc.compress, b"foo", b"bar")
48 self.assertRaises(TypeError, lzc.flush, b"blah")
49 empty = lzc.flush()
50 self.assertRaises(ValueError, lzc.compress, b"quux")
51 self.assertRaises(ValueError, lzc.flush)
52
53 lzd = LZMADecompressor()
54 self.assertRaises(TypeError, lzd.decompress)
55 self.assertRaises(TypeError, lzd.decompress, b"foo", b"bar")
56 lzd.decompress(empty)
57 self.assertRaises(EOFError, lzd.decompress, b"quux")
58
59 def test_bad_filter_spec(self):
60 self.assertRaises(TypeError, LZMACompressor, filters=[b"wobsite"])
61 self.assertRaises(ValueError, LZMACompressor, filters=[{"xyzzy": 3}])
62 self.assertRaises(ValueError, LZMACompressor, filters=[{"id": 98765}])
63 with self.assertRaises(ValueError):
64 LZMACompressor(filters=[{"id": lzma.FILTER_LZMA2, "foo": 0}])
65 with self.assertRaises(ValueError):
66 LZMACompressor(filters=[{"id": lzma.FILTER_DELTA, "foo": 0}])
67 with self.assertRaises(ValueError):
68 LZMACompressor(filters=[{"id": lzma.FILTER_X86, "foo": 0}])
69
70 def test_decompressor_after_eof(self):
71 lzd = LZMADecompressor()
72 lzd.decompress(COMPRESSED_XZ)
73 self.assertRaises(EOFError, lzd.decompress, b"nyan")
74
75 def test_decompressor_memlimit(self):
76 lzd = LZMADecompressor(memlimit=1024)
77 self.assertRaises(LZMAError, lzd.decompress, COMPRESSED_XZ)
78
79 lzd = LZMADecompressor(lzma.FORMAT_XZ, memlimit=1024)
80 self.assertRaises(LZMAError, lzd.decompress, COMPRESSED_XZ)
81
82 lzd = LZMADecompressor(lzma.FORMAT_ALONE, memlimit=1024)
83 self.assertRaises(LZMAError, lzd.decompress, COMPRESSED_ALONE)
84
85 # Test LZMADecompressor on known-good input data.
86
87 def _test_decompressor(self, lzd, data, check, unused_data=b""):
88 self.assertFalse(lzd.eof)
89 out = lzd.decompress(data)
90 self.assertEqual(out, INPUT)
91 self.assertEqual(lzd.check, check)
92 self.assertTrue(lzd.eof)
93 self.assertEqual(lzd.unused_data, unused_data)
94
95 def test_decompressor_auto(self):
96 lzd = LZMADecompressor()
97 self._test_decompressor(lzd, COMPRESSED_XZ, lzma.CHECK_CRC64)
98
99 lzd = LZMADecompressor()
100 self._test_decompressor(lzd, COMPRESSED_ALONE, lzma.CHECK_NONE)
101
102 def test_decompressor_xz(self):
103 lzd = LZMADecompressor(lzma.FORMAT_XZ)
104 self._test_decompressor(lzd, COMPRESSED_XZ, lzma.CHECK_CRC64)
105
106 def test_decompressor_alone(self):
107 lzd = LZMADecompressor(lzma.FORMAT_ALONE)
108 self._test_decompressor(lzd, COMPRESSED_ALONE, lzma.CHECK_NONE)
109
110 def test_decompressor_raw_1(self):
111 lzd = LZMADecompressor(lzma.FORMAT_RAW, filters=FILTERS_RAW_1)
112 self._test_decompressor(lzd, COMPRESSED_RAW_1, lzma.CHECK_NONE)
113
114 def test_decompressor_raw_2(self):
115 lzd = LZMADecompressor(lzma.FORMAT_RAW, filters=FILTERS_RAW_2)
116 self._test_decompressor(lzd, COMPRESSED_RAW_2, lzma.CHECK_NONE)
117
118 def test_decompressor_raw_3(self):
119 lzd = LZMADecompressor(lzma.FORMAT_RAW, filters=FILTERS_RAW_3)
120 self._test_decompressor(lzd, COMPRESSED_RAW_3, lzma.CHECK_NONE)
121
122 def test_decompressor_raw_4(self):
123 lzd = LZMADecompressor(lzma.FORMAT_RAW, filters=FILTERS_RAW_4)
124 self._test_decompressor(lzd, COMPRESSED_RAW_4, lzma.CHECK_NONE)
125
126 def test_decompressor_chunks(self):
127 lzd = LZMADecompressor()
128 out = []
129 for i in range(0, len(COMPRESSED_XZ), 10):
130 self.assertFalse(lzd.eof)
131 out.append(lzd.decompress(COMPRESSED_XZ[i:i+10]))
132 out = b"".join(out)
133 self.assertEqual(out, INPUT)
134 self.assertEqual(lzd.check, lzma.CHECK_CRC64)
135 self.assertTrue(lzd.eof)
136 self.assertEqual(lzd.unused_data, b"")
137
138 def test_decompressor_unused_data(self):
139 lzd = LZMADecompressor()
140 extra = b"fooblibar"
141 self._test_decompressor(lzd, COMPRESSED_XZ + extra, lzma.CHECK_CRC64,
142 unused_data=extra)
143
144 def test_decompressor_bad_input(self):
145 lzd = LZMADecompressor()
146 self.assertRaises(LZMAError, lzd.decompress, COMPRESSED_RAW_1)
147
148 lzd = LZMADecompressor(lzma.FORMAT_XZ)
149 self.assertRaises(LZMAError, lzd.decompress, COMPRESSED_ALONE)
150
151 lzd = LZMADecompressor(lzma.FORMAT_ALONE)
152 self.assertRaises(LZMAError, lzd.decompress, COMPRESSED_XZ)
153
154 lzd = LZMADecompressor(lzma.FORMAT_RAW, filters=FILTERS_RAW_1)
155 self.assertRaises(LZMAError, lzd.decompress, COMPRESSED_XZ)
156
157 # Test that LZMACompressor->LZMADecompressor preserves the input data.
158
159 def test_roundtrip_xz(self):
160 lzc = LZMACompressor()
161 cdata = lzc.compress(INPUT) + lzc.flush()
162 lzd = LZMADecompressor()
163 self._test_decompressor(lzd, cdata, lzma.CHECK_CRC64)
164
165 def test_roundtrip_alone(self):
166 lzc = LZMACompressor(lzma.FORMAT_ALONE)
167 cdata = lzc.compress(INPUT) + lzc.flush()
168 lzd = LZMADecompressor()
169 self._test_decompressor(lzd, cdata, lzma.CHECK_NONE)
170
171 def test_roundtrip_raw(self):
172 lzc = LZMACompressor(lzma.FORMAT_RAW, filters=FILTERS_RAW_4)
173 cdata = lzc.compress(INPUT) + lzc.flush()
174 lzd = LZMADecompressor(lzma.FORMAT_RAW, filters=FILTERS_RAW_4)
175 self._test_decompressor(lzd, cdata, lzma.CHECK_NONE)
176
177 def test_roundtrip_chunks(self):
178 lzc = LZMACompressor()
179 cdata = []
180 for i in range(0, len(INPUT), 10):
181 cdata.append(lzc.compress(INPUT[i:i+10]))
182 cdata.append(lzc.flush())
183 cdata = b"".join(cdata)
184 lzd = LZMADecompressor()
185 self._test_decompressor(lzd, cdata, lzma.CHECK_CRC64)
186
187 # LZMADecompressor intentionally does not handle concatenated streams.
188
189 def test_decompressor_multistream(self):
190 lzd = LZMADecompressor()
191 self._test_decompressor(lzd, COMPRESSED_XZ + COMPRESSED_ALONE,
192 lzma.CHECK_CRC64, unused_data=COMPRESSED_ALONE)
193
194 # Test with inputs larger than 4GiB.
195
196 @bigmemtest(size=_4G + 100, memuse=2)
197 def test_compressor_bigmem(self, size):
198 lzc = LZMACompressor()
199 cdata = lzc.compress(b"x" * size) + lzc.flush()
200 ddata = lzma.decompress(cdata)
201 try:
202 self.assertEqual(len(ddata), size)
203 self.assertEqual(len(ddata.strip(b"x")), 0)
204 finally:
205 ddata = None
206
207 @bigmemtest(size=_4G + 100, memuse=3)
208 def test_decompressor_bigmem(self, size):
209 lzd = LZMADecompressor()
210 blocksize = 10 * 1024 * 1024
211 block = random.getrandbits(blocksize * 8).to_bytes(blocksize, "little")
212 try:
213 input = block * (size // blocksize + 1)
214 cdata = lzma.compress(input)
215 ddata = lzd.decompress(cdata)
216 self.assertEqual(ddata, input)
217 finally:
218 input = cdata = ddata = None
219
Nadeem Vawda37970652013-10-28 21:35:23 +0100220 # Pickling raises an exception; there's no way to serialize an lzma_stream.
221
222 def test_pickle(self):
223 with self.assertRaises(TypeError):
224 pickle.dumps(LZMACompressor())
225 with self.assertRaises(TypeError):
226 pickle.dumps(LZMADecompressor())
227
Nadeem Vawda3ff069e2011-11-30 00:25:06 +0200228
229class CompressDecompressFunctionTestCase(unittest.TestCase):
230
231 # Test error cases:
232
233 def test_bad_args(self):
234 self.assertRaises(TypeError, lzma.compress)
235 self.assertRaises(TypeError, lzma.compress, [])
236 self.assertRaises(TypeError, lzma.compress, b"", format="xz")
237 self.assertRaises(TypeError, lzma.compress, b"", check="none")
238 self.assertRaises(TypeError, lzma.compress, b"", preset="blah")
239 self.assertRaises(TypeError, lzma.compress, b"", filters=1024)
240 # Can't specify a preset and a custom filter chain at the same time.
241 with self.assertRaises(ValueError):
242 lzma.compress(b"", preset=3, filters=[{"id": lzma.FILTER_LZMA2}])
243
244 self.assertRaises(TypeError, lzma.decompress)
245 self.assertRaises(TypeError, lzma.decompress, [])
246 self.assertRaises(TypeError, lzma.decompress, b"", format="lzma")
247 self.assertRaises(TypeError, lzma.decompress, b"", memlimit=7.3e9)
248 with self.assertRaises(TypeError):
249 lzma.decompress(b"", format=lzma.FORMAT_RAW, filters={})
250 # Cannot specify a memory limit with FILTER_RAW.
251 with self.assertRaises(ValueError):
252 lzma.decompress(b"", format=lzma.FORMAT_RAW, memlimit=0x1000000)
253 # Can only specify a custom filter chain with FILTER_RAW.
254 with self.assertRaises(ValueError):
255 lzma.decompress(b"", filters=FILTERS_RAW_1)
256 with self.assertRaises(ValueError):
257 lzma.decompress(b"", format=lzma.FORMAT_XZ, filters=FILTERS_RAW_1)
258 with self.assertRaises(ValueError):
259 lzma.decompress(
260 b"", format=lzma.FORMAT_ALONE, filters=FILTERS_RAW_1)
261
262 def test_decompress_memlimit(self):
263 with self.assertRaises(LZMAError):
264 lzma.decompress(COMPRESSED_XZ, memlimit=1024)
265 with self.assertRaises(LZMAError):
266 lzma.decompress(
267 COMPRESSED_XZ, format=lzma.FORMAT_XZ, memlimit=1024)
268 with self.assertRaises(LZMAError):
269 lzma.decompress(
270 COMPRESSED_ALONE, format=lzma.FORMAT_ALONE, memlimit=1024)
271
272 # Test LZMADecompressor on known-good input data.
273
274 def test_decompress_good_input(self):
275 ddata = lzma.decompress(COMPRESSED_XZ)
276 self.assertEqual(ddata, INPUT)
277
278 ddata = lzma.decompress(COMPRESSED_ALONE)
279 self.assertEqual(ddata, INPUT)
280
281 ddata = lzma.decompress(COMPRESSED_XZ, lzma.FORMAT_XZ)
282 self.assertEqual(ddata, INPUT)
283
284 ddata = lzma.decompress(COMPRESSED_ALONE, lzma.FORMAT_ALONE)
285 self.assertEqual(ddata, INPUT)
286
287 ddata = lzma.decompress(
288 COMPRESSED_RAW_1, lzma.FORMAT_RAW, filters=FILTERS_RAW_1)
289 self.assertEqual(ddata, INPUT)
290
291 ddata = lzma.decompress(
292 COMPRESSED_RAW_2, lzma.FORMAT_RAW, filters=FILTERS_RAW_2)
293 self.assertEqual(ddata, INPUT)
294
295 ddata = lzma.decompress(
296 COMPRESSED_RAW_3, lzma.FORMAT_RAW, filters=FILTERS_RAW_3)
297 self.assertEqual(ddata, INPUT)
298
299 ddata = lzma.decompress(
300 COMPRESSED_RAW_4, lzma.FORMAT_RAW, filters=FILTERS_RAW_4)
301 self.assertEqual(ddata, INPUT)
302
303 def test_decompress_incomplete_input(self):
304 self.assertRaises(LZMAError, lzma.decompress, COMPRESSED_XZ[:128])
305 self.assertRaises(LZMAError, lzma.decompress, COMPRESSED_ALONE[:128])
306 self.assertRaises(LZMAError, lzma.decompress, COMPRESSED_RAW_1[:128],
307 format=lzma.FORMAT_RAW, filters=FILTERS_RAW_1)
308 self.assertRaises(LZMAError, lzma.decompress, COMPRESSED_RAW_2[:128],
309 format=lzma.FORMAT_RAW, filters=FILTERS_RAW_2)
310 self.assertRaises(LZMAError, lzma.decompress, COMPRESSED_RAW_3[:128],
311 format=lzma.FORMAT_RAW, filters=FILTERS_RAW_3)
312 self.assertRaises(LZMAError, lzma.decompress, COMPRESSED_RAW_4[:128],
313 format=lzma.FORMAT_RAW, filters=FILTERS_RAW_4)
314
315 def test_decompress_bad_input(self):
316 with self.assertRaises(LZMAError):
317 lzma.decompress(COMPRESSED_RAW_1)
318 with self.assertRaises(LZMAError):
319 lzma.decompress(COMPRESSED_ALONE, format=lzma.FORMAT_XZ)
320 with self.assertRaises(LZMAError):
321 lzma.decompress(COMPRESSED_XZ, format=lzma.FORMAT_ALONE)
322 with self.assertRaises(LZMAError):
323 lzma.decompress(COMPRESSED_XZ, format=lzma.FORMAT_RAW,
324 filters=FILTERS_RAW_1)
325
326 # Test that compress()->decompress() preserves the input data.
327
328 def test_roundtrip(self):
329 cdata = lzma.compress(INPUT)
330 ddata = lzma.decompress(cdata)
331 self.assertEqual(ddata, INPUT)
332
333 cdata = lzma.compress(INPUT, lzma.FORMAT_XZ)
334 ddata = lzma.decompress(cdata)
335 self.assertEqual(ddata, INPUT)
336
337 cdata = lzma.compress(INPUT, lzma.FORMAT_ALONE)
338 ddata = lzma.decompress(cdata)
339 self.assertEqual(ddata, INPUT)
340
341 cdata = lzma.compress(INPUT, lzma.FORMAT_RAW, filters=FILTERS_RAW_4)
342 ddata = lzma.decompress(cdata, lzma.FORMAT_RAW, filters=FILTERS_RAW_4)
343 self.assertEqual(ddata, INPUT)
344
345 # Unlike LZMADecompressor, decompress() *does* handle concatenated streams.
346
347 def test_decompress_multistream(self):
348 ddata = lzma.decompress(COMPRESSED_XZ + COMPRESSED_ALONE)
349 self.assertEqual(ddata, INPUT * 2)
350
351
352class TempFile:
353 """Context manager - creates a file, and deletes it on __exit__."""
354
355 def __init__(self, filename, data=b""):
356 self.filename = filename
357 self.data = data
358
359 def __enter__(self):
360 with open(self.filename, "wb") as f:
361 f.write(self.data)
362
363 def __exit__(self, *args):
364 unlink(self.filename)
365
366
367class FileTestCase(unittest.TestCase):
368
369 def test_init(self):
Nadeem Vawda33c34da2012-06-04 23:34:07 +0200370 with LZMAFile(BytesIO(COMPRESSED_XZ)) as f:
Nadeem Vawda3ff069e2011-11-30 00:25:06 +0200371 pass
Nadeem Vawda33c34da2012-06-04 23:34:07 +0200372 with LZMAFile(BytesIO(), "w") as f:
Nadeem Vawda3ff069e2011-11-30 00:25:06 +0200373 pass
Nadeem Vawda33c34da2012-06-04 23:34:07 +0200374 with LZMAFile(BytesIO(), "a") as f:
Nadeem Vawda3ff069e2011-11-30 00:25:06 +0200375 pass
376
377 def test_init_with_filename(self):
378 with TempFile(TESTFN, COMPRESSED_XZ):
379 with LZMAFile(TESTFN) as f:
380 pass
381 with LZMAFile(TESTFN, "w") as f:
382 pass
383 with LZMAFile(TESTFN, "a") as f:
384 pass
385
Nadeem Vawda6cbb20c2012-06-04 23:36:24 +0200386 def test_init_mode(self):
387 with TempFile(TESTFN):
388 with LZMAFile(TESTFN, "r"):
389 pass
390 with LZMAFile(TESTFN, "rb"):
391 pass
392 with LZMAFile(TESTFN, "w"):
393 pass
394 with LZMAFile(TESTFN, "wb"):
395 pass
396 with LZMAFile(TESTFN, "a"):
397 pass
398 with LZMAFile(TESTFN, "ab"):
399 pass
400
Nadeem Vawda3ff069e2011-11-30 00:25:06 +0200401 def test_init_bad_mode(self):
402 with self.assertRaises(ValueError):
Nadeem Vawda33c34da2012-06-04 23:34:07 +0200403 LZMAFile(BytesIO(COMPRESSED_XZ), (3, "x"))
Nadeem Vawda3ff069e2011-11-30 00:25:06 +0200404 with self.assertRaises(ValueError):
Nadeem Vawda33c34da2012-06-04 23:34:07 +0200405 LZMAFile(BytesIO(COMPRESSED_XZ), "")
Nadeem Vawda3ff069e2011-11-30 00:25:06 +0200406 with self.assertRaises(ValueError):
Nadeem Vawda33c34da2012-06-04 23:34:07 +0200407 LZMAFile(BytesIO(COMPRESSED_XZ), "x")
Nadeem Vawda3ff069e2011-11-30 00:25:06 +0200408 with self.assertRaises(ValueError):
Nadeem Vawda6cbb20c2012-06-04 23:36:24 +0200409 LZMAFile(BytesIO(COMPRESSED_XZ), "rt")
Nadeem Vawda3ff069e2011-11-30 00:25:06 +0200410 with self.assertRaises(ValueError):
Nadeem Vawda33c34da2012-06-04 23:34:07 +0200411 LZMAFile(BytesIO(COMPRESSED_XZ), "r+")
Nadeem Vawda3ff069e2011-11-30 00:25:06 +0200412 with self.assertRaises(ValueError):
Nadeem Vawda6cbb20c2012-06-04 23:36:24 +0200413 LZMAFile(BytesIO(COMPRESSED_XZ), "wt")
Nadeem Vawda3ff069e2011-11-30 00:25:06 +0200414 with self.assertRaises(ValueError):
Nadeem Vawda33c34da2012-06-04 23:34:07 +0200415 LZMAFile(BytesIO(COMPRESSED_XZ), "w+")
Nadeem Vawda3ff069e2011-11-30 00:25:06 +0200416 with self.assertRaises(ValueError):
Nadeem Vawda33c34da2012-06-04 23:34:07 +0200417 LZMAFile(BytesIO(COMPRESSED_XZ), "rw")
Nadeem Vawda3ff069e2011-11-30 00:25:06 +0200418
419 def test_init_bad_check(self):
420 with self.assertRaises(TypeError):
Nadeem Vawda33c34da2012-06-04 23:34:07 +0200421 LZMAFile(BytesIO(), "w", check=b"asd")
Nadeem Vawda3ff069e2011-11-30 00:25:06 +0200422 # CHECK_UNKNOWN and anything above CHECK_ID_MAX should be invalid.
423 with self.assertRaises(LZMAError):
Nadeem Vawda33c34da2012-06-04 23:34:07 +0200424 LZMAFile(BytesIO(), "w", check=lzma.CHECK_UNKNOWN)
Nadeem Vawda3ff069e2011-11-30 00:25:06 +0200425 with self.assertRaises(LZMAError):
Nadeem Vawda33c34da2012-06-04 23:34:07 +0200426 LZMAFile(BytesIO(), "w", check=lzma.CHECK_ID_MAX + 3)
Nadeem Vawda3ff069e2011-11-30 00:25:06 +0200427 # Cannot specify a check with mode="r".
428 with self.assertRaises(ValueError):
Nadeem Vawda33c34da2012-06-04 23:34:07 +0200429 LZMAFile(BytesIO(COMPRESSED_XZ), check=lzma.CHECK_NONE)
Nadeem Vawda3ff069e2011-11-30 00:25:06 +0200430 with self.assertRaises(ValueError):
Nadeem Vawda33c34da2012-06-04 23:34:07 +0200431 LZMAFile(BytesIO(COMPRESSED_XZ), check=lzma.CHECK_CRC32)
Nadeem Vawda3ff069e2011-11-30 00:25:06 +0200432 with self.assertRaises(ValueError):
Nadeem Vawda33c34da2012-06-04 23:34:07 +0200433 LZMAFile(BytesIO(COMPRESSED_XZ), check=lzma.CHECK_CRC64)
Nadeem Vawda3ff069e2011-11-30 00:25:06 +0200434 with self.assertRaises(ValueError):
Nadeem Vawda33c34da2012-06-04 23:34:07 +0200435 LZMAFile(BytesIO(COMPRESSED_XZ), check=lzma.CHECK_SHA256)
Nadeem Vawda3ff069e2011-11-30 00:25:06 +0200436 with self.assertRaises(ValueError):
Nadeem Vawda33c34da2012-06-04 23:34:07 +0200437 LZMAFile(BytesIO(COMPRESSED_XZ), check=lzma.CHECK_UNKNOWN)
Nadeem Vawda3ff069e2011-11-30 00:25:06 +0200438
439 def test_init_bad_preset(self):
440 with self.assertRaises(TypeError):
Nadeem Vawda33c34da2012-06-04 23:34:07 +0200441 LZMAFile(BytesIO(), "w", preset=4.39)
Nadeem Vawda3ff069e2011-11-30 00:25:06 +0200442 with self.assertRaises(LZMAError):
Nadeem Vawda33c34da2012-06-04 23:34:07 +0200443 LZMAFile(BytesIO(), "w", preset=10)
Nadeem Vawda3ff069e2011-11-30 00:25:06 +0200444 with self.assertRaises(LZMAError):
Nadeem Vawda33c34da2012-06-04 23:34:07 +0200445 LZMAFile(BytesIO(), "w", preset=23)
Nadeem Vawda3ff069e2011-11-30 00:25:06 +0200446 with self.assertRaises(OverflowError):
Nadeem Vawda33c34da2012-06-04 23:34:07 +0200447 LZMAFile(BytesIO(), "w", preset=-1)
Nadeem Vawda3ff069e2011-11-30 00:25:06 +0200448 with self.assertRaises(OverflowError):
Nadeem Vawda33c34da2012-06-04 23:34:07 +0200449 LZMAFile(BytesIO(), "w", preset=-7)
Nadeem Vawda3ff069e2011-11-30 00:25:06 +0200450 with self.assertRaises(TypeError):
Nadeem Vawda33c34da2012-06-04 23:34:07 +0200451 LZMAFile(BytesIO(), "w", preset="foo")
Nadeem Vawda3ff069e2011-11-30 00:25:06 +0200452 # Cannot specify a preset with mode="r".
453 with self.assertRaises(ValueError):
Nadeem Vawda33c34da2012-06-04 23:34:07 +0200454 LZMAFile(BytesIO(COMPRESSED_XZ), preset=3)
Nadeem Vawda3ff069e2011-11-30 00:25:06 +0200455
456 def test_init_bad_filter_spec(self):
457 with self.assertRaises(TypeError):
Nadeem Vawda33c34da2012-06-04 23:34:07 +0200458 LZMAFile(BytesIO(), "w", filters=[b"wobsite"])
Nadeem Vawda3ff069e2011-11-30 00:25:06 +0200459 with self.assertRaises(ValueError):
Nadeem Vawda33c34da2012-06-04 23:34:07 +0200460 LZMAFile(BytesIO(), "w", filters=[{"xyzzy": 3}])
Nadeem Vawda3ff069e2011-11-30 00:25:06 +0200461 with self.assertRaises(ValueError):
Nadeem Vawda33c34da2012-06-04 23:34:07 +0200462 LZMAFile(BytesIO(), "w", filters=[{"id": 98765}])
Nadeem Vawda3ff069e2011-11-30 00:25:06 +0200463 with self.assertRaises(ValueError):
Nadeem Vawda33c34da2012-06-04 23:34:07 +0200464 LZMAFile(BytesIO(), "w",
Nadeem Vawda3ff069e2011-11-30 00:25:06 +0200465 filters=[{"id": lzma.FILTER_LZMA2, "foo": 0}])
466 with self.assertRaises(ValueError):
Nadeem Vawda33c34da2012-06-04 23:34:07 +0200467 LZMAFile(BytesIO(), "w",
Nadeem Vawda3ff069e2011-11-30 00:25:06 +0200468 filters=[{"id": lzma.FILTER_DELTA, "foo": 0}])
469 with self.assertRaises(ValueError):
Nadeem Vawda33c34da2012-06-04 23:34:07 +0200470 LZMAFile(BytesIO(), "w",
Nadeem Vawda3ff069e2011-11-30 00:25:06 +0200471 filters=[{"id": lzma.FILTER_X86, "foo": 0}])
472
473 def test_init_with_preset_and_filters(self):
474 with self.assertRaises(ValueError):
Nadeem Vawda33c34da2012-06-04 23:34:07 +0200475 LZMAFile(BytesIO(), "w", format=lzma.FORMAT_RAW,
476 preset=6, filters=FILTERS_RAW_1)
Nadeem Vawda3ff069e2011-11-30 00:25:06 +0200477
478 def test_close(self):
479 with BytesIO(COMPRESSED_XZ) as src:
Nadeem Vawda33c34da2012-06-04 23:34:07 +0200480 f = LZMAFile(src)
Nadeem Vawda3ff069e2011-11-30 00:25:06 +0200481 f.close()
482 # LZMAFile.close() should not close the underlying file object.
483 self.assertFalse(src.closed)
484 # Try closing an already-closed LZMAFile.
485 f.close()
486 self.assertFalse(src.closed)
487
488 # Test with a real file on disk, opened directly by LZMAFile.
489 with TempFile(TESTFN, COMPRESSED_XZ):
490 f = LZMAFile(TESTFN)
491 fp = f._fp
492 f.close()
493 # Here, LZMAFile.close() *should* close the underlying file object.
494 self.assertTrue(fp.closed)
495 # Try closing an already-closed LZMAFile.
496 f.close()
497
498 def test_closed(self):
Nadeem Vawda33c34da2012-06-04 23:34:07 +0200499 f = LZMAFile(BytesIO(COMPRESSED_XZ))
Nadeem Vawda3ff069e2011-11-30 00:25:06 +0200500 try:
501 self.assertFalse(f.closed)
502 f.read()
503 self.assertFalse(f.closed)
504 finally:
505 f.close()
506 self.assertTrue(f.closed)
507
Nadeem Vawda33c34da2012-06-04 23:34:07 +0200508 f = LZMAFile(BytesIO(), "w")
Nadeem Vawda3ff069e2011-11-30 00:25:06 +0200509 try:
510 self.assertFalse(f.closed)
511 finally:
512 f.close()
513 self.assertTrue(f.closed)
514
515 def test_fileno(self):
Nadeem Vawda33c34da2012-06-04 23:34:07 +0200516 f = LZMAFile(BytesIO(COMPRESSED_XZ))
Nadeem Vawda3ff069e2011-11-30 00:25:06 +0200517 try:
518 self.assertRaises(UnsupportedOperation, f.fileno)
519 finally:
520 f.close()
521 self.assertRaises(ValueError, f.fileno)
522 with TempFile(TESTFN, COMPRESSED_XZ):
523 f = LZMAFile(TESTFN)
524 try:
525 self.assertEqual(f.fileno(), f._fp.fileno())
526 self.assertIsInstance(f.fileno(), int)
527 finally:
528 f.close()
529 self.assertRaises(ValueError, f.fileno)
530
531 def test_seekable(self):
Nadeem Vawda33c34da2012-06-04 23:34:07 +0200532 f = LZMAFile(BytesIO(COMPRESSED_XZ))
Nadeem Vawda3ff069e2011-11-30 00:25:06 +0200533 try:
534 self.assertTrue(f.seekable())
535 f.read()
536 self.assertTrue(f.seekable())
537 finally:
538 f.close()
539 self.assertRaises(ValueError, f.seekable)
540
Nadeem Vawda33c34da2012-06-04 23:34:07 +0200541 f = LZMAFile(BytesIO(), "w")
Nadeem Vawda3ff069e2011-11-30 00:25:06 +0200542 try:
543 self.assertFalse(f.seekable())
544 finally:
545 f.close()
546 self.assertRaises(ValueError, f.seekable)
547
Nadeem Vawdaae557d72012-02-12 01:51:38 +0200548 src = BytesIO(COMPRESSED_XZ)
549 src.seekable = lambda: False
Nadeem Vawda33c34da2012-06-04 23:34:07 +0200550 f = LZMAFile(src)
Nadeem Vawdaae557d72012-02-12 01:51:38 +0200551 try:
552 self.assertFalse(f.seekable())
553 finally:
554 f.close()
555 self.assertRaises(ValueError, f.seekable)
556
Nadeem Vawda3ff069e2011-11-30 00:25:06 +0200557 def test_readable(self):
Nadeem Vawda33c34da2012-06-04 23:34:07 +0200558 f = LZMAFile(BytesIO(COMPRESSED_XZ))
Nadeem Vawda3ff069e2011-11-30 00:25:06 +0200559 try:
560 self.assertTrue(f.readable())
561 f.read()
562 self.assertTrue(f.readable())
563 finally:
564 f.close()
565 self.assertRaises(ValueError, f.readable)
566
Nadeem Vawda33c34da2012-06-04 23:34:07 +0200567 f = LZMAFile(BytesIO(), "w")
Nadeem Vawda3ff069e2011-11-30 00:25:06 +0200568 try:
569 self.assertFalse(f.readable())
570 finally:
571 f.close()
572 self.assertRaises(ValueError, f.readable)
573
574 def test_writable(self):
Nadeem Vawda33c34da2012-06-04 23:34:07 +0200575 f = LZMAFile(BytesIO(COMPRESSED_XZ))
Nadeem Vawda3ff069e2011-11-30 00:25:06 +0200576 try:
577 self.assertFalse(f.writable())
578 f.read()
579 self.assertFalse(f.writable())
580 finally:
581 f.close()
582 self.assertRaises(ValueError, f.writable)
583
Nadeem Vawda33c34da2012-06-04 23:34:07 +0200584 f = LZMAFile(BytesIO(), "w")
Nadeem Vawda3ff069e2011-11-30 00:25:06 +0200585 try:
586 self.assertTrue(f.writable())
587 finally:
588 f.close()
589 self.assertRaises(ValueError, f.writable)
590
591 def test_read(self):
Nadeem Vawda33c34da2012-06-04 23:34:07 +0200592 with LZMAFile(BytesIO(COMPRESSED_XZ)) as f:
Nadeem Vawda3ff069e2011-11-30 00:25:06 +0200593 self.assertEqual(f.read(), INPUT)
594 self.assertEqual(f.read(), b"")
Nadeem Vawda33c34da2012-06-04 23:34:07 +0200595 with LZMAFile(BytesIO(COMPRESSED_ALONE)) as f:
Nadeem Vawda3ff069e2011-11-30 00:25:06 +0200596 self.assertEqual(f.read(), INPUT)
Nadeem Vawda33c34da2012-06-04 23:34:07 +0200597 with LZMAFile(BytesIO(COMPRESSED_XZ), format=lzma.FORMAT_XZ) as f:
Nadeem Vawda3ff069e2011-11-30 00:25:06 +0200598 self.assertEqual(f.read(), INPUT)
599 self.assertEqual(f.read(), b"")
Nadeem Vawda33c34da2012-06-04 23:34:07 +0200600 with LZMAFile(BytesIO(COMPRESSED_ALONE), format=lzma.FORMAT_ALONE) as f:
Nadeem Vawda3ff069e2011-11-30 00:25:06 +0200601 self.assertEqual(f.read(), INPUT)
602 self.assertEqual(f.read(), b"")
Nadeem Vawda33c34da2012-06-04 23:34:07 +0200603 with LZMAFile(BytesIO(COMPRESSED_RAW_1),
Nadeem Vawda3ff069e2011-11-30 00:25:06 +0200604 format=lzma.FORMAT_RAW, filters=FILTERS_RAW_1) as f:
605 self.assertEqual(f.read(), INPUT)
606 self.assertEqual(f.read(), b"")
Nadeem Vawda33c34da2012-06-04 23:34:07 +0200607 with LZMAFile(BytesIO(COMPRESSED_RAW_2),
Nadeem Vawda3ff069e2011-11-30 00:25:06 +0200608 format=lzma.FORMAT_RAW, filters=FILTERS_RAW_2) as f:
609 self.assertEqual(f.read(), INPUT)
610 self.assertEqual(f.read(), b"")
Nadeem Vawda33c34da2012-06-04 23:34:07 +0200611 with LZMAFile(BytesIO(COMPRESSED_RAW_3),
Nadeem Vawda3ff069e2011-11-30 00:25:06 +0200612 format=lzma.FORMAT_RAW, filters=FILTERS_RAW_3) as f:
613 self.assertEqual(f.read(), INPUT)
614 self.assertEqual(f.read(), b"")
Nadeem Vawda33c34da2012-06-04 23:34:07 +0200615 with LZMAFile(BytesIO(COMPRESSED_RAW_4),
Nadeem Vawda3ff069e2011-11-30 00:25:06 +0200616 format=lzma.FORMAT_RAW, filters=FILTERS_RAW_4) as f:
617 self.assertEqual(f.read(), INPUT)
618 self.assertEqual(f.read(), b"")
619
620 def test_read_0(self):
Nadeem Vawda33c34da2012-06-04 23:34:07 +0200621 with LZMAFile(BytesIO(COMPRESSED_XZ)) as f:
Nadeem Vawda3ff069e2011-11-30 00:25:06 +0200622 self.assertEqual(f.read(0), b"")
Nadeem Vawda33c34da2012-06-04 23:34:07 +0200623 with LZMAFile(BytesIO(COMPRESSED_ALONE)) as f:
Nadeem Vawda3ff069e2011-11-30 00:25:06 +0200624 self.assertEqual(f.read(0), b"")
Nadeem Vawda33c34da2012-06-04 23:34:07 +0200625 with LZMAFile(BytesIO(COMPRESSED_XZ), format=lzma.FORMAT_XZ) as f:
Nadeem Vawda3ff069e2011-11-30 00:25:06 +0200626 self.assertEqual(f.read(0), b"")
Nadeem Vawda33c34da2012-06-04 23:34:07 +0200627 with LZMAFile(BytesIO(COMPRESSED_ALONE), format=lzma.FORMAT_ALONE) as f:
Nadeem Vawda3ff069e2011-11-30 00:25:06 +0200628 self.assertEqual(f.read(0), b"")
629
630 def test_read_10(self):
Nadeem Vawda33c34da2012-06-04 23:34:07 +0200631 with LZMAFile(BytesIO(COMPRESSED_XZ)) as f:
Nadeem Vawda3ff069e2011-11-30 00:25:06 +0200632 chunks = []
633 while True:
634 result = f.read(10)
635 if not result:
636 break
637 self.assertLessEqual(len(result), 10)
638 chunks.append(result)
639 self.assertEqual(b"".join(chunks), INPUT)
640
641 def test_read_multistream(self):
Nadeem Vawda33c34da2012-06-04 23:34:07 +0200642 with LZMAFile(BytesIO(COMPRESSED_XZ * 5)) as f:
Nadeem Vawda3ff069e2011-11-30 00:25:06 +0200643 self.assertEqual(f.read(), INPUT * 5)
Nadeem Vawda33c34da2012-06-04 23:34:07 +0200644 with LZMAFile(BytesIO(COMPRESSED_XZ + COMPRESSED_ALONE)) as f:
Nadeem Vawda3ff069e2011-11-30 00:25:06 +0200645 self.assertEqual(f.read(), INPUT * 2)
Nadeem Vawda33c34da2012-06-04 23:34:07 +0200646 with LZMAFile(BytesIO(COMPRESSED_RAW_3 * 4),
Nadeem Vawda3ff069e2011-11-30 00:25:06 +0200647 format=lzma.FORMAT_RAW, filters=FILTERS_RAW_3) as f:
648 self.assertEqual(f.read(), INPUT * 4)
649
650 def test_read_multistream_buffer_size_aligned(self):
651 # Test the case where a stream boundary coincides with the end
652 # of the raw read buffer.
653 saved_buffer_size = lzma._BUFFER_SIZE
654 lzma._BUFFER_SIZE = len(COMPRESSED_XZ)
655 try:
Nadeem Vawda33c34da2012-06-04 23:34:07 +0200656 with LZMAFile(BytesIO(COMPRESSED_XZ * 5)) as f:
Nadeem Vawda3ff069e2011-11-30 00:25:06 +0200657 self.assertEqual(f.read(), INPUT * 5)
658 finally:
659 lzma._BUFFER_SIZE = saved_buffer_size
660
661 def test_read_from_file(self):
662 with TempFile(TESTFN, COMPRESSED_XZ):
663 with LZMAFile(TESTFN) as f:
664 self.assertEqual(f.read(), INPUT)
665 self.assertEqual(f.read(), b"")
666
Nadeem Vawda10c87912012-06-20 01:48:50 +0200667 def test_read_from_file_with_bytes_filename(self):
668 try:
669 bytes_filename = TESTFN.encode("ascii")
670 except UnicodeEncodeError:
671 self.skipTest("Temporary file name needs to be ASCII")
672 with TempFile(TESTFN, COMPRESSED_XZ):
673 with LZMAFile(bytes_filename) as f:
674 self.assertEqual(f.read(), INPUT)
675 self.assertEqual(f.read(), b"")
676
Nadeem Vawda3ff069e2011-11-30 00:25:06 +0200677 def test_read_incomplete(self):
Nadeem Vawda33c34da2012-06-04 23:34:07 +0200678 with LZMAFile(BytesIO(COMPRESSED_XZ[:128])) as f:
Nadeem Vawda3ff069e2011-11-30 00:25:06 +0200679 self.assertRaises(EOFError, f.read)
680
681 def test_read_bad_args(self):
Nadeem Vawda33c34da2012-06-04 23:34:07 +0200682 f = LZMAFile(BytesIO(COMPRESSED_XZ))
Nadeem Vawda3ff069e2011-11-30 00:25:06 +0200683 f.close()
684 self.assertRaises(ValueError, f.read)
Nadeem Vawda33c34da2012-06-04 23:34:07 +0200685 with LZMAFile(BytesIO(), "w") as f:
Nadeem Vawda3ff069e2011-11-30 00:25:06 +0200686 self.assertRaises(ValueError, f.read)
Nadeem Vawda33c34da2012-06-04 23:34:07 +0200687 with LZMAFile(BytesIO(COMPRESSED_XZ)) as f:
Nadeem Vawda3ff069e2011-11-30 00:25:06 +0200688 self.assertRaises(TypeError, f.read, None)
689
690 def test_read1(self):
Nadeem Vawda33c34da2012-06-04 23:34:07 +0200691 with LZMAFile(BytesIO(COMPRESSED_XZ)) as f:
Nadeem Vawda3ff069e2011-11-30 00:25:06 +0200692 blocks = []
693 while True:
694 result = f.read1()
695 if not result:
696 break
697 blocks.append(result)
698 self.assertEqual(b"".join(blocks), INPUT)
699 self.assertEqual(f.read1(), b"")
700
701 def test_read1_0(self):
Nadeem Vawda33c34da2012-06-04 23:34:07 +0200702 with LZMAFile(BytesIO(COMPRESSED_XZ)) as f:
Nadeem Vawda3ff069e2011-11-30 00:25:06 +0200703 self.assertEqual(f.read1(0), b"")
704
705 def test_read1_10(self):
Nadeem Vawda33c34da2012-06-04 23:34:07 +0200706 with LZMAFile(BytesIO(COMPRESSED_XZ)) as f:
Nadeem Vawda3ff069e2011-11-30 00:25:06 +0200707 blocks = []
708 while True:
709 result = f.read1(10)
710 if not result:
711 break
712 blocks.append(result)
713 self.assertEqual(b"".join(blocks), INPUT)
714 self.assertEqual(f.read1(), b"")
715
716 def test_read1_multistream(self):
Nadeem Vawda33c34da2012-06-04 23:34:07 +0200717 with LZMAFile(BytesIO(COMPRESSED_XZ * 5)) as f:
Nadeem Vawda3ff069e2011-11-30 00:25:06 +0200718 blocks = []
719 while True:
720 result = f.read1()
721 if not result:
722 break
723 blocks.append(result)
724 self.assertEqual(b"".join(blocks), INPUT * 5)
725 self.assertEqual(f.read1(), b"")
726
727 def test_read1_bad_args(self):
Nadeem Vawda33c34da2012-06-04 23:34:07 +0200728 f = LZMAFile(BytesIO(COMPRESSED_XZ))
Nadeem Vawda3ff069e2011-11-30 00:25:06 +0200729 f.close()
730 self.assertRaises(ValueError, f.read1)
Nadeem Vawda33c34da2012-06-04 23:34:07 +0200731 with LZMAFile(BytesIO(), "w") as f:
Nadeem Vawda3ff069e2011-11-30 00:25:06 +0200732 self.assertRaises(ValueError, f.read1)
Nadeem Vawda33c34da2012-06-04 23:34:07 +0200733 with LZMAFile(BytesIO(COMPRESSED_XZ)) as f:
Nadeem Vawda3ff069e2011-11-30 00:25:06 +0200734 self.assertRaises(TypeError, f.read1, None)
735
736 def test_peek(self):
Nadeem Vawda33c34da2012-06-04 23:34:07 +0200737 with LZMAFile(BytesIO(COMPRESSED_XZ)) as f:
Nadeem Vawda3ff069e2011-11-30 00:25:06 +0200738 result = f.peek()
739 self.assertGreater(len(result), 0)
740 self.assertTrue(INPUT.startswith(result))
741 self.assertEqual(f.read(), INPUT)
Nadeem Vawda33c34da2012-06-04 23:34:07 +0200742 with LZMAFile(BytesIO(COMPRESSED_XZ)) as f:
Nadeem Vawda3ff069e2011-11-30 00:25:06 +0200743 result = f.peek(10)
744 self.assertGreater(len(result), 0)
745 self.assertTrue(INPUT.startswith(result))
746 self.assertEqual(f.read(), INPUT)
747
748 def test_peek_bad_args(self):
Nadeem Vawda33c34da2012-06-04 23:34:07 +0200749 with LZMAFile(BytesIO(), "w") as f:
Nadeem Vawda3ff069e2011-11-30 00:25:06 +0200750 self.assertRaises(ValueError, f.peek)
751
752 def test_iterator(self):
753 with BytesIO(INPUT) as f:
754 lines = f.readlines()
Nadeem Vawda33c34da2012-06-04 23:34:07 +0200755 with LZMAFile(BytesIO(COMPRESSED_XZ)) as f:
Nadeem Vawda3ff069e2011-11-30 00:25:06 +0200756 self.assertListEqual(list(iter(f)), lines)
Nadeem Vawda33c34da2012-06-04 23:34:07 +0200757 with LZMAFile(BytesIO(COMPRESSED_ALONE)) as f:
Nadeem Vawda3ff069e2011-11-30 00:25:06 +0200758 self.assertListEqual(list(iter(f)), lines)
Nadeem Vawda33c34da2012-06-04 23:34:07 +0200759 with LZMAFile(BytesIO(COMPRESSED_XZ), format=lzma.FORMAT_XZ) as f:
Nadeem Vawda3ff069e2011-11-30 00:25:06 +0200760 self.assertListEqual(list(iter(f)), lines)
Nadeem Vawda33c34da2012-06-04 23:34:07 +0200761 with LZMAFile(BytesIO(COMPRESSED_ALONE), format=lzma.FORMAT_ALONE) as f:
Nadeem Vawda3ff069e2011-11-30 00:25:06 +0200762 self.assertListEqual(list(iter(f)), lines)
Nadeem Vawda33c34da2012-06-04 23:34:07 +0200763 with LZMAFile(BytesIO(COMPRESSED_RAW_2),
Nadeem Vawda3ff069e2011-11-30 00:25:06 +0200764 format=lzma.FORMAT_RAW, filters=FILTERS_RAW_2) as f:
765 self.assertListEqual(list(iter(f)), lines)
766
767 def test_readline(self):
768 with BytesIO(INPUT) as f:
769 lines = f.readlines()
Nadeem Vawda33c34da2012-06-04 23:34:07 +0200770 with LZMAFile(BytesIO(COMPRESSED_XZ)) as f:
Nadeem Vawda3ff069e2011-11-30 00:25:06 +0200771 for line in lines:
772 self.assertEqual(f.readline(), line)
773
774 def test_readlines(self):
775 with BytesIO(INPUT) as f:
776 lines = f.readlines()
Nadeem Vawda33c34da2012-06-04 23:34:07 +0200777 with LZMAFile(BytesIO(COMPRESSED_XZ)) as f:
Nadeem Vawda3ff069e2011-11-30 00:25:06 +0200778 self.assertListEqual(f.readlines(), lines)
779
780 def test_write(self):
781 with BytesIO() as dst:
Nadeem Vawda33c34da2012-06-04 23:34:07 +0200782 with LZMAFile(dst, "w") as f:
Nadeem Vawda3ff069e2011-11-30 00:25:06 +0200783 f.write(INPUT)
784 expected = lzma.compress(INPUT)
785 self.assertEqual(dst.getvalue(), expected)
786 with BytesIO() as dst:
Nadeem Vawda33c34da2012-06-04 23:34:07 +0200787 with LZMAFile(dst, "w", format=lzma.FORMAT_XZ) as f:
Nadeem Vawda3ff069e2011-11-30 00:25:06 +0200788 f.write(INPUT)
789 expected = lzma.compress(INPUT, format=lzma.FORMAT_XZ)
790 self.assertEqual(dst.getvalue(), expected)
791 with BytesIO() as dst:
Nadeem Vawda33c34da2012-06-04 23:34:07 +0200792 with LZMAFile(dst, "w", format=lzma.FORMAT_ALONE) as f:
Nadeem Vawda3ff069e2011-11-30 00:25:06 +0200793 f.write(INPUT)
794 expected = lzma.compress(INPUT, format=lzma.FORMAT_ALONE)
795 self.assertEqual(dst.getvalue(), expected)
796 with BytesIO() as dst:
Nadeem Vawda33c34da2012-06-04 23:34:07 +0200797 with LZMAFile(dst, "w", format=lzma.FORMAT_RAW,
Nadeem Vawda3ff069e2011-11-30 00:25:06 +0200798 filters=FILTERS_RAW_2) as f:
799 f.write(INPUT)
800 expected = lzma.compress(INPUT, format=lzma.FORMAT_RAW,
801 filters=FILTERS_RAW_2)
802 self.assertEqual(dst.getvalue(), expected)
803
804 def test_write_10(self):
805 with BytesIO() as dst:
Nadeem Vawda33c34da2012-06-04 23:34:07 +0200806 with LZMAFile(dst, "w") as f:
Nadeem Vawda3ff069e2011-11-30 00:25:06 +0200807 for start in range(0, len(INPUT), 10):
808 f.write(INPUT[start:start+10])
809 expected = lzma.compress(INPUT)
810 self.assertEqual(dst.getvalue(), expected)
811
812 def test_write_append(self):
813 part1 = INPUT[:1024]
814 part2 = INPUT[1024:1536]
815 part3 = INPUT[1536:]
816 expected = b"".join(lzma.compress(x) for x in (part1, part2, part3))
817 with BytesIO() as dst:
Nadeem Vawda33c34da2012-06-04 23:34:07 +0200818 with LZMAFile(dst, "w") as f:
Nadeem Vawda3ff069e2011-11-30 00:25:06 +0200819 f.write(part1)
Nadeem Vawda33c34da2012-06-04 23:34:07 +0200820 with LZMAFile(dst, "a") as f:
Nadeem Vawda3ff069e2011-11-30 00:25:06 +0200821 f.write(part2)
Nadeem Vawda33c34da2012-06-04 23:34:07 +0200822 with LZMAFile(dst, "a") as f:
Nadeem Vawda3ff069e2011-11-30 00:25:06 +0200823 f.write(part3)
824 self.assertEqual(dst.getvalue(), expected)
825
826 def test_write_to_file(self):
827 try:
828 with LZMAFile(TESTFN, "w") as f:
829 f.write(INPUT)
830 expected = lzma.compress(INPUT)
831 with open(TESTFN, "rb") as f:
832 self.assertEqual(f.read(), expected)
833 finally:
834 unlink(TESTFN)
835
Nadeem Vawda10c87912012-06-20 01:48:50 +0200836 def test_write_to_file_with_bytes_filename(self):
837 try:
838 bytes_filename = TESTFN.encode("ascii")
839 except UnicodeEncodeError:
840 self.skipTest("Temporary file name needs to be ASCII")
841 try:
842 with LZMAFile(bytes_filename, "w") as f:
843 f.write(INPUT)
844 expected = lzma.compress(INPUT)
845 with open(TESTFN, "rb") as f:
846 self.assertEqual(f.read(), expected)
847 finally:
848 unlink(TESTFN)
849
Nadeem Vawda3ff069e2011-11-30 00:25:06 +0200850 def test_write_append_to_file(self):
851 part1 = INPUT[:1024]
852 part2 = INPUT[1024:1536]
853 part3 = INPUT[1536:]
854 expected = b"".join(lzma.compress(x) for x in (part1, part2, part3))
855 try:
856 with LZMAFile(TESTFN, "w") as f:
857 f.write(part1)
858 with LZMAFile(TESTFN, "a") as f:
859 f.write(part2)
860 with LZMAFile(TESTFN, "a") as f:
861 f.write(part3)
862 with open(TESTFN, "rb") as f:
863 self.assertEqual(f.read(), expected)
864 finally:
865 unlink(TESTFN)
866
867 def test_write_bad_args(self):
Nadeem Vawda33c34da2012-06-04 23:34:07 +0200868 f = LZMAFile(BytesIO(), "w")
Nadeem Vawda3ff069e2011-11-30 00:25:06 +0200869 f.close()
870 self.assertRaises(ValueError, f.write, b"foo")
Nadeem Vawda33c34da2012-06-04 23:34:07 +0200871 with LZMAFile(BytesIO(COMPRESSED_XZ), "r") as f:
Nadeem Vawda3ff069e2011-11-30 00:25:06 +0200872 self.assertRaises(ValueError, f.write, b"bar")
Nadeem Vawda33c34da2012-06-04 23:34:07 +0200873 with LZMAFile(BytesIO(), "w") as f:
Nadeem Vawda3ff069e2011-11-30 00:25:06 +0200874 self.assertRaises(TypeError, f.write, None)
875 self.assertRaises(TypeError, f.write, "text")
876 self.assertRaises(TypeError, f.write, 789)
877
878 def test_writelines(self):
879 with BytesIO(INPUT) as f:
880 lines = f.readlines()
881 with BytesIO() as dst:
Nadeem Vawda33c34da2012-06-04 23:34:07 +0200882 with LZMAFile(dst, "w") as f:
Nadeem Vawda3ff069e2011-11-30 00:25:06 +0200883 f.writelines(lines)
884 expected = lzma.compress(INPUT)
885 self.assertEqual(dst.getvalue(), expected)
886
887 def test_seek_forward(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(555)
890 self.assertEqual(f.read(), INPUT[555:])
891
892 def test_seek_forward_across_streams(self):
Nadeem Vawda33c34da2012-06-04 23:34:07 +0200893 with LZMAFile(BytesIO(COMPRESSED_XZ * 2)) as f:
Nadeem Vawda3ff069e2011-11-30 00:25:06 +0200894 f.seek(len(INPUT) + 123)
895 self.assertEqual(f.read(), INPUT[123:])
896
897 def test_seek_forward_relative_to_current(self):
Nadeem Vawda33c34da2012-06-04 23:34:07 +0200898 with LZMAFile(BytesIO(COMPRESSED_XZ)) as f:
Nadeem Vawda3ff069e2011-11-30 00:25:06 +0200899 f.read(100)
900 f.seek(1236, 1)
901 self.assertEqual(f.read(), INPUT[1336:])
902
903 def test_seek_forward_relative_to_end(self):
Nadeem Vawda33c34da2012-06-04 23:34:07 +0200904 with LZMAFile(BytesIO(COMPRESSED_XZ)) as f:
Nadeem Vawda3ff069e2011-11-30 00:25:06 +0200905 f.seek(-555, 2)
906 self.assertEqual(f.read(), INPUT[-555:])
907
908 def test_seek_backward(self):
Nadeem Vawda33c34da2012-06-04 23:34:07 +0200909 with LZMAFile(BytesIO(COMPRESSED_XZ)) as f:
Nadeem Vawda3ff069e2011-11-30 00:25:06 +0200910 f.read(1001)
911 f.seek(211)
912 self.assertEqual(f.read(), INPUT[211:])
913
914 def test_seek_backward_across_streams(self):
Nadeem Vawda33c34da2012-06-04 23:34:07 +0200915 with LZMAFile(BytesIO(COMPRESSED_XZ * 2)) as f:
Nadeem Vawda3ff069e2011-11-30 00:25:06 +0200916 f.read(len(INPUT) + 333)
917 f.seek(737)
918 self.assertEqual(f.read(), INPUT[737:] + INPUT)
919
920 def test_seek_backward_relative_to_end(self):
Nadeem Vawda33c34da2012-06-04 23:34:07 +0200921 with LZMAFile(BytesIO(COMPRESSED_XZ)) as f:
Nadeem Vawda3ff069e2011-11-30 00:25:06 +0200922 f.seek(-150, 2)
923 self.assertEqual(f.read(), INPUT[-150:])
924
925 def test_seek_past_end(self):
Nadeem Vawda33c34da2012-06-04 23:34:07 +0200926 with LZMAFile(BytesIO(COMPRESSED_XZ)) as f:
Nadeem Vawda3ff069e2011-11-30 00:25:06 +0200927 f.seek(len(INPUT) + 9001)
928 self.assertEqual(f.tell(), len(INPUT))
929 self.assertEqual(f.read(), b"")
930
931 def test_seek_past_start(self):
Nadeem Vawda33c34da2012-06-04 23:34:07 +0200932 with LZMAFile(BytesIO(COMPRESSED_XZ)) as f:
Nadeem Vawda3ff069e2011-11-30 00:25:06 +0200933 f.seek(-88)
934 self.assertEqual(f.tell(), 0)
935 self.assertEqual(f.read(), INPUT)
936
937 def test_seek_bad_args(self):
Nadeem Vawda33c34da2012-06-04 23:34:07 +0200938 f = LZMAFile(BytesIO(COMPRESSED_XZ))
Nadeem Vawda3ff069e2011-11-30 00:25:06 +0200939 f.close()
940 self.assertRaises(ValueError, f.seek, 0)
Nadeem Vawda33c34da2012-06-04 23:34:07 +0200941 with LZMAFile(BytesIO(), "w") as f:
Nadeem Vawda3ff069e2011-11-30 00:25:06 +0200942 self.assertRaises(ValueError, f.seek, 0)
Nadeem Vawda33c34da2012-06-04 23:34:07 +0200943 with LZMAFile(BytesIO(COMPRESSED_XZ)) as f:
Nadeem Vawda3ff069e2011-11-30 00:25:06 +0200944 self.assertRaises(ValueError, f.seek, 0, 3)
945 self.assertRaises(ValueError, f.seek, 9, ())
946 self.assertRaises(TypeError, f.seek, None)
947 self.assertRaises(TypeError, f.seek, b"derp")
948
949 def test_tell(self):
Nadeem Vawda33c34da2012-06-04 23:34:07 +0200950 with LZMAFile(BytesIO(COMPRESSED_XZ)) as f:
Nadeem Vawda3ff069e2011-11-30 00:25:06 +0200951 pos = 0
952 while True:
953 self.assertEqual(f.tell(), pos)
954 result = f.read(183)
955 if not result:
956 break
957 pos += len(result)
958 self.assertEqual(f.tell(), len(INPUT))
Nadeem Vawda33c34da2012-06-04 23:34:07 +0200959 with LZMAFile(BytesIO(), "w") as f:
Nadeem Vawda3ff069e2011-11-30 00:25:06 +0200960 for pos in range(0, len(INPUT), 144):
961 self.assertEqual(f.tell(), pos)
962 f.write(INPUT[pos:pos+144])
963 self.assertEqual(f.tell(), len(INPUT))
964
965 def test_tell_bad_args(self):
Nadeem Vawda33c34da2012-06-04 23:34:07 +0200966 f = LZMAFile(BytesIO(COMPRESSED_XZ))
Nadeem Vawda3ff069e2011-11-30 00:25:06 +0200967 f.close()
968 self.assertRaises(ValueError, f.tell)
969
970
Nadeem Vawdae8604042012-06-04 23:38:12 +0200971class OpenTestCase(unittest.TestCase):
972
973 def test_binary_modes(self):
974 with lzma.open(BytesIO(COMPRESSED_XZ), "rb") as f:
975 self.assertEqual(f.read(), INPUT)
976 with BytesIO() as bio:
977 with lzma.open(bio, "wb") as f:
978 f.write(INPUT)
979 file_data = lzma.decompress(bio.getvalue())
980 self.assertEqual(file_data, INPUT)
981 with lzma.open(bio, "ab") as f:
982 f.write(INPUT)
983 file_data = lzma.decompress(bio.getvalue())
984 self.assertEqual(file_data, INPUT * 2)
985
986 def test_text_modes(self):
987 uncompressed = INPUT.decode("ascii")
988 uncompressed_raw = uncompressed.replace("\n", os.linesep)
989 with lzma.open(BytesIO(COMPRESSED_XZ), "rt") as f:
990 self.assertEqual(f.read(), uncompressed)
991 with BytesIO() as bio:
992 with lzma.open(bio, "wt") as f:
993 f.write(uncompressed)
994 file_data = lzma.decompress(bio.getvalue()).decode("ascii")
995 self.assertEqual(file_data, uncompressed_raw)
996 with lzma.open(bio, "at") as f:
997 f.write(uncompressed)
998 file_data = lzma.decompress(bio.getvalue()).decode("ascii")
999 self.assertEqual(file_data, uncompressed_raw * 2)
1000
1001 def test_filename(self):
1002 with TempFile(TESTFN):
1003 with lzma.open(TESTFN, "wb") as f:
1004 f.write(INPUT)
1005 with open(TESTFN, "rb") as f:
1006 file_data = lzma.decompress(f.read())
1007 self.assertEqual(file_data, INPUT)
1008 with lzma.open(TESTFN, "rb") as f:
1009 self.assertEqual(f.read(), INPUT)
1010 with lzma.open(TESTFN, "ab") as f:
1011 f.write(INPUT)
1012 with lzma.open(TESTFN, "rb") as f:
1013 self.assertEqual(f.read(), INPUT * 2)
1014
1015 def test_bad_params(self):
1016 # Test invalid parameter combinations.
1017 with self.assertRaises(ValueError):
1018 lzma.open(TESTFN, "")
1019 with self.assertRaises(ValueError):
1020 lzma.open(TESTFN, "x")
1021 with self.assertRaises(ValueError):
1022 lzma.open(TESTFN, "rbt")
1023 with self.assertRaises(ValueError):
1024 lzma.open(TESTFN, "rb", encoding="utf-8")
1025 with self.assertRaises(ValueError):
1026 lzma.open(TESTFN, "rb", errors="ignore")
1027 with self.assertRaises(ValueError):
1028 lzma.open(TESTFN, "rb", newline="\n")
1029
1030 def test_format_and_filters(self):
1031 # Test non-default format and filter chain.
1032 options = {"format": lzma.FORMAT_RAW, "filters": FILTERS_RAW_1}
1033 with lzma.open(BytesIO(COMPRESSED_RAW_1), "rb", **options) as f:
1034 self.assertEqual(f.read(), INPUT)
1035 with BytesIO() as bio:
1036 with lzma.open(bio, "wb", **options) as f:
1037 f.write(INPUT)
1038 file_data = lzma.decompress(bio.getvalue(), **options)
1039 self.assertEqual(file_data, INPUT)
1040
1041 def test_encoding(self):
1042 # Test non-default encoding.
1043 uncompressed = INPUT.decode("ascii")
1044 uncompressed_raw = uncompressed.replace("\n", os.linesep)
1045 with BytesIO() as bio:
1046 with lzma.open(bio, "wt", encoding="utf-16-le") as f:
1047 f.write(uncompressed)
1048 file_data = lzma.decompress(bio.getvalue()).decode("utf-16-le")
1049 self.assertEqual(file_data, uncompressed_raw)
1050 bio.seek(0)
1051 with lzma.open(bio, "rt", encoding="utf-16-le") as f:
1052 self.assertEqual(f.read(), uncompressed)
1053
1054 def test_encoding_error_handler(self):
1055 # Test wih non-default encoding error handler.
1056 with BytesIO(lzma.compress(b"foo\xffbar")) as bio:
1057 with lzma.open(bio, "rt", encoding="ascii", errors="ignore") as f:
1058 self.assertEqual(f.read(), "foobar")
1059
1060 def test_newline(self):
1061 # Test with explicit newline (universal newline mode disabled).
1062 text = INPUT.decode("ascii")
1063 with BytesIO() as bio:
1064 with lzma.open(bio, "wt", newline="\n") as f:
1065 f.write(text)
1066 bio.seek(0)
1067 with lzma.open(bio, "rt", newline="\r") as f:
1068 self.assertEqual(f.readlines(), [text])
1069
1070
Nadeem Vawda3ff069e2011-11-30 00:25:06 +02001071class MiscellaneousTestCase(unittest.TestCase):
1072
1073 def test_is_check_supported(self):
1074 # CHECK_NONE and CHECK_CRC32 should always be supported,
1075 # regardless of the options liblzma was compiled with.
Nadeem Vawdabc459bb2012-05-06 23:01:51 +02001076 self.assertTrue(lzma.is_check_supported(lzma.CHECK_NONE))
1077 self.assertTrue(lzma.is_check_supported(lzma.CHECK_CRC32))
Nadeem Vawda3ff069e2011-11-30 00:25:06 +02001078
1079 # The .xz format spec cannot store check IDs above this value.
Nadeem Vawdabc459bb2012-05-06 23:01:51 +02001080 self.assertFalse(lzma.is_check_supported(lzma.CHECK_ID_MAX + 1))
Nadeem Vawda3ff069e2011-11-30 00:25:06 +02001081
1082 # This value should not be a valid check ID.
Nadeem Vawdabc459bb2012-05-06 23:01:51 +02001083 self.assertFalse(lzma.is_check_supported(lzma.CHECK_UNKNOWN))
Nadeem Vawda3ff069e2011-11-30 00:25:06 +02001084
Nadeem Vawdaa425c3d2012-06-21 23:36:48 +02001085 def test__encode_filter_properties(self):
Nadeem Vawdaf55b3292012-05-06 23:01:27 +02001086 with self.assertRaises(TypeError):
Nadeem Vawdaa425c3d2012-06-21 23:36:48 +02001087 lzma._encode_filter_properties(b"not a dict")
Nadeem Vawdaf55b3292012-05-06 23:01:27 +02001088 with self.assertRaises(ValueError):
Nadeem Vawdaa425c3d2012-06-21 23:36:48 +02001089 lzma._encode_filter_properties({"id": 0x100})
Nadeem Vawdaf55b3292012-05-06 23:01:27 +02001090 with self.assertRaises(ValueError):
Nadeem Vawdaa425c3d2012-06-21 23:36:48 +02001091 lzma._encode_filter_properties({"id": lzma.FILTER_LZMA2, "junk": 12})
Nadeem Vawdaf55b3292012-05-06 23:01:27 +02001092 with self.assertRaises(lzma.LZMAError):
Nadeem Vawdaa425c3d2012-06-21 23:36:48 +02001093 lzma._encode_filter_properties({"id": lzma.FILTER_DELTA,
Nadeem Vawdaf55b3292012-05-06 23:01:27 +02001094 "dist": 9001})
1095
1096 # Test with parameters used by zipfile module.
Nadeem Vawdaa425c3d2012-06-21 23:36:48 +02001097 props = lzma._encode_filter_properties({
Nadeem Vawdaf55b3292012-05-06 23:01:27 +02001098 "id": lzma.FILTER_LZMA1,
1099 "pb": 2,
1100 "lp": 0,
1101 "lc": 3,
1102 "dict_size": 8 << 20,
1103 })
1104 self.assertEqual(props, b"]\x00\x00\x80\x00")
1105
Nadeem Vawdaa425c3d2012-06-21 23:36:48 +02001106 def test__decode_filter_properties(self):
Nadeem Vawdaf55b3292012-05-06 23:01:27 +02001107 with self.assertRaises(TypeError):
Nadeem Vawdaa425c3d2012-06-21 23:36:48 +02001108 lzma._decode_filter_properties(lzma.FILTER_X86, {"should be": bytes})
Nadeem Vawdaf55b3292012-05-06 23:01:27 +02001109 with self.assertRaises(lzma.LZMAError):
Nadeem Vawdaa425c3d2012-06-21 23:36:48 +02001110 lzma._decode_filter_properties(lzma.FILTER_DELTA, b"too long")
Nadeem Vawdaf55b3292012-05-06 23:01:27 +02001111
1112 # Test with parameters used by zipfile module.
Nadeem Vawdaa425c3d2012-06-21 23:36:48 +02001113 filterspec = lzma._decode_filter_properties(
Nadeem Vawdaf55b3292012-05-06 23:01:27 +02001114 lzma.FILTER_LZMA1, b"]\x00\x00\x80\x00")
1115 self.assertEqual(filterspec["id"], lzma.FILTER_LZMA1)
1116 self.assertEqual(filterspec["pb"], 2)
1117 self.assertEqual(filterspec["lp"], 0)
1118 self.assertEqual(filterspec["lc"], 3)
1119 self.assertEqual(filterspec["dict_size"], 8 << 20)
1120
1121 def test_filter_properties_roundtrip(self):
Nadeem Vawdaa425c3d2012-06-21 23:36:48 +02001122 spec1 = lzma._decode_filter_properties(
Nadeem Vawdaf55b3292012-05-06 23:01:27 +02001123 lzma.FILTER_LZMA1, b"]\x00\x00\x80\x00")
Nadeem Vawdaa425c3d2012-06-21 23:36:48 +02001124 reencoded = lzma._encode_filter_properties(spec1)
1125 spec2 = lzma._decode_filter_properties(lzma.FILTER_LZMA1, reencoded)
Nadeem Vawdaf55b3292012-05-06 23:01:27 +02001126 self.assertEqual(spec1, spec2)
1127
Nadeem Vawda3ff069e2011-11-30 00:25:06 +02001128
1129# Test data:
1130
1131INPUT = b"""
1132LAERTES
1133
1134 O, fear me not.
1135 I stay too long: but here my father comes.
1136
1137 Enter POLONIUS
1138
1139 A double blessing is a double grace,
1140 Occasion smiles upon a second leave.
1141
1142LORD POLONIUS
1143
1144 Yet here, Laertes! aboard, aboard, for shame!
1145 The wind sits in the shoulder of your sail,
1146 And you are stay'd for. There; my blessing with thee!
1147 And these few precepts in thy memory
1148 See thou character. Give thy thoughts no tongue,
1149 Nor any unproportioned thought his act.
1150 Be thou familiar, but by no means vulgar.
1151 Those friends thou hast, and their adoption tried,
1152 Grapple them to thy soul with hoops of steel;
1153 But do not dull thy palm with entertainment
1154 Of each new-hatch'd, unfledged comrade. Beware
1155 Of entrance to a quarrel, but being in,
1156 Bear't that the opposed may beware of thee.
1157 Give every man thy ear, but few thy voice;
1158 Take each man's censure, but reserve thy judgment.
1159 Costly thy habit as thy purse can buy,
1160 But not express'd in fancy; rich, not gaudy;
1161 For the apparel oft proclaims the man,
1162 And they in France of the best rank and station
1163 Are of a most select and generous chief in that.
1164 Neither a borrower nor a lender be;
1165 For loan oft loses both itself and friend,
1166 And borrowing dulls the edge of husbandry.
1167 This above all: to thine ownself be true,
1168 And it must follow, as the night the day,
1169 Thou canst not then be false to any man.
1170 Farewell: my blessing season this in thee!
1171
1172LAERTES
1173
1174 Most humbly do I take my leave, my lord.
1175
1176LORD POLONIUS
1177
1178 The time invites you; go; your servants tend.
1179
1180LAERTES
1181
1182 Farewell, Ophelia; and remember well
1183 What I have said to you.
1184
1185OPHELIA
1186
1187 'Tis in my memory lock'd,
1188 And you yourself shall keep the key of it.
1189
1190LAERTES
1191
1192 Farewell.
1193"""
1194
1195COMPRESSED_XZ = (
1196 b"\xfd7zXZ\x00\x00\x04\xe6\xd6\xb4F\x02\x00!\x01\x16\x00\x00\x00t/\xe5\xa3"
1197 b"\xe0\x07\x80\x03\xdf]\x00\x05\x14\x07bX\x19\xcd\xddn\x98\x15\xe4\xb4\x9d"
1198 b"o\x1d\xc4\xe5\n\x03\xcc2h\xc7\\\x86\xff\xf8\xe2\xfc\xe7\xd9\xfe6\xb8("
1199 b"\xa8wd\xc2\"u.n\x1e\xc3\xf2\x8e\x8d\x8f\x02\x17/\xa6=\xf0\xa2\xdf/M\x89"
1200 b"\xbe\xde\xa7\x1cz\x18-]\xd5\xef\x13\x8frZ\x15\x80\x8c\xf8\x8do\xfa\x12"
1201 b"\x9b#z/\xef\xf0\xfaF\x01\x82\xa3M\x8e\xa1t\xca6 BF$\xe5Q\xa4\x98\xee\xde"
1202 b"l\xe8\x7f\xf0\x9d,bn\x0b\x13\xd4\xa8\x81\xe4N\xc8\x86\x153\xf5x2\xa2O"
1203 b"\x13@Q\xa1\x00/\xa5\xd0O\x97\xdco\xae\xf7z\xc4\xcdS\xb6t<\x16\xf2\x9cI#"
1204 b"\x89ud\xc66Y\xd9\xee\xe6\xce\x12]\xe5\xf0\xaa\x96-Pe\xade:\x04\t\x1b\xf7"
1205 b"\xdb7\n\x86\x1fp\xc8J\xba\xf4\xf0V\xa9\xdc\xf0\x02%G\xf9\xdf=?\x15\x1b"
1206 b"\xe1(\xce\x82=\xd6I\xac3\x12\x0cR\xb7\xae\r\xb1i\x03\x95\x01\xbd\xbe\xfa"
1207 b"\x02s\x01P\x9d\x96X\xb12j\xc8L\xa8\x84b\xf6\xc3\xd4c-H\x93oJl\xd0iQ\xe4k"
1208 b"\x84\x0b\xc1\xb7\xbc\xb1\x17\x88\xb1\xca?@\xf6\x07\xea\xe6x\xf1H12P\x0f"
1209 b"\x8a\xc9\xeauw\xe3\xbe\xaai\xa9W\xd0\x80\xcd#cb5\x99\xd8]\xa9d\x0c\xbd"
1210 b"\xa2\xdcWl\xedUG\xbf\x89yF\xf77\x81v\xbd5\x98\xbeh8\x18W\x08\xf0\x1b\x99"
1211 b"5:\x1a?rD\x96\xa1\x04\x0f\xae\xba\x85\xeb\x9d5@\xf5\x83\xd37\x83\x8ac"
1212 b"\x06\xd4\x97i\xcdt\x16S\x82k\xf6K\x01vy\x88\x91\x9b6T\xdae\r\xfd]:k\xbal"
1213 b"\xa9\xbba\xc34\xf9r\xeb}r\xdb\xc7\xdb*\x8f\x03z\xdc8h\xcc\xc9\xd3\xbcl"
1214 b"\xa5-\xcb\xeaK\xa2\xc5\x15\xc0\xe3\xc1\x86Z\xfb\xebL\xe13\xcf\x9c\xe3"
1215 b"\x1d\xc9\xed\xc2\x06\xcc\xce!\x92\xe5\xfe\x9c^\xa59w \x9bP\xa3PK\x08d"
1216 b"\xf9\xe2Z}\xa7\xbf\xed\xeb%$\x0c\x82\xb8/\xb0\x01\xa9&,\xf7qh{Q\x96)\xf2"
1217 b"q\x96\xc3\x80\xb4\x12\xb0\xba\xe6o\xf4!\xb4[\xd4\x8aw\x10\xf7t\x0c\xb3"
1218 b"\xd9\xd5\xc3`^\x81\x11??\\\xa4\x99\x85R\xd4\x8e\x83\xc9\x1eX\xbfa\xf1"
1219 b"\xac\xb0\xea\xea\xd7\xd0\xab\x18\xe2\xf2\xed\xe1\xb7\xc9\x18\xcbS\xe4>"
1220 b"\xc9\x95H\xe8\xcb\t\r%\xeb\xc7$.o\xf1\xf3R\x17\x1db\xbb\xd8U\xa5^\xccS"
1221 b"\x16\x01\x87\xf3/\x93\xd1\xf0v\xc0r\xd7\xcc\xa2Gkz\xca\x80\x0e\xfd\xd0"
1222 b"\x8b\xbb\xd2Ix\xb3\x1ey\xca-0\xe3z^\xd6\xd6\x8f_\xf1\x9dP\x9fi\xa7\xd1"
1223 b"\xe8\x90\x84\xdc\xbf\xcdky\x8e\xdc\x81\x7f\xa3\xb2+\xbf\x04\xef\xd8\\"
1224 b"\xc4\xdf\xe1\xb0\x01\xe9\x93\xe3Y\xf1\x1dY\xe8h\x81\xcf\xf1w\xcc\xb4\xef"
1225 b" \x8b|\x04\xea\x83ej\xbe\x1f\xd4z\x9c`\xd3\x1a\x92A\x06\xe5\x8f\xa9\x13"
1226 b"\t\x9e=\xfa\x1c\xe5_\x9f%v\x1bo\x11ZO\xd8\xf4\t\xddM\x16-\x04\xfc\x18<\""
1227 b"CM\xddg~b\xf6\xef\x8e\x0c\xd0\xde|\xa0'\x8a\x0c\xd6x\xae!J\xa6F\x88\x15u"
1228 b"\x008\x17\xbc7y\xb3\xd8u\xac_\x85\x8d\xe7\xc1@\x9c\xecqc\xa3#\xad\xf1"
1229 b"\x935\xb5)_\r\xec3]\x0fo]5\xd0my\x07\x9b\xee\x81\xb5\x0f\xcfK+\x00\xc0"
1230 b"\xe4b\x10\xe4\x0c\x1a \x9b\xe0\x97t\xf6\xa1\x9e\x850\xba\x0c\x9a\x8d\xc8"
1231 b"\x8f\x07\xd7\xae\xc8\xf9+i\xdc\xb9k\xb0>f\x19\xb8\r\xa8\xf8\x1f$\xa5{p"
1232 b"\xc6\x880\xce\xdb\xcf\xca_\x86\xac\x88h6\x8bZ%'\xd0\n\xbf\x0f\x9c\"\xba"
1233 b"\xe5\x86\x9f\x0f7X=mNX[\xcc\x19FU\xc9\x860\xbc\x90a+* \xae_$\x03\x1e\xd3"
1234 b"\xcd_\xa0\x9c\xde\xaf46q\xa5\xc9\x92\xd7\xca\xe3`\x9d\x85}\xb4\xff\xb3"
1235 b"\x83\xfb\xb6\xca\xae`\x0bw\x7f\xfc\xd8\xacVe\x19\xc8\x17\x0bZ\xad\x88"
1236 b"\xeb#\x97\x03\x13\xb1d\x0f{\x0c\x04w\x07\r\x97\xbd\xd6\xc1\xc3B:\x95\x08"
1237 b"^\x10V\xaeaH\x02\xd9\xe3\n\\\x01X\xf6\x9c\x8a\x06u#%\xbe*\xa1\x18v\x85"
1238 b"\xec!\t4\x00\x00\x00\x00Vj?uLU\xf3\xa6\x00\x01\xfb\x07\x81\x0f\x00\x00tw"
1239 b"\x99P\xb1\xc4g\xfb\x02\x00\x00\x00\x00\x04YZ"
1240)
1241
1242COMPRESSED_ALONE = (
1243 b"]\x00\x00\x80\x00\xff\xff\xff\xff\xff\xff\xff\xff\x00\x05\x14\x07bX\x19"
1244 b"\xcd\xddn\x98\x15\xe4\xb4\x9do\x1d\xc4\xe5\n\x03\xcc2h\xc7\\\x86\xff\xf8"
1245 b"\xe2\xfc\xe7\xd9\xfe6\xb8(\xa8wd\xc2\"u.n\x1e\xc3\xf2\x8e\x8d\x8f\x02"
1246 b"\x17/\xa6=\xf0\xa2\xdf/M\x89\xbe\xde\xa7\x1cz\x18-]\xd5\xef\x13\x8frZ"
1247 b"\x15\x80\x8c\xf8\x8do\xfa\x12\x9b#z/\xef\xf0\xfaF\x01\x82\xa3M\x8e\xa1t"
1248 b"\xca6 BF$\xe5Q\xa4\x98\xee\xdel\xe8\x7f\xf0\x9d,bn\x0b\x13\xd4\xa8\x81"
1249 b"\xe4N\xc8\x86\x153\xf5x2\xa2O\x13@Q\xa1\x00/\xa5\xd0O\x97\xdco\xae\xf7z"
1250 b"\xc4\xcdS\xb6t<\x16\xf2\x9cI#\x89ud\xc66Y\xd9\xee\xe6\xce\x12]\xe5\xf0"
1251 b"\xaa\x96-Pe\xade:\x04\t\x1b\xf7\xdb7\n\x86\x1fp\xc8J\xba\xf4\xf0V\xa9"
1252 b"\xdc\xf0\x02%G\xf9\xdf=?\x15\x1b\xe1(\xce\x82=\xd6I\xac3\x12\x0cR\xb7"
1253 b"\xae\r\xb1i\x03\x95\x01\xbd\xbe\xfa\x02s\x01P\x9d\x96X\xb12j\xc8L\xa8"
1254 b"\x84b\xf8\x1epl\xeajr\xd1=\t\x03\xdd\x13\x1b3!E\xf9vV\xdaF\xf3\xd7\xb4"
1255 b"\x0c\xa9P~\xec\xdeE\xe37\xf6\x1d\xc6\xbb\xddc%\xb6\x0fI\x07\xf0;\xaf\xe7"
1256 b"\xa0\x8b\xa7Z\x99(\xe9\xe2\xf0o\x18>`\xe1\xaa\xa8\xd9\xa1\xb2}\xe7\x8d"
1257 b"\x834T\xb6\xef\xc1\xde\xe3\x98\xbcD\x03MA@\xd8\xed\xdc\xc8\x93\x03\x1a"
1258 b"\x93\x0b\x7f\x94\x12\x0b\x02Sa\x18\xc9\xc5\x9bTJE}\xf6\xc8g\x17#ZV\x01"
1259 b"\xc9\x9dc\x83\x0e>0\x16\x90S\xb8/\x03y_\x18\xfa(\xd7\x0br\xa2\xb0\xba?"
1260 b"\x8c\xe6\x83@\x84\xdf\x02:\xc5z\x9e\xa6\x84\xc9\xf5BeyX\x83\x1a\xf1 :\t"
1261 b"\xf7\x19\xfexD\\&G\xf3\x85Y\xa2J\xf9\x0bv{\x89\xf6\xe7)A\xaf\x04o\x00"
1262 b"\x075\xd3\xe0\x7f\x97\x98F\x0f?v\x93\xedVtTf\xb5\x97\x83\xed\x19\xd7\x1a"
1263 b"'k\xd7\xd9\xc5\\Y\xd1\xdc\x07\x15|w\xbc\xacd\x87\x08d\xec\xa7\xf6\x82"
1264 b"\xfc\xb3\x93\xeb\xb9 \x8d\xbc ,\xb3X\xb0\xd2s\xd7\xd1\xffv\x05\xdf}\xa2"
1265 b"\x96\xfb%\n\xdf\xa2\x7f\x08.\xa16\n\xe0\x19\x93\x7fh\n\x1c\x8c\x0f \x11"
1266 b"\xc6Bl\x95\x19U}\xe4s\xb5\x10H\xea\x86pB\xe88\x95\xbe\x8cZ\xdb\xe4\x94A"
1267 b"\x92\xb9;z\xaa\xa7{\x1c5!\xc0\xaf\xc1A\xf9\xda\xf0$\xb0\x02qg\xc8\xc7/|"
1268 b"\xafr\x99^\x91\x88\xbf\x03\xd9=\xd7n\xda6{>8\n\xc7:\xa9'\xba.\x0b\xe2"
1269 b"\xb5\x1d\x0e\n\x9a\x8e\x06\x8f:\xdd\x82'[\xc3\"wD$\xa7w\xecq\x8c,1\x93"
1270 b"\xd0,\xae2w\x93\x12$Jd\x19mg\x02\x93\x9cA\x95\x9d&\xca8i\x9c\xb0;\xe7NQ"
1271 b"\x1frh\x8beL;\xb0m\xee\x07Q\x9b\xc6\xd8\x03\xb5\xdeN\xd4\xfe\x98\xd0\xdc"
1272 b"\x1a[\x04\xde\x1a\xf6\x91j\xf8EOli\x8eB^\x1d\x82\x07\xb2\xb5R]\xb7\xd7"
1273 b"\xe9\xa6\xc3.\xfb\xf0-\xb4e\x9b\xde\x03\x88\xc6\xc1iN\x0e\x84wbQ\xdf~"
1274 b"\xe9\xa4\x884\x96kM\xbc)T\xf3\x89\x97\x0f\x143\xe7)\xa0\xb3B\x00\xa8\xaf"
1275 b"\x82^\xcb\xc7..\xdb\xc7\t\x9dH\xee5\xe9#\xe6NV\x94\xcb$Kk\xe3\x7f\r\xe3t"
1276 b"\x12\xcf'\xefR\x8b\xf42\xcf-LH\xac\xe5\x1f0~?SO\xeb\xc1E\x1a\x1c]\xf2"
1277 b"\xc4<\x11\x02\x10Z0a*?\xe4r\xff\xfb\xff\xf6\x14nG\xead^\xd6\xef8\xb6uEI"
1278 b"\x99\nV\xe2\xb3\x95\x8e\x83\xf6i!\xb5&1F\xb1DP\xf4 SO3D!w\x99_G\x7f+\x90"
1279 b".\xab\xbb]\x91>\xc9#h;\x0f5J\x91K\xf4^-[\x9e\x8a\\\x94\xca\xaf\xf6\x19"
1280 b"\xd4\xa1\x9b\xc4\xb8p\xa1\xae\x15\xe9r\x84\xe0\xcar.l []\x8b\xaf+0\xf2g"
1281 b"\x01aKY\xdfI\xcf,\n\xe8\xf0\xe7V\x80_#\xb2\xf2\xa9\x06\x8c>w\xe2W,\xf4"
1282 b"\x8c\r\xf963\xf5J\xcc2\x05=kT\xeaUti\xe5_\xce\x1b\xfa\x8dl\x02h\xef\xa8"
1283 b"\xfbf\x7f\xff\xf0\x19\xeax"
1284)
1285
1286FILTERS_RAW_1 = [{"id": lzma.FILTER_LZMA2, "preset": 3}]
1287COMPRESSED_RAW_1 = (
1288 b"\xe0\x07\x80\x03\xfd]\x00\x05\x14\x07bX\x19\xcd\xddn\x96cyq\xa1\xdd\xee"
1289 b"\xf8\xfam\xe3'\x88\xd3\xff\xe4\x9e \xceQ\x91\xa4\x14I\xf6\xb9\x9dVL8\x15"
1290 b"_\x0e\x12\xc3\xeb\xbc\xa5\xcd\nW\x1d$=R;\x1d\xf8k8\t\xb1{\xd4\xc5+\x9d"
1291 b"\x87c\xe5\xef\x98\xb4\xd7S3\xcd\xcc\xd2\xed\xa4\x0em\xe5\xf4\xdd\xd0b"
1292 b"\xbe4*\xaa\x0b\xc5\x08\x10\x85+\x81.\x17\xaf9\xc9b\xeaZrA\xe20\x7fs\"r"
1293 b"\xdaG\x81\xde\x90cu\xa5\xdb\xa9.A\x08l\xb0<\xf6\x03\xddOi\xd0\xc5\xb4"
1294 b"\xec\xecg4t6\"\xa6\xb8o\xb5?\x18^}\xb6}\x03[:\xeb\x03\xa9\n[\x89l\x19g"
1295 b"\x16\xc82\xed\x0b\xfb\x86n\xa2\x857@\x93\xcd6T\xc3u\xb0\t\xf9\x1b\x918"
1296 b"\xfc[\x1b\x1e4\xb3\x14\x06PCV\xa8\"\xf5\x81x~\xe9\xb5N\x9cK\x9f\xc6\xc3%"
1297 b"\xc8k:{6\xe7\xf7\xbd\x05\x02\xb4\xc4\xc3\xd3\xfd\xc3\xa8\\\xfc@\xb1F_"
1298 b"\xc8\x90\xd9sU\x98\xad8\x05\x07\xde7J\x8bM\xd0\xb3;X\xec\x87\xef\xae\xb3"
1299 b"eO,\xb1z,d\x11y\xeejlB\x02\x1d\xf28\x1f#\x896\xce\x0b\xf0\xf5\xa9PK\x0f"
1300 b"\xb3\x13P\xd8\x88\xd2\xa1\x08\x04C?\xdb\x94_\x9a\"\xe9\xe3e\x1d\xde\x9b"
1301 b"\xa1\xe8>H\x98\x10;\xc5\x03#\xb5\x9d4\x01\xe7\xc5\xba%v\xa49\x97A\xe0\""
1302 b"\x8c\xc22\xe3i\xc1\x9d\xab3\xdf\xbe\xfdDm7\x1b\x9d\xab\xb5\x15o:J\x92"
1303 b"\xdb\x816\x17\xc2O\x99\x1b\x0e\x8d\xf3\tQ\xed\x8e\x95S/\x16M\xb2S\x04"
1304 b"\x0f\xc3J\xc6\xc7\xe4\xcb\xc5\xf4\xe7d\x14\xe4=^B\xfb\xd3E\xd3\x1e\xcd"
1305 b"\x91\xa5\xd0G\x8f.\xf6\xf9\x0bb&\xd9\x9f\xc2\xfdj\xa2\x9e\xc4\\\x0e\x1dC"
1306 b"v\xe8\xd2\x8a?^H\xec\xae\xeb>\xfe\xb8\xab\xd4IqY\x8c\xd4K7\x11\xf4D\xd0W"
1307 b"\xa5\xbe\xeaO\xbf\xd0\x04\xfdl\x10\xae5\xd4U\x19\x06\xf9{\xaa\xe0\x81"
1308 b"\x0f\xcf\xa3k{\x95\xbd\x19\xa2\xf8\xe4\xa3\x08O*\xf1\xf1B-\xc7(\x0eR\xfd"
1309 b"@E\x9f\xd3\x1e:\xfdV\xb7\x04Y\x94\xeb]\x83\xc4\xa5\xd7\xc0gX\x98\xcf\x0f"
1310 b"\xcd3\x00]n\x17\xec\xbd\xa3Y\x86\xc5\xf3u\xf6*\xbdT\xedA$A\xd9A\xe7\x98"
1311 b"\xef\x14\x02\x9a\xfdiw\xec\xa0\x87\x11\xd9%\xc5\xeb\x8a=\xae\xc0\xc4\xc6"
1312 b"D\x80\x8f\xa8\xd1\xbbq\xb2\xc0\xa0\xf5Cqp\xeeL\xe3\xe5\xdc \x84\"\xe9"
1313 b"\x80t\x83\x05\xba\xf1\xc5~\x93\xc9\xf0\x01c\xceix\x9d\xed\xc5)l\x16)\xd1"
1314 b"\x03@l\x04\x7f\x87\xa5yn\x1b\x01D\xaa:\xd2\x96\xb4\xb3?\xb0\xf9\xce\x07"
1315 b"\xeb\x81\x00\xe4\xc3\xf5%_\xae\xd4\xf9\xeb\xe2\rh\xb2#\xd67Q\x16D\x82hn"
1316 b"\xd1\xa3_?q\xf0\xe2\xac\xf317\x9e\xd0_\x83|\xf1\xca\xb7\x95S\xabW\x12"
1317 b"\xff\xddt\xf69L\x01\xf2|\xdaW\xda\xees\x98L\x18\xb8_\xe8$\x82\xea\xd6"
1318 b"\xd1F\xd4\x0b\xcdk\x01vf\x88h\xc3\xae\xb91\xc7Q\x9f\xa5G\xd9\xcc\x1f\xe3"
1319 b"5\xb1\xdcy\x7fI\x8bcw\x8e\x10rIp\x02:\x19p_\xc8v\xcea\"\xc1\xd9\x91\x03"
1320 b"\xbfe\xbe\xa6\xb3\xa8\x14\x18\xc3\xabH*m}\xc2\xc1\x9a}>l%\xce\x84\x99"
1321 b"\xb3d\xaf\xd3\x82\x15\xdf\xc1\xfc5fOg\x9b\xfc\x8e^&\t@\xce\x9f\x06J\xb8"
1322 b"\xb5\x86\x1d\xda{\x9f\xae\xb0\xff\x02\x81r\x92z\x8cM\xb7ho\xc9^\x9c\xb6"
1323 b"\x9c\xae\xd1\xc9\xf4\xdfU7\xd6\\!\xea\x0b\x94k\xb9Ud~\x98\xe7\x86\x8az"
1324 b"\x10;\xe3\x1d\xe5PG\xf8\xa4\x12\x05w\x98^\xc4\xb1\xbb\xfb\xcf\xe0\x7f"
1325 b"\x033Sf\x0c \xb1\xf6@\x94\xe5\xa3\xb2\xa7\x10\x9a\xc0\x14\xc3s\xb5xRD"
1326 b"\xf4`W\xd9\xe5\xd3\xcf\x91\rTZ-X\xbe\xbf\xb5\xe2\xee|\x1a\xbf\xfb\x08"
1327 b"\x91\xe1\xfc\x9a\x18\xa3\x8b\xd6^\x89\xf5[\xef\x87\xd1\x06\x1c7\xd6\xa2"
1328 b"\t\tQ5/@S\xc05\xd2VhAK\x03VC\r\x9b\x93\xd6M\xf1xO\xaaO\xed\xb9<\x0c\xdae"
1329 b"*\xd0\x07Hk6\x9fG+\xa1)\xcd\x9cl\x87\xdb\xe1\xe7\xefK}\x875\xab\xa0\x19u"
1330 b"\xf6*F\xb32\x00\x00\x00"
1331)
1332
1333FILTERS_RAW_2 = [{"id": lzma.FILTER_DELTA, "dist": 2},
1334 {"id": lzma.FILTER_LZMA2,
1335 "preset": lzma.PRESET_DEFAULT | lzma.PRESET_EXTREME}]
1336COMPRESSED_RAW_2 = (
1337 b"\xe0\x07\x80\x05\x91]\x00\x05\x14\x06-\xd4\xa8d?\xef\xbe\xafH\xee\x042"
1338 b"\xcb.\xb5g\x8f\xfb\x14\xab\xa5\x9f\x025z\xa4\xdd\xd8\t[}W\xf8\x0c\x1dmH"
1339 b"\xfa\x05\xfcg\xba\xe5\x01Q\x0b\x83R\xb6A\x885\xc0\xba\xee\n\x1cv~\xde:o"
1340 b"\x06:J\xa7\x11Cc\xea\xf7\xe5*o\xf7\x83\\l\xbdE\x19\x1f\r\xa8\x10\xb42"
1341 b"\x0caU{\xd7\xb8w\xdc\xbe\x1b\xfc8\xb4\xcc\xd38\\\xf6\x13\xf6\xe7\x98\xfa"
1342 b"\xc7[\x17_9\x86%\xa8\xf8\xaa\xb8\x8dfs#\x1e=\xed<\x92\x10\\t\xff\x86\xfb"
1343 b"=\x9e7\x18\x1dft\\\xb5\x01\x95Q\xc5\x19\xb38\xe0\xd4\xaa\x07\xc3\x7f\xd8"
1344 b"\xa2\x00>-\xd3\x8e\xa1#\xfa\x83ArAm\xdbJ~\x93\xa3B\x82\xe0\xc7\xcc(\x08`"
1345 b"WK\xad\x1b\x94kaj\x04 \xde\xfc\xe1\xed\xb0\x82\x91\xefS\x84%\x86\xfbi"
1346 b"\x99X\xf1B\xe7\x90;E\xfde\x98\xda\xca\xd6T\xb4bg\xa4\n\x9aj\xd1\x83\x9e]"
1347 b"\"\x7fM\xb5\x0fr\xd2\\\xa5j~P\x10GH\xbfN*Z\x10.\x81\tpE\x8a\x08\xbe1\xbd"
1348 b"\xcd\xa9\xe1\x8d\x1f\x04\xf9\x0eH\xb9\xae\xd6\xc3\xc1\xa5\xa9\x95P\xdc~"
1349 b"\xff\x01\x930\xa9\x04\xf6\x03\xfe\xb5JK\xc3]\xdd9\xb1\xd3\xd7F\xf5\xd1"
1350 b"\x1e\xa0\x1c_\xed[\x0c\xae\xd4\x8b\x946\xeb\xbf\xbb\xe3$kS{\xb5\x80,f:Sj"
1351 b"\x0f\x08z\x1c\xf5\xe8\xe6\xae\x98\xb0Q~r\x0f\xb0\x05?\xb6\x90\x19\x02&"
1352 b"\xcb\x80\t\xc4\xea\x9c|x\xce\x10\x9c\xc5|\xcbdhh+\x0c'\xc5\x81\xc33\xb5"
1353 b"\x14q\xd6\xc5\xe3`Z#\xdc\x8a\xab\xdd\xea\x08\xc2I\xe7\x02l{\xec\x196\x06"
1354 b"\x91\x8d\xdc\xd5\xb3x\xe1hz%\xd1\xf8\xa5\xdd\x98!\x8c\x1c\xc1\x17RUa\xbb"
1355 b"\x95\x0f\xe4X\xea1\x0c\xf1=R\xbe\xc60\xe3\xa4\x9a\x90bd\x97$]B\x01\xdd"
1356 b"\x1f\xe3h2c\x1e\xa0L`4\xc6x\xa3Z\x8a\r\x14]T^\xd8\x89\x1b\x92\r;\xedY"
1357 b"\x0c\xef\x8d9z\xf3o\xb6)f\xa9]$n\rp\x93\xd0\x10\xa4\x08\xb8\xb2\x8b\xb6"
1358 b"\x8f\x80\xae;\xdcQ\xf1\xfa\x9a\x06\x8e\xa5\x0e\x8cK\x9c @\xaa:UcX\n!\xc6"
1359 b"\x02\x12\xcb\x1b\"=\x16.\x1f\x176\xf2g=\xe1Wn\xe9\xe1\xd4\xf1O\xad\x15"
1360 b"\x86\xe9\xa3T\xaf\xa9\xd7D\xb5\xd1W3pnt\x11\xc7VOj\xb7M\xc4i\xa1\xf1$3"
1361 b"\xbb\xdc\x8af\xb0\xc5Y\r\xd1\xfb\xf2\xe7K\xe6\xc5hwO\xfe\x8c2^&\x07\xd5"
1362 b"\x1fV\x19\xfd\r\x14\xd2i=yZ\xe6o\xaf\xc6\xb6\x92\x9d\xc4\r\xb3\xafw\xac%"
1363 b"\xcfc\x1a\xf1`]\xf2\x1a\x9e\x808\xedm\xedQ\xb2\xfe\xe4h`[q\xae\xe0\x0f"
1364 b"\xba0g\xb6\"N\xc3\xfb\xcfR\x11\xc5\x18)(\xc40\\\xa3\x02\xd9G!\xce\x1b"
1365 b"\xc1\x96x\xb5\xc8z\x1f\x01\xb4\xaf\xde\xc2\xcd\x07\xe7H\xb3y\xa8M\n\\A\t"
1366 b"ar\xddM\x8b\x9a\xea\x84\x9b!\xf1\x8d\xb1\xf1~\x1e\r\xa5H\xba\xf1\x84o"
1367 b"\xda\x87\x01h\xe9\xa2\xbe\xbeqN\x9d\x84\x0b!WG\xda\xa1\xa5A\xb7\xc7`j"
1368 b"\x15\xf2\xe9\xdd?\x015B\xd2~E\x06\x11\xe0\x91!\x05^\x80\xdd\xa8y\x15}"
1369 b"\xa1)\xb1)\x81\x18\xf4\xf4\xf8\xc0\xefD\xe3\xdb2f\x1e\x12\xabu\xc9\x97"
1370 b"\xcd\x1e\xa7\x0c\x02x4_6\x03\xc4$t\xf39\x94\x1d=\xcb\xbfv\\\xf5\xa3\x1d"
1371 b"\x9d8jk\x95\x13)ff\xf9n\xc4\xa9\xe3\x01\xb8\xda\xfb\xab\xdfM\x99\xfb\x05"
1372 b"\xe0\xe9\xb0I\xf4E\xab\xe2\x15\xa3\x035\xe7\xdeT\xee\x82p\xb4\x88\xd3"
1373 b"\x893\x9c/\xc0\xd6\x8fou;\xf6\x95PR\xa9\xb2\xc1\xefFj\xe2\xa7$\xf7h\xf1"
1374 b"\xdfK(\xc9c\xba7\xe8\xe3)\xdd\xb2,\x83\xfb\x84\x18.y\x18Qi\x88\xf8`h-"
1375 b"\xef\xd5\xed\x8c\t\xd8\xc3^\x0f\x00\xb7\xd0[!\xafM\x9b\xd7.\x07\xd8\xfb"
1376 b"\xd9\xe2-S+\xaa8,\xa0\x03\x1b \xea\xa8\x00\xc3\xab~\xd0$e\xa5\x7f\xf7"
1377 b"\x95P]\x12\x19i\xd9\x7fo\x0c\xd8g^\rE\xa5\x80\x18\xc5\x01\x80\xaek`\xff~"
1378 b"\xb6y\xe7+\xe5\x11^D\xa7\x85\x18\"!\xd6\xd2\xa7\xf4\x1eT\xdb\x02\xe15"
1379 b"\x02Y\xbc\x174Z\xe7\x9cH\x1c\xbf\x0f\xc6\xe9f]\xcf\x8cx\xbc\xe5\x15\x94"
1380 b"\xfc3\xbc\xa7TUH\xf1\x84\x1b\xf7\xa9y\xc07\x84\xf8X\xd8\xef\xfc \x1c\xd8"
1381 b"( /\xf2\xb7\xec\xc1\\\x8c\xf6\x95\xa1\x03J\x83vP8\xe1\xe3\xbb~\xc24kA"
1382 b"\x98y\xa1\xf2P\xe9\x9d\xc9J\xf8N\x99\xb4\xceaO\xde\x16\x1e\xc2\x19\xa7"
1383 b"\x03\xd2\xe0\x8f:\x15\xf3\x84\x9e\xee\xe6e\xb8\x02q\xc7AC\x1emw\xfd\t"
1384 b"\x9a\x1eu\xc1\xa9\xcaCwUP\x00\xa5\xf78L4w!\x91L2 \x87\xd0\xf2\x06\x81j"
1385 b"\x80;\x03V\x06\x87\x92\xcb\x90lv@E\x8d\x8d\xa5\xa6\xe7Z[\xdf\xd6E\x03`>"
1386 b"\x8f\xde\xa1bZ\x84\xd0\xa9`\x05\x0e{\x80;\xe3\xbef\x8d\x1d\xebk1.\xe3"
1387 b"\xe9N\x15\xf7\xd4(\xfa\xbb\x15\xbdu\xf7\x7f\x86\xae!\x03L\x1d\xb5\xc1"
1388 b"\xb9\x11\xdb\xd0\x93\xe4\x02\xe1\xd2\xcbBjc_\xe8}d\xdb\xc3\xa0Y\xbe\xc9/"
1389 b"\x95\x01\xa3,\xe6bl@\x01\xdbp\xc2\xce\x14\x168\xc2q\xe3uH\x89X\xa4\xa9"
1390 b"\x19\x1d\xc1}\x7fOX\x19\x9f\xdd\xbe\x85\x83\xff\x96\x1ee\x82O`CF=K\xeb$I"
1391 b"\x17_\xefX\x8bJ'v\xde\x1f+\xd9.v\xf8Tv\x17\xf2\x9f5\x19\xe1\xb9\x91\xa8S"
1392 b"\x86\xbd\x1a\"(\xa5x\x8dC\x03X\x81\x91\xa8\x11\xc4pS\x13\xbc\xf2'J\xae!"
1393 b"\xef\xef\x84G\t\x8d\xc4\x10\x132\x00oS\x9e\xe0\xe4d\x8f\xb8y\xac\xa6\x9f"
1394 b",\xb8f\x87\r\xdf\x9eE\x0f\xe1\xd0\\L\x00\xb2\xe1h\x84\xef}\x98\xa8\x11"
1395 b"\xccW#\\\x83\x7fo\xbbz\x8f\x00"
1396)
1397
1398FILTERS_RAW_3 = [{"id": lzma.FILTER_IA64, "start_offset": 0x100},
1399 {"id": lzma.FILTER_LZMA2}]
1400COMPRESSED_RAW_3 = (
1401 b"\xe0\x07\x80\x03\xdf]\x00\x05\x14\x07bX\x19\xcd\xddn\x98\x15\xe4\xb4\x9d"
1402 b"o\x1d\xc4\xe5\n\x03\xcc2h\xc7\\\x86\xff\xf8\xe2\xfc\xe7\xd9\xfe6\xb8("
1403 b"\xa8wd\xc2\"u.n\x1e\xc3\xf2\x8e\x8d\x8f\x02\x17/\xa6=\xf0\xa2\xdf/M\x89"
1404 b"\xbe\xde\xa7\x1cz\x18-]\xd5\xef\x13\x8frZ\x15\x80\x8c\xf8\x8do\xfa\x12"
1405 b"\x9b#z/\xef\xf0\xfaF\x01\x82\xa3M\x8e\xa1t\xca6 BF$\xe5Q\xa4\x98\xee\xde"
1406 b"l\xe8\x7f\xf0\x9d,bn\x0b\x13\xd4\xa8\x81\xe4N\xc8\x86\x153\xf5x2\xa2O"
1407 b"\x13@Q\xa1\x00/\xa5\xd0O\x97\xdco\xae\xf7z\xc4\xcdS\xb6t<\x16\xf2\x9cI#"
1408 b"\x89ud\xc66Y\xd9\xee\xe6\xce\x12]\xe5\xf0\xaa\x96-Pe\xade:\x04\t\x1b\xf7"
1409 b"\xdb7\n\x86\x1fp\xc8J\xba\xf4\xf0V\xa9\xdc\xf0\x02%G\xf9\xdf=?\x15\x1b"
1410 b"\xe1(\xce\x82=\xd6I\xac3\x12\x0cR\xb7\xae\r\xb1i\x03\x95\x01\xbd\xbe\xfa"
1411 b"\x02s\x01P\x9d\x96X\xb12j\xc8L\xa8\x84b\xf6\xc3\xd4c-H\x93oJl\xd0iQ\xe4k"
1412 b"\x84\x0b\xc1\xb7\xbc\xb1\x17\x88\xb1\xca?@\xf6\x07\xea\xe6x\xf1H12P\x0f"
1413 b"\x8a\xc9\xeauw\xe3\xbe\xaai\xa9W\xd0\x80\xcd#cb5\x99\xd8]\xa9d\x0c\xbd"
1414 b"\xa2\xdcWl\xedUG\xbf\x89yF\xf77\x81v\xbd5\x98\xbeh8\x18W\x08\xf0\x1b\x99"
1415 b"5:\x1a?rD\x96\xa1\x04\x0f\xae\xba\x85\xeb\x9d5@\xf5\x83\xd37\x83\x8ac"
1416 b"\x06\xd4\x97i\xcdt\x16S\x82k\xf6K\x01vy\x88\x91\x9b6T\xdae\r\xfd]:k\xbal"
1417 b"\xa9\xbba\xc34\xf9r\xeb}r\xdb\xc7\xdb*\x8f\x03z\xdc8h\xcc\xc9\xd3\xbcl"
1418 b"\xa5-\xcb\xeaK\xa2\xc5\x15\xc0\xe3\xc1\x86Z\xfb\xebL\xe13\xcf\x9c\xe3"
1419 b"\x1d\xc9\xed\xc2\x06\xcc\xce!\x92\xe5\xfe\x9c^\xa59w \x9bP\xa3PK\x08d"
1420 b"\xf9\xe2Z}\xa7\xbf\xed\xeb%$\x0c\x82\xb8/\xb0\x01\xa9&,\xf7qh{Q\x96)\xf2"
1421 b"q\x96\xc3\x80\xb4\x12\xb0\xba\xe6o\xf4!\xb4[\xd4\x8aw\x10\xf7t\x0c\xb3"
1422 b"\xd9\xd5\xc3`^\x81\x11??\\\xa4\x99\x85R\xd4\x8e\x83\xc9\x1eX\xbfa\xf1"
1423 b"\xac\xb0\xea\xea\xd7\xd0\xab\x18\xe2\xf2\xed\xe1\xb7\xc9\x18\xcbS\xe4>"
1424 b"\xc9\x95H\xe8\xcb\t\r%\xeb\xc7$.o\xf1\xf3R\x17\x1db\xbb\xd8U\xa5^\xccS"
1425 b"\x16\x01\x87\xf3/\x93\xd1\xf0v\xc0r\xd7\xcc\xa2Gkz\xca\x80\x0e\xfd\xd0"
1426 b"\x8b\xbb\xd2Ix\xb3\x1ey\xca-0\xe3z^\xd6\xd6\x8f_\xf1\x9dP\x9fi\xa7\xd1"
1427 b"\xe8\x90\x84\xdc\xbf\xcdky\x8e\xdc\x81\x7f\xa3\xb2+\xbf\x04\xef\xd8\\"
1428 b"\xc4\xdf\xe1\xb0\x01\xe9\x93\xe3Y\xf1\x1dY\xe8h\x81\xcf\xf1w\xcc\xb4\xef"
1429 b" \x8b|\x04\xea\x83ej\xbe\x1f\xd4z\x9c`\xd3\x1a\x92A\x06\xe5\x8f\xa9\x13"
1430 b"\t\x9e=\xfa\x1c\xe5_\x9f%v\x1bo\x11ZO\xd8\xf4\t\xddM\x16-\x04\xfc\x18<\""
1431 b"CM\xddg~b\xf6\xef\x8e\x0c\xd0\xde|\xa0'\x8a\x0c\xd6x\xae!J\xa6F\x88\x15u"
1432 b"\x008\x17\xbc7y\xb3\xd8u\xac_\x85\x8d\xe7\xc1@\x9c\xecqc\xa3#\xad\xf1"
1433 b"\x935\xb5)_\r\xec3]\x0fo]5\xd0my\x07\x9b\xee\x81\xb5\x0f\xcfK+\x00\xc0"
1434 b"\xe4b\x10\xe4\x0c\x1a \x9b\xe0\x97t\xf6\xa1\x9e\x850\xba\x0c\x9a\x8d\xc8"
1435 b"\x8f\x07\xd7\xae\xc8\xf9+i\xdc\xb9k\xb0>f\x19\xb8\r\xa8\xf8\x1f$\xa5{p"
1436 b"\xc6\x880\xce\xdb\xcf\xca_\x86\xac\x88h6\x8bZ%'\xd0\n\xbf\x0f\x9c\"\xba"
1437 b"\xe5\x86\x9f\x0f7X=mNX[\xcc\x19FU\xc9\x860\xbc\x90a+* \xae_$\x03\x1e\xd3"
1438 b"\xcd_\xa0\x9c\xde\xaf46q\xa5\xc9\x92\xd7\xca\xe3`\x9d\x85}\xb4\xff\xb3"
1439 b"\x83\xfb\xb6\xca\xae`\x0bw\x7f\xfc\xd8\xacVe\x19\xc8\x17\x0bZ\xad\x88"
1440 b"\xeb#\x97\x03\x13\xb1d\x0f{\x0c\x04w\x07\r\x97\xbd\xd6\xc1\xc3B:\x95\x08"
1441 b"^\x10V\xaeaH\x02\xd9\xe3\n\\\x01X\xf6\x9c\x8a\x06u#%\xbe*\xa1\x18v\x85"
1442 b"\xec!\t4\x00\x00\x00"
1443)
1444
1445FILTERS_RAW_4 = [{"id": lzma.FILTER_DELTA, "dist": 4},
1446 {"id": lzma.FILTER_X86, "start_offset": 0x40},
1447 {"id": lzma.FILTER_LZMA2, "preset": 4, "lc": 2}]
1448COMPRESSED_RAW_4 = (
1449 b"\xe0\x07\x80\x06\x0e\\\x00\x05\x14\x07bW\xaah\xdd\x10\xdc'\xd6\x90,\xc6v"
1450 b"Jq \x14l\xb7\x83xB\x0b\x97f=&fx\xba\n>Tn\xbf\x8f\xfb\x1dF\xca\xc3v_\xca?"
1451 b"\xfbV<\x92#\xd4w\xa6\x8a\xeb\xf6\x03\xc0\x01\x94\xd8\x9e\x13\x12\x98\xd1"
1452 b"*\xfa]c\xe8\x1e~\xaf\xb5]Eg\xfb\x9e\x01\"8\xb2\x90\x06=~\xe9\x91W\xcd"
1453 b"\xecD\x12\xc7\xfa\xe1\x91\x06\xc7\x99\xb9\xe3\x901\x87\x19u\x0f\x869\xff"
1454 b"\xc1\xb0hw|\xb0\xdcl\xcck\xb16o7\x85\xee{Y_b\xbf\xbc$\xf3=\x8d\x8bw\xe5Z"
1455 b"\x08@\xc4kmE\xad\xfb\xf6*\xd8\xad\xa1\xfb\xc5{\xdej,)\x1emB\x1f<\xaeca"
1456 b"\x80(\xee\x07 \xdf\xe9\xf8\xeb\x0e-\x97\x86\x90c\xf9\xea'B\xf7`\xd7\xb0"
1457 b"\x92\xbd\xa0\x82]\xbd\x0e\x0eB\x19\xdc\x96\xc6\x19\xd86D\xf0\xd5\x831"
1458 b"\x03\xb7\x1c\xf7&5\x1a\x8f PZ&j\xf8\x98\x1bo\xcc\x86\x9bS\xd3\xa5\xcdu"
1459 b"\xf9$\xcc\x97o\xe5V~\xfb\x97\xb5\x0b\x17\x9c\xfdxW\x10\xfep4\x80\xdaHDY"
1460 b"\xfa)\xfet\xb5\"\xd4\xd3F\x81\xf4\x13\x1f\xec\xdf\xa5\x13\xfc\"\x91x\xb7"
1461 b"\x99\xce\xc8\x92\n\xeb[\x10l*Y\xd8\xb1@\x06\xc8o\x8d7r\xebu\xfd5\x0e\x7f"
1462 b"\xf1$U{\t}\x1fQ\xcfxN\x9d\x9fXX\xe9`\x83\xc1\x06\xf4\x87v-f\x11\xdb/\\"
1463 b"\x06\xff\xd7)B\xf3g\x06\x88#2\x1eB244\x7f4q\t\xc893?mPX\x95\xa6a\xfb)d"
1464 b"\x9b\xfc\x98\x9aj\x04\xae\x9b\x9d\x19w\xba\xf92\xfaA\x11\\\x17\x97C3\xa4"
1465 b"\xbc!\x88\xcdo[\xec:\x030\x91.\x85\xe0@\\4\x16\x12\x9d\xcaJv\x97\xb04"
1466 b"\xack\xcbkf\xa3ss\xfc\x16^\x8ce\x85a\xa5=&\xecr\xb3p\xd1E\xd5\x80y\xc7"
1467 b"\xda\xf6\xfek\xbcT\xbfH\xee\x15o\xc5\x8c\x830\xec\x1d\x01\xae\x0c-e\\"
1468 b"\x91\x90\x94\xb2\xf8\x88\x91\xe8\x0b\xae\xa7>\x98\xf6\x9ck\xd2\xc6\x08"
1469 b"\xe6\xab\t\x98\xf2!\xa0\x8c^\xacqA\x99<\x1cEG\x97\xc8\xf1\xb6\xb9\x82"
1470 b"\x8d\xf7\x08s\x98a\xff\xe3\xcc\x92\x0e\xd2\xb6U\xd7\xd9\x86\x7fa\xe5\x1c"
1471 b"\x8dTG@\t\x1e\x0e7*\xfc\xde\xbc]6N\xf7\xf1\x84\x9e\x9f\xcf\xe9\x1e\xb5'"
1472 b"\xf4<\xdf\x99sq\xd0\x9d\xbd\x99\x0b\xb4%p4\xbf{\xbb\x8a\xd2\x0b\xbc=M"
1473 b"\x94H:\xf5\xa8\xd6\xa4\xc90\xc2D\xb9\xd3\xa8\xb0S\x87 `\xa2\xeb\xf3W\xce"
1474 b" 7\xf9N#\r\xe6\xbe\t\x9d\xe7\x811\xf9\x10\xc1\xc2\x14\xf6\xfc\xcba\xb7"
1475 b"\xb1\x7f\x95l\xe4\tjA\xec:\x10\xe5\xfe\xc2\\=D\xe2\x0c\x0b3]\xf7\xc1\xf7"
1476 b"\xbceZ\xb1A\xea\x16\xe5\xfddgFQ\xed\xaf\x04\xa3\xd3\xf8\xa2q\x19B\xd4r"
1477 b"\xc5\x0c\x9a\x14\x94\xea\x91\xc4o\xe4\xbb\xb4\x99\xf4@\xd1\xe6\x0c\xe3"
1478 b"\xc6d\xa0Q\n\xf2/\xd8\xb8S5\x8a\x18:\xb5g\xac\x95D\xce\x17\x07\xd4z\xda"
1479 b"\x90\xe65\x07\x19H!\t\xfdu\x16\x8e\x0eR\x19\xf4\x8cl\x0c\xf9Q\xf1\x80"
1480 b"\xe3\xbf\xd7O\xf8\x8c\x18\x0b\x9c\xf1\x1fb\xe1\tR\xb2\xf1\xe1A\xea \xcf-"
1481 b"IGE\xf1\x14\x98$\x83\x15\xc9\xd8j\xbf\x19\x0f\xd5\xd1\xaa\xb3\xf3\xa5I2s"
1482 b"\x8d\x145\xca\xd5\xd93\x9c\xb8D0\xe6\xaa%\xd0\xc0P}JO^h\x8e\x08\xadlV."
1483 b"\x18\x88\x13\x05o\xb0\x07\xeaw\xe0\xb6\xa4\xd5*\xe4r\xef\x07G+\xc1\xbei["
1484 b"w\xe8\xab@_\xef\x15y\xe5\x12\xc9W\x1b.\xad\x85-\xc2\xf7\xe3mU6g\x8eSA"
1485 b"\x01(\xd3\xdb\x16\x13=\xde\x92\xf9,D\xb8\x8a\xb2\xb4\xc9\xc3\xefnE\xe8\\"
1486 b"\xa6\xe2Y\xd2\xcf\xcb\x8c\xb6\xd5\xe9\x1d\x1e\x9a\x8b~\xe2\xa6\rE\x84uV"
1487 b"\xed\xc6\x99\xddm<\x10[\x0fu\x1f\xc1\x1d1\n\xcfw\xb2%!\xf0[\xce\x87\x83B"
1488 b"\x08\xaa,\x08%d\xcef\x94\"\xd9g.\xc83\xcbXY+4\xec\x85qA\n\x1d=9\xf0*\xb1"
1489 b"\x1f/\xf3s\xd61b\x7f@\xfb\x9d\xe3FQ\\\xbd\x82\x1e\x00\xf3\xce\xd3\xe1"
1490 b"\xca,E\xfd7[\xab\xb6\xb7\xac!mA}\xbd\x9d3R5\x9cF\xabH\xeb\x92)cc\x13\xd0"
1491 b"\xbd\xee\xe9n{\x1dIJB\xa5\xeb\x11\xe8`w&`\x8b}@Oxe\t\x8a\x07\x02\x95\xf2"
1492 b"\xed\xda|\xb1e\xbe\xaa\xbbg\x19@\xe1Y\x878\x84\x0f\x8c\xe3\xc98\xf2\x9e"
1493 b"\xd5N\xb5J\xef\xab!\xe2\x8dq\xe1\xe5q\xc5\xee\x11W\xb7\xe4k*\x027\xa0"
1494 b"\xa3J\xf4\xd8m\xd0q\x94\xcb\x07\n:\xb6`.\xe4\x9c\x15+\xc0)\xde\x80X\xd4"
1495 b"\xcfQm\x01\xc2cP\x1cA\x85'\xc9\xac\x8b\xe6\xb2)\xe6\x84t\x1c\x92\xe4Z"
1496 b"\x1cR\xb0\x9e\x96\xd1\xfb\x1c\xa6\x8b\xcb`\x10\x12]\xf2gR\x9bFT\xe0\xc8H"
1497 b"S\xfb\xac<\x04\xc7\xc1\xe8\xedP\xf4\x16\xdb\xc0\xd7e\xc2\x17J^\x1f\xab"
1498 b"\xff[\x08\x19\xb4\xf5\xfb\x19\xb4\x04\xe5c~']\xcb\xc2A\xec\x90\xd0\xed"
1499 b"\x06,\xc5K{\x86\x03\xb1\xcdMx\xdeQ\x8c3\xf9\x8a\xea=\x89\xaba\xd2\xc89a"
1500 b"\xd72\xf0\xc3\x19\x8a\xdfs\xd4\xfd\xbb\x81b\xeaE\"\xd8\xf4d\x0cD\xf7IJ!"
1501 b"\xe5d\xbbG\xe9\xcam\xaa\x0f_r\x95\x91NBq\xcaP\xce\xa7\xa9\xb5\x10\x94eP!"
1502 b"|\x856\xcd\xbfIir\xb8e\x9bjP\x97q\xabwS7\x1a\x0ehM\xe7\xca\x86?\xdeP}y~"
1503 b"\x0f\x95I\xfc\x13\xe1<Q\x1b\x868\x1d\x11\xdf\x94\xf4\x82>r\xa9k\x88\xcb"
1504 b"\xfd\xc3v\xe2\xb9\x8a\x02\x8eq\x92I\xf8\xf6\xf1\x03s\x9b\xb8\xe3\"\xe3"
1505 b"\xa9\xa5>D\xb8\x96;\xe7\x92\xd133\xe8\xdd'e\xc9.\xdc;\x17\x1f\xf5H\x13q"
1506 b"\xa4W\x0c\xdb~\x98\x01\xeb\xdf\xe32\x13\x0f\xddx\n6\xa0\t\x10\xb6\xbb"
1507 b"\xb0\xc3\x18\xb6;\x9fj[\xd9\xd5\xc9\x06\x8a\x87\xcd\xe5\xee\xfc\x9c-%@"
1508 b"\xee\xe0\xeb\xd2\xe3\xe8\xfb\xc0\x122\\\xc7\xaf\xc2\xa1Oth\xb3\x8f\x82"
1509 b"\xb3\x18\xa8\x07\xd5\xee_\xbe\xe0\x1cA\x1e_\r\x9a\xb0\x17W&\xa2D\x91\x94"
1510 b"\x1a\xb2\xef\xf2\xdc\x85;X\xb0,\xeb>-7S\xe5\xca\x07)\x1fp\x7f\xcaQBL\xca"
1511 b"\xf3\xb9d\xfc\xb5su\xb0\xc8\x95\x90\xeb*)\xa0v\xe4\x9a{FW\xf4l\xde\xcdj"
1512 b"\x00"
1513)
1514
1515
1516def test_main():
1517 run_unittest(
1518 CompressorDecompressorTestCase,
1519 CompressDecompressFunctionTestCase,
1520 FileTestCase,
Nadeem Vawdae8604042012-06-04 23:38:12 +02001521 OpenTestCase,
Nadeem Vawda3ff069e2011-11-30 00:25:06 +02001522 MiscellaneousTestCase,
1523 )
1524
1525if __name__ == "__main__":
1526 test_main()