blob: d2fd504e864a03bc586d699975b08beb0264cf45 [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
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
45 self.assertEqual(zlib.crc32(foo), 2486878355)
46 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'
52 crc = -1808088941
53 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
78
79
80class CompressTestCase(unittest.TestCase):
81 # Test compression in one go (whole message compression)
82 def test_speech(self):
Neil Schemenauer6412b122004-06-05 19:34:28 +000083 x = zlib.compress(HAMLET_SCENE)
84 self.assertEqual(zlib.decompress(x), HAMLET_SCENE)
Guido van Rossum7d9ea502003-02-03 20:45:52 +000085
86 def test_speech128(self):
Neil Schemenauer6412b122004-06-05 19:34:28 +000087 # compress more data
88 data = HAMLET_SCENE * 128
Guido van Rossum7d9ea502003-02-03 20:45:52 +000089 x = zlib.compress(data)
90 self.assertEqual(zlib.decompress(x), data)
91
Guido van Rossum7d9ea502003-02-03 20:45:52 +000092
93
94
95class CompressObjectTestCase(unittest.TestCase):
96 # Test compression object
Guido van Rossum7d9ea502003-02-03 20:45:52 +000097 def test_pair(self):
Neil Schemenauer6412b122004-06-05 19:34:28 +000098 # straightforward compress/decompress objects
99 data = HAMLET_SCENE * 128
100 co = zlib.compressobj()
Guido van Rossum7d9ea502003-02-03 20:45:52 +0000101 x1 = co.compress(data)
102 x2 = co.flush()
103 self.assertRaises(zlib.error, co.flush) # second flush should not work
Neil Schemenauer94afd3e2004-06-05 19:02:52 +0000104 dco = zlib.decompressobj()
Guido van Rossum7d9ea502003-02-03 20:45:52 +0000105 y1 = dco.decompress(x1 + x2)
106 y2 = dco.flush()
107 self.assertEqual(data, y1 + y2)
108
Neil Schemenauer94afd3e2004-06-05 19:02:52 +0000109 def test_compressoptions(self):
110 # specify lots of options to compressobj()
111 level = 2
112 method = zlib.DEFLATED
113 wbits = -12
114 memlevel = 9
115 strategy = zlib.Z_FILTERED
116 co = zlib.compressobj(level, method, wbits, memlevel, strategy)
Neil Schemenauer6412b122004-06-05 19:34:28 +0000117 x1 = co.compress(HAMLET_SCENE)
Neil Schemenauer94afd3e2004-06-05 19:02:52 +0000118 x2 = co.flush()
119 dco = zlib.decompressobj(wbits)
120 y1 = dco.decompress(x1 + x2)
121 y2 = dco.flush()
Neil Schemenauer6412b122004-06-05 19:34:28 +0000122 self.assertEqual(HAMLET_SCENE, y1 + y2)
Neil Schemenauer94afd3e2004-06-05 19:02:52 +0000123
Guido van Rossum7d9ea502003-02-03 20:45:52 +0000124 def test_compressincremental(self):
125 # compress object in steps, decompress object as one-shot
Neil Schemenauer6412b122004-06-05 19:34:28 +0000126 data = HAMLET_SCENE * 128
Neil Schemenauer94afd3e2004-06-05 19:02:52 +0000127 co = zlib.compressobj()
Guido van Rossum7d9ea502003-02-03 20:45:52 +0000128 bufs = []
129 for i in range(0, len(data), 256):
130 bufs.append(co.compress(data[i:i+256]))
131 bufs.append(co.flush())
Guido van Rossum776152b2007-05-22 22:44:07 +0000132 combuf = b''.join(bufs)
Guido van Rossum7d9ea502003-02-03 20:45:52 +0000133
Neil Schemenauer94afd3e2004-06-05 19:02:52 +0000134 dco = zlib.decompressobj()
Guido van Rossum776152b2007-05-22 22:44:07 +0000135 y1 = dco.decompress(b''.join(bufs))
Guido van Rossum7d9ea502003-02-03 20:45:52 +0000136 y2 = dco.flush()
137 self.assertEqual(data, y1 + y2)
138
Neil Schemenauer6412b122004-06-05 19:34:28 +0000139 def test_decompinc(self, flush=False, source=None, cx=256, dcx=64):
Guido van Rossum7d9ea502003-02-03 20:45:52 +0000140 # compress object in steps, decompress object in steps
Neil Schemenauer6412b122004-06-05 19:34:28 +0000141 source = source or HAMLET_SCENE
142 data = source * 128
Neil Schemenauer94afd3e2004-06-05 19:02:52 +0000143 co = zlib.compressobj()
Guido van Rossum7d9ea502003-02-03 20:45:52 +0000144 bufs = []
Neil Schemenauer6412b122004-06-05 19:34:28 +0000145 for i in range(0, len(data), cx):
146 bufs.append(co.compress(data[i:i+cx]))
Guido van Rossum7d9ea502003-02-03 20:45:52 +0000147 bufs.append(co.flush())
Guido van Rossum776152b2007-05-22 22:44:07 +0000148 combuf = b''.join(bufs)
Guido van Rossum7d9ea502003-02-03 20:45:52 +0000149
Neil Schemenauer94afd3e2004-06-05 19:02:52 +0000150 self.assertEqual(data, zlib.decompress(combuf))
Guido van Rossum7d9ea502003-02-03 20:45:52 +0000151
Neil Schemenauer94afd3e2004-06-05 19:02:52 +0000152 dco = zlib.decompressobj()
Guido van Rossum7d9ea502003-02-03 20:45:52 +0000153 bufs = []
Neil Schemenauer6412b122004-06-05 19:34:28 +0000154 for i in range(0, len(combuf), dcx):
155 bufs.append(dco.decompress(combuf[i:i+dcx]))
Guido van Rossum776152b2007-05-22 22:44:07 +0000156 self.assertEqual(b'', dco.unconsumed_tail, ########
157 "(A) uct should be b'': not %d long" %
Neil Schemenauer6412b122004-06-05 19:34:28 +0000158 len(dco.unconsumed_tail))
159 if flush:
160 bufs.append(dco.flush())
161 else:
162 while True:
163 chunk = dco.decompress('')
164 if chunk:
165 bufs.append(chunk)
166 else:
167 break
Guido van Rossum776152b2007-05-22 22:44:07 +0000168 self.assertEqual(b'', dco.unconsumed_tail, ########
169 "(B) uct should be b'': not %d long" %
Neil Schemenauer6412b122004-06-05 19:34:28 +0000170 len(dco.unconsumed_tail))
Guido van Rossum776152b2007-05-22 22:44:07 +0000171 self.assertEqual(data, b''.join(bufs))
Guido van Rossum7d9ea502003-02-03 20:45:52 +0000172 # Failure means: "decompressobj with init options failed"
173
Neil Schemenauer6412b122004-06-05 19:34:28 +0000174 def test_decompincflush(self):
175 self.test_decompinc(flush=True)
Guido van Rossum7d9ea502003-02-03 20:45:52 +0000176
Neil Schemenauer6412b122004-06-05 19:34:28 +0000177 def test_decompimax(self, source=None, cx=256, dcx=64):
178 # compress in steps, decompress in length-restricted steps
179 source = source or HAMLET_SCENE
Guido van Rossum7d9ea502003-02-03 20:45:52 +0000180 # Check a decompression object with max_length specified
Neil Schemenauer6412b122004-06-05 19:34:28 +0000181 data = source * 128
182 co = zlib.compressobj()
183 bufs = []
184 for i in range(0, len(data), cx):
185 bufs.append(co.compress(data[i:i+cx]))
186 bufs.append(co.flush())
Guido van Rossum776152b2007-05-22 22:44:07 +0000187 combuf = b''.join(bufs)
Neil Schemenauer6412b122004-06-05 19:34:28 +0000188 self.assertEqual(data, zlib.decompress(combuf),
189 'compressed data failure')
190
191 dco = zlib.decompressobj()
192 bufs = []
193 cb = combuf
194 while cb:
195 #max_length = 1 + len(cb)//10
196 chunk = dco.decompress(cb, dcx)
197 self.failIf(len(chunk) > dcx,
198 'chunk too big (%d>%d)' % (len(chunk), dcx))
199 bufs.append(chunk)
200 cb = dco.unconsumed_tail
201 bufs.append(dco.flush())
Guido van Rossum776152b2007-05-22 22:44:07 +0000202 self.assertEqual(data, b''.join(bufs), 'Wrong data retrieved')
Neil Schemenauer6412b122004-06-05 19:34:28 +0000203
204 def test_decompressmaxlen(self, flush=False):
205 # Check a decompression object with max_length specified
206 data = HAMLET_SCENE * 128
Neil Schemenauer94afd3e2004-06-05 19:02:52 +0000207 co = zlib.compressobj()
Guido van Rossum7d9ea502003-02-03 20:45:52 +0000208 bufs = []
209 for i in range(0, len(data), 256):
210 bufs.append(co.compress(data[i:i+256]))
211 bufs.append(co.flush())
Guido van Rossum776152b2007-05-22 22:44:07 +0000212 combuf = b''.join(bufs)
Neil Schemenauer94afd3e2004-06-05 19:02:52 +0000213 self.assertEqual(data, zlib.decompress(combuf),
Guido van Rossum7d9ea502003-02-03 20:45:52 +0000214 'compressed data failure')
215
Neil Schemenauer94afd3e2004-06-05 19:02:52 +0000216 dco = zlib.decompressobj()
Guido van Rossum7d9ea502003-02-03 20:45:52 +0000217 bufs = []
218 cb = combuf
219 while cb:
Guido van Rossumf3594102003-02-27 18:39:18 +0000220 max_length = 1 + len(cb)//10
Guido van Rossum7d9ea502003-02-03 20:45:52 +0000221 chunk = dco.decompress(cb, max_length)
222 self.failIf(len(chunk) > max_length,
223 'chunk too big (%d>%d)' % (len(chunk),max_length))
224 bufs.append(chunk)
225 cb = dco.unconsumed_tail
Neil Schemenauer6412b122004-06-05 19:34:28 +0000226 if flush:
227 bufs.append(dco.flush())
228 else:
229 while chunk:
230 chunk = dco.decompress('', max_length)
231 self.failIf(len(chunk) > max_length,
232 'chunk too big (%d>%d)' % (len(chunk),max_length))
233 bufs.append(chunk)
Guido van Rossum776152b2007-05-22 22:44:07 +0000234 self.assertEqual(data, b''.join(bufs), 'Wrong data retrieved')
Guido van Rossum7d9ea502003-02-03 20:45:52 +0000235
Neil Schemenauer6412b122004-06-05 19:34:28 +0000236 def test_decompressmaxlenflush(self):
237 self.test_decompressmaxlen(flush=True)
Guido van Rossum7d9ea502003-02-03 20:45:52 +0000238
239 def test_maxlenmisc(self):
240 # Misc tests of max_length
Neil Schemenauer94afd3e2004-06-05 19:02:52 +0000241 dco = zlib.decompressobj()
Guido van Rossum7d9ea502003-02-03 20:45:52 +0000242 self.assertRaises(ValueError, dco.decompress, "", -1)
Guido van Rossum776152b2007-05-22 22:44:07 +0000243 self.assertEqual(b'', dco.unconsumed_tail)
Guido van Rossum7d9ea502003-02-03 20:45:52 +0000244
245 def test_flushes(self):
246 # Test flush() with the various options, using all the
247 # different levels in order to provide more variations.
248 sync_opt = ['Z_NO_FLUSH', 'Z_SYNC_FLUSH', 'Z_FULL_FLUSH']
249 sync_opt = [getattr(zlib, opt) for opt in sync_opt
250 if hasattr(zlib, opt)]
Neil Schemenauer6412b122004-06-05 19:34:28 +0000251 data = HAMLET_SCENE * 8
Guido van Rossum7d9ea502003-02-03 20:45:52 +0000252
253 for sync in sync_opt:
254 for level in range(10):
255 obj = zlib.compressobj( level )
256 a = obj.compress( data[:3000] )
257 b = obj.flush( sync )
258 c = obj.compress( data[3000:] )
259 d = obj.flush()
Guido van Rossum776152b2007-05-22 22:44:07 +0000260 self.assertEqual(zlib.decompress(b''.join([a,b,c,d])),
Guido van Rossum7d9ea502003-02-03 20:45:52 +0000261 data, ("Decompress failed: flush "
262 "mode=%i, level=%i") % (sync, level))
263 del obj
264
265 def test_odd_flush(self):
266 # Test for odd flushing bugs noted in 2.0, and hopefully fixed in 2.1
267 import random
268
269 if hasattr(zlib, 'Z_SYNC_FLUSH'):
270 # Testing on 17K of "random" data
271
272 # Create compressor and decompressor objects
Neil Schemenauer6412b122004-06-05 19:34:28 +0000273 co = zlib.compressobj(zlib.Z_BEST_COMPRESSION)
Guido van Rossum7d9ea502003-02-03 20:45:52 +0000274 dco = zlib.decompressobj()
275
276 # Try 17K of data
277 # generate random data stream
278 try:
279 # In 2.3 and later, WichmannHill is the RNG of the bug report
280 gen = random.WichmannHill()
281 except AttributeError:
282 try:
283 # 2.2 called it Random
284 gen = random.Random()
285 except AttributeError:
286 # others might simply have a single RNG
287 gen = random
288 gen.seed(1)
289 data = genblock(1, 17 * 1024, generator=gen)
290
291 # compress, sync-flush, and decompress
292 first = co.compress(data)
293 second = co.flush(zlib.Z_SYNC_FLUSH)
294 expanded = dco.decompress(first + second)
295
296 # if decompressed data is different from the input data, choke.
297 self.assertEqual(expanded, data, "17K random source doesn't match")
298
Andrew M. Kuchling3b585b32004-12-28 20:10:48 +0000299 def test_empty_flush(self):
300 # Test that calling .flush() on unused objects works.
301 # (Bug #1083110 -- calling .flush() on decompress objects
302 # caused a core dump.)
303
304 co = zlib.compressobj(zlib.Z_BEST_COMPRESSION)
305 self.failUnless(co.flush()) # Returns a zlib header
306 dco = zlib.decompressobj()
Guido van Rossum776152b2007-05-22 22:44:07 +0000307 self.assertEqual(dco.flush(), b"") # Returns nothing
Tim Peters5a9fb3c2005-01-07 16:01:32 +0000308
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000309 if hasattr(zlib.compressobj(), "copy"):
310 def test_compresscopy(self):
311 # Test copying a compression object
312 data0 = HAMLET_SCENE
Guido van Rossum776152b2007-05-22 22:44:07 +0000313 data1 = bytes(str(HAMLET_SCENE, "ascii").swapcase(), "ascii")
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000314 c0 = zlib.compressobj(zlib.Z_BEST_COMPRESSION)
315 bufs0 = []
316 bufs0.append(c0.compress(data0))
Thomas Wouters477c8d52006-05-27 19:21:47 +0000317
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000318 c1 = c0.copy()
319 bufs1 = bufs0[:]
Thomas Wouters477c8d52006-05-27 19:21:47 +0000320
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000321 bufs0.append(c0.compress(data0))
322 bufs0.append(c0.flush())
Guido van Rossum776152b2007-05-22 22:44:07 +0000323 s0 = b''.join(bufs0)
Thomas Wouters477c8d52006-05-27 19:21:47 +0000324
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000325 bufs1.append(c1.compress(data1))
326 bufs1.append(c1.flush())
Guido van Rossum776152b2007-05-22 22:44:07 +0000327 s1 = b''.join(bufs1)
Thomas Wouters477c8d52006-05-27 19:21:47 +0000328
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000329 self.assertEqual(zlib.decompress(s0),data0+data0)
330 self.assertEqual(zlib.decompress(s1),data0+data1)
Thomas Wouters477c8d52006-05-27 19:21:47 +0000331
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000332 def test_badcompresscopy(self):
333 # Test copying a compression object in an inconsistent state
334 c = zlib.compressobj()
335 c.compress(HAMLET_SCENE)
336 c.flush()
337 self.assertRaises(ValueError, c.copy)
Thomas Wouters477c8d52006-05-27 19:21:47 +0000338
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000339 if hasattr(zlib.decompressobj(), "copy"):
340 def test_decompresscopy(self):
341 # Test copying a decompression object
342 data = HAMLET_SCENE
343 comp = zlib.compress(data)
Thomas Wouters477c8d52006-05-27 19:21:47 +0000344
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000345 d0 = zlib.decompressobj()
346 bufs0 = []
347 bufs0.append(d0.decompress(comp[:32]))
Thomas Wouters477c8d52006-05-27 19:21:47 +0000348
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000349 d1 = d0.copy()
350 bufs1 = bufs0[:]
Thomas Wouters477c8d52006-05-27 19:21:47 +0000351
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000352 bufs0.append(d0.decompress(comp[32:]))
Guido van Rossum776152b2007-05-22 22:44:07 +0000353 s0 = b''.join(bufs0)
Thomas Wouters477c8d52006-05-27 19:21:47 +0000354
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000355 bufs1.append(d1.decompress(comp[32:]))
Guido van Rossum776152b2007-05-22 22:44:07 +0000356 s1 = b''.join(bufs1)
Thomas Wouters477c8d52006-05-27 19:21:47 +0000357
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000358 self.assertEqual(s0,s1)
359 self.assertEqual(s0,data)
Thomas Wouters477c8d52006-05-27 19:21:47 +0000360
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000361 def test_baddecompresscopy(self):
362 # Test copying a compression object in an inconsistent state
363 data = zlib.compress(HAMLET_SCENE)
364 d = zlib.decompressobj()
365 d.decompress(data)
366 d.flush()
367 self.assertRaises(ValueError, d.copy)
Guido van Rossum7d9ea502003-02-03 20:45:52 +0000368
369def genblock(seed, length, step=1024, generator=random):
370 """length-byte stream of random data from a seed (in step-byte blocks)."""
371 if seed is not None:
372 generator.seed(seed)
373 randint = generator.randint
374 if length < step or step < 2:
375 step = length
Guido van Rossum776152b2007-05-22 22:44:07 +0000376 blocks = bytes()
Guido van Rossum7d9ea502003-02-03 20:45:52 +0000377 for i in range(0, length, step):
Guido van Rossum776152b2007-05-22 22:44:07 +0000378 blocks += bytes(randint(0, 255) for x in range(step))
379 return blocks
Guido van Rossum7d9ea502003-02-03 20:45:52 +0000380
381
382
383def choose_lines(source, number, seed=None, generator=random):
384 """Return a list of number lines randomly chosen from the source"""
385 if seed is not None:
386 generator.seed(seed)
387 sources = source.split('\n')
388 return [generator.choice(sources) for n in range(number)]
389
390
391
Guido van Rossum776152b2007-05-22 22:44:07 +0000392HAMLET_SCENE = b"""
Fred Drake004d5e62000-10-23 17:22:08 +0000393LAERTES
Jeremy Hylton6eb4b6a1997-08-15 15:59:43 +0000394
395 O, fear me not.
396 I stay too long: but here my father comes.
397
398 Enter POLONIUS
399
400 A double blessing is a double grace,
401 Occasion smiles upon a second leave.
402
Fred Drake004d5e62000-10-23 17:22:08 +0000403LORD POLONIUS
Jeremy Hylton6eb4b6a1997-08-15 15:59:43 +0000404
405 Yet here, Laertes! aboard, aboard, for shame!
406 The wind sits in the shoulder of your sail,
407 And you are stay'd for. There; my blessing with thee!
408 And these few precepts in thy memory
409 See thou character. Give thy thoughts no tongue,
410 Nor any unproportioned thought his act.
411 Be thou familiar, but by no means vulgar.
412 Those friends thou hast, and their adoption tried,
413 Grapple them to thy soul with hoops of steel;
414 But do not dull thy palm with entertainment
415 Of each new-hatch'd, unfledged comrade. Beware
416 Of entrance to a quarrel, but being in,
417 Bear't that the opposed may beware of thee.
418 Give every man thy ear, but few thy voice;
419 Take each man's censure, but reserve thy judgment.
420 Costly thy habit as thy purse can buy,
421 But not express'd in fancy; rich, not gaudy;
422 For the apparel oft proclaims the man,
423 And they in France of the best rank and station
424 Are of a most select and generous chief in that.
425 Neither a borrower nor a lender be;
426 For loan oft loses both itself and friend,
427 And borrowing dulls the edge of husbandry.
428 This above all: to thine ownself be true,
429 And it must follow, as the night the day,
430 Thou canst not then be false to any man.
431 Farewell: my blessing season this in thee!
432
Fred Drake004d5e62000-10-23 17:22:08 +0000433LAERTES
Jeremy Hylton6eb4b6a1997-08-15 15:59:43 +0000434
435 Most humbly do I take my leave, my lord.
436
Fred Drake004d5e62000-10-23 17:22:08 +0000437LORD POLONIUS
Jeremy Hylton6eb4b6a1997-08-15 15:59:43 +0000438
439 The time invites you; go; your servants tend.
440
Fred Drake004d5e62000-10-23 17:22:08 +0000441LAERTES
Jeremy Hylton6eb4b6a1997-08-15 15:59:43 +0000442
443 Farewell, Ophelia; and remember well
444 What I have said to you.
445
Fred Drake004d5e62000-10-23 17:22:08 +0000446OPHELIA
Jeremy Hylton6eb4b6a1997-08-15 15:59:43 +0000447
448 'Tis in my memory lock'd,
449 And you yourself shall keep the key of it.
450
Fred Drake004d5e62000-10-23 17:22:08 +0000451LAERTES
Jeremy Hylton6eb4b6a1997-08-15 15:59:43 +0000452
453 Farewell.
454"""
Guido van Rossum7d9ea502003-02-03 20:45:52 +0000455
456
457def test_main():
Walter Dörwald21d3a322003-05-01 17:45:56 +0000458 test_support.run_unittest(
459 ChecksumTestCase,
460 ExceptionTestCase,
461 CompressTestCase,
462 CompressObjectTestCase
463 )
Guido van Rossum7d9ea502003-02-03 20:45:52 +0000464
465if __name__ == "__main__":
Guido van Rossum776152b2007-05-22 22:44:07 +0000466 unittest.main() # XXX
467 ###test_main()