blob: f1f8b33f59d13edc5c4b20407333f42572d68a35 [file] [log] [blame]
Guido van Rossumfdecda01999-10-19 19:08:13 +00001"""Test the binascii C module."""
Roger E. Masse2a1c8341997-01-16 16:44:09 +00002
Barry Warsaw408b6d32002-07-30 23:27:12 +00003from test.test_support import verify, verbose, have_unicode
Guido van Rossumfdecda01999-10-19 19:08:13 +00004import binascii
Roger E. Masse2a1c8341997-01-16 16:44:09 +00005
Guido van Rossumfdecda01999-10-19 19:08:13 +00006# Show module doc string
7print binascii.__doc__
Roger E. Masse2a1c8341997-01-16 16:44:09 +00008
Guido van Rossumfdecda01999-10-19 19:08:13 +00009# Show module exceptions
10print binascii.Error
11print binascii.Incomplete
Roger E. Masse2a1c8341997-01-16 16:44:09 +000012
Guido van Rossumfdecda01999-10-19 19:08:13 +000013# Check presence and display doc strings of all functions
14funcs = []
15for suffix in "base64", "hqx", "uu":
16 prefixes = ["a2b_", "b2a_"]
17 if suffix == "hqx":
18 prefixes.extend(["crc_", "rlecode_", "rledecode_"])
19 for prefix in prefixes:
20 name = prefix + suffix
21 funcs.append(getattr(binascii, name))
22for func in funcs:
23 print "%-15s: %s" % (func.__name__, func.__doc__)
Roger E. Masse2a1c8341997-01-16 16:44:09 +000024
Guido van Rossumfdecda01999-10-19 19:08:13 +000025# Create binary test data
26testdata = "The quick brown fox jumps over the lazy dog.\r\n"
27for i in range(256):
28 # Be slow so we don't depend on other modules
29 testdata = testdata + chr(i)
30testdata = testdata + "\r\nHello world.\n"
Roger E. Masse2a1c8341997-01-16 16:44:09 +000031
Guido van Rossumfdecda01999-10-19 19:08:13 +000032# Test base64 with valid data
33print "base64 test"
34MAX_BASE64 = 57
35lines = []
36for i in range(0, len(testdata), MAX_BASE64):
37 b = testdata[i:i+MAX_BASE64]
38 a = binascii.b2a_base64(b)
39 lines.append(a)
40 print a,
41res = ""
42for line in lines:
43 b = binascii.a2b_base64(line)
44 res = res + b
Marc-André Lemburg36619082001-01-17 19:11:13 +000045verify(res == testdata)
Roger E. Masse2a1c8341997-01-16 16:44:09 +000046
Guido van Rossumfdecda01999-10-19 19:08:13 +000047# Test base64 with random invalid characters sprinkled throughout
48# (This requires a new version of binascii.)
49fillers = ""
50valid = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789+/"
51for i in range(256):
52 c = chr(i)
53 if c not in valid:
54 fillers = fillers + c
55def addnoise(line):
56 noise = fillers
Guido van Rossum54e54c62001-09-04 19:14:14 +000057 ratio = len(line) // len(noise)
Guido van Rossumfdecda01999-10-19 19:08:13 +000058 res = ""
59 while line and noise:
Guido van Rossum54e54c62001-09-04 19:14:14 +000060 if len(line) // len(noise) > ratio:
Guido van Rossumfdecda01999-10-19 19:08:13 +000061 c, line = line[0], line[1:]
62 else:
63 c, noise = noise[0], noise[1:]
64 res = res + c
65 return res + noise + line
66res = ""
67for line in map(addnoise, lines):
68 b = binascii.a2b_base64(line)
69 res = res + b
Marc-André Lemburg36619082001-01-17 19:11:13 +000070verify(res == testdata)
Roger E. Masse2a1c8341997-01-16 16:44:09 +000071
Guido van Rossumfdecda01999-10-19 19:08:13 +000072# Test uu
73print "uu test"
74MAX_UU = 45
75lines = []
76for i in range(0, len(testdata), MAX_UU):
77 b = testdata[i:i+MAX_UU]
78 a = binascii.b2a_uu(b)
79 lines.append(a)
80 print a,
81res = ""
82for line in lines:
83 b = binascii.a2b_uu(line)
84 res = res + b
Marc-André Lemburg36619082001-01-17 19:11:13 +000085verify(res == testdata)
Guido van Rossumfdecda01999-10-19 19:08:13 +000086
Guido van Rossumcba04362000-02-16 21:13:06 +000087# Test crc32()
88crc = binascii.crc32("Test the CRC-32 of")
89crc = binascii.crc32(" this string.", crc)
90if crc != 1571220330:
91 print "binascii.crc32() failed."
92
Guido van Rossumfdecda01999-10-19 19:08:13 +000093# The hqx test is in test_binhex.py
Barry Warsaw97ca66f2000-08-15 06:08:31 +000094
95# test hexlification
96s = '{s\005\000\000\000worldi\002\000\000\000s\005\000\000\000helloi\001\000\000\0000'
97t = binascii.b2a_hex(s)
98u = binascii.a2b_hex(t)
Fred Drake132dce22000-12-12 23:11:42 +000099if s != u:
Barry Warsaw97ca66f2000-08-15 06:08:31 +0000100 print 'binascii hexlification failed'
101try:
102 binascii.a2b_hex(t[:-1])
103except TypeError:
104 pass
105else:
106 print 'expected TypeError not raised'
107try:
108 binascii.a2b_hex(t[:-1] + 'q')
109except TypeError:
110 pass
111else:
112 print 'expected TypeError not raised'
Jeremy Hyltonde7c1922001-10-11 14:09:03 +0000113
114# Verify the treatment of Unicode strings
Michael W. Hudson286225b2002-05-20 14:15:42 +0000115if have_unicode:
Tim Peters8ac14952002-05-23 15:15:30 +0000116 verify(binascii.hexlify(unicode('a', 'ascii')) == '61',
Michael W. Hudson286225b2002-05-20 14:15:42 +0000117 "hexlify failed for Unicode")
Guido van Rossum065fa412002-04-04 16:27:04 +0000118
119# A test for SF bug 534347 (segfaults without the proper fix)
120try:
121 binascii.a2b_qp("", **{1:1})
122except TypeError:
123 pass
124else:
125 raise TestFailed, "binascii..a2b_qp(**{1:1}) didn't raise TypeError"