| Guido van Rossum | 7d9ea50 | 2003-02-03 20:45:52 +0000 | [diff] [blame] | 1 | import unittest | 
| Benjamin Peterson | ee8712c | 2008-05-20 21:35:26 +0000 | [diff] [blame] | 2 | from test import support | 
| Christian Heimes | d5e2b6f | 2008-03-19 21:50:51 +0000 | [diff] [blame] | 3 | import binascii | 
| Andrew M. Kuchling | 9a0f98e | 2001-02-21 02:17:01 +0000 | [diff] [blame] | 4 | import random | 
| Antoine Pitrou | 4b3fe14 | 2010-05-07 17:08:54 +0000 | [diff] [blame] | 5 | from test.support import precisionbigmemtest, _1G | 
| Andrew M. Kuchling | 9a0f98e | 2001-02-21 02:17:01 +0000 | [diff] [blame] | 6 |  | 
| R. David Murray | a21e4ca | 2009-03-31 23:16:50 +0000 | [diff] [blame] | 7 | zlib = support.import_module('zlib') | 
 | 8 |  | 
| Andrew M. Kuchling | 9a0f98e | 2001-02-21 02:17:01 +0000 | [diff] [blame] | 9 |  | 
| Guido van Rossum | 7d9ea50 | 2003-02-03 20:45:52 +0000 | [diff] [blame] | 10 | class ChecksumTestCase(unittest.TestCase): | 
 | 11 |     # checksum test cases | 
 | 12 |     def test_crc32start(self): | 
| Guido van Rossum | 776152b | 2007-05-22 22:44:07 +0000 | [diff] [blame] | 13 |         self.assertEqual(zlib.crc32(b""), zlib.crc32(b"", 0)) | 
| Georg Brandl | ab91fde | 2009-08-13 08:51:18 +0000 | [diff] [blame] | 14 |         self.assertTrue(zlib.crc32(b"abc", 0xffffffff)) | 
| Andrew M. Kuchling | fcfc8d5 | 2001-08-10 15:50:11 +0000 | [diff] [blame] | 15 |  | 
| Guido van Rossum | 7d9ea50 | 2003-02-03 20:45:52 +0000 | [diff] [blame] | 16 |     def test_crc32empty(self): | 
| Guido van Rossum | 776152b | 2007-05-22 22:44:07 +0000 | [diff] [blame] | 17 |         self.assertEqual(zlib.crc32(b"", 0), 0) | 
 | 18 |         self.assertEqual(zlib.crc32(b"", 1), 1) | 
 | 19 |         self.assertEqual(zlib.crc32(b"", 432), 432) | 
| Andrew M. Kuchling | 9a0f98e | 2001-02-21 02:17:01 +0000 | [diff] [blame] | 20 |  | 
| Guido van Rossum | 7d9ea50 | 2003-02-03 20:45:52 +0000 | [diff] [blame] | 21 |     def test_adler32start(self): | 
| Guido van Rossum | 776152b | 2007-05-22 22:44:07 +0000 | [diff] [blame] | 22 |         self.assertEqual(zlib.adler32(b""), zlib.adler32(b"", 1)) | 
| Georg Brandl | ab91fde | 2009-08-13 08:51:18 +0000 | [diff] [blame] | 23 |         self.assertTrue(zlib.adler32(b"abc", 0xffffffff)) | 
| Jeremy Hylton | 6eb4b6a | 1997-08-15 15:59:43 +0000 | [diff] [blame] | 24 |  | 
| Guido van Rossum | 7d9ea50 | 2003-02-03 20:45:52 +0000 | [diff] [blame] | 25 |     def test_adler32empty(self): | 
| Guido van Rossum | 776152b | 2007-05-22 22:44:07 +0000 | [diff] [blame] | 26 |         self.assertEqual(zlib.adler32(b"", 0), 0) | 
 | 27 |         self.assertEqual(zlib.adler32(b"", 1), 1) | 
 | 28 |         self.assertEqual(zlib.adler32(b"", 432), 432) | 
| Jeremy Hylton | 6eb4b6a | 1997-08-15 15:59:43 +0000 | [diff] [blame] | 29 |  | 
| Guido van Rossum | 7d9ea50 | 2003-02-03 20:45:52 +0000 | [diff] [blame] | 30 |     def assertEqual32(self, seen, expected): | 
 | 31 |         # 32-bit values masked -- checksums on 32- vs 64- bit machines | 
 | 32 |         # This is important if bit 31 (0x08000000L) is set. | 
| Guido van Rossum | e2a383d | 2007-01-15 16:59:06 +0000 | [diff] [blame] | 33 |         self.assertEqual(seen & 0x0FFFFFFFF, expected & 0x0FFFFFFFF) | 
| Guido van Rossum | 7d9ea50 | 2003-02-03 20:45:52 +0000 | [diff] [blame] | 34 |  | 
 | 35 |     def test_penguins(self): | 
| Guido van Rossum | 776152b | 2007-05-22 22:44:07 +0000 | [diff] [blame] | 36 |         self.assertEqual32(zlib.crc32(b"penguin", 0), 0x0e5c1a120) | 
 | 37 |         self.assertEqual32(zlib.crc32(b"penguin", 1), 0x43b6aa94) | 
 | 38 |         self.assertEqual32(zlib.adler32(b"penguin", 0), 0x0bcf02f6) | 
 | 39 |         self.assertEqual32(zlib.adler32(b"penguin", 1), 0x0bd602f7) | 
| Guido van Rossum | 7d9ea50 | 2003-02-03 20:45:52 +0000 | [diff] [blame] | 40 |  | 
| Guido van Rossum | 776152b | 2007-05-22 22:44:07 +0000 | [diff] [blame] | 41 |         self.assertEqual(zlib.crc32(b"penguin"), zlib.crc32(b"penguin", 0)) | 
 | 42 |         self.assertEqual(zlib.adler32(b"penguin"),zlib.adler32(b"penguin",1)) | 
| Guido van Rossum | 7d9ea50 | 2003-02-03 20:45:52 +0000 | [diff] [blame] | 43 |  | 
| Gregory P. Smith | ab0d8a1 | 2008-03-17 20:24:09 +0000 | [diff] [blame] | 44 |     def test_crc32_adler32_unsigned(self): | 
| Antoine Pitrou | c8428d3 | 2009-12-14 18:23:30 +0000 | [diff] [blame] | 45 |         foo = b'abcdefghijklmnop' | 
| Gregory P. Smith | ab0d8a1 | 2008-03-17 20:24:09 +0000 | [diff] [blame] | 46 |         # explicitly test signed behavior | 
| Gregory P. Smith | 2727503 | 2008-03-20 06:20:09 +0000 | [diff] [blame] | 47 |         self.assertEqual(zlib.crc32(foo), 2486878355) | 
| Antoine Pitrou | c8428d3 | 2009-12-14 18:23:30 +0000 | [diff] [blame] | 48 |         self.assertEqual(zlib.crc32(b'spam'), 1138425661) | 
| Gregory P. Smith | ab0d8a1 | 2008-03-17 20:24:09 +0000 | [diff] [blame] | 49 |         self.assertEqual(zlib.adler32(foo+foo), 3573550353) | 
| Antoine Pitrou | c8428d3 | 2009-12-14 18:23:30 +0000 | [diff] [blame] | 50 |         self.assertEqual(zlib.adler32(b'spam'), 72286642) | 
| Gregory P. Smith | ab0d8a1 | 2008-03-17 20:24:09 +0000 | [diff] [blame] | 51 |  | 
| Christian Heimes | d5e2b6f | 2008-03-19 21:50:51 +0000 | [diff] [blame] | 52 |     def test_same_as_binascii_crc32(self): | 
| Martin v. Löwis | 15b16a3 | 2008-12-02 06:00:15 +0000 | [diff] [blame] | 53 |         foo = b'abcdefghijklmnop' | 
| Gregory P. Smith | 2727503 | 2008-03-20 06:20:09 +0000 | [diff] [blame] | 54 |         crc = 2486878355 | 
| Christian Heimes | d5e2b6f | 2008-03-19 21:50:51 +0000 | [diff] [blame] | 55 |         self.assertEqual(binascii.crc32(foo), crc) | 
 | 56 |         self.assertEqual(zlib.crc32(foo), crc) | 
| Martin v. Löwis | 15b16a3 | 2008-12-02 06:00:15 +0000 | [diff] [blame] | 57 |         self.assertEqual(binascii.crc32(b'spam'), zlib.crc32(b'spam')) | 
| Guido van Rossum | 7d9ea50 | 2003-02-03 20:45:52 +0000 | [diff] [blame] | 58 |  | 
 | 59 |  | 
| Christian Heimes | b186d00 | 2008-03-18 15:15:01 +0000 | [diff] [blame] | 60 |  | 
| Guido van Rossum | 7d9ea50 | 2003-02-03 20:45:52 +0000 | [diff] [blame] | 61 | class ExceptionTestCase(unittest.TestCase): | 
 | 62 |     # make sure we generate some expected errors | 
| Guido van Rossum | 8ce8a78 | 2007-11-01 19:42:39 +0000 | [diff] [blame] | 63 |     def test_badlevel(self): | 
 | 64 |         # specifying compression level out of range causes an error | 
 | 65 |         # (but -1 is Z_DEFAULT_COMPRESSION and apparently the zlib | 
 | 66 |         # accepts 0 too) | 
| Antoine Pitrou | c8428d3 | 2009-12-14 18:23:30 +0000 | [diff] [blame] | 67 |         self.assertRaises(zlib.error, zlib.compress, b'ERROR', 10) | 
 | 68 |  | 
 | 69 |     def test_badargs(self): | 
 | 70 |         self.assertRaises(TypeError, zlib.adler32) | 
 | 71 |         self.assertRaises(TypeError, zlib.crc32) | 
 | 72 |         self.assertRaises(TypeError, zlib.compress) | 
 | 73 |         self.assertRaises(TypeError, zlib.decompress) | 
 | 74 |         for arg in (42, None, '', 'abc', (), []): | 
 | 75 |             self.assertRaises(TypeError, zlib.adler32, arg) | 
 | 76 |             self.assertRaises(TypeError, zlib.crc32, arg) | 
 | 77 |             self.assertRaises(TypeError, zlib.compress, arg) | 
 | 78 |             self.assertRaises(TypeError, zlib.decompress, arg) | 
| Guido van Rossum | 7d9ea50 | 2003-02-03 20:45:52 +0000 | [diff] [blame] | 79 |  | 
 | 80 |     def test_badcompressobj(self): | 
 | 81 |         # verify failure on building compress object with bad params | 
| Neil Schemenauer | 94afd3e | 2004-06-05 19:02:52 +0000 | [diff] [blame] | 82 |         self.assertRaises(ValueError, zlib.compressobj, 1, zlib.DEFLATED, 0) | 
| Guido van Rossum | 8ce8a78 | 2007-11-01 19:42:39 +0000 | [diff] [blame] | 83 |         # specifying total bits too large causes an error | 
 | 84 |         self.assertRaises(ValueError, | 
 | 85 |                 zlib.compressobj, 1, zlib.DEFLATED, zlib.MAX_WBITS + 1) | 
| Guido van Rossum | 7d9ea50 | 2003-02-03 20:45:52 +0000 | [diff] [blame] | 86 |  | 
 | 87 |     def test_baddecompressobj(self): | 
 | 88 |         # verify failure on building decompress object with bad params | 
| Antoine Pitrou | e96bf09 | 2010-04-06 17:25:56 +0000 | [diff] [blame] | 89 |         self.assertRaises(ValueError, zlib.decompressobj, -1) | 
| Guido van Rossum | 7d9ea50 | 2003-02-03 20:45:52 +0000 | [diff] [blame] | 90 |  | 
| Christian Heimes | 5e69685 | 2008-04-09 08:37:03 +0000 | [diff] [blame] | 91 |     def test_decompressobj_badflush(self): | 
 | 92 |         # verify failure on calling decompressobj.flush with bad params | 
 | 93 |         self.assertRaises(ValueError, zlib.decompressobj().flush, 0) | 
 | 94 |         self.assertRaises(ValueError, zlib.decompressobj().flush, -1) | 
 | 95 |  | 
| Guido van Rossum | 7d9ea50 | 2003-02-03 20:45:52 +0000 | [diff] [blame] | 96 |  | 
| Antoine Pitrou | 4b3fe14 | 2010-05-07 17:08:54 +0000 | [diff] [blame] | 97 | class BaseCompressTestCase(object): | 
 | 98 |     def check_big_compress_buffer(self, size, compress_func): | 
 | 99 |         _1M = 1024 * 1024 | 
 | 100 |         fmt = "%%0%dx" % (2 * _1M) | 
 | 101 |         # Generate 10MB worth of random, and expand it by repeating it. | 
 | 102 |         # The assumption is that zlib's memory is not big enough to exploit | 
 | 103 |         # such spread out redundancy. | 
