blob: 3718ca7533f891083298acd03962883bfe27507a [file] [log] [blame]
Guido van Rossum7d9ea502003-02-03 20:45:52 +00001import unittest
Benjamin Petersonee8712c2008-05-20 21:35:26 +00002from test import support
Christian Heimesd5e2b6f2008-03-19 21:50:51 +00003import binascii
Andrew M. Kuchling9a0f98e2001-02-21 02:17:01 +00004import random
Andrew M. Kuchling9a0f98e2001-02-21 02:17:01 +00005
R. David Murraya21e4ca2009-03-31 23:16:50 +00006zlib = support.import_module('zlib')
7
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):
Guido van Rossum776152b2007-05-22 22:44:07 +000012 self.assertEqual(zlib.crc32(b""), zlib.crc32(b"", 0))
Benjamin Petersonc9c0f202009-06-30 23:06:06 +000013 self.assertTrue(zlib.crc32(b"abc", 0xffffffff))
Andrew M. Kuchlingfcfc8d52001-08-10 15:50:11 +000014
Guido van Rossum7d9ea502003-02-03 20:45:52 +000015 def test_crc32empty(self):
Guido van Rossum776152b2007-05-22 22:44:07 +000016 self.assertEqual(zlib.crc32(b"", 0), 0)
17 self.assertEqual(zlib.crc32(b"", 1), 1)
18 self.assertEqual(zlib.crc32(b"", 432), 432)
Andrew M. Kuchling9a0f98e2001-02-21 02:17:01 +000019
Guido van Rossum7d9ea502003-02-03 20:45:52 +000020 def test_adler32start(self):
Guido van Rossum776152b2007-05-22 22:44:07 +000021 self.assertEqual(zlib.adler32(b""), zlib.adler32(b"", 1))
Benjamin Petersonc9c0f202009-06-30 23:06:06 +000022 self.assertTrue(zlib.adler32(b"abc", 0xffffffff))
Jeremy Hylton6eb4b6a1997-08-15 15:59:43 +000023
Guido van Rossum7d9ea502003-02-03 20:45:52 +000024 def test_adler32empty(self):
Guido van Rossum776152b2007-05-22 22:44:07 +000025 self.assertEqual(zlib.adler32(b"", 0), 0)
26 self.assertEqual(zlib.adler32(b"", 1), 1)
27 self.assertEqual(zlib.adler32(b"", 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.
Guido van Rossume2a383d2007-01-15 16:59:06 +000032 self.assertEqual(seen & 0x0FFFFFFFF, expected & 0x0FFFFFFFF)
Guido van Rossum7d9ea502003-02-03 20:45:52 +000033
34 def test_penguins(self):
Guido van Rossum776152b2007-05-22 22:44:07 +000035 self.assertEqual32(zlib.crc32(b"penguin", 0), 0x0e5c1a120)
36 self.assertEqual32(zlib.crc32(b"penguin", 1), 0x43b6aa94)
37 self.assertEqual32(zlib.adler32(b"penguin", 0), 0x0bcf02f6)
38 self.assertEqual32(zlib.adler32(b"penguin", 1), 0x0bd602f7)
Guido van Rossum7d9ea502003-02-03 20:45:52 +000039
Guido van Rossum776152b2007-05-22 22:44:07 +000040 self.assertEqual(zlib.crc32(b"penguin"), zlib.crc32(b"penguin", 0))
41 self.assertEqual(zlib.adler32(b"penguin"),zlib.adler32(b"penguin",1))
Guido van Rossum7d9ea502003-02-03 20:45:52 +000042
Gregory P. Smithab0d8a12008-03-17 20:24:09 +000043 def test_crc32_adler32_unsigned(self):
44 foo = 'abcdefghijklmnop'
45 # explicitly test signed behavior
Gregory P. Smith27275032008-03-20 06:20:09 +000046 self.assertEqual(zlib.crc32(foo), 2486878355)
Gregory P. Smithab0d8a12008-03-17 20:24:09 +000047 self.assertEqual(zlib.crc32('spam'), 1138425661)
48 self.assertEqual(zlib.adler32(foo+foo), 3573550353)
49 self.assertEqual(zlib.adler32('spam'), 72286642)
50
Christian Heimesd5e2b6f2008-03-19 21:50:51 +000051 def test_same_as_binascii_crc32(self):
Martin v. Löwis15b16a32008-12-02 06:00:15 +000052 foo = b'abcdefghijklmnop'
Gregory P. Smith27275032008-03-20 06:20:09 +000053 crc = 2486878355
Christian Heimesd5e2b6f2008-03-19 21:50:51 +000054 self.assertEqual(binascii.crc32(foo), crc)
55 self.assertEqual(zlib.crc32(foo), crc)
Martin v. Löwis15b16a32008-12-02 06:00:15 +000056 self.assertEqual(binascii.crc32(b'spam'), zlib.crc32(b'spam'))
Guido van Rossum7d9ea502003-02-03 20:45:52 +000057
58
Christian Heimesb186d002008-03-18 15:15:01 +000059
Guido van Rossum7d9ea502003-02-03 20:45:52 +000060class ExceptionTestCase(unittest.TestCase):
61 # make sure we generate some expected errors
Guido van Rossum8ce8a782007-11-01 19:42:39 +000062 def test_badlevel(self):
63 # specifying compression level out of range causes an error
64 # (but -1 is Z_DEFAULT_COMPRESSION and apparently the zlib
65 # accepts 0 too)
66 self.assertRaises(zlib.error, zlib.compress, 'ERROR', 10)
Guido van Rossum7d9ea502003-02-03 20:45:52 +000067
68 def test_badcompressobj(self):
69 # verify failure on building compress object with bad params
Neil Schemenauer94afd3e2004-06-05 19:02:52 +000070 self.assertRaises(ValueError, zlib.compressobj, 1, zlib.DEFLATED, 0)
Guido van Rossum8ce8a782007-11-01 19:42:39 +000071 # specifying total bits too large causes an error
72 self.assertRaises(ValueError,
73 zlib.compressobj, 1, zlib.DEFLATED, zlib.MAX_WBITS + 1)
Guido van Rossum7d9ea502003-02-03 20:45:52 +000074
75 def test_baddecompressobj(self):
76 # verify failure on building decompress object with bad params
77 self.assertRaises(ValueError, zlib.decompressobj, 0)
78
Christian Heimes5e696852008-04-09 08:37:03 +000079 def test_decompressobj_badflush(self):
80 # verify failure on calling decompressobj.flush with bad params
81 self.assertRaises(ValueError, zlib.decompressobj().flush, 0)
82 self.assertRaises(ValueError, zlib.decompressobj().flush, -1)
83
Guido van Rossum7d9ea502003-02-03 20:45:52 +000084
85
86class CompressTestCase(unittest.TestCase):
87 # Test compression in one go (whole message compression)
88 def test_speech(self):
Neil Schemenauer6412b122004-06-05 19:34:28 +000089 x = zlib.compress(HAMLET_SCENE)
90 self.assertEqual(zlib.decompress(x), HAMLET_SCENE)
Guido van Rossum7d9ea502003-02-03 20:45:52 +000091
92 def test_speech128(self):
Neil Schemenauer6412b122004-06-05 19:34:28 +000093 # compress more data
94 data = HAMLET_SCENE * 128
Guido van Rossum7d9ea502003-02-03 20:45:52 +000095 x = zlib.compress(data)
96 self.assertEqual(zlib.decompress(x), data)
97
Guido van Rossum7d9ea502003-02-03 20:45:52 +000098
99
100
101class CompressObjectTestCase(unittest.TestCase):
102 # Test compression object
Guido van Rossum7d9ea502003-02-03 20:45:52 +0000103 def test_pair(self):
Neil Schemenauer6412b122004-06-05 19:34:28 +0000104 # straightforward compress/decompress objects
105 data = HAMLET_SCENE * 128
106 co = zlib.compressobj()
Guido van Rossum7d9ea502003-02-03 20:45:52 +0000107 x1 = co.compress(data)
108 x2 = co.flush()
109 self.assertRaises(zlib.error, co.flush) # second flush should not work
Neil Schemenauer94afd3e2004-06-05 19:02:52 +0000110 dco = zlib.decompressobj()
Guido van Rossum7d9ea502003-02-03 20:45:52 +0000111 y1 = dco.decompress(x1 + x2)
112 y2 = dco.flush()
113 self.assertEqual(data, y1 + y2)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000114 self.assertTrue(isinstance(dco.unconsumed_tail, bytes))
115 self.assertTrue(isinstance(dco.unused_data, bytes))
Guido van Rossum7d9ea502003-02-03 20:45:52 +0000116
Neil Schemenauer94afd3e2004-06-05 19:02:52 +0000117 def test_compressoptions(self):
118 # specify lots of options to compressobj()
119 level = 2
120 method = zlib.DEFLATED
121 wbits = -12
122 memlevel = 9
123 strategy = zlib.Z_FILTERED
124 co = zlib.compressobj(level, method, wbits, memlevel, strategy)
Neil Schemenauer6412b122004-06-05 19:34:28 +0000125 x1 = co.compress(HAMLET_SCENE)
Neil Schemenauer94afd3e2004-06-05 19:02:52 +0000126 x2 = co.flush()
127 dco = zlib.decompressobj(wbits)
128 y1 = dco.decompress(x1 + x2)
129 y2 = dco.flush()
Neil Schemenauer6412b122004-06-05 19:34:28 +0000130 self.assertEqual(HAMLET_SCENE, y1 + y2)
Neil Schemenauer94afd3e2004-06-05 19:02:52 +0000131
Guido van Rossum7d9ea502003-02-03 20:45:52 +0000132 def test_compressincremental(self):
133 # compress object in steps, decompress object as one-shot
Neil Schemenauer6412b122004-06-05 19:34:28 +0000134 data = HAMLET_SCENE * 128
Neil Schemenauer94afd3e2004-06-05 19:02:52 +0000135 co = zlib.compressobj()
Guido van Rossum7d9ea502003-02-03 20:45:52 +0000136 bufs = []
137 for i in range(0, len(data), 256):
138 bufs.append(co.compress(data[i:i+256]))
139 bufs.append(co.flush())
Guido van Rossum776152b2007-05-22 22:44:07 +0000140 combuf = b''.join(bufs)
Guido van Rossum7d9ea502003-02-03 20:45:52 +0000141
Neil Schemenauer94afd3e2004-06-05 19:02:52 +0000142 dco = zlib.decompressobj()
Guido van Rossum776152b2007-05-22 22:44:07 +0000143 y1 = dco.decompress(b''.join(bufs))
Guido van Rossum7d9ea502003-02-03 20:45:52 +0000144 y2 = dco.flush()
145 self.assertEqual(data, y1 + y2)
146
Neil Schemenauer6412b122004-06-05 19:34:28 +0000147 def test_decompinc(self, flush=False, source=None, cx=256, dcx=64):
Guido van Rossum7d9ea502003-02-03 20:45:52 +0000148 # compress object in steps, decompress object in steps
Neil Schemenauer6412b122004-06-05 19:34:28 +0000149 source = source or HAMLET_SCENE
150 data = source * 128
Neil Schemenauer94afd3e2004-06-05 19:02:52 +0000151 co = zlib.compressobj()
Guido van Rossum7d9ea502003-02-03 20:45:52 +0000152 bufs = []
Neil Schemenauer6412b122004-06-05 19:34:28 +0000153 for i in range(0, len(data), cx):
154 bufs.append(co.compress(data[i:i+cx]))
Guido van Rossum7d9ea502003-02-03 20:45:52 +0000155 bufs.append(co.flush())
Guido van Rossum776152b2007-05-22 22:44:07 +0000156 combuf = b''.join(bufs)
Guido van Rossum7d9ea502003-02-03 20:45:52 +0000157
Gregory P. Smith693fc462008-09-06 20:13:06 +0000158 decombuf = zlib.decompress(combuf)
159 # Test type of return value
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000160 self.assertTrue(isinstance(decombuf, bytes))
Gregory P. Smith693fc462008-09-06 20:13:06 +0000161
162 self.assertEqual(data, decombuf)
Guido van Rossum7d9ea502003-02-03 20:45:52 +0000163
Neil Schemenauer94afd3e2004-06-05 19:02:52 +0000164 dco = zlib.decompressobj()
Guido van Rossum7d9ea502003-02-03 20:45:52 +0000165 bufs = []
Neil Schemenauer6412b122004-06-05 19:34:28 +0000166 for i in range(0, len(combuf), dcx):
167 bufs.append(dco.decompress(combuf[i:i+dcx]))
Guido van Rossum776152b2007-05-22 22:44:07 +0000168 self.assertEqual(b'', dco.unconsumed_tail, ########
169 "(A) uct should be b'': not %d long" %
Neil Schemenauer6412b122004-06-05 19:34:28 +0000170 len(dco.unconsumed_tail))
Amaury Forgeot d'Arce43d33a2008-07-02 20:50:16 +0000171 self.assertEqual(b'', dco.unused_data)
Neil Schemenauer6412b122004-06-05 19:34:28 +0000172 if flush:
173 bufs.append(dco.flush())
174 else:
175 while True:
176 chunk = dco.decompress('')
177 if chunk:
178 bufs.append(chunk)
179 else:
180 break
Guido van Rossum776152b2007-05-22 22:44:07 +0000181 self.assertEqual(b'', dco.unconsumed_tail, ########
182 "(B) uct should be b'': not %d long" %
Neil Schemenauer6412b122004-06-05 19:34:28 +0000183 len(dco.unconsumed_tail))
Amaury Forgeot d'Arce43d33a2008-07-02 20:50:16 +0000184 self.assertEqual(b'', dco.unused_data)
Guido van Rossum776152b2007-05-22 22:44:07 +0000185 self.assertEqual(data, b''.join(bufs))
Guido van Rossum7d9ea502003-02-03 20:45:52 +0000186 # Failure means: "decompressobj with init options failed"
187
Neil Schemenauer6412b122004-06-05 19:34:28 +0000188 def test_decompincflush(self):
189 self.test_decompinc(flush=True)
Guido van Rossum7d9ea502003-02-03 20:45:52 +0000190
Neil Schemenauer6412b122004-06-05 19:34:28 +0000191 def test_decompimax(self, source=None, cx=256, dcx=64):
192 # compress in steps, decompress in length-restricted steps
193 source = source or HAMLET_SCENE
Guido van Rossum7d9ea502003-02-03 20:45:52 +0000194 # Check a decompression object with max_length specified
Neil Schemenauer6412b122004-06-05 19:34:28 +0000195 data = source * 128
196 co = zlib.compressobj()
197 bufs = []
198 for i in range(0, len(data), cx):
199 bufs.append(co.compress(data[i:i+cx]))
200 bufs.append(co.flush())
Guido van Rossum776152b2007-05-22 22:44:07 +0000201 combuf = b''.join(bufs)
Neil Schemenauer6412b122004-06-05 19:34:28 +0000202 self.assertEqual(data, zlib.decompress(combuf),
203 'compressed data failure')
204
205 dco = zlib.decompressobj()
206 bufs = []
207 cb = combuf
208 while cb:
209 #max_length = 1 + len(cb)//10
210 chunk = dco.decompress(cb, dcx)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000211 self.assertFalse(len(chunk) > dcx,
Neil Schemenauer6412b122004-06-05 19:34:28 +0000212 'chunk too big (%d>%d)' % (len(chunk), dcx))
213 bufs.append(chunk)
214 cb = dco.unconsumed_tail
215 bufs.append(dco.flush())
Guido van Rossum776152b2007-05-22 22:44:07 +0000216 self.assertEqual(data, b''.join(bufs), 'Wrong data retrieved')
Neil Schemenauer6412b122004-06-05 19:34:28 +0000217
218 def test_decompressmaxlen(self, flush=False):
219 # Check a decompression object with max_length specified
220 data = HAMLET_SCENE * 128
Neil Schemenauer94afd3e2004-06-05 19:02:52 +0000221 co = zlib.compressobj()
Guido van Rossum7d9ea502003-02-03 20:45:52 +0000222 bufs = []
223 for i in range(0, len(data), 256):
224 bufs.append(co.compress(data[i:i+256]))
225 bufs.append(co.flush())
Guido van Rossum776152b2007-05-22 22:44:07 +0000226 combuf = b''.join(bufs)
Neil Schemenauer94afd3e2004-06-05 19:02:52 +0000227 self.assertEqual(data, zlib.decompress(combuf),
Guido van Rossum7d9ea502003-02-03 20:45:52 +0000228 'compressed data failure')
229
Neil Schemenauer94afd3e2004-06-05 19:02:52 +0000230 dco = zlib.decompressobj()
Guido van Rossum7d9ea502003-02-03 20:45:52 +0000231 bufs = []
232 cb = combuf
233 while cb:
Guido van Rossumf3594102003-02-27 18:39:18 +0000234 max_length = 1 + len(cb)//10
Guido van Rossum7d9ea502003-02-03 20:45:52 +0000235 chunk = dco.decompress(cb, max_length)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000236 self.assertFalse(len(chunk) > max_length,
Guido van Rossum7d9ea502003-02-03 20:45:52 +0000237 'chunk too big (%d>%d)' % (len(chunk),max_length))
238 bufs.append(chunk)
239 cb = dco.unconsumed_tail
Neil Schemenauer6412b122004-06-05 19:34:28 +0000240 if flush:
241 bufs.append(dco.flush())
242 else:
243 while chunk:
244 chunk = dco.decompress('', max_length)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000245 self.assertFalse(len(chunk) > max_length,
Neil Schemenauer6412b122004-06-05 19:34:28 +0000246 'chunk too big (%d>%d)' % (len(chunk),max_length))
247 bufs.append(chunk)
Guido van Rossum776152b2007-05-22 22:44:07 +0000248 self.assertEqual(data, b''.join(bufs), 'Wrong data retrieved')
Guido van Rossum7d9ea502003-02-03 20:45:52 +0000249
Neil Schemenauer6412b122004-06-05 19:34:28 +0000250 def test_decompressmaxlenflush(self):
251 self.test_decompressmaxlen(flush=True)
Guido van Rossum7d9ea502003-02-03 20:45:52 +0000252
253 def test_maxlenmisc(self):
254 # Misc tests of max_length
Neil Schemenauer94afd3e2004-06-05 19:02:52 +0000255 dco = zlib.decompressobj()
Guido van Rossum7d9ea502003-02-03 20:45:52 +0000256 self.assertRaises(ValueError, dco.decompress, "", -1)
Guido van Rossum776152b2007-05-22 22:44:07 +0000257 self.assertEqual(b'', dco.unconsumed_tail)
Guido van Rossum7d9ea502003-02-03 20:45:52 +0000258
259 def test_flushes(self):
260 # Test flush() with the various options, using all the
261 # different levels in order to provide more variations.
262 sync_opt = ['Z_NO_FLUSH', 'Z_SYNC_FLUSH', 'Z_FULL_FLUSH']
263 sync_opt = [getattr(zlib, opt) for opt in sync_opt
264 if hasattr(zlib, opt)]
Neil Schemenauer6412b122004-06-05 19:34:28 +0000265 data = HAMLET_SCENE * 8
Guido van Rossum7d9ea502003-02-03 20:45:52 +0000266
267 for sync in sync_opt:
268 for level in range(10):
269 obj = zlib.compressobj( level )
270 a = obj.compress( data[:3000] )
271 b = obj.flush( sync )
272 c = obj.compress( data[3000:] )
273 d = obj.flush()
Guido van Rossum776152b2007-05-22 22:44:07 +0000274 self.assertEqual(zlib.decompress(b''.join([a,b,c,d])),
Guido van Rossum7d9ea502003-02-03 20:45:52 +0000275 data, ("Decompress failed: flush "
276 "mode=%i, level=%i") % (sync, level))
277 del obj
278
279 def test_odd_flush(self):
280 # Test for odd flushing bugs noted in 2.0, and hopefully fixed in 2.1
281 import random
282
283 if hasattr(zlib, 'Z_SYNC_FLUSH'):
284 # Testing on 17K of "random" data
285
286 # Create compressor and decompressor objects
Neil Schemenauer6412b122004-06-05 19:34:28 +0000287 co = zlib.compressobj(zlib.Z_BEST_COMPRESSION)
Guido van Rossum7d9ea502003-02-03 20:45:52 +0000288 dco = zlib.decompressobj()
289
290 # Try 17K of data
291 # generate random data stream
292 try:
293 # In 2.3 and later, WichmannHill is the RNG of the bug report
294 gen = random.WichmannHill()
295 except AttributeError:
296 try:
297 # 2.2 called it Random
298 gen = random.Random()
299 except AttributeError:
300 # others might simply have a single RNG
301 gen = random
302 gen.seed(1)
303 data = genblock(1, 17 * 1024, generator=gen)
304
305 # compress, sync-flush, and decompress
306 first = co.compress(data)
307 second = co.flush(zlib.Z_SYNC_FLUSH)
308 expanded = dco.decompress(first + second)
309
310 # if decompressed data is different from the input data, choke.
311 self.assertEqual(expanded, data, "17K random source doesn't match")
312
Andrew M. Kuchling3b585b32004-12-28 20:10:48 +0000313 def test_empty_flush(self):
314 # Test that calling .flush() on unused objects works.
315 # (Bug #1083110 -- calling .flush() on decompress objects
316 # caused a core dump.)
317
318 co = zlib.compressobj(zlib.Z_BEST_COMPRESSION)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000319 self.assertTrue(co.flush()) # Returns a zlib header
Andrew M. Kuchling3b585b32004-12-28 20:10:48 +0000320 dco = zlib.decompressobj()
Guido van Rossum776152b2007-05-22 22:44:07 +0000321 self.assertEqual(dco.flush(), b"") # Returns nothing
Tim Peters5a9fb3c2005-01-07 16:01:32 +0000322
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000323 if hasattr(zlib.compressobj(), "copy"):
324 def test_compresscopy(self):
325 # Test copying a compression object
326 data0 = HAMLET_SCENE
Guido van Rossum776152b2007-05-22 22:44:07 +0000327 data1 = bytes(str(HAMLET_SCENE, "ascii").swapcase(), "ascii")
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000328 c0 = zlib.compressobj(zlib.Z_BEST_COMPRESSION)
329 bufs0 = []
330 bufs0.append(c0.compress(data0))
Thomas Wouters477c8d52006-05-27 19:21:47 +0000331
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000332 c1 = c0.copy()
333 bufs1 = bufs0[:]
Thomas Wouters477c8d52006-05-27 19:21:47 +0000334
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000335 bufs0.append(c0.compress(data0))
336 bufs0.append(c0.flush())
Guido van Rossum776152b2007-05-22 22:44:07 +0000337 s0 = b''.join(bufs0)
Thomas Wouters477c8d52006-05-27 19:21:47 +0000338
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000339 bufs1.append(c1.compress(data1))
340 bufs1.append(c1.flush())
Guido van Rossum776152b2007-05-22 22:44:07 +0000341 s1 = b''.join(bufs1)
Thomas Wouters477c8d52006-05-27 19:21:47 +0000342
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000343 self.assertEqual(zlib.decompress(s0),data0+data0)
344 self.assertEqual(zlib.decompress(s1),data0+data1)
Thomas Wouters477c8d52006-05-27 19:21:47 +0000345
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000346 def test_badcompresscopy(self):
347 # Test copying a compression object in an inconsistent state
348 c = zlib.compressobj()
349 c.compress(HAMLET_SCENE)
350 c.flush()
351 self.assertRaises(ValueError, c.copy)
Thomas Wouters477c8d52006-05-27 19:21:47 +0000352
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000353 if hasattr(zlib.decompressobj(), "copy"):
354 def test_decompresscopy(self):
355 # Test copying a decompression object
356 data = HAMLET_SCENE
357 comp = zlib.compress(data)
Gregory P. Smith693fc462008-09-06 20:13:06 +0000358 # Test type of return value
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000359 self.assertTrue(isinstance(comp, bytes))
Thomas Wouters477c8d52006-05-27 19:21:47 +0000360
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000361 d0 = zlib.decompressobj()
362 bufs0 = []
363 bufs0.append(d0.decompress(comp[:32]))
Thomas Wouters477c8d52006-05-27 19:21:47 +0000364
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000365 d1 = d0.copy()
366 bufs1 = bufs0[:]
Thomas Wouters477c8d52006-05-27 19:21:47 +0000367
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000368 bufs0.append(d0.decompress(comp[32:]))
Guido van Rossum776152b2007-05-22 22:44:07 +0000369 s0 = b''.join(bufs0)
Thomas Wouters477c8d52006-05-27 19:21:47 +0000370
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000371 bufs1.append(d1.decompress(comp[32:]))
Guido van Rossum776152b2007-05-22 22:44:07 +0000372 s1 = b''.join(bufs1)
Thomas Wouters477c8d52006-05-27 19:21:47 +0000373
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000374 self.assertEqual(s0,s1)
375 self.assertEqual(s0,data)
Thomas Wouters477c8d52006-05-27 19:21:47 +0000376
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000377 def test_baddecompresscopy(self):
378 # Test copying a compression object in an inconsistent state
379 data = zlib.compress(HAMLET_SCENE)
380 d = zlib.decompressobj()
381 d.decompress(data)
382 d.flush()
383 self.assertRaises(ValueError, d.copy)
Guido van Rossum7d9ea502003-02-03 20:45:52 +0000384
385def genblock(seed, length, step=1024, generator=random):
386 """length-byte stream of random data from a seed (in step-byte blocks)."""
387 if seed is not None:
388 generator.seed(seed)
389 randint = generator.randint
390 if length < step or step < 2:
391 step = length
Guido van Rossum776152b2007-05-22 22:44:07 +0000392 blocks = bytes()
Guido van Rossum7d9ea502003-02-03 20:45:52 +0000393 for i in range(0, length, step):
Guido van Rossum776152b2007-05-22 22:44:07 +0000394 blocks += bytes(randint(0, 255) for x in range(step))
395 return blocks
Guido van Rossum7d9ea502003-02-03 20:45:52 +0000396
397
398
399def choose_lines(source, number, seed=None, generator=random):
400 """Return a list of number lines randomly chosen from the source"""
401 if seed is not None:
402 generator.seed(seed)
403 sources = source.split('\n')
404 return [generator.choice(sources) for n in range(number)]
405
406
407
Guido van Rossum776152b2007-05-22 22:44:07 +0000408HAMLET_SCENE = b"""
Fred Drake004d5e62000-10-23 17:22:08 +0000409LAERTES
Jeremy Hylton6eb4b6a1997-08-15 15:59:43 +0000410
411 O, fear me not.
412 I stay too long: but here my father comes.
413
414 Enter POLONIUS
415
416 A double blessing is a double grace,
417 Occasion smiles upon a second leave.
418
Fred Drake004d5e62000-10-23 17:22:08 +0000419LORD POLONIUS
Jeremy Hylton6eb4b6a1997-08-15 15:59:43 +0000420
421 Yet here, Laertes! aboard, aboard, for shame!
422 The wind sits in the shoulder of your sail,
423 And you are stay'd for. There; my blessing with thee!
424 And these few precepts in thy memory
425 See thou character. Give thy thoughts no tongue,
426 Nor any unproportioned thought his act.
427 Be thou familiar, but by no means vulgar.
428 Those friends thou hast, and their adoption tried,
429 Grapple them to thy soul with hoops of steel;
430 But do not dull thy palm with entertainment
431 Of each new-hatch'd, unfledged comrade. Beware
432 Of entrance to a quarrel, but being in,
433 Bear't that the opposed may beware of thee.
434 Give every man thy ear, but few thy voice;
435 Take each man's censure, but reserve thy judgment.
436 Costly thy habit as thy purse can buy,
437 But not express'd in fancy; rich, not gaudy;
438 For the apparel oft proclaims the man,
439 And they in France of the best rank and station
440 Are of a most select and generous chief in that.
441 Neither a borrower nor a lender be;
442 For loan oft loses both itself and friend,
443 And borrowing dulls the edge of husbandry.
444 This above all: to thine ownself be true,
445 And it must follow, as the night the day,
446 Thou canst not then be false to any man.
447 Farewell: my blessing season this in thee!
448
Fred Drake004d5e62000-10-23 17:22:08 +0000449LAERTES
Jeremy Hylton6eb4b6a1997-08-15 15:59:43 +0000450
451 Most humbly do I take my leave, my lord.
452
Fred Drake004d5e62000-10-23 17:22:08 +0000453LORD POLONIUS
Jeremy Hylton6eb4b6a1997-08-15 15:59:43 +0000454
455 The time invites you; go; your servants tend.
456
Fred Drake004d5e62000-10-23 17:22:08 +0000457LAERTES
Jeremy Hylton6eb4b6a1997-08-15 15:59:43 +0000458
459 Farewell, Ophelia; and remember well
460 What I have said to you.
461
Fred Drake004d5e62000-10-23 17:22:08 +0000462OPHELIA
Jeremy Hylton6eb4b6a1997-08-15 15:59:43 +0000463
464 'Tis in my memory lock'd,
465 And you yourself shall keep the key of it.
466
Fred Drake004d5e62000-10-23 17:22:08 +0000467LAERTES
Jeremy Hylton6eb4b6a1997-08-15 15:59:43 +0000468
469 Farewell.
470"""
Guido van Rossum7d9ea502003-02-03 20:45:52 +0000471
472
473def test_main():
Benjamin Petersonee8712c2008-05-20 21:35:26 +0000474 support.run_unittest(
Walter Dörwald21d3a322003-05-01 17:45:56 +0000475 ChecksumTestCase,
476 ExceptionTestCase,
477 CompressTestCase,
478 CompressObjectTestCase
479 )
Guido van Rossum7d9ea502003-02-03 20:45:52 +0000480
481if __name__ == "__main__":
Guido van Rossum776152b2007-05-22 22:44:07 +0000482 unittest.main() # XXX
483 ###test_main()