diff options
author | Guido van Rossum <guido@python.org> | 2007-05-22 22:44:07 (GMT) |
---|---|---|
committer | Guido van Rossum <guido@python.org> | 2007-05-22 22:44:07 (GMT) |
commit | 776152b6018fa1dc25c7a1960237c76c26931cab (patch) | |
tree | f7621cb7d856de93ab664bcd34b59bbe4e6373b3 | |
parent | dcee3c0d1f536bef1c01fbdcbf714b82b7aa1b1e (diff) | |
download | cpython-776152b6018fa1dc25c7a1960237c76c26931cab.zip cpython-776152b6018fa1dc25c7a1960237c76c26931cab.tar.gz cpython-776152b6018fa1dc25c7a1960237c76c26931cab.tar.bz2 |
zlib now uses bytes everywhere, and the test passes.
-rw-r--r-- | Lib/test/test_zlib.py | 84 | ||||
-rw-r--r-- | Modules/zlibmodule.c | 98 |
2 files changed, 104 insertions, 78 deletions
diff --git a/Lib/test/test_zlib.py b/Lib/test/test_zlib.py index dc4a7d8..a3310a5 100644 --- a/Lib/test/test_zlib.py +++ b/Lib/test/test_zlib.py @@ -7,22 +7,22 @@ import random class ChecksumTestCase(unittest.TestCase): # checksum test cases def test_crc32start(self): - self.assertEqual(zlib.crc32(""), zlib.crc32("", 0)) - self.assert_(zlib.crc32("abc", 0xffffffff)) + self.assertEqual(zlib.crc32(b""), zlib.crc32(b"", 0)) + self.assert_(zlib.crc32(b"abc", 0xffffffff)) def test_crc32empty(self): - self.assertEqual(zlib.crc32("", 0), 0) - self.assertEqual(zlib.crc32("", 1), 1) - self.assertEqual(zlib.crc32("", 432), 432) + self.assertEqual(zlib.crc32(b"", 0), 0) + self.assertEqual(zlib.crc32(b"", 1), 1) + self.assertEqual(zlib.crc32(b"", 432), 432) def test_adler32start(self): - self.assertEqual(zlib.adler32(""), zlib.adler32("", 1)) - self.assert_(zlib.adler32("abc", 0xffffffff)) + self.assertEqual(zlib.adler32(b""), zlib.adler32(b"", 1)) + self.assert_(zlib.adler32(b"abc", 0xffffffff)) def test_adler32empty(self): - self.assertEqual(zlib.adler32("", 0), 0) - self.assertEqual(zlib.adler32("", 1), 1) - self.assertEqual(zlib.adler32("", 432), 432) + self.assertEqual(zlib.adler32(b"", 0), 0) + self.assertEqual(zlib.adler32(b"", 1), 1) + self.assertEqual(zlib.adler32(b"", 432), 432) def assertEqual32(self, seen, expected): # 32-bit values masked -- checksums on 32- vs 64- bit machines @@ -30,13 +30,13 @@ class ChecksumTestCase(unittest.TestCase): self.assertEqual(seen & 0x0FFFFFFFF, expected & 0x0FFFFFFFF) def test_penguins(self): - self.assertEqual32(zlib.crc32("penguin", 0), 0x0e5c1a120) - self.assertEqual32(zlib.crc32("penguin", 1), 0x43b6aa94) - self.assertEqual32(zlib.adler32("penguin", 0), 0x0bcf02f6) - self.assertEqual32(zlib.adler32("penguin", 1), 0x0bd602f7) + self.assertEqual32(zlib.crc32(b"penguin", 0), 0x0e5c1a120) + self.assertEqual32(zlib.crc32(b"penguin", 1), 0x43b6aa94) + self.assertEqual32(zlib.adler32(b"penguin", 0), 0x0bcf02f6) + self.assertEqual32(zlib.adler32(b"penguin", 1), 0x0bd602f7) - self.assertEqual(zlib.crc32("penguin"), zlib.crc32("penguin", 0)) - self.assertEqual(zlib.adler32("penguin"),zlib.adler32("penguin",1)) + self.assertEqual(zlib.crc32(b"penguin"), zlib.crc32(b"penguin", 0)) + self.assertEqual(zlib.adler32(b"penguin"),zlib.adler32(b"penguin",1)) @@ -109,10 +109,10 @@ class CompressObjectTestCase(unittest.TestCase): for i in range(0, len(data), 256): bufs.append(co.compress(data[i:i+256])) bufs.append(co.flush()) - combuf = ''.join(bufs) + combuf = b''.join(bufs) dco = zlib.decompressobj() - y1 = dco.decompress(''.join(bufs)) + y1 = dco.decompress(b''.join(bufs)) y2 = dco.flush() self.assertEqual(data, y1 + y2) @@ -125,7 +125,7 @@ class CompressObjectTestCase(unittest.TestCase): for i in range(0, len(data), cx): bufs.append(co.compress(data[i:i+cx])) bufs.append(co.flush()) - combuf = ''.join(bufs) + combuf = b''.join(bufs) self.assertEqual(data, zlib.decompress(combuf)) @@ -133,8 +133,8 @@ class CompressObjectTestCase(unittest.TestCase): bufs = [] for i in range(0, len(combuf), dcx): bufs.append(dco.decompress(combuf[i:i+dcx])) - self.assertEqual('', dco.unconsumed_tail, ######## - "(A) uct should be '': not %d long" % + self.assertEqual(b'', dco.unconsumed_tail, ######## + "(A) uct should be b'': not %d long" % len(dco.unconsumed_tail)) if flush: bufs.append(dco.flush()) @@ -145,10 +145,10 @@ class CompressObjectTestCase(unittest.TestCase): bufs.append(chunk) else: break - self.assertEqual('', dco.unconsumed_tail, ######## - "(B) uct should be '': not %d long" % + self.assertEqual(b'', dco.unconsumed_tail, ######## + "(B) uct should be b'': not %d long" % len(dco.unconsumed_tail)) - self.assertEqual(data, ''.join(bufs)) + self.assertEqual(data, b''.join(bufs)) # Failure means: "decompressobj with init options failed" def test_decompincflush(self): @@ -164,7 +164,7 @@ class CompressObjectTestCase(unittest.TestCase): for i in range(0, len(data), cx): bufs.append(co.compress(data[i:i+cx])) bufs.append(co.flush()) - combuf = ''.join(bufs) + combuf = b''.join(bufs) self.assertEqual(data, zlib.decompress(combuf), 'compressed data failure') @@ -179,7 +179,7 @@ class CompressObjectTestCase(unittest.TestCase): bufs.append(chunk) cb = dco.unconsumed_tail bufs.append(dco.flush()) - self.assertEqual(data, ''.join(bufs), 'Wrong data retrieved') + self.assertEqual(data, b''.join(bufs), 'Wrong data retrieved') def test_decompressmaxlen(self, flush=False): # Check a decompression object with max_length specified @@ -189,7 +189,7 @@ class CompressObjectTestCase(unittest.TestCase): for i in range(0, len(data), 256): bufs.append(co.compress(data[i:i+256])) bufs.append(co.flush()) - combuf = ''.join(bufs) + combuf = b''.join(bufs) self.assertEqual(data, zlib.decompress(combuf), 'compressed data failure') @@ -211,7 +211,7 @@ class CompressObjectTestCase(unittest.TestCase): self.failIf(len(chunk) > max_length, 'chunk too big (%d>%d)' % (len(chunk),max_length)) bufs.append(chunk) - self.assertEqual(data, ''.join(bufs), 'Wrong data retrieved') + self.assertEqual(data, b''.join(bufs), 'Wrong data retrieved') def test_decompressmaxlenflush(self): self.test_decompressmaxlen(flush=True) @@ -220,7 +220,7 @@ class CompressObjectTestCase(unittest.TestCase): # Misc tests of max_length dco = zlib.decompressobj() self.assertRaises(ValueError, dco.decompress, "", -1) - self.assertEqual('', dco.unconsumed_tail) + self.assertEqual(b'', dco.unconsumed_tail) def test_flushes(self): # Test flush() with the various options, using all the @@ -237,7 +237,7 @@ class CompressObjectTestCase(unittest.TestCase): b = obj.flush( sync ) c = obj.compress( data[3000:] ) d = obj.flush() - self.assertEqual(zlib.decompress(''.join([a,b,c,d])), + self.assertEqual(zlib.decompress(b''.join([a,b,c,d])), data, ("Decompress failed: flush " "mode=%i, level=%i") % (sync, level)) del obj @@ -284,13 +284,13 @@ class CompressObjectTestCase(unittest.TestCase): co = zlib.compressobj(zlib.Z_BEST_COMPRESSION) self.failUnless(co.flush()) # Returns a zlib header dco = zlib.decompressobj() - self.assertEqual(dco.flush(), "") # Returns nothing + self.assertEqual(dco.flush(), b"") # Returns nothing if hasattr(zlib.compressobj(), "copy"): def test_compresscopy(self): # Test copying a compression object data0 = HAMLET_SCENE - data1 = HAMLET_SCENE.swapcase() + data1 = bytes(str(HAMLET_SCENE, "ascii").swapcase(), "ascii") c0 = zlib.compressobj(zlib.Z_BEST_COMPRESSION) bufs0 = [] bufs0.append(c0.compress(data0)) @@ -300,11 +300,11 @@ class CompressObjectTestCase(unittest.TestCase): bufs0.append(c0.compress(data0)) bufs0.append(c0.flush()) - s0 = ''.join(bufs0) + s0 = b''.join(bufs0) bufs1.append(c1.compress(data1)) bufs1.append(c1.flush()) - s1 = ''.join(bufs1) + s1 = b''.join(bufs1) self.assertEqual(zlib.decompress(s0),data0+data0) self.assertEqual(zlib.decompress(s1),data0+data1) @@ -330,10 +330,10 @@ class CompressObjectTestCase(unittest.TestCase): bufs1 = bufs0[:] bufs0.append(d0.decompress(comp[32:])) - s0 = ''.join(bufs0) + s0 = b''.join(bufs0) bufs1.append(d1.decompress(comp[32:])) - s1 = ''.join(bufs1) + s1 = b''.join(bufs1) self.assertEqual(s0,s1) self.assertEqual(s0,data) @@ -353,11 +353,10 @@ def genblock(seed, length, step=1024, generator=random): randint = generator.randint if length < step or step < 2: step = length - blocks = [] + blocks = bytes() for i in range(0, length, step): - blocks.append(''.join([chr(randint(0,255)) - for x in range(step)])) - return ''.join(blocks)[:length] + blocks += bytes(randint(0, 255) for x in range(step)) + return blocks @@ -370,7 +369,7 @@ def choose_lines(source, number, seed=None, generator=random): -HAMLET_SCENE = """ +HAMLET_SCENE = b""" LAERTES O, fear me not. @@ -444,4 +443,5 @@ def test_main(): ) if __name__ == "__main__": - test_main() + unittest.main() # XXX + ###test_main() diff --git a/Modules/zlibmodule.c b/Modules/zlibmodule.c index da31e8b..51395a2 100644 --- a/Modules/zlibmodule.c +++ b/Modules/zlibmodule.c @@ -96,12 +96,12 @@ newcompobject(PyTypeObject *type) if (self == NULL) return NULL; self->is_initialised = 0; - self->unused_data = PyString_FromString(""); + self->unused_data = PyBytes_FromStringAndSize("", 0); if (self->unused_data == NULL) { Py_DECREF(self); return NULL; } - self->unconsumed_tail = PyString_FromString(""); + self->unconsumed_tail = PyBytes_FromStringAndSize("", 0); if (self->unconsumed_tail == NULL) { Py_DECREF(self); return NULL; @@ -174,8 +174,8 @@ PyZlib_compress(PyObject *self, PyObject *args) err=deflateEnd(&zst); if (err == Z_OK) - ReturnVal = PyString_FromStringAndSize((char *)output, - zst.total_out); + ReturnVal = PyBytes_FromStringAndSize((char *)output, + zst.total_out); else zlib_error(zst, err, "while finishing compression"); @@ -210,12 +210,12 @@ PyZlib_decompress(PyObject *self, PyObject *args) zst.avail_in = length; zst.avail_out = r_strlen; - if (!(result_str = PyString_FromStringAndSize(NULL, r_strlen))) + if (!(result_str = PyBytes_FromStringAndSize(NULL, r_strlen))) return NULL; zst.zalloc = (alloc_func)NULL; zst.zfree = (free_func)Z_NULL; - zst.next_out = (Byte *)PyString_AS_STRING(result_str); + zst.next_out = (Byte *)PyBytes_AS_STRING(result_str); zst.next_in = (Byte *)input; err = inflateInit2(&zst, wsize); @@ -255,12 +255,12 @@ PyZlib_decompress(PyObject *self, PyObject *args) /* fall through */ case(Z_OK): /* need more memory */ - if (_PyString_Resize(&result_str, r_strlen << 1) < 0) { + if (PyBytes_Resize(result_str, r_strlen << 1) < 0) { inflateEnd(&zst); goto error; } - zst.next_out = (unsigned char *)PyString_AS_STRING(result_str) \ - + r_strlen; + zst.next_out = + (unsigned char *)PyBytes_AS_STRING(result_str) + r_strlen; zst.avail_out = r_strlen; r_strlen = r_strlen << 1; break; @@ -277,7 +277,9 @@ PyZlib_decompress(PyObject *self, PyObject *args) goto error; } - _PyString_Resize(&result_str, zst.total_out); + if (PyBytes_Resize(result_str, zst.total_out) < 0) + goto error; + return result_str; error: @@ -399,7 +401,7 @@ PyZlib_objcompress(compobject *self, PyObject *args) if (!PyArg_ParseTuple(args, "s#:compress", &input, &inplen)) return NULL; - if (!(RetVal = PyString_FromStringAndSize(NULL, length))) + if (!(RetVal = PyBytes_FromStringAndSize(NULL, length))) return NULL; ENTER_ZLIB @@ -408,7 +410,7 @@ PyZlib_objcompress(compobject *self, PyObject *args) self->zst.avail_in = inplen; self->zst.next_in = input; self->zst.avail_out = length; - self->zst.next_out = (unsigned char *)PyString_AS_STRING(RetVal); + self->zst.next_out = (unsigned char *)PyBytes_AS_STRING(RetVal); Py_BEGIN_ALLOW_THREADS err = deflate(&(self->zst), Z_NO_FLUSH); @@ -417,10 +419,13 @@ PyZlib_objcompress(compobject *self, PyObject *args) /* while Z_OK and the output buffer is full, there might be more output, so extend the output buffer and try again */ while (err == Z_OK && self->zst.avail_out == 0) { - if (_PyString_Resize(&RetVal, length << 1) < 0) + if (PyBytes_Resize(RetVal, length << 1) < 0) { + Py_DECREF(RetVal); + RetVal = NULL; goto error; - self->zst.next_out = (unsigned char *)PyString_AS_STRING(RetVal) \ - + length; + } + self->zst.next_out = + (unsigned char *)PyBytes_AS_STRING(RetVal) + length; self->zst.avail_out = length; length = length << 1; @@ -439,7 +444,10 @@ PyZlib_objcompress(compobject *self, PyObject *args) RetVal = NULL; goto error; } - _PyString_Resize(&RetVal, self->zst.total_out - start_total_out); + if (PyBytes_Resize(RetVal, self->zst.total_out - start_total_out) < 0) { + Py_DECREF(RetVal); + RetVal = NULL; + } error: LEAVE_ZLIB @@ -478,7 +486,7 @@ PyZlib_objdecompress(compobject *self, PyObject *args) /* limit amount of data allocated to max_length */ if (max_length && length > max_length) length = max_length; - if (!(RetVal = PyString_FromStringAndSize(NULL, length))) + if (!(RetVal = PyBytes_FromStringAndSize(NULL, length))) return NULL; ENTER_ZLIB @@ -487,7 +495,7 @@ PyZlib_objdecompress(compobject *self, PyObject *args) self->zst.avail_in = inplen; self->zst.next_in = input; self->zst.avail_out = length; - self->zst.next_out = (unsigned char *)PyString_AS_STRING(RetVal); + self->zst.next_out = (unsigned char *)PyBytes_AS_STRING(RetVal); Py_BEGIN_ALLOW_THREADS err = inflate(&(self->zst), Z_SYNC_FLUSH); @@ -509,10 +517,13 @@ PyZlib_objdecompress(compobject *self, PyObject *args) if (max_length && length > max_length) length = max_length; - if (_PyString_Resize(&RetVal, length) < 0) + if (PyBytes_Resize(RetVal, length) < 0) { + Py_DECREF(RetVal); + RetVal = NULL; goto error; - self->zst.next_out = (unsigned char *)PyString_AS_STRING(RetVal) \ - + old_length; + } + self->zst.next_out = + (unsigned char *)PyBytes_AS_STRING(RetVal) + old_length; self->zst.avail_out = length - old_length; Py_BEGIN_ALLOW_THREADS @@ -524,7 +535,7 @@ PyZlib_objdecompress(compobject *self, PyObject *args) of specified size. Return the unconsumed tail in an attribute.*/ if(max_length) { Py_DECREF(self->unconsumed_tail); - self->unconsumed_tail = PyString_FromStringAndSize((char *)self->zst.next_in, + self->unconsumed_tail = PyBytes_FromStringAndSize((char *)self->zst.next_in, self->zst.avail_in); if(!self->unconsumed_tail) { Py_DECREF(RetVal); @@ -541,7 +552,7 @@ PyZlib_objdecompress(compobject *self, PyObject *args) */ if (err == Z_STREAM_END) { Py_XDECREF(self->unused_data); /* Free original empty string */ - self->unused_data = PyString_FromStringAndSize( + self->unused_data = PyBytes_FromStringAndSize( (char *)self->zst.next_in, self->zst.avail_in); if (self->unused_data == NULL) { Py_DECREF(RetVal); @@ -558,7 +569,10 @@ PyZlib_objdecompress(compobject *self, PyObject *args) goto error; } - _PyString_Resize(&RetVal, self->zst.total_out - start_total_out); + if (PyBytes_Resize(RetVal, self->zst.total_out - start_total_out) < 0) { + Py_DECREF(RetVal); + RetVal = NULL; + } error: LEAVE_ZLIB @@ -588,10 +602,10 @@ PyZlib_flush(compobject *self, PyObject *args) /* Flushing with Z_NO_FLUSH is a no-op, so there's no point in doing any work at all; just return an empty string. */ if (flushmode == Z_NO_FLUSH) { - return PyString_FromStringAndSize(NULL, 0); + return PyBytes_FromStringAndSize(NULL, 0); } - if (!(RetVal = PyString_FromStringAndSize(NULL, length))) + if (!(RetVal = PyBytes_FromStringAndSize(NULL, length))) return NULL; ENTER_ZLIB @@ -599,7 +613,7 @@ PyZlib_flush(compobject *self, PyObject *args) start_total_out = self->zst.total_out; self->zst.avail_in = 0; self->zst.avail_out = length; - self->zst.next_out = (unsigned char *)PyString_AS_STRING(RetVal); + self->zst.next_out = (unsigned char *)PyBytes_AS_STRING(RetVal); Py_BEGIN_ALLOW_THREADS err = deflate(&(self->zst), flushmode); @@ -608,10 +622,13 @@ PyZlib_flush(compobject *self, PyObject *args) /* while Z_OK and the output buffer is full, there might be more output, so extend the output buffer and try again */ while (err == Z_OK && self->zst.avail_out == 0) { - if (_PyString_Resize(&RetVal, length << 1) < 0) + if (PyBytes_Resize(RetVal, length << 1) < 0) { + Py_DECREF(RetVal); + RetVal = NULL; goto error; - self->zst.next_out = (unsigned char *)PyString_AS_STRING(RetVal) \ - + length; + } + self->zst.next_out = + (unsigned char *)PyBytes_AS_STRING(RetVal) + length; self->zst.avail_out = length; length = length << 1; @@ -645,7 +662,10 @@ PyZlib_flush(compobject *self, PyObject *args) goto error; } - _PyString_Resize(&RetVal, self->zst.total_out - start_total_out); + if (PyBytes_Resize(RetVal, self->zst.total_out - start_total_out) < 0) { + Py_DECREF(RetVal); + RetVal = NULL; + } error: LEAVE_ZLIB @@ -773,7 +793,7 @@ PyZlib_unflush(compobject *self, PyObject *args) if (!PyArg_ParseTuple(args, "|i:flush", &length)) return NULL; - if (!(retval = PyString_FromStringAndSize(NULL, length))) + if (!(retval = PyBytes_FromStringAndSize(NULL, length))) return NULL; @@ -781,7 +801,7 @@ PyZlib_unflush(compobject *self, PyObject *args) start_total_out = self->zst.total_out; self->zst.avail_out = length; - self->zst.next_out = (Byte *)PyString_AS_STRING(retval); + self->zst.next_out = (Byte *)PyBytes_AS_STRING(retval); Py_BEGIN_ALLOW_THREADS err = inflate(&(self->zst), Z_FINISH); @@ -790,9 +810,12 @@ PyZlib_unflush(compobject *self, PyObject *args) /* while Z_OK and the output buffer is full, there might be more output, so extend the output buffer and try again */ while ((err == Z_OK || err == Z_BUF_ERROR) && self->zst.avail_out == 0) { - if (_PyString_Resize(&retval, length << 1) < 0) + if (PyBytes_Resize(retval, length << 1) < 0) { + Py_DECREF(retval); + retval = NULL; goto error; - self->zst.next_out = (Byte *)PyString_AS_STRING(retval) + length; + } + self->zst.next_out = (Byte *)PyBytes_AS_STRING(retval) + length; self->zst.avail_out = length; length = length << 1; @@ -814,7 +837,10 @@ PyZlib_unflush(compobject *self, PyObject *args) goto error; } } - _PyString_Resize(&retval, self->zst.total_out - start_total_out); + if (PyBytes_Resize(retval, self->zst.total_out - start_total_out) < 0) { + Py_DECREF(retval); + retval = NULL; + } error: |