| """Test the binascii C module.""" |
| |
| from test_support import verify, verbose, have_unicode |
| 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): |
| # 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:] |
| 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 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" |