| Antoine Pitrou | adfe27a | 2010-05-07 18:09:36 +0000 | [diff] [blame] | 104 |         data = b''.join([binascii.a2b_hex(fmt % random.getrandbits(8 * _1M)) | 
| Antoine Pitrou | 4b3fe14 | 2010-05-07 17:08:54 +0000 | [diff] [blame] | 105 |                         for i in range(10)]) | 
 | 106 |         data = data * (size // len(data) + 1) | 
 | 107 |         try: | 
 | 108 |             compress_func(data) | 
 | 109 |         finally: | 
 | 110 |             # Release memory | 
 | 111 |             data = None | 
| Guido van Rossum | 7d9ea50 | 2003-02-03 20:45:52 +0000 | [diff] [blame] | 112 |  | 
| Antoine Pitrou | 4b3fe14 | 2010-05-07 17:08:54 +0000 | [diff] [blame] | 113 |     def check_big_decompress_buffer(self, size, decompress_func): | 
 | 114 |         data = b'x' * size | 
 | 115 |         try: | 
 | 116 |             compressed = zlib.compress(data, 1) | 
 | 117 |         finally: | 
 | 118 |             # Release memory | 
 | 119 |             data = None | 
 | 120 |         data = decompress_func(compressed) | 
 | 121 |         # Sanity check | 
 | 122 |         try: | 
 | 123 |             self.assertEqual(len(data), size) | 
 | 124 |             self.assertEqual(len(data.strip(b'x')), 0) | 
 | 125 |         finally: | 
 | 126 |             data = None | 
 | 127 |  | 
 | 128 |  | 
 | 129 | class CompressTestCase(BaseCompressTestCase, unittest.TestCase): | 
| Guido van Rossum | 7d9ea50 | 2003-02-03 20:45:52 +0000 | [diff] [blame] | 130 |     # Test compression in one go (whole message compression) | 
 | 131 |     def test_speech(self): | 
| Neil Schemenauer | 6412b12 | 2004-06-05 19:34:28 +0000 | [diff] [blame] | 132 |         x = zlib.compress(HAMLET_SCENE) | 
 | 133 |         self.assertEqual(zlib.decompress(x), HAMLET_SCENE) | 
| Guido van Rossum | 7d9ea50 | 2003-02-03 20:45:52 +0000 | [diff] [blame] | 134 |  | 
 | 135 |     def test_speech128(self): | 
| Neil Schemenauer | 6412b12 | 2004-06-05 19:34:28 +0000 | [diff] [blame] | 136 |         # compress more data | 
 | 137 |         data = HAMLET_SCENE * 128 | 
| Guido van Rossum | 7d9ea50 | 2003-02-03 20:45:52 +0000 | [diff] [blame] | 138 |         x = zlib.compress(data) | 
| Antoine Pitrou | c8428d3 | 2009-12-14 18:23:30 +0000 | [diff] [blame] | 139 |         self.assertEqual(zlib.compress(bytearray(data)), x) | 
 | 140 |         for ob in x, bytearray(x): | 
 | 141 |             self.assertEqual(zlib.decompress(ob), data) | 
| Guido van Rossum | 7d9ea50 | 2003-02-03 20:45:52 +0000 | [diff] [blame] | 142 |  | 
| Antoine Pitrou | 4b3fe14 | 2010-05-07 17:08:54 +0000 | [diff] [blame] | 143 |     # Memory use of the following functions takes into account overallocation | 
 | 144 |  | 
 | 145 |     @precisionbigmemtest(size=_1G + 1024 * 1024, memuse=3) | 
 | 146 |     def test_big_compress_buffer(self, size): | 
 | 147 |         compress = lambda s: zlib.compress(s, 1) | 
 | 148 |         self.check_big_compress_buffer(size, compress) | 
 | 149 |  | 
 | 150 |     @precisionbigmemtest(size=_1G + 1024 * 1024, memuse=2) | 
 | 151 |     def test_big_decompress_buffer(self, size): | 
 | 152 |         self.check_big_decompress_buffer(size, zlib.decompress) | 
| Guido van Rossum | 7d9ea50 | 2003-02-03 20:45:52 +0000 | [diff] [blame] | 153 |  | 
 | 154 |  | 
| Antoine Pitrou | 4b3fe14 | 2010-05-07 17:08:54 +0000 | [diff] [blame] | 155 | class CompressObjectTestCase(BaseCompressTestCase, unittest.TestCase): | 
| Guido van Rossum | 7d9ea50 | 2003-02-03 20:45:52 +0000 | [diff] [blame] | 156 |     # Test compression object | 
| Guido van Rossum | 7d9ea50 | 2003-02-03 20:45:52 +0000 | [diff] [blame] | 157 |     def test_pair(self): | 
| Neil Schemenauer | 6412b12 | 2004-06-05 19:34:28 +0000 | [diff] [blame] | 158 |         # straightforward compress/decompress objects | 
| Antoine Pitrou | c8428d3 | 2009-12-14 18:23:30 +0000 | [diff] [blame] | 159 |         datasrc = HAMLET_SCENE * 128 | 
 | 160 |         datazip = zlib.compress(datasrc) | 
 | 161 |         # should compress both bytes and bytearray data | 
 | 162 |         for data in (datasrc, bytearray(datasrc)): | 
 | 163 |             co = zlib.compressobj() | 
 | 164 |             x1 = co.compress(data) | 
 | 165 |             x2 = co.flush() | 
 | 166 |             self.assertRaises(zlib.error, co.flush) # second flush should not work | 
 | 167 |             self.assertEqual(x1 + x2, datazip) | 
 | 168 |         for v1, v2 in ((x1, x2), (bytearray(x1), bytearray(x2))): | 
 | 169 |             dco = zlib.decompressobj() | 
 | 170 |             y1 = dco.decompress(v1 + v2) | 
 | 171 |             y2 = dco.flush() | 
 | 172 |             self.assertEqual(data, y1 + y2) | 
 | 173 |             self.assertTrue(isinstance(dco.unconsumed_tail, bytes)) | 
 | 174 |             self.assertTrue(isinstance(dco.unused_data, bytes)) | 
| Guido van Rossum | 7d9ea50 | 2003-02-03 20:45:52 +0000 | [diff] [blame] | 175 |  | 
| Neil Schemenauer | 94afd3e | 2004-06-05 19:02:52 +0000 | [diff] [blame] | 176 |     def test_compressoptions(self): | 
 | 177 |         # specify lots of options to compressobj() | 
 | 178 |         level = 2 | 
 | 179 |         method = zlib.DEFLATED | 
 | 180 |         wbits = -12 | 
 | 181 |         memlevel = 9 | 
 | 182 |         strategy = zlib.Z_FILTERED | 
 | 183 |         co = zlib.compressobj(level, method, wbits, memlevel, strategy) | 
| Neil Schemenauer | 6412b12 | 2004-06-05 19:34:28 +0000 | [diff] [blame] | 184 |         x1 = co.compress(HAMLET_SCENE) | 
| Neil Schemenauer | 94afd3e | 2004-06-05 19:02:52 +0000 | [diff] [blame] | 185 |         x2 = co.flush() | 
 | 186 |         dco = zlib.decompressobj(wbits) | 
 | 187 |         y1 = dco.decompress(x1 + x2) | 
 | 188 |         y2 = dco.flush() | 
| Neil Schemenauer | 6412b12 | 2004-06-05 19:34:28 +0000 | [diff] [blame] | 189 |         self.assertEqual(HAMLET_SCENE, y1 + y2) | 
| Neil Schemenauer | 94afd3e | 2004-06-05 19:02:52 +0000 | [diff] [blame] | 190 |  | 
| Guido van Rossum | 7d9ea50 | 2003-02-03 20:45:52 +0000 | [diff] [blame] | 191 |     def test_compressincremental(self): | 
 | 192 |         # compress object in steps, decompress object as one-shot | 
| Neil Schemenauer | 6412b12 | 2004-06-05 19:34:28 +0000 | [diff] [blame] | 193 |         data = HAMLET_SCENE * 128 | 
| Neil Schemenauer | 94afd3e | 2004-06-05 19:02:52 +0000 | [diff] [blame] | 194 |         co = zlib.compressobj() | 
| Guido van Rossum | 7d9ea50 | 2003-02-03 20:45:52 +0000 | [diff] [blame] | 195 |         bufs = [] | 
 | 196 |         for i in range(0, len(data), 256): | 
 | 197 |             bufs.append(co.compress(data[i:i+256])) | 
 | 198 |         bufs.append(co.flush()) | 
| Guido van Rossum | 776152b | 2007-05-22 22:44:07 +0000 | [diff] [blame] | 199 |         combuf = b''.join(bufs) | 
| Guido van Rossum | 7d9ea50 | 2003-02-03 20:45:52 +0000 | [diff] [blame] | 200 |  | 
| Neil Schemenauer | 94afd3e | 2004-06-05 19:02:52 +0000 | [diff] [blame] | 201 |         dco = zlib.decompressobj() | 
| Guido van Rossum | 776152b | 2007-05-22 22:44:07 +0000 | [diff] [blame] | 202 |         y1 = dco.decompress(b''.join(bufs)) | 
| Guido van Rossum | 7d9ea50 | 2003-02-03 20:45:52 +0000 | [diff] [blame] | 203 |         y2 = dco.flush() | 
 | 204 |         self.assertEqual(data, y1 + y2) | 
 | 205 |  | 
| Neil Schemenauer | 6412b12 | 2004-06-05 19:34:28 +0000 | [diff] [blame] | 206 |     def test_decompinc(self, flush=False, source=None, cx=256, dcx=64): | 
| Guido van Rossum | 7d9ea50 | 2003-02-03 20:45:52 +0000 | [diff] [blame] | 207 |         # compress object in steps, decompress object in steps | 
| Neil Schemenauer | 6412b12 | 2004-06-05 19:34:28 +0000 | [diff] [blame] | 208 |         source = source or HAMLET_SCENE | 
 | 209 |         data = source * 128 | 
| Neil Schemenauer | 94afd3e | 2004-06-05 19:02:52 +0000 | [diff] [blame] | 210 |         co = zlib.compressobj() | 
| Guido van Rossum | 7d9ea50 | 2003-02-03 20:45:52 +0000 | [diff] [blame] | 211 |         bufs = [] | 
| Neil Schemenauer | 6412b12 | 2004-06-05 19:34:28 +0000 | [diff] [blame] | 212 |         for i in range(0, len(data), cx): | 
 | 213 |             bufs.append(co.compress(data[i:i+cx])) | 
| Guido van Rossum | 7d9ea50 | 2003-02-03 20:45:52 +0000 | [diff] [blame] | 214 |         bufs.append(co.flush()) | 
| Guido van Rossum | 776152b | 2007-05-22 22:44:07 +0000 | [diff] [blame] | 215 |         combuf = b''.join(bufs) | 
| Guido van Rossum | 7d9ea50 | 2003-02-03 20:45:52 +0000 | [diff] [blame] | 216 |  | 
| Gregory P. Smith | 693fc46 | 2008-09-06 20:13:06 +0000 | [diff] [blame] | 217 |         decombuf = zlib.decompress(combuf) | 
 | 218 |         # Test type of return value | 
| Georg Brandl | ab91fde | 2009-08-13 08:51:18 +0000 | [diff] [blame] | 219 |         self.assertTrue(isinstance(decombuf, bytes)) | 
| Gregory P. Smith | 693fc46 | 2008-09-06 20:13:06 +0000 | [diff] [blame] | 220 |  | 
 | 221 |         self.assertEqual(data, decombuf) | 
| Guido van Rossum | 7d9ea50 | 2003-02-03 20:45:52 +0000 | [diff] [blame] | 222 |  | 
| Neil Schemenauer | 94afd3e | 2004-06-05 19:02:52 +0000 | [diff] [blame] | 223 |         dco = zlib.decompressobj() | 
| Guido van Rossum | 7d9ea50 | 2003-02-03 20:45:52 +0000 | [diff] [blame] | 224 |         bufs = [] | 
| Neil Schemenauer | 6412b12 | 2004-06-05 19:34:28 +0000 | [diff] [blame] | 225 |         for i in range(0, len(combuf), dcx): | 
 | 226 |             bufs.append(dco.decompress(combuf[i:i+dcx])) | 
| Guido van Rossum | 776152b | 2007-05-22 22:44:07 +0000 | [diff] [blame] | 227 |             self.assertEqual(b'', dco.unconsumed_tail, ######## | 
 | 228 |                              "(A) uct should be b'': not %d long" % | 
| Neil Schemenauer | 6412b12 | 2004-06-05 19:34:28 +0000 | [diff] [blame] | 229 |                                        len(dco.unconsumed_tail)) | 
| Amaury Forgeot d'Arc | e43d33a | 2008-07-02 20:50:16 +0000 | [diff] [blame] | 230 |             self.assertEqual(b'', dco.unused_data) | 
| Neil Schemenauer | 6412b12 | 2004-06-05 19:34:28 +0000 | [diff] [blame] | 231 |         if flush: | 
 | 232 |             bufs.append(dco.flush()) | 
 | 233 |         else: | 
 | 234 |             while True: | 
| Antoine Pitrou | c8428d3 | 2009-12-14 18:23:30 +0000 | [diff] [blame] | 235 |                 chunk = dco.decompress(b'') | 
| Neil Schemenauer | 6412b12 | 2004-06-05 19:34:28 +0000 | [diff] [blame] | 236 |                 if chunk: | 
 | 237 |                     bufs.append(chunk) | 
 | 238 |                 else: | 
 | 239 |                     break | 
| Guido van Rossum | 776152b | 2007-05-22 22:44:07 +0000 | [diff] [blame] | 240 |         self.assertEqual(b'', dco.unconsumed_tail, ######## | 
 | 241 |                          "(B) uct should be b'': not %d long" % | 
| Neil Schemenauer | 6412b12 | 2004-06-05 19:34:28 +0000 | [diff] [blame] | 242 |                                        len(dco.unconsumed_tail)) | 
| Amaury Forgeot d'Arc | e43d33a | 2008-07-02 20:50:16 +0000 | [diff] [blame] | 243 |         self.assertEqual(b'', dco.unused_data) | 
| Guido van Rossum | 776152b | 2007-05-22 22:44:07 +0000 | [diff] [blame] | 244 |         self.assertEqual(data, b''.join(bufs)) | 
| Guido van Rossum | 7d9ea50 | 2003-02-03 20:45:52 +0000 | [diff] [blame] | 245 |         # Failure means: "decompressobj with init options failed" | 
 | 246 |  | 
| Neil Schemenauer | 6412b12 | 2004-06-05 19:34:28 +0000 | [diff] [blame] | 247 |     def test_decompincflush(self): | 
 | 248 |         self.test_decompinc(flush=True) | 
| Guido van Rossum | 7d9ea50 | 2003-02-03 20:45:52 +0000 | [diff] [blame] | 249 |  | 
| Neil Schemenauer | 6412b12 | 2004-06-05 19:34:28 +0000 | [diff] [blame] | 250 |     def test_decompimax(self, source=None, cx=256, dcx=64): | 
 | 251 |         # compress in steps, decompress in length-restricted steps | 
 | 252 |         source = source or HAMLET_SCENE | 
| Guido van Rossum | 7d9ea50 | 2003-02-03 20:45:52 +0000 | [diff] [blame] | 253 |         # Check a decompression object with max_length specified | 
| Neil Schemenauer | 6412b12 | 2004-06-05 19:34:28 +0000 | [diff] [blame] | 254 |         data = source * 128 | 
 | 255 |         co = zlib.compressobj() | 
 | 256 |         bufs = [] | 
 | 257 |         for i in range(0, len(data), cx): | 
 | 258 |             bufs.append(co.compress(data[i:i+cx])) | 
 | 259 |         bufs.append(co.flush()) | 
| Guido van Rossum | 776152b | 2007-05-22 22:44:07 +0000 | [diff] [blame] | 260 |         combuf = b''.join(bufs) | 
| Neil Schemenauer | 6412b12 | 2004-06-05 19:34:28 +0000 | [diff] [blame] | 261 |         self.assertEqual(data, zlib.decompress(combuf), | 
 | 262 |                          'compressed data failure') | 
 | 263 |  | 
 | 264 |         dco = zlib.decompressobj() | 
 | 265 |         bufs = [] | 
 | 266 |         cb = combuf | 
 | 267 |         while cb: | 
 | 268 |             #max_length = 1 + len(cb)//10 | 
 | 269 |             chunk = dco.decompress(cb, dcx) | 
| Georg Brandl | ab91fde | 2009-08-13 08:51:18 +0000 | [diff] [blame] | 270 |             self.assertFalse(len(chunk) > dcx, | 
| Neil Schemenauer | 6412b12 | 2004-06-05 19:34:28 +0000 | [diff] [blame] | 271 |                     'chunk too big (%d>%d)' % (len(chunk), dcx)) | 
 | 272 |             bufs.append(chunk) | 
 | 273 |             cb = dco.unconsumed_tail | 
 | 274 |         bufs.append(dco.flush()) | 
| Guido van Rossum | 776152b | 2007-05-22 22:44:07 +0000 | [diff] [blame] | 275 |         self.assertEqual(data, b''.join(bufs), 'Wrong data retrieved') | 
| Neil Schemenauer | 6412b12 | 2004-06-05 19:34:28 +0000 | [diff] [blame] | 276 |  | 
 | 277 |     def test_decompressmaxlen(self, flush=False): | 
 | 278 |         # Check a decompression object with max_length specified | 
 | 279 |         data = HAMLET_SCENE * 128 | 
| Neil Schemenauer | 94afd3e | 2004-06-05 19:02:52 +0000 | [diff] [blame] | 280 |         co = zlib.compressobj() | 
| Guido van Rossum | 7d9ea50 | 2003-02-03 20:45:52 +0000 | [diff] [blame] | 281 |         bufs = [] | 
 | 282 |         for i in range(0, len(data), 256): | 
 | 283 |             bufs.append(co.compress(data[i:i+256])) | 
 | 284 |         bufs.append(co.flush()) | 
| Guido van Rossum | 776152b | 2007-05-22 22:44:07 +0000 | [diff] [blame] | 285 |         combuf = b''.join(bufs) | 
| Neil Schemenauer | 94afd3e | 2004-06-05 19:02:52 +0000 | [diff] [blame] | 286 |         self.assertEqual(data, zlib.decompress(combuf), | 
| Guido van Rossum | 7d9ea50 | 2003-02-03 20:45:52 +0000 | [diff] [blame] | 287 |                          'compressed data failure') | 
 | 288 |  | 
| Neil Schemenauer | 94afd3e | 2004-06-05 19:02:52 +0000 | [diff] [blame] | 289 |         dco = zlib.decompressobj() | 
| Guido van Rossum | 7d9ea50 | 2003-02-03 20:45:52 +0000 | [diff] [blame] | 290 |         bufs = [] | 
 | 291 |         cb = combuf | 
 | 292 |         while cb: | 
| Guido van Rossum | f359410 | 2003-02-27 18:39:18 +0000 | [diff] [blame] | 293 |             max_length = 1 + len(cb)//10 | 
| Guido van Rossum | 7d9ea50 | 2003-02-03 20:45:52 +0000 | [diff] [blame] | 294 |             chunk = dco.decompress(cb, max_length) | 
| Georg Brandl | ab91fde | 2009-08-13 08:51:18 +0000 | [diff] [blame] | 295 |             self.assertFalse(len(chunk) > max_length, | 
| Guido van Rossum | 7d9ea50 | 2003-02-03 20:45:52 +0000 | [diff] [blame] | 296 |                         'chunk too big (%d>%d)' % (len(chunk),max_length)) | 
 | 297 |             bufs.append(chunk) | 
 | 298 |             cb = dco.unconsumed_tail | 
| Neil Schemenauer | 6412b12 | 2004-06-05 19:34:28 +0000 | [diff] [blame] | 299 |         if flush: | 
 | 300 |             bufs.append(dco.flush()) | 
 | 301 |         else: | 
 | 302 |             while chunk: | 
| Antoine Pitrou | c8428d3 | 2009-12-14 18:23:30 +0000 | [diff] [blame] | 303 |                 chunk = dco.decompress(b'', max_length) | 
| Georg Brandl | ab91fde | 2009-08-13 08:51:18 +0000 | [diff] [blame] | 304 |                 self.assertFalse(len(chunk) > max_length, | 
| Neil Schemenauer | 6412b12 | 2004-06-05 19:34:28 +0000 | [diff] [blame] | 305 |                             'chunk too big (%d>%d)' % (len(chunk),max_length)) | 
 | 306 |                 bufs.append(chunk) | 
| Guido van Rossum | 776152b | 2007-05-22 22:44:07 +0000 | [diff] [blame] | 307 |         self.assertEqual(data, b''.join(bufs), 'Wrong data retrieved') | 
| Guido van Rossum | 7d9ea50 | 2003-02-03 20:45:52 +0000 | [diff] [blame] | 308 |  | 
| Neil Schemenauer | 6412b12 | 2004-06-05 19:34:28 +0000 | [diff] [blame] | 309 |     def test_decompressmaxlenflush(self): | 
 | 310 |         self.test_decompressmaxlen(flush=True) | 
| Guido van Rossum | 7d9ea50 | 2003-02-03 20:45:52 +0000 | [diff] [blame] | 311 |  | 
 | 312 |     def test_maxlenmisc(self): | 
 | 313 |         # Misc tests of max_length | 
| Neil Schemenauer | 94afd3e | 2004-06-05 19:02:52 +0000 | [diff] [blame] | 314 |         dco = zlib.decompressobj() | 
| Antoine Pitrou | c8428d3 | 2009-12-14 18:23:30 +0000 | [diff] [blame] | 315 |         self.assertRaises(ValueError, dco.decompress, b"", -1) | 
| Guido van Rossum | 776152b | 2007-05-22 22:44:07 +0000 | [diff] [blame] | 316 |         self.assertEqual(b'', dco.unconsumed_tail) | 
| Guido van Rossum | 7d9ea50 | 2003-02-03 20:45:52 +0000 | [diff] [blame] | 317 |  | 
 | 318 |     def test_flushes(self): | 
 | 319 |         # Test flush() with the various options, using all the | 
 | 320 |         # different levels in order to provide more variations. | 
 | 321 |         sync_opt = ['Z_NO_FLUSH', 'Z_SYNC_FLUSH', 'Z_FULL_FLUSH'] | 
 | 322 |         sync_opt = [getattr(zlib, opt) for opt in sync_opt | 
 | 323 |                     if hasattr(zlib, opt)] | 
| Neil Schemenauer | 6412b12 | 2004-06-05 19:34:28 +0000 | [diff] [blame] | 324 |         data = HAMLET_SCENE * 8 | 
| Guido van Rossum | 7d9ea50 | 2003-02-03 20:45:52 +0000 | [diff] [blame] | 325 |  | 
 | 326 |         for sync in sync_opt: | 
 | 327 |             for level in range(10): | 
 | 328 |                 obj = zlib.compressobj( level ) | 
 | 329 |                 a = obj.compress( data[:3000] ) | 
 | 330 |                 b = obj.flush( sync ) | 
 | 331 |                 c = obj.compress( data[3000:] ) | 
 | 332 |                 d = obj.flush() | 
| Guido van Rossum | 776152b | 2007-05-22 22:44:07 +0000 | [diff] [blame] | 333 |                 self.assertEqual(zlib.decompress(b''.join([a,b,c,d])), | 
| Guido van Rossum | 7d9ea50 | 2003-02-03 20:45:52 +0000 | [diff] [blame] | 334 |                                  data, ("Decompress failed: flush " | 
 | 335 |                                         "mode=%i, level=%i") % (sync, level)) | 
 | 336 |                 del obj | 
 | 337 |  | 
 | 338 |     def test_odd_flush(self): | 
 | 339 |         # Test for odd flushing bugs noted in 2.0, and hopefully fixed in 2.1 | 
 | 340 |         import random | 
 | 341 |  | 
 | 342 |         if hasattr(zlib, 'Z_SYNC_FLUSH'): | 
 | 343 |             # Testing on 17K of "random" data | 
 | 344 |  | 
 | 345 |             # Create compressor and decompressor objects | 
| Neil Schemenauer | 6412b12 | 2004-06-05 19:34:28 +0000 | [diff] [blame] | 346 |             co = zlib.compressobj(zlib.Z_BEST_COMPRESSION) | 
| Guido van Rossum | 7d9ea50 | 2003-02-03 20:45:52 +0000 | [diff] [blame] | 347 |             dco = zlib.decompressobj() | 
 | 348 |  | 
 | 349 |             # Try 17K of data | 
 | 350 |             # generate random data stream | 
 | 351 |             try: | 
 | 352 |                 # In 2.3 and later, WichmannHill is the RNG of the bug report | 
 | 353 |                 gen = random.WichmannHill() | 
 | 354 |             except AttributeError: | 
 | 355 |                 try: | 
 | 356 |                     # 2.2 called it Random | 
 | 357 |                     gen = random.Random() | 
 | 358 |                 except AttributeError: | 
 | 359 |                     # others might simply have a single RNG | 
 | 360 |                     gen = random | 
 | 361 |             gen.seed(1) | 
 | 362 |             data = genblock(1, 17 * 1024, generator=gen) | 
 | 363 |  | 
 | 364 |             # compress, sync-flush, and decompress | 
 | 365 |             first = co.compress(data) | 
 | 366 |             second = co.flush(zlib.Z_SYNC_FLUSH) | 
 | 367 |             expanded = dco.decompress(first + second) | 
 | 368 |  | 
 | 369 |             # if decompressed data is different from the input data, choke. | 
 | 370 |             self.assertEqual(expanded, data, "17K random source doesn't match") | 
 | 371 |  | 
| Andrew M. Kuchling | 3b585b3 | 2004-12-28 20:10:48 +0000 | [diff] [blame] | 372 |     def test_empty_flush(self): | 
 | 373 |         # Test that calling .flush() on unused objects works. | 
 | 374 |         # (Bug #1083110 -- calling .flush() on decompress objects | 
 | 375 |         # caused a core dump.) | 
 | 376 |  | 
 | 377 |         co = zlib.compressobj(zlib.Z_BEST_COMPRESSION) | 
| Georg Brandl | ab91fde | 2009-08-13 08:51:18 +0000 | [diff] [blame] | 378 |         self.assertTrue(co.flush())  # Returns a zlib header | 
| Andrew M. Kuchling | 3b585b3 | 2004-12-28 20:10:48 +0000 | [diff] [blame] | 379 |         dco = zlib.decompressobj() | 
| Guido van Rossum | 776152b | 2007-05-22 22:44:07 +0000 | [diff] [blame] | 380 |         self.assertEqual(dco.flush(), b"") # Returns nothing | 
| Tim Peters | 5a9fb3c | 2005-01-07 16:01:32 +0000 | [diff] [blame] | 381 |  | 
| Thomas Wouters | 0e3f591 | 2006-08-11 14:57:12 +0000 | [diff] [blame] | 382 |     if hasattr(zlib.compressobj(), "copy"): | 
 | 383 |         def test_compresscopy(self): | 
 | 384 |             # Test copying a compression object | 
 | 385 |             data0 = HAMLET_SCENE | 
| Guido van Rossum | 776152b | 2007-05-22 22:44:07 +0000 | [diff] [blame] | 386 |             data1 = bytes(str(HAMLET_SCENE, "ascii").swapcase(), "ascii") | 
| Thomas Wouters | 0e3f591 | 2006-08-11 14:57:12 +0000 | [diff] [blame] | 387 |             c0 = zlib.compressobj(zlib.Z_BEST_COMPRESSION) | 
 | 388 |             bufs0 = [] | 
 | 389 |             bufs0.append(c0.compress(data0)) | 
| Thomas Wouters | 477c8d5 | 2006-05-27 19:21:47 +0000 | [diff] [blame] | 390 |  | 
| Thomas Wouters | 0e3f591 | 2006-08-11 14:57:12 +0000 | [diff] [blame] | 391 |             c1 = c0.copy() | 
 | 392 |             bufs1 = bufs0[:] | 
| Thomas Wouters | 477c8d5 | 2006-05-27 19:21:47 +0000 | [diff] [blame] | 393 |  | 
| Thomas Wouters | 0e3f591 | 2006-08-11 14:57:12 +0000 | [diff] [blame] | 394 |             bufs0.append(c0.compress(data0)) | 
 | 395 |             bufs0.append(c0.flush()) | 
| Guido van Rossum | 776152b | 2007-05-22 22:44:07 +0000 | [diff] [blame] | 396 |             s0 = b''.join(bufs0) | 
| Thomas Wouters | 477c8d5 | 2006-05-27 19:21:47 +0000 | [diff] [blame] | 397 |  | 
| Thomas Wouters | 0e3f591 | 2006-08-11 14:57:12 +0000 | [diff] [blame] | 398 |             bufs1.append(c1.compress(data1)) | 
 | 399 |             bufs1.append(c1.flush()) | 
| Guido van Rossum | 776152b | 2007-05-22 22:44:07 +0000 | [diff] [blame] | 400 |             s1 = b''.join(bufs1) | 
| Thomas Wouters | 477c8d5 | 2006-05-27 19:21:47 +0000 | [diff] [blame] | 401 |  | 
| Thomas Wouters | 0e3f591 | 2006-08-11 14:57:12 +0000 | [diff] [blame] | 402 |             self.assertEqual(zlib.decompress(s0),data0+data0) | 
 | 403 |             self.assertEqual(zlib.decompress(s1),data0+data1) | 
| Thomas Wouters | 477c8d5 | 2006-05-27 19:21:47 +0000 | [diff] [blame] | 404 |  | 
| Thomas Wouters | 0e3f591 | 2006-08-11 14:57:12 +0000 | [diff] [blame] | 405 |         def test_badcompresscopy(self): | 
 | 406 |             # Test copying a compression object in an inconsistent state | 
 | 407 |             c = zlib.compressobj() | 
 | 408 |             c.compress(HAMLET_SCENE) | 
 | 409 |             c.flush() | 
 | 410 |             self.assertRaises(ValueError, c.copy) | 
| Thomas Wouters | 477c8d5 | 2006-05-27 19:21:47 +0000 | [diff] [blame] | 411 |  | 
| Thomas Wouters | 0e3f591 | 2006-08-11 14:57:12 +0000 | [diff] [blame] | 412 |     if hasattr(zlib.decompressobj(), "copy"): | 
 | 413 |         def test_decompresscopy(self): | 
 | 414 |             # Test copying a decompression object | 
 | 415 |             data = HAMLET_SCENE | 
 | 416 |             comp = zlib.compress(data) | 
| Gregory P. Smith | 693fc46 | 2008-09-06 20:13:06 +0000 | [diff] [blame] | 417 |             # Test type of return value | 
| Georg Brandl | ab91fde | 2009-08-13 08:51:18 +0000 | [diff] [blame] | 418 |             self.assertTrue(isinstance(comp, bytes)) | 
| Thomas Wouters | 477c8d5 | 2006-05-27 19:21:47 +0000 | [diff] [blame] | 419 |  | 
| Thomas Wouters | 0e3f591 | 2006-08-11 14:57:12 +0000 | [diff] [blame] | 420 |             d0 = zlib.decompressobj() | 
 | 421 |             bufs0 = [] | 
 | 422 |             bufs0.append(d0.decompress(comp[:32])) | 
| Thomas Wouters | 477c8d5 | 2006-05-27 19:21:47 +0000 | [diff] [blame] | 423 |  | 
| Thomas Wouters | 0e3f591 | 2006-08-11 14:57:12 +0000 | [diff] [blame] | 424 |             d1 = d0.copy() | 
 | 425 |             bufs1 = bufs0[:] | 
| Thomas Wouters | 477c8d5 | 2006-05-27 19:21:47 +0000 | [diff] [blame] | 426 |  | 
| Thomas Wouters | 0e3f591 | 2006-08-11 14:57:12 +0000 | [diff] [blame] | 427 |             bufs0.append(d0.decompress(comp[32:])) | 
| Guido van Rossum | 776152b | 2007-05-22 22:44:07 +0000 | [diff] [blame] | 428 |             s0 = b''.join(bufs0) | 
| Thomas Wouters | 477c8d5 | 2006-05-27 19:21:47 +0000 | [diff] [blame] | 429 |  | 
| Thomas Wouters | 0e3f591 | 2006-08-11 14:57:12 +0000 | [diff] [blame] | 430 |             bufs1.append(d1.decompress(comp[32:])) | 
| Guido van Rossum | 776152b | 2007-05-22 22:44:07 +0000 | [diff] [blame] | 431 |             s1 = b''.join(bufs1) | 
| Thomas Wouters | 477c8d5 | 2006-05-27 19:21:47 +0000 | [diff] [blame] | 432 |  | 
| Thomas Wouters | 0e3f591 | 2006-08-11 14:57:12 +0000 | [diff] [blame] | 433 |             self.assertEqual(s0,s1) | 
 | 434 |             self.assertEqual(s0,data) | 
| Thomas Wouters | 477c8d5 | 2006-05-27 19:21:47 +0000 | [diff] [blame] | 435 |  | 
| Thomas Wouters | 0e3f591 | 2006-08-11 14:57:12 +0000 | [diff] [blame] | 436 |         def test_baddecompresscopy(self): | 
 | 437 |             # Test copying a compression object in an inconsistent state | 
 | 438 |             data = zlib.compress(HAMLET_SCENE) | 
 | 439 |             d = zlib.decompressobj() | 
 | 440 |             d.decompress(data) | 
 | 441 |             d.flush() | 
 | 442 |             self.assertRaises(ValueError, d.copy) | 
| Guido van Rossum | 7d9ea50 | 2003-02-03 20:45:52 +0000 | [diff] [blame] | 443 |  | 
| Antoine Pitrou | 4b3fe14 | 2010-05-07 17:08:54 +0000 | [diff] [blame] | 444 |     # Memory use of the following functions takes into account overallocation | 
 | 445 |  | 
 | 446 |     @precisionbigmemtest(size=_1G + 1024 * 1024, memuse=3) | 
 | 447 |     def test_big_compress_buffer(self, size): | 
 | 448 |         c = zlib.compressobj(1) | 
 | 449 |         compress = lambda s: c.compress(s) + c.flush() | 
 | 450 |         self.check_big_compress_buffer(size, compress) | 
 | 451 |  | 
 | 452 |     @precisionbigmemtest(size=_1G + 1024 * 1024, memuse=2) | 
 | 453 |     def test_big_decompress_buffer(self, size): | 
 | 454 |         d = zlib.decompressobj() | 
 | 455 |         decompress = lambda s: d.decompress(s) + d.flush() | 
 | 456 |         self.check_big_decompress_buffer(size, decompress) | 
 | 457 |  | 
 | 458 |  | 
| Guido van Rossum | 7d9ea50 | 2003-02-03 20:45:52 +0000 | [diff] [blame] | 459 | def genblock(seed, length, step=1024, generator=random): | 
 | 460 |     """length-byte stream of random data from a seed (in step-byte blocks).""" | 
 | 461 |     if seed is not None: | 
 | 462 |         generator.seed(seed) | 
 | 463 |     randint = generator.randint | 
 | 464 |     if length < step or step < 2: | 
 | 465 |         step = length | 
| Guido van Rossum | 776152b | 2007-05-22 22:44:07 +0000 | [diff] [blame] | 466 |     blocks = bytes() | 
| Guido van Rossum | 7d9ea50 | 2003-02-03 20:45:52 +0000 | [diff] [blame] | 467 |     for i in range(0, length, step): | 
| Guido van Rossum | 776152b | 2007-05-22 22:44:07 +0000 | [diff] [blame] | 468 |         blocks += bytes(randint(0, 255) for x in range(step)) | 
 | 469 |     return blocks | 
| Guido van Rossum | 7d9ea50 | 2003-02-03 20:45:52 +0000 | [diff] [blame] | 470 |  | 
 | 471 |  | 
 | 472 |  | 
 | 473 | def choose_lines(source, number, seed=None, generator=random): | 
 | 474 |     """Return a list of number lines randomly chosen from the source""" | 
 | 475 |     if seed is not None: | 
 | 476 |         generator.seed(seed) | 
 | 477 |     sources = source.split('\n') | 
 | 478 |     return [generator.choice(sources) for n in range(number)] | 
 | 479 |  | 
 | 480 |  | 
 | 481 |  | 
| Guido van Rossum | 776152b | 2007-05-22 22:44:07 +0000 | [diff] [blame] | 482 | HAMLET_SCENE = b""" | 
| Fred Drake | 004d5e6 | 2000-10-23 17:22:08 +0000 | [diff] [blame] | 483 | LAERTES | 
| Jeremy Hylton | 6eb4b6a | 1997-08-15 15:59:43 +0000 | [diff] [blame] | 484 |  | 
 | 485 |        O, fear me not. | 
 | 486 |        I stay too long: but here my father comes. | 
 | 487 |  | 
 | 488 |        Enter POLONIUS | 
 | 489 |  | 
 | 490 |        A double blessing is a double grace, | 
 | 491 |        Occasion smiles upon a second leave. | 
 | 492 |  | 
| Fred Drake | 004d5e6 | 2000-10-23 17:22:08 +0000 | [diff] [blame] | 493 | LORD POLONIUS | 
| Jeremy Hylton | 6eb4b6a | 1997-08-15 15:59:43 +0000 | [diff] [blame] | 494 |  | 
 | 495 |        Yet here, Laertes! aboard, aboard, for shame! | 
 | 496 |        The wind sits in the shoulder of your sail, | 
 | 497 |        And you are stay'd for. There; my blessing with thee! | 
 | 498 |        And these few precepts in thy memory | 
 | 499 |        See thou character. Give thy thoughts no tongue, | 
 | 500 |        Nor any unproportioned thought his act. | 
 | 501 |        Be thou familiar, but by no means vulgar. | 
 | 502 |        Those friends thou hast, and their adoption tried, | 
 | 503 |        Grapple them to thy soul with hoops of steel; | 
 | 504 |        But do not dull thy palm with entertainment | 
 | 505 |        Of each new-hatch'd, unfledged comrade. Beware | 
 | 506 |        Of entrance to a quarrel, but being in, | 
 | 507 |        Bear't that the opposed may beware of thee. | 
 | 508 |        Give every man thy ear, but few thy voice; | 
 | 509 |        Take each man's censure, but reserve thy judgment. | 
 | 510 |        Costly thy habit as thy purse can buy, | 
 | 511 |        But not express'd in fancy; rich, not gaudy; | 
 | 512 |        For the apparel oft proclaims the man, | 
 | 513 |        And they in France of the best rank and station | 
 | 514 |        Are of a most select and generous chief in that. | 
 | 515 |        Neither a borrower nor a lender be; | 
 | 516 |        For loan oft loses both itself and friend, | 
 | 517 |        And borrowing dulls the edge of husbandry. | 
 | 518 |        This above all: to thine ownself be true, | 
 | 519 |        And it must follow, as the night the day, | 
 | 520 |        Thou canst not then be false to any man. | 
 | 521 |        Farewell: my blessing season this in thee! | 
 | 522 |  | 
| Fred Drake | 004d5e6 | 2000-10-23 17:22:08 +0000 | [diff] [blame] | 523 | LAERTES | 
| Jeremy Hylton | 6eb4b6a | 1997-08-15 15:59:43 +0000 | [diff] [blame] | 524 |  | 
 | 525 |        Most humbly do I take my leave, my lord. | 
 | 526 |  | 
| Fred Drake | 004d5e6 | 2000-10-23 17:22:08 +0000 | [diff] [blame] | 527 | LORD POLONIUS | 
| Jeremy Hylton | 6eb4b6a | 1997-08-15 15:59:43 +0000 | [diff] [blame] | 528 |  | 
 | 529 |        The time invites you; go; your servants tend. | 
 | 530 |  | 
| Fred Drake | 004d5e6 | 2000-10-23 17:22:08 +0000 | [diff] [blame] | 531 | LAERTES | 
| Jeremy Hylton | 6eb4b6a | 1997-08-15 15:59:43 +0000 | [diff] [blame] | 532 |  | 
 | 533 |        Farewell, Ophelia; and remember well | 
 | 534 |        What I have said to you. | 
 | 535 |  | 
| Fred Drake | 004d5e6 | 2000-10-23 17:22:08 +0000 | [diff] [blame] | 536 | OPHELIA | 
| Jeremy Hylton | 6eb4b6a | 1997-08-15 15:59:43 +0000 | [diff] [blame] | 537 |  | 
 | 538 |        'Tis in my memory lock'd, | 
 | 539 |        And you yourself shall keep the key of it. | 
 | 540 |  | 
| Fred Drake | 004d5e6 | 2000-10-23 17:22:08 +0000 | [diff] [blame] | 541 | LAERTES | 
| Jeremy Hylton | 6eb4b6a | 1997-08-15 15:59:43 +0000 | [diff] [blame] | 542 |  | 
 | 543 |        Farewell. | 
 | 544 | """ | 
| Guido van Rossum | 7d9ea50 | 2003-02-03 20:45:52 +0000 | [diff] [blame] | 545 |  | 
 | 546 |  | 
 | 547 | def test_main(): | 
| Benjamin Peterson | ee8712c | 2008-05-20 21:35:26 +0000 | [diff] [blame] | 548 |     support.run_unittest( | 
| Walter Dörwald | 21d3a32 | 2003-05-01 17:45:56 +0000 | [diff] [blame] | 549 |         ChecksumTestCase, | 
 | 550 |         ExceptionTestCase, | 
 | 551 |         CompressTestCase, | 
 | 552 |         CompressObjectTestCase | 
 | 553 |     ) | 
| Guido van Rossum | 7d9ea50 | 2003-02-03 20:45:52 +0000 | [diff] [blame] | 554 |  | 
 | 555 | if __name__ == "__main__": | 
| Guido van Rossum | 776152b | 2007-05-22 22:44:07 +0000 | [diff] [blame] | 556 |     unittest.main() # XXX | 
 | 557 |     ###test_main() |