summaryrefslogtreecommitdiffstats
path: root/Lib/test/test_binascii.py
blob: 2764c3c5e52a75b0de436b4053fac54c73fcfde8 (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
126
127
128
129
"""Test the binascii C module."""

from test.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 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"