blob: 2fc43139a2f6d0ee6f4f184ce9a207e5598b8e5c [file] [log] [blame]
Guido van Rossum7d9ea502003-02-03 20:45:52 +00001import unittest
2from test import test_support
Gregory P. Smithc856fa82008-03-18 22:27:41 +00003import binascii
Andrew M. Kuchling9a0f98e2001-02-21 02:17:01 +00004import random
Antoine Pitrou3843cd82010-05-07 16:50:34 +00005from test.test_support import precisionbigmemtest, _1G
Andrew M. Kuchling9a0f98e2001-02-21 02:17:01 +00006
R. David Murray3db8a342009-03-30 23:05:48 +00007zlib = test_support.import_module('zlib')
8
Andrew M. Kuchling9a0f98e2001-02-21 02:17:01 +00009
Guido van Rossum7d9ea502003-02-03 20:45:52 +000010class ChecksumTestCase(unittest.TestCase):
11 # checksum test cases
12 def test_crc32start(self):
13 self.assertEqual(zlib.crc32(""), zlib.crc32("", 0))
Benjamin Peterson5c8da862009-06-30 22:57:08 +000014 self.assertTrue(zlib.crc32("abc", 0xffffffff))
Andrew M. Kuchlingfcfc8d52001-08-10 15:50:11 +000015
Guido van Rossum7d9ea502003-02-03 20:45:52 +000016 def test_crc32empty(self):
17 self.assertEqual(zlib.crc32("", 0), 0)
18 self.assertEqual(zlib.crc32("", 1), 1)
19 self.assertEqual(zlib.crc32("", 432), 432)
Andrew M. Kuchling9a0f98e2001-02-21 02:17:01 +000020
Guido van Rossum7d9ea502003-02-03 20:45:52 +000021 def test_adler32start(self):
22 self.assertEqual(zlib.adler32(""), zlib.adler32("", 1))
Benjamin Peterson5c8da862009-06-30 22:57:08 +000023 self.assertTrue(zlib.adler32("abc", 0xffffffff))
Jeremy Hylton6eb4b6a1997-08-15 15:59:43 +000024
Guido van Rossum7d9ea502003-02-03 20:45:52 +000025 def test_adler32empty(self):
26 self.assertEqual(zlib.adler32("", 0), 0)
27 self.assertEqual(zlib.adler32("", 1), 1)
28 self.assertEqual(zlib.adler32("", 432), 432)
Jeremy Hylton6eb4b6a1997-08-15 15:59:43 +000029
Guido van Rossum7d9ea502003-02-03 20:45:52 +000030 def assertEqual32(self, seen, expected):
31 # 32-bit values masked -- checksums on 32- vs 64- bit machines
32 # This is important if bit 31 (0x08000000L) is set.
33 self.assertEqual(seen & 0x0FFFFFFFFL, expected & 0x0FFFFFFFFL)
34
35 def test_penguins(self):
36 self.assertEqual32(zlib.crc32("penguin", 0), 0x0e5c1a120L)
37 self.assertEqual32(zlib.crc32("penguin", 1), 0x43b6aa94)
38 self.assertEqual32(zlib.adler32("penguin", 0), 0x0bcf02f6)
39 self.assertEqual32(zlib.adler32("penguin", 1), 0x0bd602f7)
40
41 self.assertEqual(zlib.crc32("penguin"), zlib.crc32("penguin", 0))
42 self.assertEqual(zlib.adler32("penguin"),zlib.adler32("penguin",1))
43
Gregory P. Smithf48f9d32008-03-17 18:48:05 +000044 def test_abcdefghijklmnop(self):
45 """test issue1202 compliance: signed crc32, adler32 in 2.x"""
46 foo = 'abcdefghijklmnop'
47 # explicitly test signed behavior
48 self.assertEqual(zlib.crc32(foo), -1808088941)
49 self.assertEqual(zlib.crc32('spam'), 1138425661)
50 self.assertEqual(zlib.adler32(foo+foo), -721416943)
51 self.assertEqual(zlib.adler32('spam'), 72286642)
52
Gregory P. Smithc856fa82008-03-18 22:27:41 +000053 def test_same_as_binascii_crc32(self):
54 foo = 'abcdefghijklmnop'
55 self.assertEqual(binascii.crc32(foo), zlib.crc32(foo))
56 self.assertEqual(binascii.crc32('spam'), zlib.crc32('spam'))
57
Gregory P. Smith88440962008-03-25 06:12:45 +000058 def test_negative_crc_iv_input(self):
59 # The range of valid input values for the crc state should be
60 # -2**31 through 2**32-1 to allow inputs artifically constrained
61 # to a signed 32-bit integer.
62 self.assertEqual(zlib.crc32('ham', -1), zlib.crc32('ham', 0xffffffffL))
63 self.assertEqual(zlib.crc32('spam', -3141593),
64 zlib.crc32('spam', 0xffd01027L))
65 self.assertEqual(zlib.crc32('spam', -(2**31)),
66 zlib.crc32('spam', (2**31)))
Guido van Rossum7d9ea502003-02-03 20:45:52 +000067
68
69class ExceptionTestCase(unittest.TestCase):
70 # make sure we generate some expected errors
Armin Rigoec560192007-10-15 07:48:35 +000071 def test_badlevel(self):
72 # specifying compression level out of range causes an error
73 # (but -1 is Z_DEFAULT_COMPRESSION and apparently the zlib
74 # accepts 0 too)
75 self.assertRaises(zlib.error, zlib.compress, 'ERROR', 10)
Guido van Rossum7d9ea502003-02-03 20:45:52 +000076
77 def test_badcompressobj(self):
78 # verify failure on building compress object with bad params
Neil Schemenauer94afd3e2004-06-05 19:02:52 +000079 self.assertRaises(ValueError, zlib.compressobj, 1, zlib.DEFLATED, 0)
Armin Rigoec560192007-10-15 07:48:35 +000080 # specifying total bits too large causes an error
81 self.assertRaises(ValueError,
82 zlib.compressobj, 1, zlib.DEFLATED, zlib.MAX_WBITS + 1)
Guido van Rossum7d9ea502003-02-03 20:45:52 +000083
84 def test_baddecompressobj(self):
85 # verify failure on building decompress object with bad params
Antoine Pitrou3b4c9892010-04-06 17:21:09 +000086 self.assertRaises(ValueError, zlib.decompressobj, -1)
Guido van Rossum7d9ea502003-02-03 20:45:52 +000087
Gregory P. Smith79e42a02008-04-09 00:25:17 +000088 def test_decompressobj_badflush(self):
89 # verify failure on calling decompressobj.flush with bad params
90 self.assertRaises(ValueError, zlib.decompressobj().flush, 0)
91 self.assertRaises(ValueError, zlib.decompressobj().flush, -1)
92
Guido van Rossum7d9ea502003-02-03 20:45:52 +000093
Antoine Pitrou3843cd82010-05-07 16:50:34 +000094class BaseCompressTestCase(object):
95 def check_big_compress_buffer(self, size, compress_func):
96 _1M = 1024 * 1024
97 fmt = "%%0%dx" % (2 * _1M)
98 # Generate 10MB worth of random, and expand it by repeating it.
99 # The assumption is that zlib's memory is not big enough to exploit
100 # such spread out redundancy.
101 data = ''.join([binascii.a2b_hex(fmt % random.getrandbits(8 * _1M))
102 for i in range(10)])
103 data = data * (size // len(data) + 1)
104 try:
105 compress_func(data)
106 finally:
107 # Release memory
108 data = None
Guido van Rossum7d9ea502003-02-03 20:45:52 +0000109
Antoine Pitrou3843cd82010-05-07 16:50:34 +0000110 def check_big_decompress_buffer(self, size, decompress_func):
111 data = 'x' * size
112 try:
113 compressed = zlib.compress(data, 1)
114 finally:
115 # Release memory
116 data = None
117 data = decompress_func(compressed)
118 # Sanity check
119 try:
120 self.assertEqual(len(data), size)
121 self.assertEqual(len(data.strip('x')), 0)
122 finally:
123 data = None
124
125
126class CompressTestCase(BaseCompressTestCase, unittest.TestCase):
Guido van Rossum7d9ea502003-02-03 20:45:52 +0000127 # Test compression in one go (whole message compression)
128 def test_speech(self):
Neil Schemenauer6412b122004-06-05 19:34:28 +0000129 x = zlib.compress(HAMLET_SCENE)
130 self.assertEqual(zlib.decompress(x), HAMLET_SCENE)
Guido van Rossum7d9ea502003-02-03 20:45:52 +0000131
132 def test_speech128(self):
Neil Schemenauer6412b122004-06-05 19:34:28 +0000133 # compress more data
134 data = HAMLET_SCENE * 128
Guido van Rossum7d9ea502003-02-03 20:45:52 +0000135 x = zlib.compress(data)
136 self.assertEqual(zlib.decompress(x), data)
137
Antoine Pitrou3843cd82010-05-07 16:50:34 +0000138 # Memory use of the following functions takes into account overallocation
139
140 @precisionbigmemtest(size=_1G + 1024 * 1024, memuse=3)
141 def test_big_compress_buffer(self, size):
142 compress = lambda s: zlib.compress(s, 1)
143 self.check_big_compress_buffer(size, compress)
144
145 @precisionbigmemtest(size=_1G + 1024 * 1024, memuse=2)
146 def test_big_decompress_buffer(self, size):
147 self.check_big_decompress_buffer(size, zlib.decompress)
Guido van Rossum7d9ea502003-02-03 20:45:52 +0000148
149
Antoine Pitrou3843cd82010-05-07 16:50:34 +0000150class CompressObjectTestCase(BaseCompressTestCase, unittest.TestCase):
Guido van Rossum7d9ea502003-02-03 20:45:52 +0000151 # Test compression object
Guido van Rossum7d9ea502003-02-03 20:45:52 +0000152 def test_pair(self):
Neil Schemenauer6412b122004-06-05 19:34:28 +0000153 # straightforward compress/decompress objects
154 data = HAMLET_SCENE * 128
155 co = zlib.compressobj()
Guido van Rossum7d9ea502003-02-03 20:45:52 +0000156 x1 = co.compress(data)
157 x2 = co.flush()
158 self.assertRaises(zlib.error, co.flush) # second flush should not work
Neil Schemenauer94afd3e2004-06-05 19:02:52 +0000159 dco = zlib.decompressobj()
Guido van Rossum7d9ea502003-02-03 20:45:52 +0000160 y1 = dco.decompress(x1 + x2)
161 y2 = dco.flush()
162 self.assertEqual(data, y1 + y2)
163
Neil Schemenauer94afd3e2004-06-05 19:02:52 +0000164 def test_compressoptions(self):
165 # specify lots of options to compressobj()
166 level = 2
167 method = zlib.DEFLATED
168 wbits = -12
169 memlevel = 9
170 strategy = zlib.Z_FILTERED
171 co = zlib.compressobj(level, method, wbits, memlevel, strategy)
Neil Schemenauer6412b122004-06-05 19:34:28 +0000172 x1 = co.compress(HAMLET_SCENE)
Neil Schemenauer94afd3e2004-06-05 19:02:52 +0000173 x2 = co.flush()
174 dco = zlib.decompressobj(wbits)
175 y1 = dco.decompress(x1 + x2)
176 y2 = dco.flush()
Neil Schemenauer6412b122004-06-05 19:34:28 +0000177 self.assertEqual(HAMLET_SCENE, y1 + y2)
Neil Schemenauer94afd3e2004-06-05 19:02:52 +0000178
Guido van Rossum7d9ea502003-02-03 20:45:52 +0000179 def test_compressincremental(self):
180 # compress object in steps, decompress object as one-shot
Neil Schemenauer6412b122004-06-05 19:34:28 +0000181 data = HAMLET_SCENE * 128
Neil Schemenauer94afd3e2004-06-05 19:02:52 +0000182 co = zlib.compressobj()
Guido van Rossum7d9ea502003-02-03 20:45:52 +0000183 bufs = []
184 for i in range(0, len(data), 256):
185 bufs.append(co.compress(data[i:i+256]))
186 bufs.append(co.flush())
187 combuf = ''.join(bufs)
188
Neil Schemenauer94afd3e2004-06-05 19:02:52 +0000189 dco = zlib.decompressobj()
Guido van Rossum7d9ea502003-02-03 20:45:52 +0000190 y1 = dco.decompress(''.join(bufs))
191 y2 = dco.flush()
192 self.assertEqual(data, y1 + y2)
193
Neil Schemenauer6412b122004-06-05 19:34:28 +0000194 def test_decompinc(self, flush=False, source=None, cx=256, dcx=64):
Guido van Rossum7d9ea502003-02-03 20:45:52 +0000195 # compress object in steps, decompress object in steps
Neil Schemenauer6412b122004-06-05 19:34:28 +0000196 source = source or HAMLET_SCENE
197 data = source * 128
Neil Schemenauer94afd3e2004-06-05 19:02:52 +0000198 co = zlib.compressobj()
Guido van Rossum7d9ea502003-02-03 20:45:52 +0000199 bufs = []
Neil Schemenauer6412b122004-06-05 19:34:28 +0000200 for i in range(0, len(data), cx):
201 bufs.append(co.compress(data[i:i+cx]))
Guido van Rossum7d9ea502003-02-03 20:45:52 +0000202 bufs.append(co.flush())
203 combuf = ''.join(bufs)
204
Neil Schemenauer94afd3e2004-06-05 19:02:52 +0000205 self.assertEqual(data, zlib.decompress(combuf))
Guido van Rossum7d9ea502003-02-03 20:45:52 +0000206
Neil Schemenauer94afd3e2004-06-05 19:02:52 +0000207 dco = zlib.decompressobj()
Guido van Rossum7d9ea502003-02-03 20:45:52 +0000208 bufs = []
Neil Schemenauer6412b122004-06-05 19:34:28 +0000209 for i in range(0, len(combuf), dcx):
210 bufs.append(dco.decompress(combuf[i:i+dcx]))
Guido van Rossum7d9ea502003-02-03 20:45:52 +0000211 self.assertEqual('', dco.unconsumed_tail, ########
212 "(A) uct should be '': not %d long" %
Neil Schemenauer6412b122004-06-05 19:34:28 +0000213 len(dco.unconsumed_tail))
214 if flush:
215 bufs.append(dco.flush())
216 else:
217 while True:
218 chunk = dco.decompress('')
219 if chunk:
220 bufs.append(chunk)
221 else:
222 break
Guido van Rossum7d9ea502003-02-03 20:45:52 +0000223 self.assertEqual('', dco.unconsumed_tail, ########
Neil Schemenauer6412b122004-06-05 19:34:28 +0000224 "(B) uct should be '': not %d long" %
225 len(dco.unconsumed_tail))
Guido van Rossum7d9ea502003-02-03 20:45:52 +0000226 self.assertEqual(data, ''.join(bufs))
227 # Failure means: "decompressobj with init options failed"
228
Neil Schemenauer6412b122004-06-05 19:34:28 +0000229 def test_decompincflush(self):
230 self.test_decompinc(flush=True)
Guido van Rossum7d9ea502003-02-03 20:45:52 +0000231
Neil Schemenauer6412b122004-06-05 19:34:28 +0000232 def test_decompimax(self, source=None, cx=256, dcx=64):
233 # compress in steps, decompress in length-restricted steps
234 source = source or HAMLET_SCENE
Guido van Rossum7d9ea502003-02-03 20:45:52 +0000235 # Check a decompression object with max_length specified
Neil Schemenauer6412b122004-06-05 19:34:28 +0000236 data = source * 128
237 co = zlib.compressobj()
238 bufs = []
239 for i in range(0, len(data), cx):
240 bufs.append(co.compress(data[i:i+cx]))
241 bufs.append(co.flush())
242 combuf = ''.join(bufs)
243 self.assertEqual(data, zlib.decompress(combuf),
244 'compressed data failure')
245
246 dco = zlib.decompressobj()
247 bufs = []
248 cb = combuf
249 while cb:
250 #max_length = 1 + len(cb)//10
251 chunk = dco.decompress(cb, dcx)
Benjamin Peterson5c8da862009-06-30 22:57:08 +0000252 self.assertFalse(len(chunk) > dcx,
Neil Schemenauer6412b122004-06-05 19:34:28 +0000253 'chunk too big (%d>%d)' % (len(chunk), dcx))
254 bufs.append(chunk)
255 cb = dco.unconsumed_tail
256 bufs.append(dco.flush())
257 self.assertEqual(data, ''.join(bufs), 'Wrong data retrieved')
258
259 def test_decompressmaxlen(self, flush=False):
260 # Check a decompression object with max_length specified
261 data = HAMLET_SCENE * 128
Neil Schemenauer94afd3e2004-06-05 19:02:52 +0000262 co = zlib.compressobj()
Guido van Rossum7d9ea502003-02-03 20:45:52 +0000263 bufs = []
264 for i in range(0, len(data), 256):
265 bufs.append(co.compress(data[i:i+256]))
266 bufs.append(co.flush())
267 combuf = ''.join(bufs)
Neil Schemenauer94afd3e2004-06-05 19:02:52 +0000268 self.assertEqual(data, zlib.decompress(combuf),
Guido van Rossum7d9ea502003-02-03 20:45:52 +0000269 'compressed data failure')
270
Neil Schemenauer94afd3e2004-06-05 19:02:52 +0000271 dco = zlib.decompressobj()
Guido van Rossum7d9ea502003-02-03 20:45:52 +0000272 bufs = []
273 cb = combuf
274 while cb:
Guido van Rossumf3594102003-02-27 18:39:18 +0000275 max_length = 1 + len(cb)//10
Guido van Rossum7d9ea502003-02-03 20:45:52 +0000276 chunk = dco.decompress(cb, max_length)
Benjamin Peterson5c8da862009-06-30 22:57:08 +0000277 self.assertFalse(len(chunk) > max_length,
Guido van Rossum7d9ea502003-02-03 20:45:52 +0000278 'chunk too big (%d>%d)' % (len(chunk),max_length))
279 bufs.append(chunk)
280 cb = dco.unconsumed_tail
Neil Schemenauer6412b122004-06-05 19:34:28 +0000281 if flush:
282 bufs.append(dco.flush())
283 else:
284 while chunk:
285 chunk = dco.decompress('', max_length)
Benjamin Peterson5c8da862009-06-30 22:57:08 +0000286 self.assertFalse(len(chunk) > max_length,
Neil Schemenauer6412b122004-06-05 19:34:28 +0000287 'chunk too big (%d>%d)' % (len(chunk),max_length))
288 bufs.append(chunk)
Guido van Rossum7d9ea502003-02-03 20:45:52 +0000289 self.assertEqual(data, ''.join(bufs), 'Wrong data retrieved')
290
Neil Schemenauer6412b122004-06-05 19:34:28 +0000291 def test_decompressmaxlenflush(self):
292 self.test_decompressmaxlen(flush=True)
Guido van Rossum7d9ea502003-02-03 20:45:52 +0000293
294 def test_maxlenmisc(self):
295 # Misc tests of max_length
Neil Schemenauer94afd3e2004-06-05 19:02:52 +0000296 dco = zlib.decompressobj()
Guido van Rossum7d9ea502003-02-03 20:45:52 +0000297 self.assertRaises(ValueError, dco.decompress, "", -1)
298 self.assertEqual('', dco.unconsumed_tail)
299
300 def test_flushes(self):
301 # Test flush() with the various options, using all the
302 # different levels in order to provide more variations.
303 sync_opt = ['Z_NO_FLUSH', 'Z_SYNC_FLUSH', 'Z_FULL_FLUSH']
304 sync_opt = [getattr(zlib, opt) for opt in sync_opt
305 if hasattr(zlib, opt)]
Neil Schemenauer6412b122004-06-05 19:34:28 +0000306 data = HAMLET_SCENE * 8
Guido van Rossum7d9ea502003-02-03 20:45:52 +0000307
308 for sync in sync_opt:
309 for level in range(10):
310 obj = zlib.compressobj( level )
311 a = obj.compress( data[:3000] )
312 b = obj.flush( sync )
313 c = obj.compress( data[3000:] )
314 d = obj.flush()
315 self.assertEqual(zlib.decompress(''.join([a,b,c,d])),
316 data, ("Decompress failed: flush "
317 "mode=%i, level=%i") % (sync, level))
318 del obj
319
320 def test_odd_flush(self):
321 # Test for odd flushing bugs noted in 2.0, and hopefully fixed in 2.1
322 import random
323
324 if hasattr(zlib, 'Z_SYNC_FLUSH'):
325 # Testing on 17K of "random" data
326
327 # Create compressor and decompressor objects
Neil Schemenauer6412b122004-06-05 19:34:28 +0000328 co = zlib.compressobj(zlib.Z_BEST_COMPRESSION)
Guido van Rossum7d9ea502003-02-03 20:45:52 +0000329 dco = zlib.decompressobj()
330
331 # Try 17K of data
332 # generate random data stream
333 try:
334 # In 2.3 and later, WichmannHill is the RNG of the bug report
335 gen = random.WichmannHill()
336 except AttributeError:
337 try:
338 # 2.2 called it Random
339 gen = random.Random()
340 except AttributeError:
341 # others might simply have a single RNG
342 gen = random
343 gen.seed(1)
344 data = genblock(1, 17 * 1024, generator=gen)
345
346 # compress, sync-flush, and decompress
347 first = co.compress(data)
348 second = co.flush(zlib.Z_SYNC_FLUSH)
349 expanded = dco.decompress(first + second)
350
351 # if decompressed data is different from the input data, choke.
352 self.assertEqual(expanded, data, "17K random source doesn't match")
353
Andrew M. Kuchling3b585b32004-12-28 20:10:48 +0000354 def test_empty_flush(self):
355 # Test that calling .flush() on unused objects works.
356 # (Bug #1083110 -- calling .flush() on decompress objects
357 # caused a core dump.)
358
359 co = zlib.compressobj(zlib.Z_BEST_COMPRESSION)
Benjamin Peterson5c8da862009-06-30 22:57:08 +0000360 self.assertTrue(co.flush()) # Returns a zlib header
Andrew M. Kuchling3b585b32004-12-28 20:10:48 +0000361 dco = zlib.decompressobj()
362 self.assertEqual(dco.flush(), "") # Returns nothing
Tim Peters5a9fb3c2005-01-07 16:01:32 +0000363
Antoine Pitrou37ffc3e2010-05-11 23:32:31 +0000364 def test_decompress_incomplete_stream(self):
365 # This is 'foo', deflated
366 x = 'x\x9cK\xcb\xcf\x07\x00\x02\x82\x01E'
367 # For the record
368 self.assertEqual(zlib.decompress(x), 'foo')
369 self.assertRaises(zlib.error, zlib.decompress, x[:-5])
370 # Omitting the stream end works with decompressor objects
371 # (see issue #8672).
372 dco = zlib.decompressobj()
373 y = dco.decompress(x[:-5])
374 y += dco.flush()
375 self.assertEqual(y, 'foo')
376
Neal Norwitz6e73aaa2006-06-12 03:33:09 +0000377 if hasattr(zlib.compressobj(), "copy"):
378 def test_compresscopy(self):
379 # Test copying a compression object
380 data0 = HAMLET_SCENE
381 data1 = HAMLET_SCENE.swapcase()
382 c0 = zlib.compressobj(zlib.Z_BEST_COMPRESSION)
383 bufs0 = []
384 bufs0.append(c0.compress(data0))
Georg Brandl8d3342b2006-05-16 07:38:27 +0000385
Neal Norwitz6e73aaa2006-06-12 03:33:09 +0000386 c1 = c0.copy()
387 bufs1 = bufs0[:]
Georg Brandl8d3342b2006-05-16 07:38:27 +0000388
Neal Norwitz6e73aaa2006-06-12 03:33:09 +0000389 bufs0.append(c0.compress(data0))
390 bufs0.append(c0.flush())
391 s0 = ''.join(bufs0)
Georg Brandl8d3342b2006-05-16 07:38:27 +0000392
Neal Norwitz6e73aaa2006-06-12 03:33:09 +0000393 bufs1.append(c1.compress(data1))
394 bufs1.append(c1.flush())
395 s1 = ''.join(bufs1)
Georg Brandl8d3342b2006-05-16 07:38:27 +0000396
Neal Norwitz6e73aaa2006-06-12 03:33:09 +0000397 self.assertEqual(zlib.decompress(s0),data0+data0)
398 self.assertEqual(zlib.decompress(s1),data0+data1)
Georg Brandl8d3342b2006-05-16 07:38:27 +0000399
Neal Norwitz6e73aaa2006-06-12 03:33:09 +0000400 def test_badcompresscopy(self):
401 # Test copying a compression object in an inconsistent state
402 c = zlib.compressobj()
403 c.compress(HAMLET_SCENE)
404 c.flush()
405 self.assertRaises(ValueError, c.copy)
Georg Brandl8d3342b2006-05-16 07:38:27 +0000406
Neal Norwitz6e73aaa2006-06-12 03:33:09 +0000407 if hasattr(zlib.decompressobj(), "copy"):
408 def test_decompresscopy(self):
409 # Test copying a decompression object
410 data = HAMLET_SCENE
411 comp = zlib.compress(data)
Georg Brandl8d3342b2006-05-16 07:38:27 +0000412
Neal Norwitz6e73aaa2006-06-12 03:33:09 +0000413 d0 = zlib.decompressobj()
414 bufs0 = []
415 bufs0.append(d0.decompress(comp[:32]))
Georg Brandl8d3342b2006-05-16 07:38:27 +0000416
Neal Norwitz6e73aaa2006-06-12 03:33:09 +0000417 d1 = d0.copy()
418 bufs1 = bufs0[:]
Georg Brandl8d3342b2006-05-16 07:38:27 +0000419
Neal Norwitz6e73aaa2006-06-12 03:33:09 +0000420 bufs0.append(d0.decompress(comp[32:]))
421 s0 = ''.join(bufs0)
Georg Brandl8d3342b2006-05-16 07:38:27 +0000422
Neal Norwitz6e73aaa2006-06-12 03:33:09 +0000423 bufs1.append(d1.decompress(comp[32:]))
424 s1 = ''.join(bufs1)
Georg Brandl8d3342b2006-05-16 07:38:27 +0000425
Neal Norwitz6e73aaa2006-06-12 03:33:09 +0000426 self.assertEqual(s0,s1)
427 self.assertEqual(s0,data)
Georg Brandl8d3342b2006-05-16 07:38:27 +0000428
Neal Norwitz6e73aaa2006-06-12 03:33:09 +0000429 def test_baddecompresscopy(self):
430 # Test copying a compression object in an inconsistent state
431 data = zlib.compress(HAMLET_SCENE)
432 d = zlib.decompressobj()
433 d.decompress(data)
434 d.flush()
435 self.assertRaises(ValueError, d.copy)
Guido van Rossum7d9ea502003-02-03 20:45:52 +0000436
Antoine Pitrou3843cd82010-05-07 16:50:34 +0000437 # Memory use of the following functions takes into account overallocation
438
439 @precisionbigmemtest(size=_1G + 1024 * 1024, memuse=3)
440 def test_big_compress_buffer(self, size):
441 c = zlib.compressobj(1)
442 compress = lambda s: c.compress(s) + c.flush()
443 self.check_big_compress_buffer(size, compress)
444
445 @precisionbigmemtest(size=_1G + 1024 * 1024, memuse=2)
446 def test_big_decompress_buffer(self, size):
447 d = zlib.decompressobj()
448 decompress = lambda s: d.decompress(s) + d.flush()
449 self.check_big_decompress_buffer(size, decompress)
450
451
Guido van Rossum7d9ea502003-02-03 20:45:52 +0000452def genblock(seed, length, step=1024, generator=random):
453 """length-byte stream of random data from a seed (in step-byte blocks)."""
454 if seed is not None:
455 generator.seed(seed)
456 randint = generator.randint
457 if length < step or step < 2:
458 step = length
459 blocks = []
460 for i in range(0, length, step):
461 blocks.append(''.join([chr(randint(0,255))
462 for x in range(step)]))
463 return ''.join(blocks)[:length]
464
465
466
467def choose_lines(source, number, seed=None, generator=random):
468 """Return a list of number lines randomly chosen from the source"""
469 if seed is not None:
470 generator.seed(seed)
471 sources = source.split('\n')
472 return [generator.choice(sources) for n in range(number)]
473
474
475
Neil Schemenauer6412b122004-06-05 19:34:28 +0000476HAMLET_SCENE = """
Fred Drake004d5e62000-10-23 17:22:08 +0000477LAERTES
Jeremy Hylton6eb4b6a1997-08-15 15:59:43 +0000478
479 O, fear me not.
480 I stay too long: but here my father comes.
481
482 Enter POLONIUS
483
484 A double blessing is a double grace,
485 Occasion smiles upon a second leave.
486
Fred Drake004d5e62000-10-23 17:22:08 +0000487LORD POLONIUS
Jeremy Hylton6eb4b6a1997-08-15 15:59:43 +0000488
489 Yet here, Laertes! aboard, aboard, for shame!
490 The wind sits in the shoulder of your sail,
491 And you are stay'd for. There; my blessing with thee!
492 And these few precepts in thy memory
493 See thou character. Give thy thoughts no tongue,
494 Nor any unproportioned thought his act.
495 Be thou familiar, but by no means vulgar.
496 Those friends thou hast, and their adoption tried,
497 Grapple them to thy soul with hoops of steel;
498 But do not dull thy palm with entertainment
499 Of each new-hatch'd, unfledged comrade. Beware
500 Of entrance to a quarrel, but being in,
501 Bear't that the opposed may beware of thee.
502 Give every man thy ear, but few thy voice;
503 Take each man's censure, but reserve thy judgment.
504 Costly thy habit as thy purse can buy,
505 But not express'd in fancy; rich, not gaudy;
506 For the apparel oft proclaims the man,
507 And they in France of the best rank and station
508 Are of a most select and generous chief in that.
509 Neither a borrower nor a lender be;
510 For loan oft loses both itself and friend,
511 And borrowing dulls the edge of husbandry.
512 This above all: to thine ownself be true,
513 And it must follow, as the night the day,
514 Thou canst not then be false to any man.
515 Farewell: my blessing season this in thee!
516
Fred Drake004d5e62000-10-23 17:22:08 +0000517LAERTES
Jeremy Hylton6eb4b6a1997-08-15 15:59:43 +0000518
519 Most humbly do I take my leave, my lord.
520
Fred Drake004d5e62000-10-23 17:22:08 +0000521LORD POLONIUS
Jeremy Hylton6eb4b6a1997-08-15 15:59:43 +0000522
523 The time invites you; go; your servants tend.
524
Fred Drake004d5e62000-10-23 17:22:08 +0000525LAERTES
Jeremy Hylton6eb4b6a1997-08-15 15:59:43 +0000526
527 Farewell, Ophelia; and remember well
528 What I have said to you.
529
Fred Drake004d5e62000-10-23 17:22:08 +0000530OPHELIA
Jeremy Hylton6eb4b6a1997-08-15 15:59:43 +0000531
532 'Tis in my memory lock'd,
533 And you yourself shall keep the key of it.
534
Fred Drake004d5e62000-10-23 17:22:08 +0000535LAERTES
Jeremy Hylton6eb4b6a1997-08-15 15:59:43 +0000536
537 Farewell.
538"""
Guido van Rossum7d9ea502003-02-03 20:45:52 +0000539
540
541def test_main():
Walter Dörwald21d3a322003-05-01 17:45:56 +0000542 test_support.run_unittest(
543 ChecksumTestCase,
544 ExceptionTestCase,
545 CompressTestCase,
546 CompressObjectTestCase
547 )
Guido van Rossum7d9ea502003-02-03 20:45:52 +0000548
549if __name__ == "__main__":
550 test_main()