blob: 88815160f8b8c0e632c5dcaad2488a60ed68cbbd [file] [log] [blame]
Jeremy Hylton6eb4b6a1997-08-15 15:59:43 +00001import zlib
Andrew M. Kuchling9a0f98e2001-02-21 02:17:01 +00002from test_support import TestFailed
Jeremy Hylton6eb4b6a1997-08-15 15:59:43 +00003import sys
Guido van Rossumc95a6c11997-08-15 16:23:32 +00004import imp
Jeremy Hylton6eb4b6a1997-08-15 15:59:43 +00005
Guido van Rossum629bcfb1997-12-18 05:21:07 +00006try:
7 t = imp.find_module('test_zlib')
8 file = t[0]
9except ImportError:
10 file = open(__file__)
Guido van Rossumc95a6c11997-08-15 16:23:32 +000011buf = file.read() * 8
12file.close()
Jeremy Hylton6eb4b6a1997-08-15 15:59:43 +000013
Jeremy Hyltona05e2932000-06-28 14:48:01 +000014# test the checksums (hex so the test doesn't break on 64-bit machines)
Guido van Rossum446898f1998-04-24 18:31:28 +000015print hex(zlib.crc32('penguin')), hex(zlib.crc32('penguin', 1))
16print hex(zlib.adler32('penguin')), hex(zlib.adler32('penguin', 1))
Jeremy Hylton9dc2b8e1997-09-04 23:41:37 +000017
18# make sure we generate some expected errors
19try:
20 zlib.compress('ERROR', zlib.MAX_WBITS + 1)
21except zlib.error, msg:
22 print "expecting", msg
23try:
24 zlib.compressobj(1, 8, 0)
25except ValueError, msg:
26 print "expecting", msg
27try:
28 zlib.decompressobj(0)
29except ValueError, msg:
30 print "expecting", msg
31
Jeremy Hylton6eb4b6a1997-08-15 15:59:43 +000032x = zlib.compress(buf)
33y = zlib.decompress(x)
34if buf != y:
35 print "normal compression/decompression failed"
Jeremy Hylton9dc2b8e1997-09-04 23:41:37 +000036else:
37 print "normal compression/decompression succeeded"
Jeremy Hylton6eb4b6a1997-08-15 15:59:43 +000038
39buf = buf * 16
40
41co = zlib.compressobj(8, 8, -15)
42x1 = co.compress(buf)
43x2 = co.flush()
44x = x1 + x2
45
46dc = zlib.decompressobj(-15)
47y1 = dc.decompress(x)
48y2 = dc.flush()
49y = y1 + y2
50if buf != y:
51 print "compress/decompression obj failed"
Jeremy Hylton9dc2b8e1997-09-04 23:41:37 +000052else:
53 print "compress/decompression obj succeeded"
54
55co = zlib.compressobj(2, 8, -12, 9, 1)
56bufs = []
57for i in range(0, len(buf), 256):
58 bufs.append(co.compress(buf[i:i+256]))
59bufs.append(co.flush())
Eric S. Raymond83ff7492001-02-09 12:03:45 +000060combuf = ''.join(bufs)
Jeremy Hylton9dc2b8e1997-09-04 23:41:37 +000061
62decomp1 = zlib.decompress(combuf, -12, -5)
63if decomp1 != buf:
64 print "decompress with init options failed"
65else:
66 print "decompress with init options succeeded"
67
68deco = zlib.decompressobj(-12)
69bufs = []
70for i in range(0, len(combuf), 128):
71 bufs.append(deco.decompress(combuf[i:i+128]))
72bufs.append(deco.flush())
Andrew M. Kuchling8e6d44e2001-02-14 17:46:20 +000073decomp2 = ''.join(bufs)
Jeremy Hylton9dc2b8e1997-09-04 23:41:37 +000074if decomp2 != buf:
75 print "decompressobj with init options failed"
76else:
77 print "decompressobj with init options succeeded"
Jeremy Hylton6eb4b6a1997-08-15 15:59:43 +000078
Jeremy Hylton511e2ca2001-10-16 20:39:49 +000079print "should be '':", `deco.unconsumed_tail`
80
81# Check a decompression object with max_length specified
82deco = zlib.decompressobj(-12)
83cb = combuf
84bufs = []
85while cb:
86 max_length = 1 + len(cb)/10
87 chunk = deco.decompress(cb, max_length)
88 if len(chunk) > max_length:
89 print 'chunk too big (%d>%d)' % (len(chunk),max_length)
90 bufs.append(chunk)
91 cb = deco.unconsumed_tail
92bufs.append(deco.flush())
93decomp2 = ''.join(buf)
94if decomp2 != buf:
95 print "max_length decompressobj failed"
96else:
97 print "max_length decompressobj succeeded"
Tim Peterse0c446b2001-10-18 21:57:37 +000098
Jeremy Hylton511e2ca2001-10-16 20:39:49 +000099# Misc tests of max_length
100deco = zlib.decompressobj(-12)
101try:
102 deco.decompress("", -1)
103except ValueError:
104 pass
105else:
106 print "failed to raise value error on bad max_length"
107print "unconsumed_tail should be '':", `deco.unconsumed_tail`
108
Andrew M. Kuchlingdca7e001999-03-22 19:23:17 +0000109# Test flush() with the various options, using all the different levels
110# in order to provide more variations.
Andrew M. Kuchlingfcfc8d52001-08-10 15:50:11 +0000111sync_opt = ['Z_NO_FLUSH', 'Z_SYNC_FLUSH', 'Z_FULL_FLUSH']
112sync_opt = [getattr(zlib, opt) for opt in sync_opt if hasattr(zlib, opt)]
113
114for sync in sync_opt:
Andrew M. Kuchlingdca7e001999-03-22 19:23:17 +0000115 for level in range(10):
Fred Drakead892dc2000-02-10 15:31:07 +0000116 obj = zlib.compressobj( level )
117 d = obj.compress( buf[:3000] )
118 d = d + obj.flush( sync )
119 d = d + obj.compress( buf[3000:] )
120 d = d + obj.flush()
121 if zlib.decompress(d) != buf:
122 print "Decompress failed: flush mode=%i, level=%i" % (sync,level)
123 del obj
Andrew M. Kuchlingdca7e001999-03-22 19:23:17 +0000124
Andrew M. Kuchling9a0f98e2001-02-21 02:17:01 +0000125# Test for the odd flushing bugs noted in 2.0, and hopefully fixed in 2.1
126
127import random
Tim Peters0009c4e2001-02-21 07:29:48 +0000128random.seed(1)
Andrew M. Kuchling9a0f98e2001-02-21 02:17:01 +0000129
130print 'Testing on 17K of random data'
131
Andrew M. Kuchlingfcfc8d52001-08-10 15:50:11 +0000132if hasattr(zlib, 'Z_SYNC_FLUSH'):
Andrew M. Kuchling9a0f98e2001-02-21 02:17:01 +0000133
Andrew M. Kuchlingfcfc8d52001-08-10 15:50:11 +0000134 # Create compressor and decompressor objects
135 c=zlib.compressobj(9)
136 d=zlib.decompressobj()
Tim Peters0009c4e2001-02-21 07:29:48 +0000137
Andrew M. Kuchlingfcfc8d52001-08-10 15:50:11 +0000138 # Try 17K of data
139 # generate random data stream
140 a=""
141 for i in range(17*1024):
142 a=a+chr(random.randint(0,255))
Andrew M. Kuchling9a0f98e2001-02-21 02:17:01 +0000143
Andrew M. Kuchlingfcfc8d52001-08-10 15:50:11 +0000144 # compress, sync-flush, and decompress
145 t = d.decompress( c.compress(a)+c.flush(zlib.Z_SYNC_FLUSH) )
146
147 # if decompressed data is different from the input data, choke.
148 if len(t) != len(a):
149 print len(a),len(t),len(d.unused_data)
150 raise TestFailed, "output of 17K doesn't match"
Andrew M. Kuchling9a0f98e2001-02-21 02:17:01 +0000151
Jeremy Hylton6eb4b6a1997-08-15 15:59:43 +0000152def ignore():
153 """An empty function with a big string.
154
155 Make the compression algorithm work a little harder.
156 """
157
158 """
Fred Drake004d5e62000-10-23 17:22:08 +0000159LAERTES
Jeremy Hylton6eb4b6a1997-08-15 15:59:43 +0000160
161 O, fear me not.
162 I stay too long: but here my father comes.
163
164 Enter POLONIUS
165
166 A double blessing is a double grace,
167 Occasion smiles upon a second leave.
168
Fred Drake004d5e62000-10-23 17:22:08 +0000169LORD POLONIUS
Jeremy Hylton6eb4b6a1997-08-15 15:59:43 +0000170
171 Yet here, Laertes! aboard, aboard, for shame!
172 The wind sits in the shoulder of your sail,
173 And you are stay'd for. There; my blessing with thee!
174 And these few precepts in thy memory
175 See thou character. Give thy thoughts no tongue,
176 Nor any unproportioned thought his act.
177 Be thou familiar, but by no means vulgar.
178 Those friends thou hast, and their adoption tried,
179 Grapple them to thy soul with hoops of steel;
180 But do not dull thy palm with entertainment
181 Of each new-hatch'd, unfledged comrade. Beware
182 Of entrance to a quarrel, but being in,
183 Bear't that the opposed may beware of thee.
184 Give every man thy ear, but few thy voice;
185 Take each man's censure, but reserve thy judgment.
186 Costly thy habit as thy purse can buy,
187 But not express'd in fancy; rich, not gaudy;
188 For the apparel oft proclaims the man,
189 And they in France of the best rank and station
190 Are of a most select and generous chief in that.
191 Neither a borrower nor a lender be;
192 For loan oft loses both itself and friend,
193 And borrowing dulls the edge of husbandry.
194 This above all: to thine ownself be true,
195 And it must follow, as the night the day,
196 Thou canst not then be false to any man.
197 Farewell: my blessing season this in thee!
198
Fred Drake004d5e62000-10-23 17:22:08 +0000199LAERTES
Jeremy Hylton6eb4b6a1997-08-15 15:59:43 +0000200
201 Most humbly do I take my leave, my lord.
202
Fred Drake004d5e62000-10-23 17:22:08 +0000203LORD POLONIUS
Jeremy Hylton6eb4b6a1997-08-15 15:59:43 +0000204
205 The time invites you; go; your servants tend.
206
Fred Drake004d5e62000-10-23 17:22:08 +0000207LAERTES
Jeremy Hylton6eb4b6a1997-08-15 15:59:43 +0000208
209 Farewell, Ophelia; and remember well
210 What I have said to you.
211
Fred Drake004d5e62000-10-23 17:22:08 +0000212OPHELIA
Jeremy Hylton6eb4b6a1997-08-15 15:59:43 +0000213
214 'Tis in my memory lock'd,
215 And you yourself shall keep the key of it.
216
Fred Drake004d5e62000-10-23 17:22:08 +0000217LAERTES
Jeremy Hylton6eb4b6a1997-08-15 15:59:43 +0000218
219 Farewell.
220"""