]> granicus.if.org Git - python/commitdiff
zlib now uses bytes everywhere, and the test passes.
authorGuido van Rossum <guido@python.org>
Tue, 22 May 2007 22:44:07 +0000 (22:44 +0000)
committerGuido van Rossum <guido@python.org>
Tue, 22 May 2007 22:44:07 +0000 (22:44 +0000)
Lib/test/test_zlib.py
Modules/zlibmodule.c

index dc4a7d8ebe6722ca96ec680d429382a8268152cf..a3310a5f2cc068cb3ed4a40c421adbe65a589742 100644 (file)
@@ -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()
index da31e8b2827d48c63bdb5d314ccc1d74e9695385..51395a2cb40ecf12b7defbbc4d8350f5a0d95b16 100644 (file)
@@ -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: