blob: 9d17c9330b1cf8d9cf5abdab54b4d37a0f556216 [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
Neal Norwitz6e73aaa2006-06-12 03:33:09 +0000363 if hasattr(zlib.compressobj(), "copy"):
364 def test_compresscopy(self):
365 # Test copying a compression object
366 data0 = HAMLET_SCENE
367 data1 = HAMLET_SCENE.swapcase()
368 c0 = zlib.compressobj(zlib.Z_BEST_COMPRESSION)
369 bufs0 = []
370 bufs0.append(c0.compress(data0))
Georg Brandl8d3342b2006-05-16 07:38:27 +0000371
Neal Norwitz6e73aaa2006-06-12 03:33:09 +0000372 c1 = c0.copy()
373 bufs1 = bufs0[:]
Georg Brandl8d3342b2006-05-16 07:38:27 +0000374
Neal Norwitz6e73aaa2006-06-12 03:33:09 +0000375 bufs0.append(c0.compress(data0))
376 bufs0.append(c0.flush())
377 s0 = ''.join(bufs0)
Georg Brandl8d3342b2006-05-16 07:38:27 +0000378
Neal Norwitz6e73aaa2006-06-12 03:33:09 +0000379 bufs1.append(c1.compress(data1))
380 bufs1.append(c1.flush())
381 s1 = ''.join(bufs1)
Georg Brandl8d3342b2006-05-16 07:38:27 +0000382
Neal Norwitz6e73aaa2006-06-12 03:33:09 +0000383 self.assertEqual(zlib.decompress(s0),data0+data0)
384 self.assertEqual(zlib.decompress(s1),data0+data1)
Georg Brandl8d3342b2006-05-16 07:38:27 +0000385
Neal Norwitz6e73aaa2006-06-12 03:33:09 +0000386 def test_badcompresscopy(self):
387 # Test copying a compression object in an inconsistent state
388 c = zlib.compressobj()
389 c.compress(HAMLET_SCENE)
390 c.flush()
391 self.assertRaises(ValueError, c.copy)
Georg Brandl8d3342b2006-05-16 07:38:27 +0000392
Neal Norwitz6e73aaa2006-06-12 03:33:09 +0000393 if hasattr(zlib.decompressobj(), "copy"):
394 def test_decompresscopy(self):
395 # Test copying a decompression object
396 data = HAMLET_SCENE
397 comp = zlib.compress(data)
Georg Brandl8d3342b2006-05-16 07:38:27 +0000398
Neal Norwitz6e73aaa2006-06-12 03:33:09 +0000399 d0 = zlib.decompressobj()
400 bufs0 = []
401 bufs0.append(d0.decompress(comp[:32]))
Georg Brandl8d3342b2006-05-16 07:38:27 +0000402
Neal Norwitz6e73aaa2006-06-12 03:33:09 +0000403 d1 = d0.copy()
404 bufs1 = bufs0[:]
Georg Brandl8d3342b2006-05-16 07:38:27 +0000405
Neal Norwitz6e73aaa2006-06-12 03:33:09 +0000406 bufs0.append(d0.decompress(comp[32:]))
407 s0 = ''.join(bufs0)
Georg Brandl8d3342b2006-05-16 07:38:27 +0000408
Neal Norwitz6e73aaa2006-06-12 03:33:09 +0000409 bufs1.append(d1.decompress(comp[32:]))
410 s1 = ''.join(bufs1)
Georg Brandl8d3342b2006-05-16 07:38:27 +0000411
Neal Norwitz6e73aaa2006-06-12 03:33:09 +0000412 self.assertEqual(s0,s1)
413 self.assertEqual(s0,data)
Georg Brandl8d3342b2006-05-16 07:38:27 +0000414
Neal Norwitz6e73aaa2006-06-12 03:33:09 +0000415 def test_baddecompresscopy(self):
416 # Test copying a compression object in an inconsistent state
417 data = zlib.compress(HAMLET_SCENE)
418 d = zlib.decompressobj()
419 d.decompress(data)
420 d.flush()
421 self.assertRaises(ValueError, d.copy)
Guido van Rossum7d9ea502003-02-03 20:45:52 +0000422
Antoine Pitrouc7035cd2010-05-07 16:59:00 +0000423 # Memory use of the following functions takes into account overallocation
424
425 @precisionbigmemtest(size=_1G + 1024 * 1024, memuse=3)
426 def test_big_compress_buffer(self, size):
427 c = zlib.compressobj(1)
428 compress = lambda s: c.compress(s) + c.flush()
429 self.check_big_compress_buffer(size, compress)
430
431 @precisionbigmemtest(size=_1G + 1024 * 1024, memuse=2)
432 def test_big_decompress_buffer(self, size):
433 d = zlib.decompressobj()
434 decompress = lambda s: d.decompress(s) + d.flush()
435 self.check_big_decompress_buffer(size, decompress)
436
437
Guido van Rossum7d9ea502003-02-03 20:45:52 +0000438def genblock(seed, length, step=1024, generator=random):
439 """length-byte stream of random data from a seed (in step-byte blocks)."""
440 if seed is not None:
441 generator.seed(seed)
442 randint = generator.randint
443 if length < step or step < 2:
444 step = length
445 blocks = []
446 for i in range(0, length, step):
447 blocks.append(''.join([chr(randint(0,255))
448 for x in range(step)]))
449 return ''.join(blocks)[:length]
450
451
452
453def choose_lines(source, number, seed=None, generator=random):
454 """Return a list of number lines randomly chosen from the source"""
455 if seed is not None:
456 generator.seed(seed)
457 sources = source.split('\n')
458 return [generator.choice(sources) for n in range(number)]
459
460
461
Neil Schemenauer6412b122004-06-05 19:34:28 +0000462HAMLET_SCENE = """
Fred Drake004d5e62000-10-23 17:22:08 +0000463LAERTES
Jeremy Hylton6eb4b6a1997-08-15 15:59:43 +0000464
465 O, fear me not.
466 I stay too long: but here my father comes.
467
468 Enter POLONIUS
469
470 A double blessing is a double grace,
471 Occasion smiles upon a second leave.
472
Fred Drake004d5e62000-10-23 17:22:08 +0000473LORD POLONIUS
Jeremy Hylton6eb4b6a1997-08-15 15:59:43 +0000474
475 Yet here, Laertes! aboard, aboard, for shame!
476 The wind sits in the shoulder of your sail,
477 And you are stay'd for. There; my blessing with thee!
478 And these few precepts in thy memory
479 See thou character. Give thy thoughts no tongue,
480 Nor any unproportioned thought his act.
481 Be thou familiar, but by no means vulgar.
482 Those friends thou hast, and their adoption tried,
483 Grapple them to thy soul with hoops of steel;
484 But do not dull thy palm with entertainment
485 Of each new-hatch'd, unfledged comrade. Beware
486 Of entrance to a quarrel, but being in,
487 Bear't that the opposed may beware of thee.
488 Give every man thy ear, but few thy voice;
489 Take each man's censure, but reserve thy judgment.
490 Costly thy habit as thy purse can buy,
491 But not express'd in fancy; rich, not gaudy;
492 For the apparel oft proclaims the man,
493 And they in France of the best rank and station
494 Are of a most select and generous chief in that.
495 Neither a borrower nor a lender be;
496 For loan oft loses both itself and friend,
497 And borrowing dulls the edge of husbandry.
498 This above all: to thine ownself be true,
499 And it must follow, as the night the day,
500 Thou canst not then be false to any man.
501 Farewell: my blessing season this in thee!
502
Fred Drake004d5e62000-10-23 17:22:08 +0000503LAERTES
Jeremy Hylton6eb4b6a1997-08-15 15:59:43 +0000504
505 Most humbly do I take my leave, my lord.
506
Fred Drake004d5e62000-10-23 17:22:08 +0000507LORD POLONIUS
Jeremy Hylton6eb4b6a1997-08-15 15:59:43 +0000508
509 The time invites you; go; your servants tend.
510
Fred Drake004d5e62000-10-23 17:22:08 +0000511LAERTES
Jeremy Hylton6eb4b6a1997-08-15 15:59:43 +0000512
513 Farewell, Ophelia; and remember well
514 What I have said to you.
515
Fred Drake004d5e62000-10-23 17:22:08 +0000516OPHELIA
Jeremy Hylton6eb4b6a1997-08-15 15:59:43 +0000517
518 'Tis in my memory lock'd,
519 And you yourself shall keep the key of it.
520
Fred Drake004d5e62000-10-23 17:22:08 +0000521LAERTES
Jeremy Hylton6eb4b6a1997-08-15 15:59:43 +0000522
523 Farewell.
524"""
Guido van Rossum7d9ea502003-02-03 20:45:52 +0000525
526
527def test_main():
Walter Dörwald21d3a322003-05-01 17:45:56 +0000528 test_support.run_unittest(
529 ChecksumTestCase,
530 ExceptionTestCase,
531 CompressTestCase,
532 CompressObjectTestCase
533 )
Guido van Rossum7d9ea502003-02-03 20:45:52 +0000534
535if __name__ == "__main__":
536 test_main()