summaryrefslogtreecommitdiffstats
path: root/Lib/test/test_binascii.py
blob: d4a905a24c3a8d295e7e23de90604db27f0ae4b1 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
"""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"