blob: 9137f8aaeb3961d7cee2169230f5906e7242266a [file] [log] [blame]
Guido van Rossum7d9ea502003-02-03 20:45:52 +00001import unittest
2from test import test_support
Jeremy Hylton6eb4b6a1997-08-15 15:59:43 +00003import zlib
Gregory P. Smithc856fa82008-03-18 22:27:41 +00004import binascii
Andrew M. Kuchling9a0f98e2001-02-21 02:17:01 +00005import random
Antoine Pitrouc7035cd2010-05-07 16:59:00 +00006from test.test_support import precisionbigmemtest, _1G
Andrew M. Kuchling9a0f98e2001-02-21 02:17:01 +00007
Andrew M. Kuchling9a0f98e2001-02-21 02:17:01 +00008
Guido van Rossum7d9ea502003-02-03 20:45:52 +00009class ChecksumTestCase(unittest.TestCase):
10 # checksum test cases
11 def test_crc32start(self):
12 self.assertEqual(zlib.crc32(""), zlib.crc32("", 0))
Andrew M. Kuchlingbb7e8002005-11-22 15:32:28 +000013 self.assert_(zlib.crc32("abc", 0xffffffff))
Andrew M. Kuchlingfcfc8d52001-08-10 15:50:11 +000014
Guido van Rossum7d9ea502003-02-03 20:45:52 +000015 def test_crc32empty(self):
16 self.assertEqual(zlib.crc32("", 0), 0)
17 self.assertEqual(zlib.crc32("", 1), 1)
18 self.assertEqual(zlib.crc32("", 432), 432)
Andrew M. Kuchling9a0f98e2001-02-21 02:17:01 +000019
Guido van Rossum7d9ea502003-02-03 20:45:52 +000020 def test_adler32start(self):
21 self.assertEqual(zlib.adler32(""), zlib.adler32("", 1))
Andrew M. Kuchlingbb7e8002005-11-22 15:32:28 +000022 self.assert_(zlib.adler32("abc", 0xffffffff))
Jeremy Hylton6eb4b6a1997-08-15 15:59:43 +000023
Guido van Rossum7d9ea502003-02-03 20:45:52 +000024 def test_adler32empty(self):
25 self.assertEqual(zlib.adler32("", 0), 0)
26 self.assertEqual(zlib.adler32("", 1), 1)
27 self.assertEqual(zlib.adler32("", 432), 432)
Jeremy Hylton6eb4b6a1997-08-15 15:59:43 +000028
Guido van Rossum7d9ea502003-02-03 20:45:52 +000029 def assertEqual32(self, seen, expected):
30 # 32-bit values masked -- checksums on 32- vs 64- bit machines
31 # This is important if bit 31 (0x08000000L) is set.
32 self.assertEqual(seen & 0x0FFFFFFFFL, expected & 0x0FFFFFFFFL)
33
34 def test_penguins(self):
35 self.assertEqual32(zlib.crc32("penguin", 0), 0x0e5c1a120L)
36 self.assertEqual32(zlib.crc32("penguin", 1), 0x43b6aa94)
37 self.assertEqual32(zlib.adler32("penguin", 0), 0x0bcf02f6)
38 self.assertEqual32(zlib.adler32("penguin", 1), 0x0bd602f7)
39
40 self.assertEqual(zlib.crc32("penguin"), zlib.crc32("penguin", 0))
41 self.assertEqual(zlib.adler32("penguin"),zlib.adler32("penguin",1))
42
Gregory P. Smithf48f9d32008-03-17 18:48:05 +000043 def test_abcdefghijklmnop(self):
44 """test issue1202 compliance: signed crc32, adler32 in 2.x"""
45 foo = 'abcdefghijklmnop'
46 # explicitly test signed behavior
47 self.assertEqual(zlib.crc32(foo), -1808088941)
48 self.assertEqual(zlib.crc32('spam'), 1138425661)
49 self.assertEqual(zlib.adler32(foo+foo), -721416943)
50 self.assertEqual(zlib.adler32('spam'), 72286642)
51
Gregory P. Smithc856fa82008-03-18 22:27:41 +000052 def test_same_as_binascii_crc32(self):
53 foo = 'abcdefghijklmnop'
54 self.assertEqual(binascii.crc32(foo), zlib.crc32(foo))
55 self.assertEqual(binascii.crc32('spam'), zlib.crc32('spam'))
56
Gregory P. Smith88440962008-03-25 06:12:45 +000057 def test_negative_crc_iv_input(self):
58 # The range of valid input values for the crc state should be
59 # -2**31 through 2**32-1 to allow inputs artifically constrained
60 # to a signed 32-bit integer.
61 self.assertEqual(zlib.crc32('ham', -1), zlib.crc32('ham', 0xffffffffL))
62 self.assertEqual(zlib.crc32('spam', -3141593),
63 zlib.crc32('spam', 0xffd01027L))
64 self.assertEqual(zlib.crc32('spam', -(2**31)),
65 zlib.crc32('spam', (2**31)))
Guido van Rossum7d9ea502003-02-03 20:45:52 +000066
67
68class ExceptionTestCase(unittest.TestCase):
69 # make sure we generate some expected errors
Armin Rigoec560192007-10-15 07:48:35 +000070 def test_badlevel(self):
71 # specifying compression level out of range causes an error
72 # (but -1 is Z_DEFAULT_COMPRESSION and apparently the zlib
73 # accepts 0 too)
74 self.assertRaises(zlib.error, zlib.compress, 'ERROR', 10)
Guido van Rossum7d9ea502003-02-03 20:45:52 +000075
76 def test_badcompressobj(self):
77 # verify failure on building compress object with bad params
Neil Schemenauer94afd3e2004-06-05 19:02:52 +000078 self.assertRaises(ValueError, zlib.compressobj, 1, zlib.DEFLATED, 0)
Armin Rigoec560192007-10-15 07:48:35 +000079 # specifying total bits too large causes an error
80 self.assertRaises(ValueError,
81 zlib.compressobj, 1, zlib.DEFLATED, zlib.MAX_WBITS + 1)
Guido van Rossum7d9ea502003-02-03 20:45:52 +000082
83 def test_baddecompressobj(self):
84 # verify failure on building decompress object with bad params
Antoine Pitrou644c9dd2010-04-06 17:24:02 +000085 self.assertRaises(ValueError, zlib.decompressobj, -1)
Guido van Rossum7d9ea502003-02-03 20:45:52 +000086
Gregory P. Smith79e42a02008-04-09 00:25:17 +000087 def test_decompressobj_badflush(self):
88 # verify failure on calling decompressobj.flush with bad params
89 self.assertRaises(ValueError, zlib.decompressobj().flush, 0)
90 self.assertRaises(ValueError, zlib.decompressobj().flush, -1)
91
Guido van Rossum7d9ea502003-02-03 20:45:52 +000092
Antoine Pitrouc7035cd2010-05-07 16:59:00 +000093class BaseCompressTestCase(object):
94 def check_big_compress_buffer(self, size, compress_func):
95 _1M = 1024 * 1024
96 fmt = "%%0%dx" % (2 * _1M)
97 # Generate 10MB worth of random, and expand it by repeating it.
98 # The assumption is that zlib's memory is not big enough to exploit
99 # such spread out redundancy.
100 data = ''.join([binascii.a2b_hex(fmt % random.getrandbits(8 * _1M))
101 for i in range(10)])
102 data = data * (size // len(data) + 1)
103 try:
104 compress_func(data)
105 finally:
106 # Release memory
107 data = None
Guido van Rossum7d9ea502003-02-03 20:45:52 +0000108
Antoine Pitrouc7035cd2010-05-07 16:59:00 +0000109 def check_big_decompress_buffer(self, size, decompress_func):
110 data = 'x' * size
111 try:
112 compressed = zlib.compress(data, 1)
113 finally:
114 # Release memory
115 data = None
116 data = decompress_func(compressed)
117 # Sanity check
118 try:
119 self.assertEqual(len(data), size)
120 self.assertEqual(len(data.strip('x')), 0)
121 finally:
122 data = None
123
124
125class CompressTestCase(BaseCompressTestCase, unittest.TestCase):
Guido van Rossum7d9ea502003-02-03 20:45:52 +0000126 # Test compression in one go (whole message compression)
127 def test_speech(self):
Neil Schemenauer6412b122004-06-05 19:34:28 +0000128 x = zlib.compress(HAMLET_SCENE)
129 self.assertEqual(zlib.decompress(x), HAMLET_SCENE)
Guido van Rossum7d9ea502003-02-03 20:45:52 +0000130
131 def test_speech128(self):
Neil Schemenauer6412b122004-06-05 19:34:28 +0000132 # compress more data
133 data = HAMLET_SCENE * 128
Guido van Rossum7d9ea502003-02-03 20:45:52 +0000134 x = zlib.compress(data)
135 self.assertEqual(zlib.decompress(x), data)
136
Antoine Pitrouc7035cd2010-05-07 16:59:00 +0000137 # Memory use of the following functions takes into account overallocation
138
139 @precisionbigmemtest(size=_1G + 1024 * 1024, memuse=3)
140 def test_big_compress_buffer(self, size):
141 compress = lambda s: zlib.compress(s, 1)
142 self.check_big_compress_buffer(size, compress)
143
144 @precisionbigmemtest(size=_1G + 1024 * 1024, memuse=2)
145 def test_big_decompress_buffer(self, size):
146 self.check_big_decompress_buffer(size, zlib.decompress)
Guido van Rossum7d9ea502003-02-03 20:45:52 +0000147
148
Antoine Pitrouc7035cd2010-05-07 16:59:00 +0000149class CompressObjectTestCase(BaseCompressTestCase, unittest.TestCase):
Guido van Rossum7d9ea502003-02-03 20:45:52 +0000150 # Test compression object
Guido van Rossum7d9ea502003-02-03 20:45:52 +0000151 def test_pair(self):
Neil Schemenauer6412b122004-06-05 19:34:28 +0000152 # straightforward compress/decompress objects
153 data = HAMLET_SCENE * 128
154 co = zlib.compressobj()
Guido van Rossum7d9ea502003-02-03 20:45:52 +0000155 x1 = co.compress(data)
156 x2 = co.flush()
157 self.assertRaises(zlib.error, co.flush) # second flush should not work
Neil Schemenauer94afd3e2004-06-05 19:02:52 +0000158 dco = zlib.decompressobj()
Guido van Rossum7d9ea502003-02-03 20:45:52 +0000159 y1 = dco.decompress(x1 + x2)
160 y2 = dco.flush()
161 self.assertEqual(data, y1 + y2)
162
Neil Schemenauer94afd3e2004-06-05 19:02:52 +0000163 def test_compressoptions(self):
164 # specify lots of options to compressobj()
165 level = 2
166 method = zlib.DEFLATED
167 wbits = -12
168 memlevel = 9
169 strategy = zlib.Z_FILTERED
170 co = zlib.compressobj(level, method, wbits, memlevel, strategy)
Neil Schemenauer6412b122004-06-05 19:34:28 +0000171 x1 = co.compress(HAMLET_SCENE)
Neil Schemenauer94afd3e2004-06-05 19:02:52 +0000172 x2 = co.flush()
173 dco = zlib.decompressobj(wbits)
174 y1 = dco.decompress(x1 + x2)
175 y2 = dco.flush()
Neil Schemenauer6412b122004-06-05 19:34:28 +0000176 self.assertEqual(HAMLET_SCENE, y1 + y2)
Neil Schemenauer94afd3e2004-06-05 19:02:52 +0000177
Guido van Rossum7d9ea502003-02-03 20:45:52 +0000178 def test_compressincremental(self):
179 # compress object in steps, decompress object as one-shot
Neil Schemenauer6412b122004-06-05 19:34:28 +0000180 data = HAMLET_SCENE * 128
Neil Schemenauer94afd3e2004-06-05 19:02:52 +0000181 co = zlib.compressobj()
Guido van Rossum7d9ea502003-02-03 20:45:52 +0000182 bufs = []
183 for i in range(0, len(data), 256):
184 bufs.append(co.compress(data[i:i+256]))
185 bufs.append(co.flush())
186 combuf = ''.join(bufs)
187
Neil Schemenauer94afd3e2004-06-05 19:02:52 +0000188 dco = zlib.decompressobj()
Guido van Rossum7d9ea502003-02-03 20:45:52 +0000189 y1 = dco.decompress(''.join(bufs))
190 y2 = dco.flush()
191 self.assertEqual(data, y1 + y2)
192
Neil Schemenauer6412b122004-06-05 19:34:28 +0000193 def test_decompinc(self, flush=False, source=None, cx=256, dcx=64):
Guido van Rossum7d9ea502003-02-03 20:45:52 +0000194 # compress object in steps, decompress object in steps
Neil Schemenauer6412b122004-06-05 19:34:28 +0000195 source = source or HAMLET_SCENE
196 data = source * 128
Neil Schemenauer94afd3e2004-06-05 19:02:52 +0000197 co = zlib.compressobj()
Guido van Rossum7d9ea502003-02-03 20:45:52 +0000198 bufs = []
Neil Schemenauer6412b122004-06-05 19:34:28 +0000199 for i in range(0, len(data), cx):
200 bufs.append(co.compress(data[i:i+cx]))
Guido van Rossum7d9ea502003-02-03 20:45:52 +0000201 bufs.append(co.flush())
202 combuf = ''.join(bufs)
203
Neil Schemenauer94afd3e2004-06-05 19:02:52 +0000204 self.assertEqual(data, zlib.decompress(combuf))
Guido van Rossum7d9ea502003-02-03 20:45:52 +0000205
Neil Schemenauer94afd3e2004-06-05 19:02:52 +0000206 dco = zlib.decompressobj()
Guido van Rossum7d9ea502003-02-03 20:45:52 +0000207 bufs = []
Neil Schemenauer6412b122004-06-05 19:34:28 +0000208 for i in range(0, len(combuf), dcx):
209 bufs.append(dco.decompress(combuf[i:i+dcx]))
Guido van Rossum7d9ea502003-02-03 20:45:52 +0000210 self.assertEqual('', dco.unconsumed_tail, ########
211 "(A) uct should be '': not %d long" %
Neil Schemenauer6412b122004-06-05 19:34:28 +0000212 len(dco.unconsumed_tail))
213 if flush:
214 bufs.append(dco.flush())
215 else:
216 while True:
217 chunk = dco.decompress('')
218 if chunk:
219 bufs.append(chunk)
220 else:
221 break
Guido van Rossum7d9ea502003-02-03 20:45:52 +0000222 self.assertEqual('', dco.unconsumed_tail, ########
Neil Schemenauer6412b122004-06-05 19:34:28 +0000223 "(B) uct should be '': not %d long" %
224 len(dco.unconsumed_tail))
Guido van Rossum7d9ea502003-02-03 20:45:52 +0000225 self.assertEqual(data, ''.join(bufs))
226 # Failure means: "decompressobj with init options failed"
227
Neil Schemenauer6412b122004-06-05 19:34:28 +0000228 def test_decompincflush(self):
229 self.test_decompinc(flush=True)
Guido van Rossum7d9ea502003-02-03 20:45:52 +0000230
Neil Schemenauer6412b122004-06-05 19:34:28 +0000231 def test_decompimax(self, source=None, cx=256, dcx=64):
232 # compress in steps, decompress in length-restricted steps
233 source = source or HAMLET_SCENE
Guido van Rossum7d9ea502003-02-03 20:45:52 +0000234 # Check a decompression object with max_length specified
Neil Schemenauer6412b122004-06-05 19:34:28 +0000235 data = source * 128
236 co = zlib.compressobj()
237 bufs = []
238 for i in range(0, len(data), cx):
239 bufs.append(co.compress(data[i:i+cx]))
240 bufs.append(co.flush())
241 combuf = ''.join(bufs)
242 self.assertEqual(data, zlib.decompress(combuf),
243 'compressed data failure')
244
245 dco = zlib.decompressobj()
246 bufs = []
247 cb = combuf
248 while cb:
249 #max_length = 1 + len(cb)//10
250 chunk = dco.decompress(cb, dcx)
251 self.failIf(len(chunk) > dcx,
252 'chunk too big (%d>%d)' % (len(chunk), dcx))
253 bufs.append(chunk)
254 cb = dco.unconsumed_tail
255 bufs.append(dco.flush())
256 self.assertEqual(data, ''.join(bufs), 'Wrong data retrieved')
257
258 def test_decompressmaxlen(self, flush=False):
259 # Check a decompression object with max_length specified
260 data = HAMLET_SCENE * 128
Neil Schemenauer94afd3e2004-06-05 19:02:52 +0000261 co = zlib.compressobj()
Guido van Rossum7d9ea502003-02-03 20:45:52 +0000262 bufs = []
263 for i in range(0, len(data), 256):
264 bufs.append(co.compress(data[i:i+256]))
265 bufs.append(co.flush())
266 combuf = ''.join(bufs)
Neil Schemenauer94afd3e2004-06-05 19:02:52 +0000267 self.assertEqual(data, zlib.decompress(combuf),
Guido van Rossum7d9ea502003-02-03 20:45:52 +0000268 'compressed data failure')
269
Neil Schemenauer94afd3e2004-06-05 19:02:52 +0000270 dco = zlib.decompressobj()
Guido van Rossum7d9ea502003-02-03 20:45:52 +0000271 bufs = []
272 cb = combuf
273 while cb:
Guido van Rossumf3594102003-02-27 18:39:18 +0000274 max_length = 1 + len(cb)//10
Guido van Rossum7d9ea502003-02-03 20:45:52 +0000275 chunk = dco.decompress(cb, max_length)
276 self.failIf(len(chunk) > max_length,
277 'chunk too big (%d>%d)' % (len(chunk),max_length))
278 bufs.append(chunk)
279 cb = dco.unconsumed_tail
Neil Schemenauer6412b122004-06-05 19:34:28 +0000280 if flush:
281 bufs.append(dco.flush())
282 else:
283 while chunk:
284 chunk = dco.decompress('', max_length)
285 self.failIf(len(chunk) > max_length,
286 'chunk too big (%d>%d)' % (len(chunk),max_length))
287 bufs.append(chunk)
Guido van Rossum7d9ea502003-02-03 20:45:52 +0000288 self.assertEqual(data, ''.join(bufs), 'Wrong data retrieved')
289
Neil Schemenauer6412b122004-06-05 19:34:28 +0000290 def test_decompressmaxlenflush(self):
291 self.test_decompressmaxlen(flush=True)
Guido van Rossum7d9ea502003-02-03 20:45:52 +0000292
293 def test_maxlenmisc(self):
294 # Misc tests of max_length
Neil Schemenauer94afd3e2004-06-05 19:02:52 +0000295 dco = zlib.decompressobj()
Guido van Rossum7d9ea502003-02-03 20:45:52 +0000296 self.assertRaises(ValueError, dco.decompress, "", -1)
297 self.assertEqual('', dco.unconsumed_tail)
298
299 def test_flushes(self):
300 # Test flush() with the various options, using all the
301 # different levels in order to provide more variations.
302 sync_opt = ['Z_NO_FLUSH', 'Z_SYNC_FLUSH', 'Z_FULL_FLUSH']
303 sync_opt = [getattr(zlib, opt) for opt in sync_opt
304 if hasattr(zlib, opt)]
Neil Schemenauer6412b122004-06-05 19:34:28 +0000305 data = HAMLET_SCENE * 8
Guido van Rossum7d9ea502003-02-03 20:45:52 +0000306
307 for sync in sync_opt:
308 for level in range(10):
309 obj = zlib.compressobj( level )
310 a = obj.compress( data[:3000] )
311 b = obj.flush( sync )
312 c = obj.compress( data[3000:] )
313 d = obj.flush()
314 self.assertEqual(zlib.decompress(''.join([a,b,c,d])),
315 data, ("Decompress failed: flush "
316 "mode=%i, level=%i") % (sync, level))
317 del obj
318
319 def test_odd_flush(self):
320 # Test for odd flushing bugs noted in 2.0, and hopefully fixed in 2.1
321 import random
322
323 if hasattr(zlib, 'Z_SYNC_FLUSH'):
324 # Testing on 17K of "random" data
325
326 # Create compressor and decompressor objects
Neil Schemenauer6412b122004-06-05 19:34:28 +0000327 co = zlib.compressobj(zlib.Z_BEST_COMPRESSION)
Guido van Rossum7d9ea502003-02-03 20:45:52 +0000328 dco = zlib.decompressobj()
329
330 # Try 17K of data
331 # generate random data stream
332 try:
333 # In 2.3 and later, WichmannHill is the RNG of the bug report
334 gen = random.WichmannHill()
335 except AttributeError:
336 try:
337 # 2.2 called it Random
338 gen = random.Random()
339 except AttributeError:
340 # others might simply have a single RNG
341 gen = random
342 gen.seed(1)
343 data = genblock(1, 17 * 1024, generator=gen)
344
345 # compress, sync-flush, and decompress
346 first = co.compress(data)
347 second = co.flush(zlib.Z_SYNC_FLUSH)
348 expanded = dco.decompress(first + second)
349
350 # if decompressed data is different from the input data, choke.
351 self.assertEqual(expanded, data, "17K random source doesn't match")
352
Andrew M. Kuchling3b585b32004-12-28 20:10:48 +0000353 def test_empty_flush(self):
354 # Test that calling .flush() on unused objects works.
355 # (Bug #1083110 -- calling .flush() on decompress objects
356 # caused a core dump.)
357
358 co = zlib.compressobj(zlib.Z_BEST_COMPRESSION)
359 self.failUnless(co.flush()) # Returns a zlib header
360 dco = zlib.decompressobj()
361 self.assertEqual(dco.flush(), "") # Returns nothing
Tim Peters5a9fb3c2005-01-07 16:01:32 +0000362
Antoine Pitrou33c58132010-05-11 23:33:53 +0000363 def test_decompress_incomplete_stream(self):
364 # This is 'foo', deflated
365 x = 'x\x9cK\xcb\xcf\x07\x00\x02\x82\x01E'
366 # For the record
367 self.assertEqual(zlib.decompress(x), 'foo')
368 self.assertRaises(zlib.error, zlib.decompress, x[:-5])
369 # Omitting the stream end works with decompressor objects
370 # (see issue #8672).
371 dco = zlib.decompressobj()
372 y = dco.decompress(x[:-5])
373 y += dco.flush()
374 self.assertEqual(y, 'foo')
375
Neal Norwitz6e73aaa2006-06-12 03:33:09 +0000376 if hasattr(zlib.compressobj(), "copy"):
377 def test_compresscopy(self):
378 # Test copying a compression object
379 data0 = HAMLET_SCENE
380 data1 = HAMLET_SCENE.swapcase()
381 c0 = zlib.compressobj(zlib.Z_BEST_COMPRESSION)
382 bufs0 = []
383 bufs0.append(c0.compress(data0))
Georg Brandl8d3342b2006-05-16 07:38:27 +0000384
Neal Norwitz6e73aaa2006-06-12 03:33:09 +0000385 c1 = c0.copy()
386 bufs1 = bufs0[:]
Georg Brandl8d3342b2006-05-16 07:38:27 +0000387
Neal Norwitz6e73aaa2006-06-12 03:33:09 +0000388 bufs0.append(c0.compress(data0))
389 bufs0.append(c0.flush())
390 s0 = ''.join(bufs0)
Georg Brandl8d3342b2006-05-16 07:38:27 +0000391
Neal Norwitz6e73aaa2006-06-12 03:33:09 +0000392 bufs1.append(c1.compress(data1))
393 bufs1.append(c1.flush())
394 s1 = ''.join(bufs1)
Georg Brandl8d3342b2006-05-16 07:38:27 +0000395
Neal Norwitz6e73aaa2006-06-12 03:33:09 +0000396 self.assertEqual(zlib.decompress(s0),data0+data0)
397 self.assertEqual(zlib.decompress(s1),data0+data1)
Georg Brandl8d3342b2006-05-16 07:38:27 +0000398
Neal Norwitz6e73aaa2006-06-12 03:33:09 +0000399 def test_badcompresscopy(self):
400 # Test copying a compression object in an inconsistent state
401 c = zlib.compressobj()
402 c.compress(HAMLET_SCENE)
403 c.flush()
404 self.assertRaises(ValueError, c.copy)
Georg Brandl8d3342b2006-05-16 07:38:27 +0000405
Neal Norwitz6e73aaa2006-06-12 03:33:09 +0000406 if hasattr(zlib.decompressobj(), "copy"):
407 def test_decompresscopy(self):
408 # Test copying a decompression object
409 data = HAMLET_SCENE
410 comp = zlib.compress(data)
Georg Brandl8d3342b2006-05-16 07:38:27 +0000411
Neal Norwitz6e73aaa2006-06-12 03:33:09 +0000412 d0 = zlib.decompressobj()
413 bufs0 = []
414 bufs0.append(d0.decompress(comp[:32]))
Georg Brandl8d3342b2006-05-16 07:38:27 +0000415
Neal Norwitz6e73aaa2006-06-12 03:33:09 +0000416 d1 = d0.copy()
417 bufs1 = bufs0[:]
Georg Brandl8d3342b2006-05-16 07:38:27 +0000418
Neal Norwitz6e73aaa2006-06-12 03:33:09 +0000419 bufs0.append(d0.decompress(comp[32:]))
420 s0 = ''.join(bufs0)
Georg Brandl8d3342b2006-05-16 07:38:27 +0000421
Neal Norwitz6e73aaa2006-06-12 03:33:09 +0000422 bufs1.append(d1.decompress(comp[32:]))
423 s1 = ''.join(bufs1)
Georg Brandl8d3342b2006-05-16 07:38:27 +0000424
Neal Norwitz6e73aaa2006-06-12 03:33:09 +0000425 self.assertEqual(s0,s1)
426 self.assertEqual(s0,data)
Georg Brandl8d3342b2006-05-16 07:38:27 +0000427
Neal Norwitz6e73aaa2006-06-12 03:33:09 +0000428 def test_baddecompresscopy(self):
429 # Test copying a compression object in an inconsistent state
430 data = zlib.compress(HAMLET_SCENE)
431 d = zlib.decompressobj()
432 d.decompress(data)
433 d.flush()
434 self.assertRaises(ValueError, d.copy)
Guido van Rossum7d9ea502003-02-03 20:45:52 +0000435
Antoine Pitrouc7035cd2010-05-07 16:59:00 +0000436 # Memory use of the following functions takes into account overallocation
437
438 @precisionbigmemtest(size=_1G + 1024 * 1024, memuse=3)
439 def test_big_compress_buffer(self, size):
440 c = zlib.compressobj(1)
441 compress = lambda s: c.compress(s) + c.flush()
442 self.check_big_compress_buffer(size, compress)
443
444 @precisionbigmemtest(size=_1G + 1024 * 1024, memuse=2)
445 def test_big_decompress_buffer(self, size):
446 d = zlib.decompressobj()
447 decompress = lambda s: d.decompress(s) + d.flush()
448 self.check_big_decompress_buffer(size, decompress)
449
450
Guido van Rossum7d9ea502003-02-03 20:45:52 +0000451def genblock(seed, length, step=1024, generator=random):
452 """length-byte stream of random data from a seed (in step-byte blocks)."""
453 if seed is not None:
454 generator.seed(seed)
455 randint = generator.randint
456 if length < step or step < 2:
457 step = length
458 blocks = []
459 for i in range(0, length, step):
460 blocks.append(''.join([chr(randint(0,255))
461 for x in range(step)]))
462 return ''.join(blocks)[:length]
463
464
465
466def choose_lines(source, number, seed=None, generator=random):
467 """Return a list of number lines randomly chosen from the source"""
468 if seed is not None:
469 generator.seed(seed)
470 sources = source.split('\n')
471 return [generator.choice(sources) for n in range(number)]
472
473
474
Neil Schemenauer6412b122004-06-05 19:34:28 +0000475HAMLET_SCENE = """
Fred Drake004d5e62000-10-23 17:22:08 +0000476LAERTES
Jeremy Hylton6eb4b6a1997-08-15 15:59:43 +0000477
478 O, fear me not.
479 I stay too long: but here my father comes.
480
481 Enter POLONIUS
482
483 A double blessing is a double grace,
484 Occasion smiles upon a second leave.
485
Fred Drake004d5e62000-10-23 17:22:08 +0000486LORD POLONIUS
Jeremy Hylton6eb4b6a1997-08-15 15:59:43 +0000487
488 Yet here, Laertes! aboard, aboard, for shame!
489 The wind sits in the shoulder of your sail,
490 And you are stay'd for. There; my blessing with thee!
491 And these few precepts in thy memory
492 See thou character. Give thy thoughts no tongue,
493 Nor any unproportioned thought his act.
494 Be thou familiar, but by no means vulgar.
495 Those friends thou hast, and their adoption tried,
496 Grapple them to thy soul with hoops of steel;
497 But do not dull thy palm with entertainment
498 Of each new-hatch'd, unfledged comrade. Beware
499 Of entrance to a quarrel, but being in,
500 Bear't that the opposed may beware of thee.
501 Give every man thy ear, but few thy voice;
502 Take each man's censure, but reserve thy judgment.
503 Costly thy habit as thy purse can buy,
504 But not express'd in fancy; rich, not gaudy;
505 For the apparel oft proclaims the man,
506 And they in France of the best rank and station
507 Are of a most select and generous chief in that.
508 Neither a borrower nor a lender be;
509 For loan oft loses both itself and friend,
510 And borrowing dulls the edge of husbandry.
511 This above all: to thine ownself be true,
512 And it must follow, as the night the day,
513 Thou canst not then be false to any man.
514 Farewell: my blessing season this in thee!
515
Fred Drake004d5e62000-10-23 17:22:08 +0000516LAERTES
Jeremy Hylton6eb4b6a1997-08-15 15:59:43 +0000517
518 Most humbly do I take my leave, my lord.
519
Fred Drake004d5e62000-10-23 17:22:08 +0000520LORD POLONIUS
Jeremy Hylton6eb4b6a1997-08-15 15:59:43 +0000521
522 The time invites you; go; your servants tend.
523
Fred Drake004d5e62000-10-23 17:22:08 +0000524LAERTES
Jeremy Hylton6eb4b6a1997-08-15 15:59:43 +0000525
526 Farewell, Ophelia; and remember well
527 What I have said to you.
528
Fred Drake004d5e62000-10-23 17:22:08 +0000529OPHELIA
Jeremy Hylton6eb4b6a1997-08-15 15:59:43 +0000530
531 'Tis in my memory lock'd,
532 And you yourself shall keep the key of it.
533
Fred Drake004d5e62000-10-23 17:22:08 +0000534LAERTES
Jeremy Hylton6eb4b6a1997-08-15 15:59:43 +0000535
536 Farewell.
537"""
Guido van Rossum7d9ea502003-02-03 20:45:52 +0000538
539
540def test_main():
Walter Dörwald21d3a322003-05-01 17:45:56 +0000541 test_support.run_unittest(
542 ChecksumTestCase,
543 ExceptionTestCase,
544 CompressTestCase,
545 CompressObjectTestCase
546 )
Guido van Rossum7d9ea502003-02-03 20:45:52 +0000547
548if __name__ == "__main__":
549 test_main()