diff options
author | Walter Dörwald <walter@livinglogic.de> | 2004-03-15 12:07:38 (GMT) |
---|---|---|
committer | Walter Dörwald <walter@livinglogic.de> | 2004-03-15 12:07:38 (GMT) |
commit | cd1e8a948516a8a05d4e682d793a49d80bbdf8f8 (patch) | |
tree | c1c390b8142252d7eb9b2b2cf342f8b835087033 /Lib/test/test_binascii.py | |
parent | d4ff741e785b598df9737da10831f927fa0eddbb (diff) | |
download | cpython-cd1e8a948516a8a05d4e682d793a49d80bbdf8f8.zip cpython-cd1e8a948516a8a05d4e682d793a49d80bbdf8f8.tar.gz cpython-cd1e8a948516a8a05d4e682d793a49d80bbdf8f8.tar.bz2 |
Port test_binascii.py to PyUnit and enhance tests.
Code coverage for binascii.c is at 92%.
From SF patch #736962.
Diffstat (limited to 'Lib/test/test_binascii.py')
-rwxr-xr-x | Lib/test/test_binascii.py | 272 |
1 files changed, 149 insertions, 123 deletions
diff --git a/Lib/test/test_binascii.py b/Lib/test/test_binascii.py index 2764c3c..c252062 100755 --- a/Lib/test/test_binascii.py +++ b/Lib/test/test_binascii.py @@ -1,129 +1,155 @@ """Test the binascii C module.""" -from test.test_support import verify, verbose, have_unicode +from test import test_support +import unittest import binascii -# Show module doc string -print binascii.__doc__ - -# Show module exceptions -print binascii.Error -print binascii.Incomplete - -# Check presence and display doc strings of all functions -funcs = [] -for suffix in "base64", "hqx", "uu": - prefixes = ["a2b_", "b2a_"] - if suffix == "hqx": - prefixes.extend(["crc_", "rlecode_", "rledecode_"]) - for prefix in prefixes: - name = prefix + suffix - funcs.append(getattr(binascii, name)) -for func in funcs: - print "%-15s: %s" % (func.__name__, func.__doc__) - -# Create binary test data -testdata = "The quick brown fox jumps over the lazy dog.\r\n" -for i in range(256): +class BinASCIITest(unittest.TestCase): + + # Create binary test data + data = "The quick brown fox jumps over the lazy dog.\r\n" # Be slow so we don't depend on other modules - testdata = testdata + chr(i) -testdata = testdata + "\r\nHello world.\n" - -# Test base64 with valid data -print "base64 test" -MAX_BASE64 = 57 -lines = [] -for i in range(0, len(testdata), MAX_BASE64): - b = testdata[i:i+MAX_BASE64] - a = binascii.b2a_base64(b) - lines.append(a) - print a, -res = "" -for line in lines: - b = binascii.a2b_base64(line) - res = res + b -verify(res == testdata) - -# Test base64 with random invalid characters sprinkled throughout -# (This requires a new version of binascii.) -fillers = "" -valid = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789+/" -for i in range(256): - c = chr(i) - if c not in valid: - fillers = fillers + c -def addnoise(line): - noise = fillers - ratio = len(line) // len(noise) - res = "" - while line and noise: - if len(line) // len(noise) > ratio: - c, line = line[0], line[1:] + data += "".join(map(chr, xrange(256))) + data += "\r\nHello world.\n" + + def test_exceptions(self): + # Check module exceptions + self.assert_(issubclass(binascii.Error, Exception)) + self.assert_(issubclass(binascii.Incomplete, Exception)) + + def test_functions(self): + # Check presence of all functions + funcs = [] + for suffix in "base64", "hqx", "uu", "hex": + prefixes = ["a2b_", "b2a_"] + if suffix == "hqx": + prefixes.extend(["crc_", "rlecode_", "rledecode_"]) + for prefix in prefixes: + name = prefix + suffix + self.assert_(callable(getattr(binascii, name))) + self.assertRaises(TypeError, getattr(binascii, name)) + for name in ("hexlify", "unhexlify"): + self.assert_(callable(getattr(binascii, name))) + self.assertRaises(TypeError, getattr(binascii, name)) + + def test_base64valid(self): + # Test base64 with valid data + MAX_BASE64 = 57 + lines = [] + for i in range(0, len(self.data), MAX_BASE64): + b = self.data[i:i+MAX_BASE64] + a = binascii.b2a_base64(b) + lines.append(a) + res = "" + for line in lines: + b = binascii.a2b_base64(line) + res = res + b + self.assertEqual(res, self.data) + + def test_base64invalid(self): + # Test base64 with random invalid characters sprinkled throughout + # (This requires a new version of binascii.) + MAX_BASE64 = 57 + lines = [] + for i in range(0, len(self.data), MAX_BASE64): + b = self.data[i:i+MAX_BASE64] + a = binascii.b2a_base64(b) + lines.append(a) + + fillers = "" + valid = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789+/" + for i in xrange(256): + c = chr(i) + if c not in valid: + fillers += c + def addnoise(line): + noise = fillers + ratio = len(line) // len(noise) + res = "" + while line and noise: + if len(line) // len(noise) > ratio: + c, line = line[0], line[1:] + else: + c, noise = noise[0], noise[1:] + res += c + return res + noise + line + res = "" + for line in map(addnoise, lines): + b = binascii.a2b_base64(line) + res += b + self.assertEqual(res, self.data) + + # Test base64 with just invalid characters, which should return + # empty strings. TBD: shouldn't it raise an exception instead ? + self.assertEqual(binascii.a2b_base64(fillers), '') + + def test_uu(self): + MAX_UU = 45 + lines = [] + for i in range(0, len(self.data), MAX_UU): + b = self.data[i:i+MAX_UU] + a = binascii.b2a_uu(b) + lines.append(a) + res = "" + for line in lines: + b = binascii.a2b_uu(line) + res += b + self.assertEqual(res, self.data) + + self.assertEqual(binascii.a2b_uu("\x7f"), "\x00"*31) + self.assertEqual(binascii.a2b_uu("\x80"), "\x00"*32) + self.assertEqual(binascii.a2b_uu("\xff"), "\x00"*31) + self.assertRaises(binascii.Error, binascii.a2b_uu, "\xff\x00") + self.assertRaises(binascii.Error, binascii.a2b_uu, "!!!!") + + self.assertRaises(binascii.Error, binascii.b2a_uu, 46*"!") + + def test_crc32(self): + crc = binascii.crc32("Test the CRC-32 of") + crc = binascii.crc32(" this string.", crc) + self.assertEqual(crc, 1571220330) + + self.assertRaises(TypeError, binascii.crc32) + + # The hqx test is in test_binhex.py + + def test_hex(self): + # test hexlification + s = '{s\005\000\000\000worldi\002\000\000\000s\005\000\000\000helloi\001\000\000\0000' + t = binascii.b2a_hex(s) + u = binascii.a2b_hex(t) + self.assertEqual(s, u) + self.assertRaises(TypeError, binascii.a2b_hex, t[:-1]) + self.assertRaises(TypeError, binascii.a2b_hex, t[:-1] + 'q') + + # Verify the treatment of Unicode strings + if test_support.have_unicode: + self.assertEqual(binascii.hexlify(unicode('a', 'ascii')), '61') + + def test_qp(self): + # A test for SF bug 534347 (segfaults without the proper fix) + try: + binascii.a2b_qp("", **{1:1}) + except TypeError: + pass else: - c, noise = noise[0], noise[1:] - res = res + c - return res + noise + line -res = "" -for line in map(addnoise, lines): - b = binascii.a2b_base64(line) - res = res + b -verify(res == testdata) - -# Test base64 with just invalid characters, which should return -# empty strings. TBD: shouldn't it raise an exception instead ? -verify(binascii.a2b_base64(fillers) == '') - -# Test uu -print "uu test" -MAX_UU = 45 -lines = [] -for i in range(0, len(testdata), MAX_UU): - b = testdata[i:i+MAX_UU] - a = binascii.b2a_uu(b) - lines.append(a) - print a, -res = "" -for line in lines: - b = binascii.a2b_uu(line) - res = res + b -verify(res == testdata) - -# Test crc32() -crc = binascii.crc32("Test the CRC-32 of") -crc = binascii.crc32(" this string.", crc) -if crc != 1571220330: - print "binascii.crc32() failed." - -# The hqx test is in test_binhex.py - -# test hexlification -s = '{s\005\000\000\000worldi\002\000\000\000s\005\000\000\000helloi\001\000\000\0000' -t = binascii.b2a_hex(s) -u = binascii.a2b_hex(t) -if s != u: - print 'binascii hexlification failed' -try: - binascii.a2b_hex(t[:-1]) -except TypeError: - pass -else: - print 'expected TypeError not raised' -try: - binascii.a2b_hex(t[:-1] + 'q') -except TypeError: - pass -else: - print 'expected TypeError not raised' - -# Verify the treatment of Unicode strings -if have_unicode: - verify(binascii.hexlify(unicode('a', 'ascii')) == '61', - "hexlify failed for Unicode") - -# A test for SF bug 534347 (segfaults without the proper fix) -try: - binascii.a2b_qp("", **{1:1}) -except TypeError: - pass -else: - raise TestFailed, "binascii..a2b_qp(**{1:1}) didn't raise TypeError" + self.fail("binascii.a2b_qp(**{1:1}) didn't raise TypeError") + self.assertEqual(binascii.a2b_qp("= "), "") + self.assertEqual(binascii.a2b_qp("=="), "=") + self.assertEqual(binascii.a2b_qp("=AX"), "=AX") + self.assertRaises(TypeError, binascii.b2a_qp, foo="bar") + self.assertEqual(binascii.a2b_qp("=00\r\n=00"), "\x00\r\n\x00") + self.assertEqual( + binascii.b2a_qp("\xff\r\n\xff\n\xff"), + "=FF\r\n=FF\r\n=FF" + ) + self.assertEqual( + binascii.b2a_qp("0"*75+"\xff\r\n\xff\r\n\xff"), + "0"*75+"=\r\n=FF\r\n=FF\r\n=FF" + ) + +def test_main(): + test_support.run_unittest(BinASCIITest) + +if __name__ == "__main__": + test_main() |