blob: b5f3fe50281a75791f1fef31dcd043eeff716c99 [file] [log] [blame]
Guido van Rossum7d9ea502003-02-03 20:45:52 +00001import unittest
Benjamin Petersonee8712c2008-05-20 21:35:26 +00002from test import support
Jeremy Hylton6eb4b6a1997-08-15 15:59:43 +00003import zlib
Christian Heimesd5e2b6f2008-03-19 21:50:51 +00004import binascii
Andrew M. Kuchling9a0f98e2001-02-21 02:17:01 +00005import random
Andrew M. Kuchling9a0f98e2001-02-21 02:17:01 +00006
Andrew M. Kuchling9a0f98e2001-02-21 02:17:01 +00007
Guido van Rossum7d9ea502003-02-03 20:45:52 +00008class ChecksumTestCase(unittest.TestCase):
9 # checksum test cases
10 def test_crc32start(self):
Guido van Rossum776152b2007-05-22 22:44:07 +000011 self.assertEqual(zlib.crc32(b""), zlib.crc32(b"", 0))
12 self.assert_(zlib.crc32(b"abc", 0xffffffff))
Andrew M. Kuchlingfcfc8d52001-08-10 15:50:11 +000013
Guido van Rossum7d9ea502003-02-03 20:45:52 +000014 def test_crc32empty(self):
Guido van Rossum776152b2007-05-22 22:44:07 +000015 self.assertEqual(zlib.crc32(b"", 0), 0)
16 self.assertEqual(zlib.crc32(b"", 1), 1)
17 self.assertEqual(zlib.crc32(b"", 432), 432)
Andrew M. Kuchling9a0f98e2001-02-21 02:17:01 +000018
Guido van Rossum7d9ea502003-02-03 20:45:52 +000019 def test_adler32start(self):
Guido van Rossum776152b2007-05-22 22:44:07 +000020 self.assertEqual(zlib.adler32(b""), zlib.adler32(b"", 1))
21 self.assert_(zlib.adler32(b"abc", 0xffffffff))
Jeremy Hylton6eb4b6a1997-08-15 15:59:43 +000022
Guido van Rossum7d9ea502003-02-03 20:45:52 +000023 def test_adler32empty(self):
Guido van Rossum776152b2007-05-22 22:44:07 +000024 self.assertEqual(zlib.adler32(b"", 0), 0)
25 self.assertEqual(zlib.adler32(b"", 1), 1)
26 self.assertEqual(zlib.adler32(b"", 432), 432)
Jeremy Hylton6eb4b6a1997-08-15 15:59:43 +000027
Guido van Rossum7d9ea502003-02-03 20:45:52 +000028 def assertEqual32(self, seen, expected):
29 # 32-bit values masked -- checksums on 32- vs 64- bit machines
30 # This is important if bit 31 (0x08000000L) is set.
Guido van Rossume2a383d2007-01-15 16:59:06 +000031 self.assertEqual(seen & 0x0FFFFFFFF, expected & 0x0FFFFFFFF)
Guido van Rossum7d9ea502003-02-03 20:45:52 +000032
33 def test_penguins(self):
Guido van Rossum776152b2007-05-22 22:44:07 +000034 self.assertEqual32(zlib.crc32(b"penguin", 0), 0x0e5c1a120)
35 self.assertEqual32(zlib.crc32(b"penguin", 1), 0x43b6aa94)
36 self.assertEqual32(zlib.adler32(b"penguin", 0), 0x0bcf02f6)
37 self.assertEqual32(zlib.adler32(b"penguin", 1), 0x0bd602f7)
Guido van Rossum7d9ea502003-02-03 20:45:52 +000038
Guido van Rossum776152b2007-05-22 22:44:07 +000039 self.assertEqual(zlib.crc32(b"penguin"), zlib.crc32(b"penguin", 0))
40 self.assertEqual(zlib.adler32(b"penguin"),zlib.adler32(b"penguin",1))
Guido van Rossum7d9ea502003-02-03 20:45:52 +000041
Gregory P. Smithab0d8a12008-03-17 20:24:09 +000042 def test_crc32_adler32_unsigned(self):
43 foo = 'abcdefghijklmnop'
44 # explicitly test signed behavior
Gregory P. Smith27275032008-03-20 06:20:09 +000045 self.assertEqual(zlib.crc32(foo), 2486878355)
Gregory P. Smithab0d8a12008-03-17 20:24:09 +000046 self.assertEqual(zlib.crc32('spam'), 1138425661)
47 self.assertEqual(zlib.adler32(foo+foo), 3573550353)
48 self.assertEqual(zlib.adler32('spam'), 72286642)
49
Christian Heimesd5e2b6f2008-03-19 21:50:51 +000050 def test_same_as_binascii_crc32(self):
51 foo = 'abcdefghijklmnop'
Gregory P. Smith27275032008-03-20 06:20:09 +000052 crc = 2486878355
Christian Heimesd5e2b6f2008-03-19 21:50:51 +000053 self.assertEqual(binascii.crc32(foo), crc)
54 self.assertEqual(zlib.crc32(foo), crc)
55 self.assertEqual(binascii.crc32('spam'), zlib.crc32('spam'))
Guido van Rossum7d9ea502003-02-03 20:45:52 +000056
57
Christian Heimesb186d002008-03-18 15:15:01 +000058
Guido van Rossum7d9ea502003-02-03 20:45:52 +000059class ExceptionTestCase(unittest.TestCase):
60 # make sure we generate some expected errors
Guido van Rossum8ce8a782007-11-01 19:42:39 +000061 def test_badlevel(self):
62 # specifying compression level out of range causes an error
63 # (but -1 is Z_DEFAULT_COMPRESSION and apparently the zlib
64 # accepts 0 too)
65 self.assertRaises(zlib.error, zlib.compress, 'ERROR', 10)
Guido van Rossum7d9ea502003-02-03 20:45:52 +000066
67 def test_badcompressobj(self):
68 # verify failure on building compress object with bad params
Neil Schemenauer94afd3e2004-06-05 19:02:52 +000069 self.assertRaises(ValueError, zlib.compressobj, 1, zlib.DEFLATED, 0)
Guido van Rossum8ce8a782007-11-01 19:42:39 +000070 # specifying total bits too large causes an error
71 self.assertRaises(ValueError,
72 zlib.compressobj, 1, zlib.DEFLATED, zlib.MAX_WBITS + 1)
Guido van Rossum7d9ea502003-02-03 20:45:52 +000073
74 def test_baddecompressobj(self):
75 # verify failure on building decompress object with bad params
76 self.assertRaises(ValueError, zlib.decompressobj, 0)
77
Christian Heimes5e696852008-04-09 08:37:03 +000078 def test_decompressobj_badflush(self):
79 # verify failure on calling decompressobj.flush with bad params
80 self.assertRaises(ValueError, zlib.decompressobj().flush, 0)
81 self.assertRaises(ValueError, zlib.decompressobj().flush, -1)
82
Guido van Rossum7d9ea502003-02-03 20:45:52 +000083
84
85class CompressTestCase(unittest.TestCase):
86 # Test compression in one go (whole message compression)
87 def test_speech(self):
Neil Schemenauer6412b122004-06-05 19:34:28 +000088 x = zlib.compress(HAMLET_SCENE)
89 self.assertEqual(zlib.decompress(x), HAMLET_SCENE)
Guido van Rossum7d9ea502003-02-03 20:45:52 +000090
91 def test_speech128(self):
Neil Schemenauer6412b122004-06-05 19:34:28 +000092 # compress more data
93 data = HAMLET_SCENE * 128
Guido van Rossum7d9ea502003-02-03 20:45:52 +000094 x = zlib.compress(data)
95 self.assertEqual(zlib.decompress(x), data)
96
Guido van Rossum7d9ea502003-02-03 20:45:52 +000097
98
99
100class CompressObjectTestCase(unittest.TestCase):
101 # Test compression object
Guido van Rossum7d9ea502003-02-03 20:45:52 +0000102 def test_pair(self):
Neil Schemenauer6412b122004-06-05 19:34:28 +0000103 # straightforward compress/decompress objects
104 data = HAMLET_SCENE * 128
105 co = zlib.compressobj()
Guido van Rossum7d9ea502003-02-03 20:45:52 +0000106 x1 = co.compress(data)
107 x2 = co.flush()
108 self.assertRaises(zlib.error, co.flush) # second flush should not work
Neil Schemenauer94afd3e2004-06-05 19:02:52 +0000109 dco = zlib.decompressobj()
Guido van Rossum7d9ea502003-02-03 20:45:52 +0000110 y1 = dco.decompress(x1 + x2)
111 y2 = dco.flush()
112 self.assertEqual(data, y1 + y2)
113
Neil Schemenauer94afd3e2004-06-05 19:02:52 +0000114 def test_compressoptions(self):
115 # specify lots of options to compressobj()
116 level = 2
117 method = zlib.DEFLATED
118 wbits = -12
119 memlevel = 9
120 strategy = zlib.Z_FILTERED
121 co = zlib.compressobj(level, method, wbits, memlevel, strategy)
Neil Schemenauer6412b122004-06-05 19:34:28 +0000122 x1 = co.compress(HAMLET_SCENE)
Neil Schemenauer94afd3e2004-06-05 19:02:52 +0000123 x2 = co.flush()
124 dco = zlib.decompressobj(wbits)
125 y1 = dco.decompress(x1 + x2)
126 y2 = dco.flush()
Neil Schemenauer6412b122004-06-05 19:34:28 +0000127 self.assertEqual(HAMLET_SCENE, y1 + y2)
Neil Schemenauer94afd3e2004-06-05 19:02:52 +0000128
Guido van Rossum7d9ea502003-02-03 20:45:52 +0000129 def test_compressincremental(self):
130 # compress object in steps, decompress object as one-shot
Neil Schemenauer6412b122004-06-05 19:34:28 +0000131 data = HAMLET_SCENE * 128
Neil Schemenauer94afd3e2004-06-05 19:02:52 +0000132 co = zlib.compressobj()
Guido van Rossum7d9ea502003-02-03 20:45:52 +0000133 bufs = []
134 for i in range(0, len(data), 256):
135 bufs.append(co.compress(data[i:i+256]))
136 bufs.append(co.flush())
Guido van Rossum776152b2007-05-22 22:44:07 +0000137 combuf = b''.join(bufs)
Guido van Rossum7d9ea502003-02-03 20:45:52 +0000138
Neil Schemenauer94afd3e2004-06-05 19:02:52 +0000139 dco = zlib.decompressobj()
Guido van Rossum776152b2007-05-22 22:44:07 +0000140 y1 = dco.decompress(b''.join(bufs))
Guido van Rossum7d9ea502003-02-03 20:45:52 +0000141 y2 = dco.flush()
142 self.assertEqual(data, y1 + y2)
143
Neil Schemenauer6412b122004-06-05 19:34:28 +0000144 def test_decompinc(self, flush=False, source=None, cx=256, dcx=64):
Guido van Rossum7d9ea502003-02-03 20:45:52 +0000145 # compress object in steps, decompress object in steps
Neil Schemenauer6412b122004-06-05 19:34:28 +0000146 source = source or HAMLET_SCENE
147 data = source * 128
Neil Schemenauer94afd3e2004-06-05 19:02:52 +0000148 co = zlib.compressobj()
Guido van Rossum7d9ea502003-02-03 20:45:52 +0000149 bufs = []
Neil Schemenauer6412b122004-06-05 19:34:28 +0000150 for i in range(0, len(data), cx):
151 bufs.append(co.compress(data[i:i+cx]))
Guido van Rossum7d9ea502003-02-03 20:45:52 +0000152 bufs.append(co.flush())
Guido van Rossum776152b2007-05-22 22:44:07 +0000153 combuf = b''.join(bufs)
Guido van Rossum7d9ea502003-02-03 20:45:52 +0000154
Neil Schemenauer94afd3e2004-06-05 19:02:52 +0000155 self.assertEqual(data, zlib.decompress(combuf))
Guido van Rossum7d9ea502003-02-03 20:45:52 +0000156
Neil Schemenauer94afd3e2004-06-05 19:02:52 +0000157 dco = zlib.decompressobj()
Guido van Rossum7d9ea502003-02-03 20:45:52 +0000158 bufs = []
Neil Schemenauer6412b122004-06-05 19:34:28 +0000159 for i in range(0, len(combuf), dcx):
160 bufs.append(dco.decompress(combuf[i:i+dcx]))
Guido van Rossum776152b2007-05-22 22:44:07 +0000161 self.assertEqual(b'', dco.unconsumed_tail, ########
162 "(A) uct should be b'': not %d long" %
Neil Schemenauer6412b122004-06-05 19:34:28 +0000163 len(dco.unconsumed_tail))
Amaury Forgeot d'Arce43d33a2008-07-02 20:50:16 +0000164 self.assertEqual(b'', dco.unused_data)
Neil Schemenauer6412b122004-06-05 19:34:28 +0000165 if flush:
166 bufs.append(dco.flush())
167 else:
168 while True:
169 chunk = dco.decompress('')
170 if chunk:
171 bufs.append(chunk)
172 else:
173 break
Guido van Rossum776152b2007-05-22 22:44:07 +0000174 self.assertEqual(b'', dco.unconsumed_tail, ########
175 "(B) uct should be b'': not %d long" %
Neil Schemenauer6412b122004-06-05 19:34:28 +0000176 len(dco.unconsumed_tail))
Amaury Forgeot d'Arce43d33a2008-07-02 20:50:16 +0000177 self.assertEqual(b'', dco.unused_data)
Guido van Rossum776152b2007-05-22 22:44:07 +0000178 self.assertEqual(data, b''.join(bufs))
Guido van Rossum7d9ea502003-02-03 20:45:52 +0000179 # Failure means: "decompressobj with init options failed"
180
Neil Schemenauer6412b122004-06-05 19:34:28 +0000181 def test_decompincflush(self):
182 self.test_decompinc(flush=True)
Guido van Rossum7d9ea502003-02-03 20:45:52 +0000183
Neil Schemenauer6412b122004-06-05 19:34:28 +0000184 def test_decompimax(self, source=None, cx=256, dcx=64):
185 # compress in steps, decompress in length-restricted steps
186 source = source or HAMLET_SCENE
Guido van Rossum7d9ea502003-02-03 20:45:52 +0000187 # Check a decompression object with max_length specified
Neil Schemenauer6412b122004-06-05 19:34:28 +0000188 data = source * 128
189 co = zlib.compressobj()
190 bufs = []
191 for i in range(0, len(data), cx):
192 bufs.append(co.compress(data[i:i+cx]))
193 bufs.append(co.flush())
Guido van Rossum776152b2007-05-22 22:44:07 +0000194 combuf = b''.join(bufs)
Neil Schemenauer6412b122004-06-05 19:34:28 +0000195 self.assertEqual(data, zlib.decompress(combuf),
196 'compressed data failure')
197
198 dco = zlib.decompressobj()
199 bufs = []
200 cb = combuf
201 while cb:
202 #max_length = 1 + len(cb)//10
203 chunk = dco.decompress(cb, dcx)
204 self.failIf(len(chunk) > dcx,
205 'chunk too big (%d>%d)' % (len(chunk), dcx))
206 bufs.append(chunk)
207 cb = dco.unconsumed_tail
208 bufs.append(dco.flush())
Guido van Rossum776152b2007-05-22 22:44:07 +0000209 self.assertEqual(data, b''.join(bufs), 'Wrong data retrieved')
Neil Schemenauer6412b122004-06-05 19:34:28 +0000210
211 def test_decompressmaxlen(self, flush=False):
212 # Check a decompression object with max_length specified
213 data = HAMLET_SCENE * 128
Neil Schemenauer94afd3e2004-06-05 19:02:52 +0000214 co = zlib.compressobj()
Guido van Rossum7d9ea502003-02-03 20:45:52 +0000215 bufs = []
216 for i in range(0, len(data), 256):
217 bufs.append(co.compress(data[i:i+256]))
218 bufs.append(co.flush())
Guido van Rossum776152b2007-05-22 22:44:07 +0000219 combuf = b''.join(bufs)
Neil Schemenauer94afd3e2004-06-05 19:02:52 +0000220 self.assertEqual(data, zlib.decompress(combuf),
Guido van Rossum7d9ea502003-02-03 20:45:52 +0000221 'compressed data failure')
222
Neil Schemenauer94afd3e2004-06-05 19:02:52 +0000223 dco = zlib.decompressobj()
Guido van Rossum7d9ea502003-02-03 20:45:52 +0000224 bufs = []
225 cb = combuf
226 while cb:
Guido van Rossumf3594102003-02-27 18:39:18 +0000227 max_length = 1 + len(cb)//10
Guido van Rossum7d9ea502003-02-03 20:45:52 +0000228 chunk = dco.decompress(cb, max_length)
229 self.failIf(len(chunk) > max_length,
230 'chunk too big (%d>%d)' % (len(chunk),max_length))
231 bufs.append(chunk)
232 cb = dco.unconsumed_tail
Neil Schemenauer6412b122004-06-05 19:34:28 +0000233 if flush:
234 bufs.append(dco.flush())
235 else:
236 while chunk:
237 chunk = dco.decompress('', max_length)
238 self.failIf(len(chunk) > max_length,
239 'chunk too big (%d>%d)' % (len(chunk),max_length))
240 bufs.append(chunk)
Guido van Rossum776152b2007-05-22 22:44:07 +0000241 self.assertEqual(data, b''.join(bufs), 'Wrong data retrieved')
Guido van Rossum7d9ea502003-02-03 20:45:52 +0000242
Neil Schemenauer6412b122004-06-05 19:34:28 +0000243 def test_decompressmaxlenflush(self):
244 self.test_decompressmaxlen(flush=True)
Guido van Rossum7d9ea502003-02-03 20:45:52 +0000245
246 def test_maxlenmisc(self):
247 # Misc tests of max_length
Neil Schemenauer94afd3e2004-06-05 19:02:52 +0000248 dco = zlib.decompressobj()
Guido van Rossum7d9ea502003-02-03 20:45:52 +0000249 self.assertRaises(ValueError, dco.decompress, "", -1)
Guido van Rossum776152b2007-05-22 22:44:07 +0000250 self.assertEqual(b'', dco.unconsumed_tail)
Guido van Rossum7d9ea502003-02-03 20:45:52 +0000251
252 def test_flushes(self):
253 # Test flush() with the various options, using all the
254 # different levels in order to provide more variations.
255 sync_opt = ['Z_NO_FLUSH', 'Z_SYNC_FLUSH', 'Z_FULL_FLUSH']
256 sync_opt = [getattr(zlib, opt) for opt in sync_opt
257 if hasattr(zlib, opt)]
Neil Schemenauer6412b122004-06-05 19:34:28 +0000258 data = HAMLET_SCENE * 8
Guido van Rossum7d9ea502003-02-03 20:45:52 +0000259
260 for sync in sync_opt:
261 for level in range(10):
262 obj = zlib.compressobj( level )
263 a = obj.compress( data[:3000] )
264 b = obj.flush( sync )
265 c = obj.compress( data[3000:] )
266 d = obj.flush()
Guido van Rossum776152b2007-05-22 22:44:07 +0000267 self.assertEqual(zlib.decompress(b''.join([a,b,c,d])),
Guido van Rossum7d9ea502003-02-03 20:45:52 +0000268 data, ("Decompress failed: flush "
269 "mode=%i, level=%i") % (sync, level))
270 del obj
271
272 def test_odd_flush(self):
273 # Test for odd flushing bugs noted in 2.0, and hopefully fixed in 2.1
274 import random
275
276 if hasattr(zlib, 'Z_SYNC_FLUSH'):
277 # Testing on 17K of "random" data
278
279 # Create compressor and decompressor objects
Neil Schemenauer6412b122004-06-05 19:34:28 +0000280 co = zlib.compressobj(zlib.Z_BEST_COMPRESSION)
Guido van Rossum7d9ea502003-02-03 20:45:52 +0000281 dco = zlib.decompressobj()
282
283 # Try 17K of data
284 # generate random data stream
285 try:
286 # In 2.3 and later, WichmannHill is the RNG of the bug report
287 gen = random.WichmannHill()
288 except AttributeError:
289 try:
290 # 2.2 called it Random
291 gen = random.Random()
292 except AttributeError:
293 # others might simply have a single RNG
294 gen = random
295 gen.seed(1)
296 data = genblock(1, 17 * 1024, generator=gen)
297
298 # compress, sync-flush, and decompress
299 first = co.compress(data)
300 second = co.flush(zlib.Z_SYNC_FLUSH)
301 expanded = dco.decompress(first + second)
302
303 # if decompressed data is different from the input data, choke.
304 self.assertEqual(expanded, data, "17K random source doesn't match")
305
Andrew M. Kuchling3b585b32004-12-28 20:10:48 +0000306 def test_empty_flush(self):
307 # Test that calling .flush() on unused objects works.
308 # (Bug #1083110 -- calling .flush() on decompress objects
309 # caused a core dump.)
310
311 co = zlib.compressobj(zlib.Z_BEST_COMPRESSION)
312 self.failUnless(co.flush()) # Returns a zlib header
313 dco = zlib.decompressobj()
Guido van Rossum776152b2007-05-22 22:44:07 +0000314 self.assertEqual(dco.flush(), b"") # Returns nothing
Tim Peters5a9fb3c2005-01-07 16:01:32 +0000315
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000316 if hasattr(zlib.compressobj(), "copy"):
317 def test_compresscopy(self):
318 # Test copying a compression object
319 data0 = HAMLET_SCENE
Guido van Rossum776152b2007-05-22 22:44:07 +0000320 data1 = bytes(str(HAMLET_SCENE, "ascii").swapcase(), "ascii")
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000321 c0 = zlib.compressobj(zlib.Z_BEST_COMPRESSION)
322 bufs0 = []
323 bufs0.append(c0.compress(data0))
Thomas Wouters477c8d52006-05-27 19:21:47 +0000324
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000325 c1 = c0.copy()
326 bufs1 = bufs0[:]
Thomas Wouters477c8d52006-05-27 19:21:47 +0000327
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000328 bufs0.append(c0.compress(data0))
329 bufs0.append(c0.flush())
Guido van Rossum776152b2007-05-22 22:44:07 +0000330 s0 = b''.join(bufs0)
Thomas Wouters477c8d52006-05-27 19:21:47 +0000331
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000332 bufs1.append(c1.compress(data1))
333 bufs1.append(c1.flush())
Guido van Rossum776152b2007-05-22 22:44:07 +0000334 s1 = b''.join(bufs1)
Thomas Wouters477c8d52006-05-27 19:21:47 +0000335
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000336 self.assertEqual(zlib.decompress(s0),data0+data0)
337 self.assertEqual(zlib.decompress(s1),data0+data1)
Thomas Wouters477c8d52006-05-27 19:21:47 +0000338
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000339 def test_badcompresscopy(self):
340 # Test copying a compression object in an inconsistent state
341 c = zlib.compressobj()
342 c.compress(HAMLET_SCENE)
343 c.flush()
344 self.assertRaises(ValueError, c.copy)
Thomas Wouters477c8d52006-05-27 19:21:47 +0000345
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000346 if hasattr(zlib.decompressobj(), "copy"):
347 def test_decompresscopy(self):
348 # Test copying a decompression object
349 data = HAMLET_SCENE
350 comp = zlib.compress(data)
Thomas Wouters477c8d52006-05-27 19:21:47 +0000351
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000352 d0 = zlib.decompressobj()
353 bufs0 = []
354 bufs0.append(d0.decompress(comp[:32]))
Thomas Wouters477c8d52006-05-27 19:21:47 +0000355
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000356 d1 = d0.copy()
357 bufs1 = bufs0[:]
Thomas Wouters477c8d52006-05-27 19:21:47 +0000358
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000359 bufs0.append(d0.decompress(comp[32:]))
Guido van Rossum776152b2007-05-22 22:44:07 +0000360 s0 = b''.join(bufs0)
Thomas Wouters477c8d52006-05-27 19:21:47 +0000361
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000362 bufs1.append(d1.decompress(comp[32:]))
Guido van Rossum776152b2007-05-22 22:44:07 +0000363 s1 = b''.join(bufs1)
Thomas Wouters477c8d52006-05-27 19:21:47 +0000364
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000365 self.assertEqual(s0,s1)
366 self.assertEqual(s0,data)
Thomas Wouters477c8d52006-05-27 19:21:47 +0000367
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000368 def test_baddecompresscopy(self):
369 # Test copying a compression object in an inconsistent state
370 data = zlib.compress(HAMLET_SCENE)
371 d = zlib.decompressobj()
372 d.decompress(data)
373 d.flush()
374 self.assertRaises(ValueError, d.copy)
Guido van Rossum7d9ea502003-02-03 20:45:52 +0000375
376def genblock(seed, length, step=1024, generator=random):
377 """length-byte stream of random data from a seed (in step-byte blocks)."""
378 if seed is not None:
379 generator.seed(seed)
380 randint = generator.randint
381 if length < step or step < 2:
382 step = length
Guido van Rossum776152b2007-05-22 22:44:07 +0000383 blocks = bytes()
Guido van Rossum7d9ea502003-02-03 20:45:52 +0000384 for i in range(0, length, step):
Guido van Rossum776152b2007-05-22 22:44:07 +0000385 blocks += bytes(randint(0, 255) for x in range(step))
386 return blocks
Guido van Rossum7d9ea502003-02-03 20:45:52 +0000387
388
389
390def choose_lines(source, number, seed=None, generator=random):
391 """Return a list of number lines randomly chosen from the source"""
392 if seed is not None:
393 generator.seed(seed)
394 sources = source.split('\n')
395 return [generator.choice(sources) for n in range(number)]
396
397
398
Guido van Rossum776152b2007-05-22 22:44:07 +0000399HAMLET_SCENE = b"""
Fred Drake004d5e62000-10-23 17:22:08 +0000400LAERTES
Jeremy Hylton6eb4b6a1997-08-15 15:59:43 +0000401
402 O, fear me not.
403 I stay too long: but here my father comes.
404
405 Enter POLONIUS
406
407 A double blessing is a double grace,
408 Occasion smiles upon a second leave.
409
Fred Drake004d5e62000-10-23 17:22:08 +0000410LORD POLONIUS
Jeremy Hylton6eb4b6a1997-08-15 15:59:43 +0000411
412 Yet here, Laertes! aboard, aboard, for shame!
413 The wind sits in the shoulder of your sail,
414 And you are stay'd for. There; my blessing with thee!
415 And these few precepts in thy memory
416 See thou character. Give thy thoughts no tongue,
417 Nor any unproportioned thought his act.
418 Be thou familiar, but by no means vulgar.
419 Those friends thou hast, and their adoption tried,
420 Grapple them to thy soul with hoops of steel;
421 But do not dull thy palm with entertainment
422 Of each new-hatch'd, unfledged comrade. Beware
423 Of entrance to a quarrel, but being in,
424 Bear't that the opposed may beware of thee.
425 Give every man thy ear, but few thy voice;
426 Take each man's censure, but reserve thy judgment.
427 Costly thy habit as thy purse can buy,
428 But not express'd in fancy; rich, not gaudy;
429 For the apparel oft proclaims the man,
430 And they in France of the best rank and station
431 Are of a most select and generous chief in that.
432 Neither a borrower nor a lender be;
433 For loan oft loses both itself and friend,
434 And borrowing dulls the edge of husbandry.
435 This above all: to thine ownself be true,
436 And it must follow, as the night the day,
437 Thou canst not then be false to any man.
438 Farewell: my blessing season this in thee!
439
Fred Drake004d5e62000-10-23 17:22:08 +0000440LAERTES
Jeremy Hylton6eb4b6a1997-08-15 15:59:43 +0000441
442 Most humbly do I take my leave, my lord.
443
Fred Drake004d5e62000-10-23 17:22:08 +0000444LORD POLONIUS
Jeremy Hylton6eb4b6a1997-08-15 15:59:43 +0000445
446 The time invites you; go; your servants tend.
447
Fred Drake004d5e62000-10-23 17:22:08 +0000448LAERTES
Jeremy Hylton6eb4b6a1997-08-15 15:59:43 +0000449
450 Farewell, Ophelia; and remember well
451 What I have said to you.
452
Fred Drake004d5e62000-10-23 17:22:08 +0000453OPHELIA
Jeremy Hylton6eb4b6a1997-08-15 15:59:43 +0000454
455 'Tis in my memory lock'd,
456 And you yourself shall keep the key of it.
457
Fred Drake004d5e62000-10-23 17:22:08 +0000458LAERTES
Jeremy Hylton6eb4b6a1997-08-15 15:59:43 +0000459
460 Farewell.
461"""
Guido van Rossum7d9ea502003-02-03 20:45:52 +0000462
463
464def test_main():
Benjamin Petersonee8712c2008-05-20 21:35:26 +0000465 support.run_unittest(
Walter Dörwald21d3a322003-05-01 17:45:56 +0000466 ChecksumTestCase,
467 ExceptionTestCase,
468 CompressTestCase,
469 CompressObjectTestCase
470 )
Guido van Rossum7d9ea502003-02-03 20:45:52 +0000471
472if __name__ == "__main__":
Guido van Rossum776152b2007-05-22 22:44:07 +0000473 unittest.main() # XXX
474 ###test_main()