blob: b6af563300c3702d7692a27e9127e2fbb9661ce2 [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 Vawda42ca9822013-10-19 00:06:19 +0200365 with LZMAFile(BytesIO(), "x") as f:
366 pass
Nadeem Vawda33c34da2012-06-04 23:34:07 +0200367 with LZMAFile(BytesIO(), "a") as f:
Nadeem Vawda3ff069e2011-11-30 00:25:06 +0200368 pass
369
370 def test_init_with_filename(self):
371 with TempFile(TESTFN, COMPRESSED_XZ):
372 with LZMAFile(TESTFN) as f:
373 pass
374 with LZMAFile(TESTFN, "w") as f:
375 pass
376 with LZMAFile(TESTFN, "a") as f:
377 pass
378
Nadeem Vawda6cbb20c2012-06-04 23:36:24 +0200379 def test_init_mode(self):
380 with TempFile(TESTFN):
381 with LZMAFile(TESTFN, "r"):
382 pass
383 with LZMAFile(TESTFN, "rb"):
384 pass
385 with LZMAFile(TESTFN, "w"):
386 pass
387 with LZMAFile(TESTFN, "wb"):
388 pass
389 with LZMAFile(TESTFN, "a"):
390 pass
391 with LZMAFile(TESTFN, "ab"):
392 pass
393
Nadeem Vawda42ca9822013-10-19 00:06:19 +0200394 def test_init_with_x_mode(self):
395 self.addCleanup(unlink, TESTFN)
396 for mode in ("x", "xb"):
397 unlink(TESTFN)
398 with LZMAFile(TESTFN, mode):
399 pass
400 with self.assertRaises(FileExistsError):
401 with LZMAFile(TESTFN, mode):
402 pass
403
Nadeem Vawda3ff069e2011-11-30 00:25:06 +0200404 def test_init_bad_mode(self):
405 with self.assertRaises(ValueError):
Nadeem Vawda33c34da2012-06-04 23:34:07 +0200406 LZMAFile(BytesIO(COMPRESSED_XZ), (3, "x"))
Nadeem Vawda3ff069e2011-11-30 00:25:06 +0200407 with self.assertRaises(ValueError):
Nadeem Vawda33c34da2012-06-04 23:34:07 +0200408 LZMAFile(BytesIO(COMPRESSED_XZ), "")
Nadeem Vawda3ff069e2011-11-30 00:25:06 +0200409 with self.assertRaises(ValueError):
Nadeem Vawda42ca9822013-10-19 00:06:19 +0200410 LZMAFile(BytesIO(COMPRESSED_XZ), "xt")
411 with self.assertRaises(ValueError):
412 LZMAFile(BytesIO(COMPRESSED_XZ), "x+")
413 with self.assertRaises(ValueError):
414 LZMAFile(BytesIO(COMPRESSED_XZ), "rx")
415 with self.assertRaises(ValueError):
416 LZMAFile(BytesIO(COMPRESSED_XZ), "wx")
Nadeem Vawda3ff069e2011-11-30 00:25:06 +0200417 with self.assertRaises(ValueError):
Nadeem Vawda6cbb20c2012-06-04 23:36:24 +0200418 LZMAFile(BytesIO(COMPRESSED_XZ), "rt")
Nadeem Vawda3ff069e2011-11-30 00:25:06 +0200419 with self.assertRaises(ValueError):
Nadeem Vawda33c34da2012-06-04 23:34:07 +0200420 LZMAFile(BytesIO(COMPRESSED_XZ), "r+")
Nadeem Vawda3ff069e2011-11-30 00:25:06 +0200421 with self.assertRaises(ValueError):
Nadeem Vawda6cbb20c2012-06-04 23:36:24 +0200422 LZMAFile(BytesIO(COMPRESSED_XZ), "wt")
Nadeem Vawda3ff069e2011-11-30 00:25:06 +0200423 with self.assertRaises(ValueError):
Nadeem Vawda33c34da2012-06-04 23:34:07 +0200424 LZMAFile(BytesIO(COMPRESSED_XZ), "w+")
Nadeem Vawda3ff069e2011-11-30 00:25:06 +0200425 with self.assertRaises(ValueError):
Nadeem Vawda33c34da2012-06-04 23:34:07 +0200426 LZMAFile(BytesIO(COMPRESSED_XZ), "rw")
Nadeem Vawda3ff069e2011-11-30 00:25:06 +0200427
428 def test_init_bad_check(self):
429 with self.assertRaises(TypeError):
Nadeem Vawda33c34da2012-06-04 23:34:07 +0200430 LZMAFile(BytesIO(), "w", check=b"asd")
Nadeem Vawda3ff069e2011-11-30 00:25:06 +0200431 # CHECK_UNKNOWN and anything above CHECK_ID_MAX should be invalid.
432 with self.assertRaises(LZMAError):
Nadeem Vawda33c34da2012-06-04 23:34:07 +0200433 LZMAFile(BytesIO(), "w", check=lzma.CHECK_UNKNOWN)
Nadeem Vawda3ff069e2011-11-30 00:25:06 +0200434 with self.assertRaises(LZMAError):
Nadeem Vawda33c34da2012-06-04 23:34:07 +0200435 LZMAFile(BytesIO(), "w", check=lzma.CHECK_ID_MAX + 3)
Nadeem Vawda3ff069e2011-11-30 00:25:06 +0200436 # Cannot specify a check with mode="r".
437 with self.assertRaises(ValueError):
Nadeem Vawda33c34da2012-06-04 23:34:07 +0200438 LZMAFile(BytesIO(COMPRESSED_XZ), check=lzma.CHECK_NONE)
Nadeem Vawda3ff069e2011-11-30 00:25:06 +0200439 with self.assertRaises(ValueError):
Nadeem Vawda33c34da2012-06-04 23:34:07 +0200440 LZMAFile(BytesIO(COMPRESSED_XZ), check=lzma.CHECK_CRC32)
Nadeem Vawda3ff069e2011-11-30 00:25:06 +0200441 with self.assertRaises(ValueError):
Nadeem Vawda33c34da2012-06-04 23:34:07 +0200442 LZMAFile(BytesIO(COMPRESSED_XZ), check=lzma.CHECK_CRC64)
Nadeem Vawda3ff069e2011-11-30 00:25:06 +0200443 with self.assertRaises(ValueError):
Nadeem Vawda33c34da2012-06-04 23:34:07 +0200444 LZMAFile(BytesIO(COMPRESSED_XZ), check=lzma.CHECK_SHA256)
Nadeem Vawda3ff069e2011-11-30 00:25:06 +0200445 with self.assertRaises(ValueError):
Nadeem Vawda33c34da2012-06-04 23:34:07 +0200446 LZMAFile(BytesIO(COMPRESSED_XZ), check=lzma.CHECK_UNKNOWN)
Nadeem Vawda3ff069e2011-11-30 00:25:06 +0200447
448 def test_init_bad_preset(self):
449 with self.assertRaises(TypeError):
Nadeem Vawda33c34da2012-06-04 23:34:07 +0200450 LZMAFile(BytesIO(), "w", preset=4.39)
Nadeem Vawda3ff069e2011-11-30 00:25:06 +0200451 with self.assertRaises(LZMAError):
Nadeem Vawda33c34da2012-06-04 23:34:07 +0200452 LZMAFile(BytesIO(), "w", preset=10)
Nadeem Vawda3ff069e2011-11-30 00:25:06 +0200453 with self.assertRaises(LZMAError):
Nadeem Vawda33c34da2012-06-04 23:34:07 +0200454 LZMAFile(BytesIO(), "w", preset=23)
Nadeem Vawda3ff069e2011-11-30 00:25:06 +0200455 with self.assertRaises(OverflowError):
Nadeem Vawda33c34da2012-06-04 23:34:07 +0200456 LZMAFile(BytesIO(), "w", preset=-1)
Nadeem Vawda3ff069e2011-11-30 00:25:06 +0200457 with self.assertRaises(OverflowError):
Nadeem Vawda33c34da2012-06-04 23:34:07 +0200458 LZMAFile(BytesIO(), "w", preset=-7)
Nadeem Vawda3ff069e2011-11-30 00:25:06 +0200459 with self.assertRaises(TypeError):
Nadeem Vawda33c34da2012-06-04 23:34:07 +0200460 LZMAFile(BytesIO(), "w", preset="foo")
Nadeem Vawda3ff069e2011-11-30 00:25:06 +0200461 # Cannot specify a preset with mode="r".
462 with self.assertRaises(ValueError):
Nadeem Vawda33c34da2012-06-04 23:34:07 +0200463 LZMAFile(BytesIO(COMPRESSED_XZ), preset=3)
Nadeem Vawda3ff069e2011-11-30 00:25:06 +0200464
465 def test_init_bad_filter_spec(self):
466 with self.assertRaises(TypeError):
Nadeem Vawda33c34da2012-06-04 23:34:07 +0200467 LZMAFile(BytesIO(), "w", filters=[b"wobsite"])
Nadeem Vawda3ff069e2011-11-30 00:25:06 +0200468 with self.assertRaises(ValueError):
Nadeem Vawda33c34da2012-06-04 23:34:07 +0200469 LZMAFile(BytesIO(), "w", filters=[{"xyzzy": 3}])
Nadeem Vawda3ff069e2011-11-30 00:25:06 +0200470 with self.assertRaises(ValueError):
Nadeem Vawda33c34da2012-06-04 23:34:07 +0200471 LZMAFile(BytesIO(), "w", filters=[{"id": 98765}])
Nadeem Vawda3ff069e2011-11-30 00:25:06 +0200472 with self.assertRaises(ValueError):
Nadeem Vawda33c34da2012-06-04 23:34:07 +0200473 LZMAFile(BytesIO(), "w",
Nadeem Vawda3ff069e2011-11-30 00:25:06 +0200474 filters=[{"id": lzma.FILTER_LZMA2, "foo": 0}])
475 with self.assertRaises(ValueError):
Nadeem Vawda33c34da2012-06-04 23:34:07 +0200476 LZMAFile(BytesIO(), "w",
Nadeem Vawda3ff069e2011-11-30 00:25:06 +0200477 filters=[{"id": lzma.FILTER_DELTA, "foo": 0}])
478 with self.assertRaises(ValueError):
Nadeem Vawda33c34da2012-06-04 23:34:07 +0200479 LZMAFile(BytesIO(), "w",
Nadeem Vawda3ff069e2011-11-30 00:25:06 +0200480 filters=[{"id": lzma.FILTER_X86, "foo": 0}])
481
482 def test_init_with_preset_and_filters(self):
483 with self.assertRaises(ValueError):
Nadeem Vawda33c34da2012-06-04 23:34:07 +0200484 LZMAFile(BytesIO(), "w", format=lzma.FORMAT_RAW,
485 preset=6, filters=FILTERS_RAW_1)
Nadeem Vawda3ff069e2011-11-30 00:25:06 +0200486
487 def test_close(self):
488 with BytesIO(COMPRESSED_XZ) as src:
Nadeem Vawda33c34da2012-06-04 23:34:07 +0200489 f = LZMAFile(src)
Nadeem Vawda3ff069e2011-11-30 00:25:06 +0200490 f.close()
491 # LZMAFile.close() should not close the underlying file object.
492 self.assertFalse(src.closed)
493 # Try closing an already-closed LZMAFile.
494 f.close()
495 self.assertFalse(src.closed)
496
497 # Test with a real file on disk, opened directly by LZMAFile.
498 with TempFile(TESTFN, COMPRESSED_XZ):
499 f = LZMAFile(TESTFN)
500 fp = f._fp
501 f.close()
502 # Here, LZMAFile.close() *should* close the underlying file object.
503 self.assertTrue(fp.closed)
504 # Try closing an already-closed LZMAFile.
505 f.close()
506
507 def test_closed(self):
Nadeem Vawda33c34da2012-06-04 23:34:07 +0200508 f = LZMAFile(BytesIO(COMPRESSED_XZ))
Nadeem Vawda3ff069e2011-11-30 00:25:06 +0200509 try:
510 self.assertFalse(f.closed)
511 f.read()
512 self.assertFalse(f.closed)
513 finally:
514 f.close()
515 self.assertTrue(f.closed)
516
Nadeem Vawda33c34da2012-06-04 23:34:07 +0200517 f = LZMAFile(BytesIO(), "w")
Nadeem Vawda3ff069e2011-11-30 00:25:06 +0200518 try:
519 self.assertFalse(f.closed)
520 finally:
521 f.close()
522 self.assertTrue(f.closed)
523
524 def test_fileno(self):
Nadeem Vawda33c34da2012-06-04 23:34:07 +0200525 f = LZMAFile(BytesIO(COMPRESSED_XZ))
Nadeem Vawda3ff069e2011-11-30 00:25:06 +0200526 try:
527 self.assertRaises(UnsupportedOperation, f.fileno)
528 finally:
529 f.close()
530 self.assertRaises(ValueError, f.fileno)
531 with TempFile(TESTFN, COMPRESSED_XZ):
532 f = LZMAFile(TESTFN)
533 try:
534 self.assertEqual(f.fileno(), f._fp.fileno())
535 self.assertIsInstance(f.fileno(), int)
536 finally:
537 f.close()
538 self.assertRaises(ValueError, f.fileno)
539
540 def test_seekable(self):
Nadeem Vawda33c34da2012-06-04 23:34:07 +0200541 f = LZMAFile(BytesIO(COMPRESSED_XZ))
Nadeem Vawda3ff069e2011-11-30 00:25:06 +0200542 try:
543 self.assertTrue(f.seekable())
544 f.read()
545 self.assertTrue(f.seekable())
546 finally:
547 f.close()
548 self.assertRaises(ValueError, f.seekable)
549
Nadeem Vawda33c34da2012-06-04 23:34:07 +0200550 f = LZMAFile(BytesIO(), "w")
Nadeem Vawda3ff069e2011-11-30 00:25:06 +0200551 try:
552 self.assertFalse(f.seekable())
553 finally:
554 f.close()
555 self.assertRaises(ValueError, f.seekable)
556
Nadeem Vawdaae557d72012-02-12 01:51:38 +0200557 src = BytesIO(COMPRESSED_XZ)
558 src.seekable = lambda: False
Nadeem Vawda33c34da2012-06-04 23:34:07 +0200559 f = LZMAFile(src)
Nadeem Vawdaae557d72012-02-12 01:51:38 +0200560 try:
561 self.assertFalse(f.seekable())
562 finally:
563 f.close()
564 self.assertRaises(ValueError, f.seekable)
565
Nadeem Vawda3ff069e2011-11-30 00:25:06 +0200566 def test_readable(self):
Nadeem Vawda33c34da2012-06-04 23:34:07 +0200567 f = LZMAFile(BytesIO(COMPRESSED_XZ))
Nadeem Vawda3ff069e2011-11-30 00:25:06 +0200568 try:
569 self.assertTrue(f.readable())
570 f.read()
571 self.assertTrue(f.readable())
572 finally:
573 f.close()
574 self.assertRaises(ValueError, f.readable)
575
Nadeem Vawda33c34da2012-06-04 23:34:07 +0200576 f = LZMAFile(BytesIO(), "w")
Nadeem Vawda3ff069e2011-11-30 00:25:06 +0200577 try:
578 self.assertFalse(f.readable())
579 finally:
580 f.close()
581 self.assertRaises(ValueError, f.readable)
582
583 def test_writable(self):
Nadeem Vawda33c34da2012-06-04 23:34:07 +0200584 f = LZMAFile(BytesIO(COMPRESSED_XZ))
Nadeem Vawda3ff069e2011-11-30 00:25:06 +0200585 try:
586 self.assertFalse(f.writable())
587 f.read()
588 self.assertFalse(f.writable())
589 finally:
590 f.close()
591 self.assertRaises(ValueError, f.writable)
592
Nadeem Vawda33c34da2012-06-04 23:34:07 +0200593 f = LZMAFile(BytesIO(), "w")
Nadeem Vawda3ff069e2011-11-30 00:25:06 +0200594 try:
595 self.assertTrue(f.writable())
596 finally:
597 f.close()
598 self.assertRaises(ValueError, f.writable)
599
600 def test_read(self):
Nadeem Vawda33c34da2012-06-04 23:34:07 +0200601 with LZMAFile(BytesIO(COMPRESSED_XZ)) as f:
Nadeem Vawda3ff069e2011-11-30 00:25:06 +0200602 self.assertEqual(f.read(), INPUT)
603 self.assertEqual(f.read(), b"")
Nadeem Vawda33c34da2012-06-04 23:34:07 +0200604 with LZMAFile(BytesIO(COMPRESSED_ALONE)) as f:
Nadeem Vawda3ff069e2011-11-30 00:25:06 +0200605 self.assertEqual(f.read(), INPUT)
Nadeem Vawda33c34da2012-06-04 23:34:07 +0200606 with LZMAFile(BytesIO(COMPRESSED_XZ), format=lzma.FORMAT_XZ) as f:
Nadeem Vawda3ff069e2011-11-30 00:25:06 +0200607 self.assertEqual(f.read(), INPUT)
608 self.assertEqual(f.read(), b"")
Nadeem Vawda33c34da2012-06-04 23:34:07 +0200609 with LZMAFile(BytesIO(COMPRESSED_ALONE), format=lzma.FORMAT_ALONE) as f:
Nadeem Vawda3ff069e2011-11-30 00:25:06 +0200610 self.assertEqual(f.read(), INPUT)
611 self.assertEqual(f.read(), b"")
Nadeem Vawda33c34da2012-06-04 23:34:07 +0200612 with LZMAFile(BytesIO(COMPRESSED_RAW_1),
Nadeem Vawda3ff069e2011-11-30 00:25:06 +0200613 format=lzma.FORMAT_RAW, filters=FILTERS_RAW_1) as f:
614 self.assertEqual(f.read(), INPUT)
615 self.assertEqual(f.read(), b"")
Nadeem Vawda33c34da2012-06-04 23:34:07 +0200616 with LZMAFile(BytesIO(COMPRESSED_RAW_2),
Nadeem Vawda3ff069e2011-11-30 00:25:06 +0200617 format=lzma.FORMAT_RAW, filters=FILTERS_RAW_2) as f:
618 self.assertEqual(f.read(), INPUT)
619 self.assertEqual(f.read(), b"")
Nadeem Vawda33c34da2012-06-04 23:34:07 +0200620 with LZMAFile(BytesIO(COMPRESSED_RAW_3),
Nadeem Vawda3ff069e2011-11-30 00:25:06 +0200621 format=lzma.FORMAT_RAW, filters=FILTERS_RAW_3) as f:
622 self.assertEqual(f.read(), INPUT)
623 self.assertEqual(f.read(), b"")
Nadeem Vawda33c34da2012-06-04 23:34:07 +0200624 with LZMAFile(BytesIO(COMPRESSED_RAW_4),
Nadeem Vawda3ff069e2011-11-30 00:25:06 +0200625 format=lzma.FORMAT_RAW, filters=FILTERS_RAW_4) as f:
626 self.assertEqual(f.read(), INPUT)
627 self.assertEqual(f.read(), b"")
628
629 def test_read_0(self):
Nadeem Vawda33c34da2012-06-04 23:34:07 +0200630 with LZMAFile(BytesIO(COMPRESSED_XZ)) as f:
Nadeem Vawda3ff069e2011-11-30 00:25:06 +0200631 self.assertEqual(f.read(0), b"")
Nadeem Vawda33c34da2012-06-04 23:34:07 +0200632 with LZMAFile(BytesIO(COMPRESSED_ALONE)) as f:
Nadeem Vawda3ff069e2011-11-30 00:25:06 +0200633 self.assertEqual(f.read(0), b"")
Nadeem Vawda33c34da2012-06-04 23:34:07 +0200634 with LZMAFile(BytesIO(COMPRESSED_XZ), format=lzma.FORMAT_XZ) as f:
Nadeem Vawda3ff069e2011-11-30 00:25:06 +0200635 self.assertEqual(f.read(0), b"")
Nadeem Vawda33c34da2012-06-04 23:34:07 +0200636 with LZMAFile(BytesIO(COMPRESSED_ALONE), format=lzma.FORMAT_ALONE) as f:
Nadeem Vawda3ff069e2011-11-30 00:25:06 +0200637 self.assertEqual(f.read(0), b"")
638
639 def test_read_10(self):
Nadeem Vawda33c34da2012-06-04 23:34:07 +0200640 with LZMAFile(BytesIO(COMPRESSED_XZ)) as f:
Nadeem Vawda3ff069e2011-11-30 00:25:06 +0200641 chunks = []
642 while True:
643 result = f.read(10)
644 if not result:
645 break
646 self.assertLessEqual(len(result), 10)
647 chunks.append(result)
648 self.assertEqual(b"".join(chunks), INPUT)
649
650 def test_read_multistream(self):
Nadeem Vawda33c34da2012-06-04 23:34:07 +0200651 with LZMAFile(BytesIO(COMPRESSED_XZ * 5)) as f:
Nadeem Vawda3ff069e2011-11-30 00:25:06 +0200652 self.assertEqual(f.read(), INPUT * 5)
Nadeem Vawda33c34da2012-06-04 23:34:07 +0200653 with LZMAFile(BytesIO(COMPRESSED_XZ + COMPRESSED_ALONE)) as f:
Nadeem Vawda3ff069e2011-11-30 00:25:06 +0200654 self.assertEqual(f.read(), INPUT * 2)
Nadeem Vawda33c34da2012-06-04 23:34:07 +0200655 with LZMAFile(BytesIO(COMPRESSED_RAW_3 * 4),
Nadeem Vawda3ff069e2011-11-30 00:25:06 +0200656 format=lzma.FORMAT_RAW, filters=FILTERS_RAW_3) as f:
657 self.assertEqual(f.read(), INPUT * 4)
658
659 def test_read_multistream_buffer_size_aligned(self):
660 # Test the case where a stream boundary coincides with the end
661 # of the raw read buffer.
662 saved_buffer_size = lzma._BUFFER_SIZE
663 lzma._BUFFER_SIZE = len(COMPRESSED_XZ)
664 try:
Nadeem Vawda33c34da2012-06-04 23:34:07 +0200665 with LZMAFile(BytesIO(COMPRESSED_XZ * 5)) as f:
Nadeem Vawda3ff069e2011-11-30 00:25:06 +0200666 self.assertEqual(f.read(), INPUT * 5)
667 finally:
668 lzma._BUFFER_SIZE = saved_buffer_size
669
670 def test_read_from_file(self):
671 with TempFile(TESTFN, COMPRESSED_XZ):
672 with LZMAFile(TESTFN) as f:
673 self.assertEqual(f.read(), INPUT)
674 self.assertEqual(f.read(), b"")
675
Nadeem Vawda10c87912012-06-20 01:48:50 +0200676 def test_read_from_file_with_bytes_filename(self):
677 try:
678 bytes_filename = TESTFN.encode("ascii")
679 except UnicodeEncodeError:
680 self.skipTest("Temporary file name needs to be ASCII")
681 with TempFile(TESTFN, COMPRESSED_XZ):
682 with LZMAFile(bytes_filename) as f:
683 self.assertEqual(f.read(), INPUT)
684 self.assertEqual(f.read(), b"")
685
Nadeem Vawda3ff069e2011-11-30 00:25:06 +0200686 def test_read_incomplete(self):
Nadeem Vawda33c34da2012-06-04 23:34:07 +0200687 with LZMAFile(BytesIO(COMPRESSED_XZ[:128])) as f:
Nadeem Vawda3ff069e2011-11-30 00:25:06 +0200688 self.assertRaises(EOFError, f.read)
689
Serhiy Storchaka57f9b7a2013-01-22 17:07:49 +0200690 def test_read_truncated(self):
691 # Drop stream footer: CRC (4 bytes), index size (4 bytes),
Serhiy Storchaka70ea7fa2013-02-08 11:24:16 +0200692 # flags (2 bytes) and magic number (2 bytes).
Serhiy Storchaka57f9b7a2013-01-22 17:07:49 +0200693 truncated = COMPRESSED_XZ[:-12]
694 with LZMAFile(BytesIO(truncated)) as f:
695 self.assertRaises(EOFError, f.read)
696 with LZMAFile(BytesIO(truncated)) as f:
697 self.assertEqual(f.read(len(INPUT)), INPUT)
698 self.assertRaises(EOFError, f.read, 1)
699 # Incomplete 12-byte header.
700 for i in range(12):
701 with LZMAFile(BytesIO(truncated[:i])) as f:
702 self.assertRaises(EOFError, f.read, 1)
703
Nadeem Vawda3ff069e2011-11-30 00:25:06 +0200704 def test_read_bad_args(self):
Nadeem Vawda33c34da2012-06-04 23:34:07 +0200705 f = LZMAFile(BytesIO(COMPRESSED_XZ))
Nadeem Vawda3ff069e2011-11-30 00:25:06 +0200706 f.close()
707 self.assertRaises(ValueError, f.read)
Nadeem Vawda33c34da2012-06-04 23:34:07 +0200708 with LZMAFile(BytesIO(), "w") as f:
Nadeem Vawda3ff069e2011-11-30 00:25:06 +0200709 self.assertRaises(ValueError, f.read)
Nadeem Vawda33c34da2012-06-04 23:34:07 +0200710 with LZMAFile(BytesIO(COMPRESSED_XZ)) as f:
Nadeem Vawda3ff069e2011-11-30 00:25:06 +0200711 self.assertRaises(TypeError, f.read, None)
712
713 def test_read1(self):
Nadeem Vawda33c34da2012-06-04 23:34:07 +0200714 with LZMAFile(BytesIO(COMPRESSED_XZ)) as f:
Nadeem Vawda3ff069e2011-11-30 00:25:06 +0200715 blocks = []
716 while True:
717 result = f.read1()
718 if not result:
719 break
720 blocks.append(result)
721 self.assertEqual(b"".join(blocks), INPUT)
722 self.assertEqual(f.read1(), b"")
723
724 def test_read1_0(self):
Nadeem Vawda33c34da2012-06-04 23:34:07 +0200725 with LZMAFile(BytesIO(COMPRESSED_XZ)) as f:
Nadeem Vawda3ff069e2011-11-30 00:25:06 +0200726 self.assertEqual(f.read1(0), b"")
727
728 def test_read1_10(self):
Nadeem Vawda33c34da2012-06-04 23:34:07 +0200729 with LZMAFile(BytesIO(COMPRESSED_XZ)) as f:
Nadeem Vawda3ff069e2011-11-30 00:25:06 +0200730 blocks = []
731 while True:
732 result = f.read1(10)
733 if not result:
734 break
735 blocks.append(result)
736 self.assertEqual(b"".join(blocks), INPUT)
737 self.assertEqual(f.read1(), b"")
738
739 def test_read1_multistream(self):
Nadeem Vawda33c34da2012-06-04 23:34:07 +0200740 with LZMAFile(BytesIO(COMPRESSED_XZ * 5)) as f:
Nadeem Vawda3ff069e2011-11-30 00:25:06 +0200741 blocks = []
742 while True:
743 result = f.read1()
744 if not result:
745 break
746 blocks.append(result)
747 self.assertEqual(b"".join(blocks), INPUT * 5)
748 self.assertEqual(f.read1(), b"")
749
750 def test_read1_bad_args(self):
Nadeem Vawda33c34da2012-06-04 23:34:07 +0200751 f = LZMAFile(BytesIO(COMPRESSED_XZ))
Nadeem Vawda3ff069e2011-11-30 00:25:06 +0200752 f.close()
753 self.assertRaises(ValueError, f.read1)
Nadeem Vawda33c34da2012-06-04 23:34:07 +0200754 with LZMAFile(BytesIO(), "w") as f:
Nadeem Vawda3ff069e2011-11-30 00:25:06 +0200755 self.assertRaises(ValueError, f.read1)
Nadeem Vawda33c34da2012-06-04 23:34:07 +0200756 with LZMAFile(BytesIO(COMPRESSED_XZ)) as f:
Nadeem Vawda3ff069e2011-11-30 00:25:06 +0200757 self.assertRaises(TypeError, f.read1, None)
758
759 def test_peek(self):
Nadeem Vawda33c34da2012-06-04 23:34:07 +0200760 with LZMAFile(BytesIO(COMPRESSED_XZ)) as f:
Nadeem Vawda3ff069e2011-11-30 00:25:06 +0200761 result = f.peek()
762 self.assertGreater(len(result), 0)
763 self.assertTrue(INPUT.startswith(result))
764 self.assertEqual(f.read(), INPUT)
Nadeem Vawda33c34da2012-06-04 23:34:07 +0200765 with LZMAFile(BytesIO(COMPRESSED_XZ)) as f:
Nadeem Vawda3ff069e2011-11-30 00:25:06 +0200766 result = f.peek(10)
767 self.assertGreater(len(result), 0)
768 self.assertTrue(INPUT.startswith(result))
769 self.assertEqual(f.read(), INPUT)
770
771 def test_peek_bad_args(self):
Nadeem Vawda33c34da2012-06-04 23:34:07 +0200772 with LZMAFile(BytesIO(), "w") as f:
Nadeem Vawda3ff069e2011-11-30 00:25:06 +0200773 self.assertRaises(ValueError, f.peek)
774
775 def test_iterator(self):
776 with BytesIO(INPUT) as f:
777 lines = f.readlines()
Nadeem Vawda33c34da2012-06-04 23:34:07 +0200778 with LZMAFile(BytesIO(COMPRESSED_XZ)) as f:
Nadeem Vawda3ff069e2011-11-30 00:25:06 +0200779 self.assertListEqual(list(iter(f)), lines)
Nadeem Vawda33c34da2012-06-04 23:34:07 +0200780 with LZMAFile(BytesIO(COMPRESSED_ALONE)) as f:
Nadeem Vawda3ff069e2011-11-30 00:25:06 +0200781 self.assertListEqual(list(iter(f)), lines)
Nadeem Vawda33c34da2012-06-04 23:34:07 +0200782 with LZMAFile(BytesIO(COMPRESSED_XZ), format=lzma.FORMAT_XZ) as f:
Nadeem Vawda3ff069e2011-11-30 00:25:06 +0200783 self.assertListEqual(list(iter(f)), lines)
Nadeem Vawda33c34da2012-06-04 23:34:07 +0200784 with LZMAFile(BytesIO(COMPRESSED_ALONE), format=lzma.FORMAT_ALONE) as f:
Nadeem Vawda3ff069e2011-11-30 00:25:06 +0200785 self.assertListEqual(list(iter(f)), lines)
Nadeem Vawda33c34da2012-06-04 23:34:07 +0200786 with LZMAFile(BytesIO(COMPRESSED_RAW_2),
Nadeem Vawda3ff069e2011-11-30 00:25:06 +0200787 format=lzma.FORMAT_RAW, filters=FILTERS_RAW_2) as f:
788 self.assertListEqual(list(iter(f)), lines)
789
790 def test_readline(self):
791 with BytesIO(INPUT) as f:
792 lines = f.readlines()
Nadeem Vawda33c34da2012-06-04 23:34:07 +0200793 with LZMAFile(BytesIO(COMPRESSED_XZ)) as f:
Nadeem Vawda3ff069e2011-11-30 00:25:06 +0200794 for line in lines:
795 self.assertEqual(f.readline(), line)
796
797 def test_readlines(self):
798 with BytesIO(INPUT) as f:
799 lines = f.readlines()
Nadeem Vawda33c34da2012-06-04 23:34:07 +0200800 with LZMAFile(BytesIO(COMPRESSED_XZ)) as f:
Nadeem Vawda3ff069e2011-11-30 00:25:06 +0200801 self.assertListEqual(f.readlines(), lines)
802
803 def test_write(self):
804 with BytesIO() as dst:
Nadeem Vawda33c34da2012-06-04 23:34:07 +0200805 with LZMAFile(dst, "w") as f:
Nadeem Vawda3ff069e2011-11-30 00:25:06 +0200806 f.write(INPUT)
807 expected = lzma.compress(INPUT)
808 self.assertEqual(dst.getvalue(), expected)
809 with BytesIO() as dst:
Nadeem Vawda33c34da2012-06-04 23:34:07 +0200810 with LZMAFile(dst, "w", format=lzma.FORMAT_XZ) as f:
Nadeem Vawda3ff069e2011-11-30 00:25:06 +0200811 f.write(INPUT)
812 expected = lzma.compress(INPUT, format=lzma.FORMAT_XZ)
813 self.assertEqual(dst.getvalue(), expected)
814 with BytesIO() as dst:
Nadeem Vawda33c34da2012-06-04 23:34:07 +0200815 with LZMAFile(dst, "w", format=lzma.FORMAT_ALONE) as f:
Nadeem Vawda3ff069e2011-11-30 00:25:06 +0200816 f.write(INPUT)
817 expected = lzma.compress(INPUT, format=lzma.FORMAT_ALONE)
818 self.assertEqual(dst.getvalue(), expected)
819 with BytesIO() as dst:
Nadeem Vawda33c34da2012-06-04 23:34:07 +0200820 with LZMAFile(dst, "w", format=lzma.FORMAT_RAW,
Nadeem Vawda3ff069e2011-11-30 00:25:06 +0200821 filters=FILTERS_RAW_2) as f:
822 f.write(INPUT)
823 expected = lzma.compress(INPUT, format=lzma.FORMAT_RAW,
824 filters=FILTERS_RAW_2)
825 self.assertEqual(dst.getvalue(), expected)
826
827 def test_write_10(self):
828 with BytesIO() as dst:
Nadeem Vawda33c34da2012-06-04 23:34:07 +0200829 with LZMAFile(dst, "w") as f:
Nadeem Vawda3ff069e2011-11-30 00:25:06 +0200830 for start in range(0, len(INPUT), 10):
831 f.write(INPUT[start:start+10])
832 expected = lzma.compress(INPUT)
833 self.assertEqual(dst.getvalue(), expected)
834
835 def test_write_append(self):
836 part1 = INPUT[:1024]
837 part2 = INPUT[1024:1536]
838 part3 = INPUT[1536:]
839 expected = b"".join(lzma.compress(x) for x in (part1, part2, part3))
840 with BytesIO() as dst:
Nadeem Vawda33c34da2012-06-04 23:34:07 +0200841 with LZMAFile(dst, "w") as f:
Nadeem Vawda3ff069e2011-11-30 00:25:06 +0200842 f.write(part1)
Nadeem Vawda33c34da2012-06-04 23:34:07 +0200843 with LZMAFile(dst, "a") as f:
Nadeem Vawda3ff069e2011-11-30 00:25:06 +0200844 f.write(part2)
Nadeem Vawda33c34da2012-06-04 23:34:07 +0200845 with LZMAFile(dst, "a") as f:
Nadeem Vawda3ff069e2011-11-30 00:25:06 +0200846 f.write(part3)
847 self.assertEqual(dst.getvalue(), expected)
848
849 def test_write_to_file(self):
850 try:
851 with LZMAFile(TESTFN, "w") as f:
852 f.write(INPUT)
853 expected = lzma.compress(INPUT)
854 with open(TESTFN, "rb") as f:
855 self.assertEqual(f.read(), expected)
856 finally:
857 unlink(TESTFN)
858
Nadeem Vawda10c87912012-06-20 01:48:50 +0200859 def test_write_to_file_with_bytes_filename(self):
860 try:
861 bytes_filename = TESTFN.encode("ascii")
862 except UnicodeEncodeError:
863 self.skipTest("Temporary file name needs to be ASCII")
864 try:
865 with LZMAFile(bytes_filename, "w") as f:
866 f.write(INPUT)
867 expected = lzma.compress(INPUT)
868 with open(TESTFN, "rb") as f:
869 self.assertEqual(f.read(), expected)
870 finally:
871 unlink(TESTFN)
872
Nadeem Vawda3ff069e2011-11-30 00:25:06 +0200873 def test_write_append_to_file(self):
874 part1 = INPUT[:1024]
875 part2 = INPUT[1024:1536]
876 part3 = INPUT[1536:]
877 expected = b"".join(lzma.compress(x) for x in (part1, part2, part3))
878 try:
879 with LZMAFile(TESTFN, "w") as f:
880 f.write(part1)
881 with LZMAFile(TESTFN, "a") as f:
882 f.write(part2)
883 with LZMAFile(TESTFN, "a") as f:
884 f.write(part3)
885 with open(TESTFN, "rb") as f:
886 self.assertEqual(f.read(), expected)
887 finally:
888 unlink(TESTFN)
889
890 def test_write_bad_args(self):
Nadeem Vawda33c34da2012-06-04 23:34:07 +0200891 f = LZMAFile(BytesIO(), "w")
Nadeem Vawda3ff069e2011-11-30 00:25:06 +0200892 f.close()
893 self.assertRaises(ValueError, f.write, b"foo")
Nadeem Vawda33c34da2012-06-04 23:34:07 +0200894 with LZMAFile(BytesIO(COMPRESSED_XZ), "r") as f:
Nadeem Vawda3ff069e2011-11-30 00:25:06 +0200895 self.assertRaises(ValueError, f.write, b"bar")
Nadeem Vawda33c34da2012-06-04 23:34:07 +0200896 with LZMAFile(BytesIO(), "w") as f:
Nadeem Vawda3ff069e2011-11-30 00:25:06 +0200897 self.assertRaises(TypeError, f.write, None)
898 self.assertRaises(TypeError, f.write, "text")
899 self.assertRaises(TypeError, f.write, 789)
900
901 def test_writelines(self):
902 with BytesIO(INPUT) as f:
903 lines = f.readlines()
904 with BytesIO() as dst:
Nadeem Vawda33c34da2012-06-04 23:34:07 +0200905 with LZMAFile(dst, "w") as f:
Nadeem Vawda3ff069e2011-11-30 00:25:06 +0200906 f.writelines(lines)
907 expected = lzma.compress(INPUT)
908 self.assertEqual(dst.getvalue(), expected)
909
910 def test_seek_forward(self):
Nadeem Vawda33c34da2012-06-04 23:34:07 +0200911 with LZMAFile(BytesIO(COMPRESSED_XZ)) as f:
Nadeem Vawda3ff069e2011-11-30 00:25:06 +0200912 f.seek(555)
913 self.assertEqual(f.read(), INPUT[555:])
914
915 def test_seek_forward_across_streams(self):
Nadeem Vawda33c34da2012-06-04 23:34:07 +0200916 with LZMAFile(BytesIO(COMPRESSED_XZ * 2)) as f:
Nadeem Vawda3ff069e2011-11-30 00:25:06 +0200917 f.seek(len(INPUT) + 123)
918 self.assertEqual(f.read(), INPUT[123:])
919
920 def test_seek_forward_relative_to_current(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.read(100)
923 f.seek(1236, 1)
924 self.assertEqual(f.read(), INPUT[1336:])
925
926 def test_seek_forward_relative_to_end(self):
Nadeem Vawda33c34da2012-06-04 23:34:07 +0200927 with LZMAFile(BytesIO(COMPRESSED_XZ)) as f:
Nadeem Vawda3ff069e2011-11-30 00:25:06 +0200928 f.seek(-555, 2)
929 self.assertEqual(f.read(), INPUT[-555:])
930
931 def test_seek_backward(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.read(1001)
934 f.seek(211)
935 self.assertEqual(f.read(), INPUT[211:])
936
937 def test_seek_backward_across_streams(self):
Nadeem Vawda33c34da2012-06-04 23:34:07 +0200938 with LZMAFile(BytesIO(COMPRESSED_XZ * 2)) as f:
Nadeem Vawda3ff069e2011-11-30 00:25:06 +0200939 f.read(len(INPUT) + 333)
940 f.seek(737)
941 self.assertEqual(f.read(), INPUT[737:] + INPUT)
942
943 def test_seek_backward_relative_to_end(self):
Nadeem Vawda33c34da2012-06-04 23:34:07 +0200944 with LZMAFile(BytesIO(COMPRESSED_XZ)) as f:
Nadeem Vawda3ff069e2011-11-30 00:25:06 +0200945 f.seek(-150, 2)
946 self.assertEqual(f.read(), INPUT[-150:])
947
948 def test_seek_past_end(self):
Nadeem Vawda33c34da2012-06-04 23:34:07 +0200949 with LZMAFile(BytesIO(COMPRESSED_XZ)) as f:
Nadeem Vawda3ff069e2011-11-30 00:25:06 +0200950 f.seek(len(INPUT) + 9001)
951 self.assertEqual(f.tell(), len(INPUT))
952 self.assertEqual(f.read(), b"")
953
954 def test_seek_past_start(self):
Nadeem Vawda33c34da2012-06-04 23:34:07 +0200955 with LZMAFile(BytesIO(COMPRESSED_XZ)) as f:
Nadeem Vawda3ff069e2011-11-30 00:25:06 +0200956 f.seek(-88)
957 self.assertEqual(f.tell(), 0)
958 self.assertEqual(f.read(), INPUT)
959
960 def test_seek_bad_args(self):
Nadeem Vawda33c34da2012-06-04 23:34:07 +0200961 f = LZMAFile(BytesIO(COMPRESSED_XZ))
Nadeem Vawda3ff069e2011-11-30 00:25:06 +0200962 f.close()
963 self.assertRaises(ValueError, f.seek, 0)
Nadeem Vawda33c34da2012-06-04 23:34:07 +0200964 with LZMAFile(BytesIO(), "w") as f:
Nadeem Vawda3ff069e2011-11-30 00:25:06 +0200965 self.assertRaises(ValueError, f.seek, 0)
Nadeem Vawda33c34da2012-06-04 23:34:07 +0200966 with LZMAFile(BytesIO(COMPRESSED_XZ)) as f:
Nadeem Vawda3ff069e2011-11-30 00:25:06 +0200967 self.assertRaises(ValueError, f.seek, 0, 3)
968 self.assertRaises(ValueError, f.seek, 9, ())
969 self.assertRaises(TypeError, f.seek, None)
970 self.assertRaises(TypeError, f.seek, b"derp")
971
972 def test_tell(self):
Nadeem Vawda33c34da2012-06-04 23:34:07 +0200973 with LZMAFile(BytesIO(COMPRESSED_XZ)) as f:
Nadeem Vawda3ff069e2011-11-30 00:25:06 +0200974 pos = 0
975 while True:
976 self.assertEqual(f.tell(), pos)
977 result = f.read(183)
978 if not result:
979 break
980 pos += len(result)
981 self.assertEqual(f.tell(), len(INPUT))
Nadeem Vawda33c34da2012-06-04 23:34:07 +0200982 with LZMAFile(BytesIO(), "w") as f:
Nadeem Vawda3ff069e2011-11-30 00:25:06 +0200983 for pos in range(0, len(INPUT), 144):
984 self.assertEqual(f.tell(), pos)
985 f.write(INPUT[pos:pos+144])
986 self.assertEqual(f.tell(), len(INPUT))
987
988 def test_tell_bad_args(self):
Nadeem Vawda33c34da2012-06-04 23:34:07 +0200989 f = LZMAFile(BytesIO(COMPRESSED_XZ))
Nadeem Vawda3ff069e2011-11-30 00:25:06 +0200990 f.close()
991 self.assertRaises(ValueError, f.tell)
992
993
Nadeem Vawdae8604042012-06-04 23:38:12 +0200994class OpenTestCase(unittest.TestCase):
995
996 def test_binary_modes(self):
997 with lzma.open(BytesIO(COMPRESSED_XZ), "rb") as f:
998 self.assertEqual(f.read(), INPUT)
999 with BytesIO() as bio:
1000 with lzma.open(bio, "wb") as f:
1001 f.write(INPUT)
1002 file_data = lzma.decompress(bio.getvalue())
1003 self.assertEqual(file_data, INPUT)
1004 with lzma.open(bio, "ab") as f:
1005 f.write(INPUT)
1006 file_data = lzma.decompress(bio.getvalue())
1007 self.assertEqual(file_data, INPUT * 2)
1008
1009 def test_text_modes(self):
1010 uncompressed = INPUT.decode("ascii")
1011 uncompressed_raw = uncompressed.replace("\n", os.linesep)
1012 with lzma.open(BytesIO(COMPRESSED_XZ), "rt") as f:
1013 self.assertEqual(f.read(), uncompressed)
1014 with BytesIO() as bio:
1015 with lzma.open(bio, "wt") as f:
1016 f.write(uncompressed)
1017 file_data = lzma.decompress(bio.getvalue()).decode("ascii")
1018 self.assertEqual(file_data, uncompressed_raw)
1019 with lzma.open(bio, "at") as f:
1020 f.write(uncompressed)
1021 file_data = lzma.decompress(bio.getvalue()).decode("ascii")
1022 self.assertEqual(file_data, uncompressed_raw * 2)
1023
1024 def test_filename(self):
1025 with TempFile(TESTFN):
1026 with lzma.open(TESTFN, "wb") as f:
1027 f.write(INPUT)
1028 with open(TESTFN, "rb") as f:
1029 file_data = lzma.decompress(f.read())
1030 self.assertEqual(file_data, INPUT)
1031 with lzma.open(TESTFN, "rb") as f:
1032 self.assertEqual(f.read(), INPUT)
1033 with lzma.open(TESTFN, "ab") as f:
1034 f.write(INPUT)
1035 with lzma.open(TESTFN, "rb") as f:
1036 self.assertEqual(f.read(), INPUT * 2)
1037
1038 def test_bad_params(self):
1039 # Test invalid parameter combinations.
1040 with self.assertRaises(ValueError):
1041 lzma.open(TESTFN, "")
1042 with self.assertRaises(ValueError):
Nadeem Vawdae8604042012-06-04 23:38:12 +02001043 lzma.open(TESTFN, "rbt")
1044 with self.assertRaises(ValueError):
1045 lzma.open(TESTFN, "rb", encoding="utf-8")
1046 with self.assertRaises(ValueError):
1047 lzma.open(TESTFN, "rb", errors="ignore")
1048 with self.assertRaises(ValueError):
1049 lzma.open(TESTFN, "rb", newline="\n")
1050
1051 def test_format_and_filters(self):
1052 # Test non-default format and filter chain.
1053 options = {"format": lzma.FORMAT_RAW, "filters": FILTERS_RAW_1}
1054 with lzma.open(BytesIO(COMPRESSED_RAW_1), "rb", **options) as f:
1055 self.assertEqual(f.read(), INPUT)
1056 with BytesIO() as bio:
1057 with lzma.open(bio, "wb", **options) as f:
1058 f.write(INPUT)
1059 file_data = lzma.decompress(bio.getvalue(), **options)
1060 self.assertEqual(file_data, INPUT)
1061
1062 def test_encoding(self):
1063 # Test non-default encoding.
1064 uncompressed = INPUT.decode("ascii")
1065 uncompressed_raw = uncompressed.replace("\n", os.linesep)
1066 with BytesIO() as bio:
1067 with lzma.open(bio, "wt", encoding="utf-16-le") as f:
1068 f.write(uncompressed)
1069 file_data = lzma.decompress(bio.getvalue()).decode("utf-16-le")
1070 self.assertEqual(file_data, uncompressed_raw)
1071 bio.seek(0)
1072 with lzma.open(bio, "rt", encoding="utf-16-le") as f:
1073 self.assertEqual(f.read(), uncompressed)
1074
1075 def test_encoding_error_handler(self):
1076 # Test wih non-default encoding error handler.
1077 with BytesIO(lzma.compress(b"foo\xffbar")) as bio:
1078 with lzma.open(bio, "rt", encoding="ascii", errors="ignore") as f:
1079 self.assertEqual(f.read(), "foobar")
1080
1081 def test_newline(self):
1082 # Test with explicit newline (universal newline mode disabled).
1083 text = INPUT.decode("ascii")
1084 with BytesIO() as bio:
1085 with lzma.open(bio, "wt", newline="\n") as f:
1086 f.write(text)
1087 bio.seek(0)
1088 with lzma.open(bio, "rt", newline="\r") as f:
1089 self.assertEqual(f.readlines(), [text])
1090
Nadeem Vawda42ca9822013-10-19 00:06:19 +02001091 def test_x_mode(self):
1092 self.addCleanup(unlink, TESTFN)
1093 for mode in ("x", "xb", "xt"):
1094 unlink(TESTFN)
1095 with lzma.open(TESTFN, mode):
1096 pass
1097 with self.assertRaises(FileExistsError):
1098 with lzma.open(TESTFN, mode):
1099 pass
1100
Nadeem Vawdae8604042012-06-04 23:38:12 +02001101
Nadeem Vawda3ff069e2011-11-30 00:25:06 +02001102class MiscellaneousTestCase(unittest.TestCase):
1103
1104 def test_is_check_supported(self):
1105 # CHECK_NONE and CHECK_CRC32 should always be supported,
1106 # regardless of the options liblzma was compiled with.
Nadeem Vawdabc459bb2012-05-06 23:01:51 +02001107 self.assertTrue(lzma.is_check_supported(lzma.CHECK_NONE))
1108 self.assertTrue(lzma.is_check_supported(lzma.CHECK_CRC32))
Nadeem Vawda3ff069e2011-11-30 00:25:06 +02001109
1110 # The .xz format spec cannot store check IDs above this value.
Nadeem Vawdabc459bb2012-05-06 23:01:51 +02001111 self.assertFalse(lzma.is_check_supported(lzma.CHECK_ID_MAX + 1))
Nadeem Vawda3ff069e2011-11-30 00:25:06 +02001112
1113 # This value should not be a valid check ID.
Nadeem Vawdabc459bb2012-05-06 23:01:51 +02001114 self.assertFalse(lzma.is_check_supported(lzma.CHECK_UNKNOWN))
Nadeem Vawda3ff069e2011-11-30 00:25:06 +02001115
Nadeem Vawdaa425c3d2012-06-21 23:36:48 +02001116 def test__encode_filter_properties(self):
Nadeem Vawdaf55b3292012-05-06 23:01:27 +02001117 with self.assertRaises(TypeError):
Nadeem Vawdaa425c3d2012-06-21 23:36:48 +02001118 lzma._encode_filter_properties(b"not a dict")
Nadeem Vawdaf55b3292012-05-06 23:01:27 +02001119 with self.assertRaises(ValueError):
Nadeem Vawdaa425c3d2012-06-21 23:36:48 +02001120 lzma._encode_filter_properties({"id": 0x100})
Nadeem Vawdaf55b3292012-05-06 23:01:27 +02001121 with self.assertRaises(ValueError):
Nadeem Vawdaa425c3d2012-06-21 23:36:48 +02001122 lzma._encode_filter_properties({"id": lzma.FILTER_LZMA2, "junk": 12})
Nadeem Vawdaf55b3292012-05-06 23:01:27 +02001123 with self.assertRaises(lzma.LZMAError):
Nadeem Vawdaa425c3d2012-06-21 23:36:48 +02001124 lzma._encode_filter_properties({"id": lzma.FILTER_DELTA,
Nadeem Vawdaf55b3292012-05-06 23:01:27 +02001125 "dist": 9001})
1126
1127 # Test with parameters used by zipfile module.
Nadeem Vawdaa425c3d2012-06-21 23:36:48 +02001128 props = lzma._encode_filter_properties({
Nadeem Vawdaf55b3292012-05-06 23:01:27 +02001129 "id": lzma.FILTER_LZMA1,
1130 "pb": 2,
1131 "lp": 0,
1132 "lc": 3,
1133 "dict_size": 8 << 20,
1134 })
1135 self.assertEqual(props, b"]\x00\x00\x80\x00")
1136
Nadeem Vawdaa425c3d2012-06-21 23:36:48 +02001137 def test__decode_filter_properties(self):
Nadeem Vawdaf55b3292012-05-06 23:01:27 +02001138 with self.assertRaises(TypeError):
Nadeem Vawdaa425c3d2012-06-21 23:36:48 +02001139 lzma._decode_filter_properties(lzma.FILTER_X86, {"should be": bytes})
Nadeem Vawdaf55b3292012-05-06 23:01:27 +02001140 with self.assertRaises(lzma.LZMAError):
Nadeem Vawdaa425c3d2012-06-21 23:36:48 +02001141 lzma._decode_filter_properties(lzma.FILTER_DELTA, b"too long")
Nadeem Vawdaf55b3292012-05-06 23:01:27 +02001142
1143 # Test with parameters used by zipfile module.
Nadeem Vawdaa425c3d2012-06-21 23:36:48 +02001144 filterspec = lzma._decode_filter_properties(
Nadeem Vawdaf55b3292012-05-06 23:01:27 +02001145 lzma.FILTER_LZMA1, b"]\x00\x00\x80\x00")
1146 self.assertEqual(filterspec["id"], lzma.FILTER_LZMA1)
1147 self.assertEqual(filterspec["pb"], 2)
1148 self.assertEqual(filterspec["lp"], 0)
1149 self.assertEqual(filterspec["lc"], 3)
1150 self.assertEqual(filterspec["dict_size"], 8 << 20)
1151
1152 def test_filter_properties_roundtrip(self):
Nadeem Vawdaa425c3d2012-06-21 23:36:48 +02001153 spec1 = lzma._decode_filter_properties(
Nadeem Vawdaf55b3292012-05-06 23:01:27 +02001154 lzma.FILTER_LZMA1, b"]\x00\x00\x80\x00")
Nadeem Vawdaa425c3d2012-06-21 23:36:48 +02001155 reencoded = lzma._encode_filter_properties(spec1)
1156 spec2 = lzma._decode_filter_properties(lzma.FILTER_LZMA1, reencoded)
Nadeem Vawdaf55b3292012-05-06 23:01:27 +02001157 self.assertEqual(spec1, spec2)
1158
Nadeem Vawda3ff069e2011-11-30 00:25:06 +02001159
1160# Test data:
1161
1162INPUT = b"""
1163LAERTES
1164
1165 O, fear me not.
1166 I stay too long: but here my father comes.
1167
1168 Enter POLONIUS
1169
1170 A double blessing is a double grace,
1171 Occasion smiles upon a second leave.
1172
1173LORD POLONIUS
1174
1175 Yet here, Laertes! aboard, aboard, for shame!
1176 The wind sits in the shoulder of your sail,
1177 And you are stay'd for. There; my blessing with thee!
1178 And these few precepts in thy memory
1179 See thou character. Give thy thoughts no tongue,
1180 Nor any unproportioned thought his act.
1181 Be thou familiar, but by no means vulgar.
1182 Those friends thou hast, and their adoption tried,
1183 Grapple them to thy soul with hoops of steel;
1184 But do not dull thy palm with entertainment
1185 Of each new-hatch'd, unfledged comrade. Beware
1186 Of entrance to a quarrel, but being in,
1187 Bear't that the opposed may beware of thee.
1188 Give every man thy ear, but few thy voice;
1189 Take each man's censure, but reserve thy judgment.
1190 Costly thy habit as thy purse can buy,
1191 But not express'd in fancy; rich, not gaudy;
1192 For the apparel oft proclaims the man,
1193 And they in France of the best rank and station
1194 Are of a most select and generous chief in that.
1195 Neither a borrower nor a lender be;
1196 For loan oft loses both itself and friend,
1197 And borrowing dulls the edge of husbandry.
1198 This above all: to thine ownself be true,
1199 And it must follow, as the night the day,
1200 Thou canst not then be false to any man.
1201 Farewell: my blessing season this in thee!
1202
1203LAERTES
1204
1205 Most humbly do I take my leave, my lord.
1206
1207LORD POLONIUS
1208
1209 The time invites you; go; your servants tend.
1210
1211LAERTES
1212
1213 Farewell, Ophelia; and remember well
1214 What I have said to you.
1215
1216OPHELIA
1217
1218 'Tis in my memory lock'd,
1219 And you yourself shall keep the key of it.
1220
1221LAERTES
1222
1223 Farewell.
1224"""
1225
1226COMPRESSED_XZ = (
1227 b"\xfd7zXZ\x00\x00\x04\xe6\xd6\xb4F\x02\x00!\x01\x16\x00\x00\x00t/\xe5\xa3"
1228 b"\xe0\x07\x80\x03\xdf]\x00\x05\x14\x07bX\x19\xcd\xddn\x98\x15\xe4\xb4\x9d"
1229 b"o\x1d\xc4\xe5\n\x03\xcc2h\xc7\\\x86\xff\xf8\xe2\xfc\xe7\xd9\xfe6\xb8("
1230 b"\xa8wd\xc2\"u.n\x1e\xc3\xf2\x8e\x8d\x8f\x02\x17/\xa6=\xf0\xa2\xdf/M\x89"
1231 b"\xbe\xde\xa7\x1cz\x18-]\xd5\xef\x13\x8frZ\x15\x80\x8c\xf8\x8do\xfa\x12"
1232 b"\x9b#z/\xef\xf0\xfaF\x01\x82\xa3M\x8e\xa1t\xca6 BF$\xe5Q\xa4\x98\xee\xde"
1233 b"l\xe8\x7f\xf0\x9d,bn\x0b\x13\xd4\xa8\x81\xe4N\xc8\x86\x153\xf5x2\xa2O"
1234 b"\x13@Q\xa1\x00/\xa5\xd0O\x97\xdco\xae\xf7z\xc4\xcdS\xb6t<\x16\xf2\x9cI#"
1235 b"\x89ud\xc66Y\xd9\xee\xe6\xce\x12]\xe5\xf0\xaa\x96-Pe\xade:\x04\t\x1b\xf7"
1236 b"\xdb7\n\x86\x1fp\xc8J\xba\xf4\xf0V\xa9\xdc\xf0\x02%G\xf9\xdf=?\x15\x1b"
1237 b"\xe1(\xce\x82=\xd6I\xac3\x12\x0cR\xb7\xae\r\xb1i\x03\x95\x01\xbd\xbe\xfa"
1238 b"\x02s\x01P\x9d\x96X\xb12j\xc8L\xa8\x84b\xf6\xc3\xd4c-H\x93oJl\xd0iQ\xe4k"
1239 b"\x84\x0b\xc1\xb7\xbc\xb1\x17\x88\xb1\xca?@\xf6\x07\xea\xe6x\xf1H12P\x0f"
1240 b"\x8a\xc9\xeauw\xe3\xbe\xaai\xa9W\xd0\x80\xcd#cb5\x99\xd8]\xa9d\x0c\xbd"
1241 b"\xa2\xdcWl\xedUG\xbf\x89yF\xf77\x81v\xbd5\x98\xbeh8\x18W\x08\xf0\x1b\x99"
1242 b"5:\x1a?rD\x96\xa1\x04\x0f\xae\xba\x85\xeb\x9d5@\xf5\x83\xd37\x83\x8ac"
1243 b"\x06\xd4\x97i\xcdt\x16S\x82k\xf6K\x01vy\x88\x91\x9b6T\xdae\r\xfd]:k\xbal"
1244 b"\xa9\xbba\xc34\xf9r\xeb}r\xdb\xc7\xdb*\x8f\x03z\xdc8h\xcc\xc9\xd3\xbcl"
1245 b"\xa5-\xcb\xeaK\xa2\xc5\x15\xc0\xe3\xc1\x86Z\xfb\xebL\xe13\xcf\x9c\xe3"
1246 b"\x1d\xc9\xed\xc2\x06\xcc\xce!\x92\xe5\xfe\x9c^\xa59w \x9bP\xa3PK\x08d"
1247 b"\xf9\xe2Z}\xa7\xbf\xed\xeb%$\x0c\x82\xb8/\xb0\x01\xa9&,\xf7qh{Q\x96)\xf2"
1248 b"q\x96\xc3\x80\xb4\x12\xb0\xba\xe6o\xf4!\xb4[\xd4\x8aw\x10\xf7t\x0c\xb3"
1249 b"\xd9\xd5\xc3`^\x81\x11??\\\xa4\x99\x85R\xd4\x8e\x83\xc9\x1eX\xbfa\xf1"
1250 b"\xac\xb0\xea\xea\xd7\xd0\xab\x18\xe2\xf2\xed\xe1\xb7\xc9\x18\xcbS\xe4>"
1251 b"\xc9\x95H\xe8\xcb\t\r%\xeb\xc7$.o\xf1\xf3R\x17\x1db\xbb\xd8U\xa5^\xccS"
1252 b"\x16\x01\x87\xf3/\x93\xd1\xf0v\xc0r\xd7\xcc\xa2Gkz\xca\x80\x0e\xfd\xd0"
1253 b"\x8b\xbb\xd2Ix\xb3\x1ey\xca-0\xe3z^\xd6\xd6\x8f_\xf1\x9dP\x9fi\xa7\xd1"
1254 b"\xe8\x90\x84\xdc\xbf\xcdky\x8e\xdc\x81\x7f\xa3\xb2+\xbf\x04\xef\xd8\\"
1255 b"\xc4\xdf\xe1\xb0\x01\xe9\x93\xe3Y\xf1\x1dY\xe8h\x81\xcf\xf1w\xcc\xb4\xef"
1256 b" \x8b|\x04\xea\x83ej\xbe\x1f\xd4z\x9c`\xd3\x1a\x92A\x06\xe5\x8f\xa9\x13"
1257 b"\t\x9e=\xfa\x1c\xe5_\x9f%v\x1bo\x11ZO\xd8\xf4\t\xddM\x16-\x04\xfc\x18<\""
1258 b"CM\xddg~b\xf6\xef\x8e\x0c\xd0\xde|\xa0'\x8a\x0c\xd6x\xae!J\xa6F\x88\x15u"
1259 b"\x008\x17\xbc7y\xb3\xd8u\xac_\x85\x8d\xe7\xc1@\x9c\xecqc\xa3#\xad\xf1"
1260 b"\x935\xb5)_\r\xec3]\x0fo]5\xd0my\x07\x9b\xee\x81\xb5\x0f\xcfK+\x00\xc0"
1261 b"\xe4b\x10\xe4\x0c\x1a \x9b\xe0\x97t\xf6\xa1\x9e\x850\xba\x0c\x9a\x8d\xc8"
1262 b"\x8f\x07\xd7\xae\xc8\xf9+i\xdc\xb9k\xb0>f\x19\xb8\r\xa8\xf8\x1f$\xa5{p"
1263 b"\xc6\x880\xce\xdb\xcf\xca_\x86\xac\x88h6\x8bZ%'\xd0\n\xbf\x0f\x9c\"\xba"
1264 b"\xe5\x86\x9f\x0f7X=mNX[\xcc\x19FU\xc9\x860\xbc\x90a+* \xae_$\x03\x1e\xd3"
1265 b"\xcd_\xa0\x9c\xde\xaf46q\xa5\xc9\x92\xd7\xca\xe3`\x9d\x85}\xb4\xff\xb3"
1266 b"\x83\xfb\xb6\xca\xae`\x0bw\x7f\xfc\xd8\xacVe\x19\xc8\x17\x0bZ\xad\x88"
1267 b"\xeb#\x97\x03\x13\xb1d\x0f{\x0c\x04w\x07\r\x97\xbd\xd6\xc1\xc3B:\x95\x08"
1268 b"^\x10V\xaeaH\x02\xd9\xe3\n\\\x01X\xf6\x9c\x8a\x06u#%\xbe*\xa1\x18v\x85"
1269 b"\xec!\t4\x00\x00\x00\x00Vj?uLU\xf3\xa6\x00\x01\xfb\x07\x81\x0f\x00\x00tw"
1270 b"\x99P\xb1\xc4g\xfb\x02\x00\x00\x00\x00\x04YZ"
1271)
1272
1273COMPRESSED_ALONE = (
1274 b"]\x00\x00\x80\x00\xff\xff\xff\xff\xff\xff\xff\xff\x00\x05\x14\x07bX\x19"
1275 b"\xcd\xddn\x98\x15\xe4\xb4\x9do\x1d\xc4\xe5\n\x03\xcc2h\xc7\\\x86\xff\xf8"
1276 b"\xe2\xfc\xe7\xd9\xfe6\xb8(\xa8wd\xc2\"u.n\x1e\xc3\xf2\x8e\x8d\x8f\x02"
1277 b"\x17/\xa6=\xf0\xa2\xdf/M\x89\xbe\xde\xa7\x1cz\x18-]\xd5\xef\x13\x8frZ"
1278 b"\x15\x80\x8c\xf8\x8do\xfa\x12\x9b#z/\xef\xf0\xfaF\x01\x82\xa3M\x8e\xa1t"
1279 b"\xca6 BF$\xe5Q\xa4\x98\xee\xdel\xe8\x7f\xf0\x9d,bn\x0b\x13\xd4\xa8\x81"
1280 b"\xe4N\xc8\x86\x153\xf5x2\xa2O\x13@Q\xa1\x00/\xa5\xd0O\x97\xdco\xae\xf7z"
1281 b"\xc4\xcdS\xb6t<\x16\xf2\x9cI#\x89ud\xc66Y\xd9\xee\xe6\xce\x12]\xe5\xf0"
1282 b"\xaa\x96-Pe\xade:\x04\t\x1b\xf7\xdb7\n\x86\x1fp\xc8J\xba\xf4\xf0V\xa9"
1283 b"\xdc\xf0\x02%G\xf9\xdf=?\x15\x1b\xe1(\xce\x82=\xd6I\xac3\x12\x0cR\xb7"
1284 b"\xae\r\xb1i\x03\x95\x01\xbd\xbe\xfa\x02s\x01P\x9d\x96X\xb12j\xc8L\xa8"
1285 b"\x84b\xf8\x1epl\xeajr\xd1=\t\x03\xdd\x13\x1b3!E\xf9vV\xdaF\xf3\xd7\xb4"
1286 b"\x0c\xa9P~\xec\xdeE\xe37\xf6\x1d\xc6\xbb\xddc%\xb6\x0fI\x07\xf0;\xaf\xe7"
1287 b"\xa0\x8b\xa7Z\x99(\xe9\xe2\xf0o\x18>`\xe1\xaa\xa8\xd9\xa1\xb2}\xe7\x8d"
1288 b"\x834T\xb6\xef\xc1\xde\xe3\x98\xbcD\x03MA@\xd8\xed\xdc\xc8\x93\x03\x1a"
1289 b"\x93\x0b\x7f\x94\x12\x0b\x02Sa\x18\xc9\xc5\x9bTJE}\xf6\xc8g\x17#ZV\x01"
1290 b"\xc9\x9dc\x83\x0e>0\x16\x90S\xb8/\x03y_\x18\xfa(\xd7\x0br\xa2\xb0\xba?"
1291 b"\x8c\xe6\x83@\x84\xdf\x02:\xc5z\x9e\xa6\x84\xc9\xf5BeyX\x83\x1a\xf1 :\t"
1292 b"\xf7\x19\xfexD\\&G\xf3\x85Y\xa2J\xf9\x0bv{\x89\xf6\xe7)A\xaf\x04o\x00"
1293 b"\x075\xd3\xe0\x7f\x97\x98F\x0f?v\x93\xedVtTf\xb5\x97\x83\xed\x19\xd7\x1a"
1294 b"'k\xd7\xd9\xc5\\Y\xd1\xdc\x07\x15|w\xbc\xacd\x87\x08d\xec\xa7\xf6\x82"
1295 b"\xfc\xb3\x93\xeb\xb9 \x8d\xbc ,\xb3X\xb0\xd2s\xd7\xd1\xffv\x05\xdf}\xa2"
1296 b"\x96\xfb%\n\xdf\xa2\x7f\x08.\xa16\n\xe0\x19\x93\x7fh\n\x1c\x8c\x0f \x11"
1297 b"\xc6Bl\x95\x19U}\xe4s\xb5\x10H\xea\x86pB\xe88\x95\xbe\x8cZ\xdb\xe4\x94A"
1298 b"\x92\xb9;z\xaa\xa7{\x1c5!\xc0\xaf\xc1A\xf9\xda\xf0$\xb0\x02qg\xc8\xc7/|"
1299 b"\xafr\x99^\x91\x88\xbf\x03\xd9=\xd7n\xda6{>8\n\xc7:\xa9'\xba.\x0b\xe2"
1300 b"\xb5\x1d\x0e\n\x9a\x8e\x06\x8f:\xdd\x82'[\xc3\"wD$\xa7w\xecq\x8c,1\x93"
1301 b"\xd0,\xae2w\x93\x12$Jd\x19mg\x02\x93\x9cA\x95\x9d&\xca8i\x9c\xb0;\xe7NQ"
1302 b"\x1frh\x8beL;\xb0m\xee\x07Q\x9b\xc6\xd8\x03\xb5\xdeN\xd4\xfe\x98\xd0\xdc"
1303 b"\x1a[\x04\xde\x1a\xf6\x91j\xf8EOli\x8eB^\x1d\x82\x07\xb2\xb5R]\xb7\xd7"
1304 b"\xe9\xa6\xc3.\xfb\xf0-\xb4e\x9b\xde\x03\x88\xc6\xc1iN\x0e\x84wbQ\xdf~"
1305 b"\xe9\xa4\x884\x96kM\xbc)T\xf3\x89\x97\x0f\x143\xe7)\xa0\xb3B\x00\xa8\xaf"
1306 b"\x82^\xcb\xc7..\xdb\xc7\t\x9dH\xee5\xe9#\xe6NV\x94\xcb$Kk\xe3\x7f\r\xe3t"
1307 b"\x12\xcf'\xefR\x8b\xf42\xcf-LH\xac\xe5\x1f0~?SO\xeb\xc1E\x1a\x1c]\xf2"
1308 b"\xc4<\x11\x02\x10Z0a*?\xe4r\xff\xfb\xff\xf6\x14nG\xead^\xd6\xef8\xb6uEI"
1309 b"\x99\nV\xe2\xb3\x95\x8e\x83\xf6i!\xb5&1F\xb1DP\xf4 SO3D!w\x99_G\x7f+\x90"
1310 b".\xab\xbb]\x91>\xc9#h;\x0f5J\x91K\xf4^-[\x9e\x8a\\\x94\xca\xaf\xf6\x19"
1311 b"\xd4\xa1\x9b\xc4\xb8p\xa1\xae\x15\xe9r\x84\xe0\xcar.l []\x8b\xaf+0\xf2g"
1312 b"\x01aKY\xdfI\xcf,\n\xe8\xf0\xe7V\x80_#\xb2\xf2\xa9\x06\x8c>w\xe2W,\xf4"
1313 b"\x8c\r\xf963\xf5J\xcc2\x05=kT\xeaUti\xe5_\xce\x1b\xfa\x8dl\x02h\xef\xa8"
1314 b"\xfbf\x7f\xff\xf0\x19\xeax"
1315)
1316
1317FILTERS_RAW_1 = [{"id": lzma.FILTER_LZMA2, "preset": 3}]
1318COMPRESSED_RAW_1 = (
1319 b"\xe0\x07\x80\x03\xfd]\x00\x05\x14\x07bX\x19\xcd\xddn\x96cyq\xa1\xdd\xee"
1320 b"\xf8\xfam\xe3'\x88\xd3\xff\xe4\x9e \xceQ\x91\xa4\x14I\xf6\xb9\x9dVL8\x15"
1321 b"_\x0e\x12\xc3\xeb\xbc\xa5\xcd\nW\x1d$=R;\x1d\xf8k8\t\xb1{\xd4\xc5+\x9d"
1322 b"\x87c\xe5\xef\x98\xb4\xd7S3\xcd\xcc\xd2\xed\xa4\x0em\xe5\xf4\xdd\xd0b"
1323 b"\xbe4*\xaa\x0b\xc5\x08\x10\x85+\x81.\x17\xaf9\xc9b\xeaZrA\xe20\x7fs\"r"
1324 b"\xdaG\x81\xde\x90cu\xa5\xdb\xa9.A\x08l\xb0<\xf6\x03\xddOi\xd0\xc5\xb4"
1325 b"\xec\xecg4t6\"\xa6\xb8o\xb5?\x18^}\xb6}\x03[:\xeb\x03\xa9\n[\x89l\x19g"
1326 b"\x16\xc82\xed\x0b\xfb\x86n\xa2\x857@\x93\xcd6T\xc3u\xb0\t\xf9\x1b\x918"
1327 b"\xfc[\x1b\x1e4\xb3\x14\x06PCV\xa8\"\xf5\x81x~\xe9\xb5N\x9cK\x9f\xc6\xc3%"
1328 b"\xc8k:{6\xe7\xf7\xbd\x05\x02\xb4\xc4\xc3\xd3\xfd\xc3\xa8\\\xfc@\xb1F_"
1329 b"\xc8\x90\xd9sU\x98\xad8\x05\x07\xde7J\x8bM\xd0\xb3;X\xec\x87\xef\xae\xb3"
1330 b"eO,\xb1z,d\x11y\xeejlB\x02\x1d\xf28\x1f#\x896\xce\x0b\xf0\xf5\xa9PK\x0f"
1331 b"\xb3\x13P\xd8\x88\xd2\xa1\x08\x04C?\xdb\x94_\x9a\"\xe9\xe3e\x1d\xde\x9b"
1332 b"\xa1\xe8>H\x98\x10;\xc5\x03#\xb5\x9d4\x01\xe7\xc5\xba%v\xa49\x97A\xe0\""
1333 b"\x8c\xc22\xe3i\xc1\x9d\xab3\xdf\xbe\xfdDm7\x1b\x9d\xab\xb5\x15o:J\x92"
1334 b"\xdb\x816\x17\xc2O\x99\x1b\x0e\x8d\xf3\tQ\xed\x8e\x95S/\x16M\xb2S\x04"
1335 b"\x0f\xc3J\xc6\xc7\xe4\xcb\xc5\xf4\xe7d\x14\xe4=^B\xfb\xd3E\xd3\x1e\xcd"
1336 b"\x91\xa5\xd0G\x8f.\xf6\xf9\x0bb&\xd9\x9f\xc2\xfdj\xa2\x9e\xc4\\\x0e\x1dC"
1337 b"v\xe8\xd2\x8a?^H\xec\xae\xeb>\xfe\xb8\xab\xd4IqY\x8c\xd4K7\x11\xf4D\xd0W"
1338 b"\xa5\xbe\xeaO\xbf\xd0\x04\xfdl\x10\xae5\xd4U\x19\x06\xf9{\xaa\xe0\x81"
1339 b"\x0f\xcf\xa3k{\x95\xbd\x19\xa2\xf8\xe4\xa3\x08O*\xf1\xf1B-\xc7(\x0eR\xfd"
1340 b"@E\x9f\xd3\x1e:\xfdV\xb7\x04Y\x94\xeb]\x83\xc4\xa5\xd7\xc0gX\x98\xcf\x0f"
1341 b"\xcd3\x00]n\x17\xec\xbd\xa3Y\x86\xc5\xf3u\xf6*\xbdT\xedA$A\xd9A\xe7\x98"
1342 b"\xef\x14\x02\x9a\xfdiw\xec\xa0\x87\x11\xd9%\xc5\xeb\x8a=\xae\xc0\xc4\xc6"
1343 b"D\x80\x8f\xa8\xd1\xbbq\xb2\xc0\xa0\xf5Cqp\xeeL\xe3\xe5\xdc \x84\"\xe9"
1344 b"\x80t\x83\x05\xba\xf1\xc5~\x93\xc9\xf0\x01c\xceix\x9d\xed\xc5)l\x16)\xd1"
1345 b"\x03@l\x04\x7f\x87\xa5yn\x1b\x01D\xaa:\xd2\x96\xb4\xb3?\xb0\xf9\xce\x07"
1346 b"\xeb\x81\x00\xe4\xc3\xf5%_\xae\xd4\xf9\xeb\xe2\rh\xb2#\xd67Q\x16D\x82hn"
1347 b"\xd1\xa3_?q\xf0\xe2\xac\xf317\x9e\xd0_\x83|\xf1\xca\xb7\x95S\xabW\x12"
1348 b"\xff\xddt\xf69L\x01\xf2|\xdaW\xda\xees\x98L\x18\xb8_\xe8$\x82\xea\xd6"
1349 b"\xd1F\xd4\x0b\xcdk\x01vf\x88h\xc3\xae\xb91\xc7Q\x9f\xa5G\xd9\xcc\x1f\xe3"
1350 b"5\xb1\xdcy\x7fI\x8bcw\x8e\x10rIp\x02:\x19p_\xc8v\xcea\"\xc1\xd9\x91\x03"
1351 b"\xbfe\xbe\xa6\xb3\xa8\x14\x18\xc3\xabH*m}\xc2\xc1\x9a}>l%\xce\x84\x99"
1352 b"\xb3d\xaf\xd3\x82\x15\xdf\xc1\xfc5fOg\x9b\xfc\x8e^&\t@\xce\x9f\x06J\xb8"
1353 b"\xb5\x86\x1d\xda{\x9f\xae\xb0\xff\x02\x81r\x92z\x8cM\xb7ho\xc9^\x9c\xb6"
1354 b"\x9c\xae\xd1\xc9\xf4\xdfU7\xd6\\!\xea\x0b\x94k\xb9Ud~\x98\xe7\x86\x8az"
1355 b"\x10;\xe3\x1d\xe5PG\xf8\xa4\x12\x05w\x98^\xc4\xb1\xbb\xfb\xcf\xe0\x7f"
1356 b"\x033Sf\x0c \xb1\xf6@\x94\xe5\xa3\xb2\xa7\x10\x9a\xc0\x14\xc3s\xb5xRD"
1357 b"\xf4`W\xd9\xe5\xd3\xcf\x91\rTZ-X\xbe\xbf\xb5\xe2\xee|\x1a\xbf\xfb\x08"
1358 b"\x91\xe1\xfc\x9a\x18\xa3\x8b\xd6^\x89\xf5[\xef\x87\xd1\x06\x1c7\xd6\xa2"
1359 b"\t\tQ5/@S\xc05\xd2VhAK\x03VC\r\x9b\x93\xd6M\xf1xO\xaaO\xed\xb9<\x0c\xdae"
1360 b"*\xd0\x07Hk6\x9fG+\xa1)\xcd\x9cl\x87\xdb\xe1\xe7\xefK}\x875\xab\xa0\x19u"
1361 b"\xf6*F\xb32\x00\x00\x00"
1362)
1363
1364FILTERS_RAW_2 = [{"id": lzma.FILTER_DELTA, "dist": 2},
1365 {"id": lzma.FILTER_LZMA2,
1366 "preset": lzma.PRESET_DEFAULT | lzma.PRESET_EXTREME}]
1367COMPRESSED_RAW_2 = (
1368 b"\xe0\x07\x80\x05\x91]\x00\x05\x14\x06-\xd4\xa8d?\xef\xbe\xafH\xee\x042"
1369 b"\xcb.\xb5g\x8f\xfb\x14\xab\xa5\x9f\x025z\xa4\xdd\xd8\t[}W\xf8\x0c\x1dmH"
1370 b"\xfa\x05\xfcg\xba\xe5\x01Q\x0b\x83R\xb6A\x885\xc0\xba\xee\n\x1cv~\xde:o"
1371 b"\x06:J\xa7\x11Cc\xea\xf7\xe5*o\xf7\x83\\l\xbdE\x19\x1f\r\xa8\x10\xb42"
1372 b"\x0caU{\xd7\xb8w\xdc\xbe\x1b\xfc8\xb4\xcc\xd38\\\xf6\x13\xf6\xe7\x98\xfa"
1373 b"\xc7[\x17_9\x86%\xa8\xf8\xaa\xb8\x8dfs#\x1e=\xed<\x92\x10\\t\xff\x86\xfb"
1374 b"=\x9e7\x18\x1dft\\\xb5\x01\x95Q\xc5\x19\xb38\xe0\xd4\xaa\x07\xc3\x7f\xd8"
1375 b"\xa2\x00>-\xd3\x8e\xa1#\xfa\x83ArAm\xdbJ~\x93\xa3B\x82\xe0\xc7\xcc(\x08`"
1376 b"WK\xad\x1b\x94kaj\x04 \xde\xfc\xe1\xed\xb0\x82\x91\xefS\x84%\x86\xfbi"
1377 b"\x99X\xf1B\xe7\x90;E\xfde\x98\xda\xca\xd6T\xb4bg\xa4\n\x9aj\xd1\x83\x9e]"
1378 b"\"\x7fM\xb5\x0fr\xd2\\\xa5j~P\x10GH\xbfN*Z\x10.\x81\tpE\x8a\x08\xbe1\xbd"
1379 b"\xcd\xa9\xe1\x8d\x1f\x04\xf9\x0eH\xb9\xae\xd6\xc3\xc1\xa5\xa9\x95P\xdc~"
1380 b"\xff\x01\x930\xa9\x04\xf6\x03\xfe\xb5JK\xc3]\xdd9\xb1\xd3\xd7F\xf5\xd1"
1381 b"\x1e\xa0\x1c_\xed[\x0c\xae\xd4\x8b\x946\xeb\xbf\xbb\xe3$kS{\xb5\x80,f:Sj"
1382 b"\x0f\x08z\x1c\xf5\xe8\xe6\xae\x98\xb0Q~r\x0f\xb0\x05?\xb6\x90\x19\x02&"
1383 b"\xcb\x80\t\xc4\xea\x9c|x\xce\x10\x9c\xc5|\xcbdhh+\x0c'\xc5\x81\xc33\xb5"
1384 b"\x14q\xd6\xc5\xe3`Z#\xdc\x8a\xab\xdd\xea\x08\xc2I\xe7\x02l{\xec\x196\x06"
1385 b"\x91\x8d\xdc\xd5\xb3x\xe1hz%\xd1\xf8\xa5\xdd\x98!\x8c\x1c\xc1\x17RUa\xbb"
1386 b"\x95\x0f\xe4X\xea1\x0c\xf1=R\xbe\xc60\xe3\xa4\x9a\x90bd\x97$]B\x01\xdd"
1387 b"\x1f\xe3h2c\x1e\xa0L`4\xc6x\xa3Z\x8a\r\x14]T^\xd8\x89\x1b\x92\r;\xedY"
1388 b"\x0c\xef\x8d9z\xf3o\xb6)f\xa9]$n\rp\x93\xd0\x10\xa4\x08\xb8\xb2\x8b\xb6"
1389 b"\x8f\x80\xae;\xdcQ\xf1\xfa\x9a\x06\x8e\xa5\x0e\x8cK\x9c @\xaa:UcX\n!\xc6"
1390 b"\x02\x12\xcb\x1b\"=\x16.\x1f\x176\xf2g=\xe1Wn\xe9\xe1\xd4\xf1O\xad\x15"
1391 b"\x86\xe9\xa3T\xaf\xa9\xd7D\xb5\xd1W3pnt\x11\xc7VOj\xb7M\xc4i\xa1\xf1$3"
1392 b"\xbb\xdc\x8af\xb0\xc5Y\r\xd1\xfb\xf2\xe7K\xe6\xc5hwO\xfe\x8c2^&\x07\xd5"
1393 b"\x1fV\x19\xfd\r\x14\xd2i=yZ\xe6o\xaf\xc6\xb6\x92\x9d\xc4\r\xb3\xafw\xac%"
1394 b"\xcfc\x1a\xf1`]\xf2\x1a\x9e\x808\xedm\xedQ\xb2\xfe\xe4h`[q\xae\xe0\x0f"
1395 b"\xba0g\xb6\"N\xc3\xfb\xcfR\x11\xc5\x18)(\xc40\\\xa3\x02\xd9G!\xce\x1b"
1396 b"\xc1\x96x\xb5\xc8z\x1f\x01\xb4\xaf\xde\xc2\xcd\x07\xe7H\xb3y\xa8M\n\\A\t"
1397 b"ar\xddM\x8b\x9a\xea\x84\x9b!\xf1\x8d\xb1\xf1~\x1e\r\xa5H\xba\xf1\x84o"
1398 b"\xda\x87\x01h\xe9\xa2\xbe\xbeqN\x9d\x84\x0b!WG\xda\xa1\xa5A\xb7\xc7`j"
1399 b"\x15\xf2\xe9\xdd?\x015B\xd2~E\x06\x11\xe0\x91!\x05^\x80\xdd\xa8y\x15}"
1400 b"\xa1)\xb1)\x81\x18\xf4\xf4\xf8\xc0\xefD\xe3\xdb2f\x1e\x12\xabu\xc9\x97"
1401 b"\xcd\x1e\xa7\x0c\x02x4_6\x03\xc4$t\xf39\x94\x1d=\xcb\xbfv\\\xf5\xa3\x1d"
1402 b"\x9d8jk\x95\x13)ff\xf9n\xc4\xa9\xe3\x01\xb8\xda\xfb\xab\xdfM\x99\xfb\x05"
1403 b"\xe0\xe9\xb0I\xf4E\xab\xe2\x15\xa3\x035\xe7\xdeT\xee\x82p\xb4\x88\xd3"
1404 b"\x893\x9c/\xc0\xd6\x8fou;\xf6\x95PR\xa9\xb2\xc1\xefFj\xe2\xa7$\xf7h\xf1"
1405 b"\xdfK(\xc9c\xba7\xe8\xe3)\xdd\xb2,\x83\xfb\x84\x18.y\x18Qi\x88\xf8`h-"
1406 b"\xef\xd5\xed\x8c\t\xd8\xc3^\x0f\x00\xb7\xd0[!\xafM\x9b\xd7.\x07\xd8\xfb"
1407 b"\xd9\xe2-S+\xaa8,\xa0\x03\x1b \xea\xa8\x00\xc3\xab~\xd0$e\xa5\x7f\xf7"
1408 b"\x95P]\x12\x19i\xd9\x7fo\x0c\xd8g^\rE\xa5\x80\x18\xc5\x01\x80\xaek`\xff~"
1409 b"\xb6y\xe7+\xe5\x11^D\xa7\x85\x18\"!\xd6\xd2\xa7\xf4\x1eT\xdb\x02\xe15"
1410 b"\x02Y\xbc\x174Z\xe7\x9cH\x1c\xbf\x0f\xc6\xe9f]\xcf\x8cx\xbc\xe5\x15\x94"
1411 b"\xfc3\xbc\xa7TUH\xf1\x84\x1b\xf7\xa9y\xc07\x84\xf8X\xd8\xef\xfc \x1c\xd8"
1412 b"( /\xf2\xb7\xec\xc1\\\x8c\xf6\x95\xa1\x03J\x83vP8\xe1\xe3\xbb~\xc24kA"
1413 b"\x98y\xa1\xf2P\xe9\x9d\xc9J\xf8N\x99\xb4\xceaO\xde\x16\x1e\xc2\x19\xa7"
1414 b"\x03\xd2\xe0\x8f:\x15\xf3\x84\x9e\xee\xe6e\xb8\x02q\xc7AC\x1emw\xfd\t"
1415 b"\x9a\x1eu\xc1\xa9\xcaCwUP\x00\xa5\xf78L4w!\x91L2 \x87\xd0\xf2\x06\x81j"
1416 b"\x80;\x03V\x06\x87\x92\xcb\x90lv@E\x8d\x8d\xa5\xa6\xe7Z[\xdf\xd6E\x03`>"
1417 b"\x8f\xde\xa1bZ\x84\xd0\xa9`\x05\x0e{\x80;\xe3\xbef\x8d\x1d\xebk1.\xe3"
1418 b"\xe9N\x15\xf7\xd4(\xfa\xbb\x15\xbdu\xf7\x7f\x86\xae!\x03L\x1d\xb5\xc1"
1419 b"\xb9\x11\xdb\xd0\x93\xe4\x02\xe1\xd2\xcbBjc_\xe8}d\xdb\xc3\xa0Y\xbe\xc9/"
1420 b"\x95\x01\xa3,\xe6bl@\x01\xdbp\xc2\xce\x14\x168\xc2q\xe3uH\x89X\xa4\xa9"
1421 b"\x19\x1d\xc1}\x7fOX\x19\x9f\xdd\xbe\x85\x83\xff\x96\x1ee\x82O`CF=K\xeb$I"
1422 b"\x17_\xefX\x8bJ'v\xde\x1f+\xd9.v\xf8Tv\x17\xf2\x9f5\x19\xe1\xb9\x91\xa8S"
1423 b"\x86\xbd\x1a\"(\xa5x\x8dC\x03X\x81\x91\xa8\x11\xc4pS\x13\xbc\xf2'J\xae!"
1424 b"\xef\xef\x84G\t\x8d\xc4\x10\x132\x00oS\x9e\xe0\xe4d\x8f\xb8y\xac\xa6\x9f"
1425 b",\xb8f\x87\r\xdf\x9eE\x0f\xe1\xd0\\L\x00\xb2\xe1h\x84\xef}\x98\xa8\x11"
1426 b"\xccW#\\\x83\x7fo\xbbz\x8f\x00"
1427)
1428
1429FILTERS_RAW_3 = [{"id": lzma.FILTER_IA64, "start_offset": 0x100},
1430 {"id": lzma.FILTER_LZMA2}]
1431COMPRESSED_RAW_3 = (
1432 b"\xe0\x07\x80\x03\xdf]\x00\x05\x14\x07bX\x19\xcd\xddn\x98\x15\xe4\xb4\x9d"
1433 b"o\x1d\xc4\xe5\n\x03\xcc2h\xc7\\\x86\xff\xf8\xe2\xfc\xe7\xd9\xfe6\xb8("
1434 b"\xa8wd\xc2\"u.n\x1e\xc3\xf2\x8e\x8d\x8f\x02\x17/\xa6=\xf0\xa2\xdf/M\x89"
1435 b"\xbe\xde\xa7\x1cz\x18-]\xd5\xef\x13\x8frZ\x15\x80\x8c\xf8\x8do\xfa\x12"
1436 b"\x9b#z/\xef\xf0\xfaF\x01\x82\xa3M\x8e\xa1t\xca6 BF$\xe5Q\xa4\x98\xee\xde"
1437 b"l\xe8\x7f\xf0\x9d,bn\x0b\x13\xd4\xa8\x81\xe4N\xc8\x86\x153\xf5x2\xa2O"
1438 b"\x13@Q\xa1\x00/\xa5\xd0O\x97\xdco\xae\xf7z\xc4\xcdS\xb6t<\x16\xf2\x9cI#"
1439 b"\x89ud\xc66Y\xd9\xee\xe6\xce\x12]\xe5\xf0\xaa\x96-Pe\xade:\x04\t\x1b\xf7"
1440 b"\xdb7\n\x86\x1fp\xc8J\xba\xf4\xf0V\xa9\xdc\xf0\x02%G\xf9\xdf=?\x15\x1b"
1441 b"\xe1(\xce\x82=\xd6I\xac3\x12\x0cR\xb7\xae\r\xb1i\x03\x95\x01\xbd\xbe\xfa"
1442 b"\x02s\x01P\x9d\x96X\xb12j\xc8L\xa8\x84b\xf6\xc3\xd4c-H\x93oJl\xd0iQ\xe4k"
1443 b"\x84\x0b\xc1\xb7\xbc\xb1\x17\x88\xb1\xca?@\xf6\x07\xea\xe6x\xf1H12P\x0f"
1444 b"\x8a\xc9\xeauw\xe3\xbe\xaai\xa9W\xd0\x80\xcd#cb5\x99\xd8]\xa9d\x0c\xbd"
1445 b"\xa2\xdcWl\xedUG\xbf\x89yF\xf77\x81v\xbd5\x98\xbeh8\x18W\x08\xf0\x1b\x99"
1446 b"5:\x1a?rD\x96\xa1\x04\x0f\xae\xba\x85\xeb\x9d5@\xf5\x83\xd37\x83\x8ac"
1447 b"\x06\xd4\x97i\xcdt\x16S\x82k\xf6K\x01vy\x88\x91\x9b6T\xdae\r\xfd]:k\xbal"
1448 b"\xa9\xbba\xc34\xf9r\xeb}r\xdb\xc7\xdb*\x8f\x03z\xdc8h\xcc\xc9\xd3\xbcl"
1449 b"\xa5-\xcb\xeaK\xa2\xc5\x15\xc0\xe3\xc1\x86Z\xfb\xebL\xe13\xcf\x9c\xe3"
1450 b"\x1d\xc9\xed\xc2\x06\xcc\xce!\x92\xe5\xfe\x9c^\xa59w \x9bP\xa3PK\x08d"
1451 b"\xf9\xe2Z}\xa7\xbf\xed\xeb%$\x0c\x82\xb8/\xb0\x01\xa9&,\xf7qh{Q\x96)\xf2"
1452 b"q\x96\xc3\x80\xb4\x12\xb0\xba\xe6o\xf4!\xb4[\xd4\x8aw\x10\xf7t\x0c\xb3"
1453 b"\xd9\xd5\xc3`^\x81\x11??\\\xa4\x99\x85R\xd4\x8e\x83\xc9\x1eX\xbfa\xf1"
1454 b"\xac\xb0\xea\xea\xd7\xd0\xab\x18\xe2\xf2\xed\xe1\xb7\xc9\x18\xcbS\xe4>"
1455 b"\xc9\x95H\xe8\xcb\t\r%\xeb\xc7$.o\xf1\xf3R\x17\x1db\xbb\xd8U\xa5^\xccS"
1456 b"\x16\x01\x87\xf3/\x93\xd1\xf0v\xc0r\xd7\xcc\xa2Gkz\xca\x80\x0e\xfd\xd0"
1457 b"\x8b\xbb\xd2Ix\xb3\x1ey\xca-0\xe3z^\xd6\xd6\x8f_\xf1\x9dP\x9fi\xa7\xd1"
1458 b"\xe8\x90\x84\xdc\xbf\xcdky\x8e\xdc\x81\x7f\xa3\xb2+\xbf\x04\xef\xd8\\"
1459 b"\xc4\xdf\xe1\xb0\x01\xe9\x93\xe3Y\xf1\x1dY\xe8h\x81\xcf\xf1w\xcc\xb4\xef"
1460 b" \x8b|\x04\xea\x83ej\xbe\x1f\xd4z\x9c`\xd3\x1a\x92A\x06\xe5\x8f\xa9\x13"
1461 b"\t\x9e=\xfa\x1c\xe5_\x9f%v\x1bo\x11ZO\xd8\xf4\t\xddM\x16-\x04\xfc\x18<\""
1462 b"CM\xddg~b\xf6\xef\x8e\x0c\xd0\xde|\xa0'\x8a\x0c\xd6x\xae!J\xa6F\x88\x15u"
1463 b"\x008\x17\xbc7y\xb3\xd8u\xac_\x85\x8d\xe7\xc1@\x9c\xecqc\xa3#\xad\xf1"
1464 b"\x935\xb5)_\r\xec3]\x0fo]5\xd0my\x07\x9b\xee\x81\xb5\x0f\xcfK+\x00\xc0"
1465 b"\xe4b\x10\xe4\x0c\x1a \x9b\xe0\x97t\xf6\xa1\x9e\x850\xba\x0c\x9a\x8d\xc8"
1466 b"\x8f\x07\xd7\xae\xc8\xf9+i\xdc\xb9k\xb0>f\x19\xb8\r\xa8\xf8\x1f$\xa5{p"
1467 b"\xc6\x880\xce\xdb\xcf\xca_\x86\xac\x88h6\x8bZ%'\xd0\n\xbf\x0f\x9c\"\xba"
1468 b"\xe5\x86\x9f\x0f7X=mNX[\xcc\x19FU\xc9\x860\xbc\x90a+* \xae_$\x03\x1e\xd3"
1469 b"\xcd_\xa0\x9c\xde\xaf46q\xa5\xc9\x92\xd7\xca\xe3`\x9d\x85}\xb4\xff\xb3"
1470 b"\x83\xfb\xb6\xca\xae`\x0bw\x7f\xfc\xd8\xacVe\x19\xc8\x17\x0bZ\xad\x88"
1471 b"\xeb#\x97\x03\x13\xb1d\x0f{\x0c\x04w\x07\r\x97\xbd\xd6\xc1\xc3B:\x95\x08"
1472 b"^\x10V\xaeaH\x02\xd9\xe3\n\\\x01X\xf6\x9c\x8a\x06u#%\xbe*\xa1\x18v\x85"
1473 b"\xec!\t4\x00\x00\x00"
1474)
1475
1476FILTERS_RAW_4 = [{"id": lzma.FILTER_DELTA, "dist": 4},
1477 {"id": lzma.FILTER_X86, "start_offset": 0x40},
1478 {"id": lzma.FILTER_LZMA2, "preset": 4, "lc": 2}]
1479COMPRESSED_RAW_4 = (
1480 b"\xe0\x07\x80\x06\x0e\\\x00\x05\x14\x07bW\xaah\xdd\x10\xdc'\xd6\x90,\xc6v"
1481 b"Jq \x14l\xb7\x83xB\x0b\x97f=&fx\xba\n>Tn\xbf\x8f\xfb\x1dF\xca\xc3v_\xca?"
1482 b"\xfbV<\x92#\xd4w\xa6\x8a\xeb\xf6\x03\xc0\x01\x94\xd8\x9e\x13\x12\x98\xd1"
1483 b"*\xfa]c\xe8\x1e~\xaf\xb5]Eg\xfb\x9e\x01\"8\xb2\x90\x06=~\xe9\x91W\xcd"
1484 b"\xecD\x12\xc7\xfa\xe1\x91\x06\xc7\x99\xb9\xe3\x901\x87\x19u\x0f\x869\xff"
1485 b"\xc1\xb0hw|\xb0\xdcl\xcck\xb16o7\x85\xee{Y_b\xbf\xbc$\xf3=\x8d\x8bw\xe5Z"
1486 b"\x08@\xc4kmE\xad\xfb\xf6*\xd8\xad\xa1\xfb\xc5{\xdej,)\x1emB\x1f<\xaeca"
1487 b"\x80(\xee\x07 \xdf\xe9\xf8\xeb\x0e-\x97\x86\x90c\xf9\xea'B\xf7`\xd7\xb0"
1488 b"\x92\xbd\xa0\x82]\xbd\x0e\x0eB\x19\xdc\x96\xc6\x19\xd86D\xf0\xd5\x831"
1489 b"\x03\xb7\x1c\xf7&5\x1a\x8f PZ&j\xf8\x98\x1bo\xcc\x86\x9bS\xd3\xa5\xcdu"
1490 b"\xf9$\xcc\x97o\xe5V~\xfb\x97\xb5\x0b\x17\x9c\xfdxW\x10\xfep4\x80\xdaHDY"
1491 b"\xfa)\xfet\xb5\"\xd4\xd3F\x81\xf4\x13\x1f\xec\xdf\xa5\x13\xfc\"\x91x\xb7"
1492 b"\x99\xce\xc8\x92\n\xeb[\x10l*Y\xd8\xb1@\x06\xc8o\x8d7r\xebu\xfd5\x0e\x7f"
1493 b"\xf1$U{\t}\x1fQ\xcfxN\x9d\x9fXX\xe9`\x83\xc1\x06\xf4\x87v-f\x11\xdb/\\"
1494 b"\x06\xff\xd7)B\xf3g\x06\x88#2\x1eB244\x7f4q\t\xc893?mPX\x95\xa6a\xfb)d"
1495 b"\x9b\xfc\x98\x9aj\x04\xae\x9b\x9d\x19w\xba\xf92\xfaA\x11\\\x17\x97C3\xa4"
1496 b"\xbc!\x88\xcdo[\xec:\x030\x91.\x85\xe0@\\4\x16\x12\x9d\xcaJv\x97\xb04"
1497 b"\xack\xcbkf\xa3ss\xfc\x16^\x8ce\x85a\xa5=&\xecr\xb3p\xd1E\xd5\x80y\xc7"
1498 b"\xda\xf6\xfek\xbcT\xbfH\xee\x15o\xc5\x8c\x830\xec\x1d\x01\xae\x0c-e\\"
1499 b"\x91\x90\x94\xb2\xf8\x88\x91\xe8\x0b\xae\xa7>\x98\xf6\x9ck\xd2\xc6\x08"
1500 b"\xe6\xab\t\x98\xf2!\xa0\x8c^\xacqA\x99<\x1cEG\x97\xc8\xf1\xb6\xb9\x82"
1501 b"\x8d\xf7\x08s\x98a\xff\xe3\xcc\x92\x0e\xd2\xb6U\xd7\xd9\x86\x7fa\xe5\x1c"
1502 b"\x8dTG@\t\x1e\x0e7*\xfc\xde\xbc]6N\xf7\xf1\x84\x9e\x9f\xcf\xe9\x1e\xb5'"
1503 b"\xf4<\xdf\x99sq\xd0\x9d\xbd\x99\x0b\xb4%p4\xbf{\xbb\x8a\xd2\x0b\xbc=M"
1504 b"\x94H:\xf5\xa8\xd6\xa4\xc90\xc2D\xb9\xd3\xa8\xb0S\x87 `\xa2\xeb\xf3W\xce"
1505 b" 7\xf9N#\r\xe6\xbe\t\x9d\xe7\x811\xf9\x10\xc1\xc2\x14\xf6\xfc\xcba\xb7"
1506 b"\xb1\x7f\x95l\xe4\tjA\xec:\x10\xe5\xfe\xc2\\=D\xe2\x0c\x0b3]\xf7\xc1\xf7"
1507 b"\xbceZ\xb1A\xea\x16\xe5\xfddgFQ\xed\xaf\x04\xa3\xd3\xf8\xa2q\x19B\xd4r"
1508 b"\xc5\x0c\x9a\x14\x94\xea\x91\xc4o\xe4\xbb\xb4\x99\xf4@\xd1\xe6\x0c\xe3"
1509 b"\xc6d\xa0Q\n\xf2/\xd8\xb8S5\x8a\x18:\xb5g\xac\x95D\xce\x17\x07\xd4z\xda"
1510 b"\x90\xe65\x07\x19H!\t\xfdu\x16\x8e\x0eR\x19\xf4\x8cl\x0c\xf9Q\xf1\x80"
1511 b"\xe3\xbf\xd7O\xf8\x8c\x18\x0b\x9c\xf1\x1fb\xe1\tR\xb2\xf1\xe1A\xea \xcf-"
1512 b"IGE\xf1\x14\x98$\x83\x15\xc9\xd8j\xbf\x19\x0f\xd5\xd1\xaa\xb3\xf3\xa5I2s"
1513 b"\x8d\x145\xca\xd5\xd93\x9c\xb8D0\xe6\xaa%\xd0\xc0P}JO^h\x8e\x08\xadlV."
1514 b"\x18\x88\x13\x05o\xb0\x07\xeaw\xe0\xb6\xa4\xd5*\xe4r\xef\x07G+\xc1\xbei["
1515 b"w\xe8\xab@_\xef\x15y\xe5\x12\xc9W\x1b.\xad\x85-\xc2\xf7\xe3mU6g\x8eSA"
1516 b"\x01(\xd3\xdb\x16\x13=\xde\x92\xf9,D\xb8\x8a\xb2\xb4\xc9\xc3\xefnE\xe8\\"
1517 b"\xa6\xe2Y\xd2\xcf\xcb\x8c\xb6\xd5\xe9\x1d\x1e\x9a\x8b~\xe2\xa6\rE\x84uV"
1518 b"\xed\xc6\x99\xddm<\x10[\x0fu\x1f\xc1\x1d1\n\xcfw\xb2%!\xf0[\xce\x87\x83B"
1519 b"\x08\xaa,\x08%d\xcef\x94\"\xd9g.\xc83\xcbXY+4\xec\x85qA\n\x1d=9\xf0*\xb1"
1520 b"\x1f/\xf3s\xd61b\x7f@\xfb\x9d\xe3FQ\\\xbd\x82\x1e\x00\xf3\xce\xd3\xe1"
1521 b"\xca,E\xfd7[\xab\xb6\xb7\xac!mA}\xbd\x9d3R5\x9cF\xabH\xeb\x92)cc\x13\xd0"
1522 b"\xbd\xee\xe9n{\x1dIJB\xa5\xeb\x11\xe8`w&`\x8b}@Oxe\t\x8a\x07\x02\x95\xf2"
1523 b"\xed\xda|\xb1e\xbe\xaa\xbbg\x19@\xe1Y\x878\x84\x0f\x8c\xe3\xc98\xf2\x9e"
1524 b"\xd5N\xb5J\xef\xab!\xe2\x8dq\xe1\xe5q\xc5\xee\x11W\xb7\xe4k*\x027\xa0"
1525 b"\xa3J\xf4\xd8m\xd0q\x94\xcb\x07\n:\xb6`.\xe4\x9c\x15+\xc0)\xde\x80X\xd4"
1526 b"\xcfQm\x01\xc2cP\x1cA\x85'\xc9\xac\x8b\xe6\xb2)\xe6\x84t\x1c\x92\xe4Z"
1527 b"\x1cR\xb0\x9e\x96\xd1\xfb\x1c\xa6\x8b\xcb`\x10\x12]\xf2gR\x9bFT\xe0\xc8H"
1528 b"S\xfb\xac<\x04\xc7\xc1\xe8\xedP\xf4\x16\xdb\xc0\xd7e\xc2\x17J^\x1f\xab"
1529 b"\xff[\x08\x19\xb4\xf5\xfb\x19\xb4\x04\xe5c~']\xcb\xc2A\xec\x90\xd0\xed"
1530 b"\x06,\xc5K{\x86\x03\xb1\xcdMx\xdeQ\x8c3\xf9\x8a\xea=\x89\xaba\xd2\xc89a"
1531 b"\xd72\xf0\xc3\x19\x8a\xdfs\xd4\xfd\xbb\x81b\xeaE\"\xd8\xf4d\x0cD\xf7IJ!"
1532 b"\xe5d\xbbG\xe9\xcam\xaa\x0f_r\x95\x91NBq\xcaP\xce\xa7\xa9\xb5\x10\x94eP!"
1533 b"|\x856\xcd\xbfIir\xb8e\x9bjP\x97q\xabwS7\x1a\x0ehM\xe7\xca\x86?\xdeP}y~"
1534 b"\x0f\x95I\xfc\x13\xe1<Q\x1b\x868\x1d\x11\xdf\x94\xf4\x82>r\xa9k\x88\xcb"
1535 b"\xfd\xc3v\xe2\xb9\x8a\x02\x8eq\x92I\xf8\xf6\xf1\x03s\x9b\xb8\xe3\"\xe3"
1536 b"\xa9\xa5>D\xb8\x96;\xe7\x92\xd133\xe8\xdd'e\xc9.\xdc;\x17\x1f\xf5H\x13q"
1537 b"\xa4W\x0c\xdb~\x98\x01\xeb\xdf\xe32\x13\x0f\xddx\n6\xa0\t\x10\xb6\xbb"
1538 b"\xb0\xc3\x18\xb6;\x9fj[\xd9\xd5\xc9\x06\x8a\x87\xcd\xe5\xee\xfc\x9c-%@"
1539 b"\xee\xe0\xeb\xd2\xe3\xe8\xfb\xc0\x122\\\xc7\xaf\xc2\xa1Oth\xb3\x8f\x82"
1540 b"\xb3\x18\xa8\x07\xd5\xee_\xbe\xe0\x1cA\x1e_\r\x9a\xb0\x17W&\xa2D\x91\x94"
1541 b"\x1a\xb2\xef\xf2\xdc\x85;X\xb0,\xeb>-7S\xe5\xca\x07)\x1fp\x7f\xcaQBL\xca"
1542 b"\xf3\xb9d\xfc\xb5su\xb0\xc8\x95\x90\xeb*)\xa0v\xe4\x9a{FW\xf4l\xde\xcdj"
1543 b"\x00"
1544)
1545
1546
1547def test_main():
1548 run_unittest(
1549 CompressorDecompressorTestCase,
1550 CompressDecompressFunctionTestCase,
1551 FileTestCase,
Nadeem Vawdae8604042012-06-04 23:38:12 +02001552 OpenTestCase,
Nadeem Vawda3ff069e2011-11-30 00:25:06 +02001553 MiscellaneousTestCase,
1554 )
1555
1556if __name__ == "__main__":
1557 test_main()