Commit 071cf2e2 authored by Walter Dörwald's avatar Walter Dörwald

Port test_binascii.py to PyUnit and enhance tests.

Code coverage for binascii.c is at 92%.
From SF patch #736962.
parent 60979d47
test_binascii
Conversion between binary data and ASCII
binascii.Error
binascii.Incomplete
a2b_base64 : (ascii) -> bin. Decode a line of base64 data
b2a_base64 : (bin) -> ascii. Base64-code line of data
a2b_hqx : ascii -> bin, done. Decode .hqx coding
b2a_hqx : Encode .hqx data
crc_hqx : (data, oldcrc) -> newcrc. Compute hqx CRC incrementally
rlecode_hqx : Binhex RLE-code binary data
rledecode_hqx : Decode hexbin RLE-coded string
a2b_uu : (ascii) -> bin. Decode a line of uuencoded data
b2a_uu : (bin) -> ascii. Uuencode line of data
base64 test
VGhlIHF1aWNrIGJyb3duIGZveCBqdW1wcyBvdmVyIHRoZSBsYXp5IGRvZy4NCgABAgMEBQYHCAkK
CwwNDg8QERITFBUWFxgZGhscHR4fICEiIyQlJicoKSorLC0uLzAxMjM0NTY3ODk6Ozw9Pj9AQUJD
REVGR0hJSktMTU5PUFFSU1RVVldYWVpbXF1eX2BhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ent8
fX5/gIGCg4SFhoeIiYqLjI2Oj5CRkpOUlZaXmJmam5ydnp+goaKjpKWmp6ipqqusra6vsLGys7S1
tre4ubq7vL2+v8DBwsPExcbHyMnKy8zNzs/Q0dLT1NXW19jZ2tvc3d7f4OHi4+Tl5ufo6err7O3u
7/Dx8vP09fb3+Pn6+/z9/v8NCkhlbGxvIHdvcmxkLgo=
uu test
M5&AE('%U:6-K(&)R;W=N(&9O>"!J=6UP<R!O=F5R('1H92!L87IY(&1O9RX-
M"@ ! @,$!08'" D*"PP-#@\0$1(3%!46%Q@9&AL<'1X?("$B(R0E)B<H*2HK
M+"TN+S Q,C,T-38W.#DZ.SP]/C] 04)#1$5&1TA)2DM,34Y/4%%24U155E=8
M65I;7%U>7V!A8F-D969G:&EJ:VQM;F]P<7)S='5V=WAY>GM\?7Y_@(&"@X2%
MAH>(B8J+C(V.CY"1DI.4E9:7F)F:FYR=GI^@H:*CI*6FIZBIJJNLK:ZOL+&R
ML[2UMK>XN;J[O+V^O\#!PL/$Q<;'R,G*R\S-SL_0T=+3U-76U]C9VMO<W=[?
MX.'BX^3EYN?HZ>KK[.WN[_#Q\O/T]?;W^/GZ^_S]_O\-"DAE;&QO('=O<FQD
"+@H
"""Test the binascii C module.""" """Test the binascii C module."""
from test.test_support import verify, verbose, have_unicode from test import test_support
import unittest
import binascii import binascii
# Show module doc string class BinASCIITest(unittest.TestCase):
print binascii.__doc__
# Show module exceptions # Create binary test data
print binascii.Error data = "The quick brown fox jumps over the lazy dog.\r\n"
print binascii.Incomplete # Be slow so we don't depend on other modules
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))
# Check presence and display doc strings of all functions def test_functions(self):
funcs = [] # Check presence of all functions
for suffix in "base64", "hqx", "uu": funcs = []
for suffix in "base64", "hqx", "uu", "hex":
prefixes = ["a2b_", "b2a_"] prefixes = ["a2b_", "b2a_"]
if suffix == "hqx": if suffix == "hqx":
prefixes.extend(["crc_", "rlecode_", "rledecode_"]) prefixes.extend(["crc_", "rlecode_", "rledecode_"])
for prefix in prefixes: for prefix in prefixes:
name = prefix + suffix name = prefix + suffix
funcs.append(getattr(binascii, name)) self.assert_(callable(getattr(binascii, name)))
for func in funcs: self.assertRaises(TypeError, getattr(binascii, name))
print "%-15s: %s" % (func.__name__, func.__doc__) for name in ("hexlify", "unhexlify"):
self.assert_(callable(getattr(binascii, name)))
self.assertRaises(TypeError, getattr(binascii, name))
# Create binary test data def test_base64valid(self):
testdata = "The quick brown fox jumps over the lazy dog.\r\n" # Test base64 with valid data
for i in range(256): MAX_BASE64 = 57
# Be slow so we don't depend on other modules lines = []
testdata = testdata + chr(i) for i in range(0, len(self.data), MAX_BASE64):
testdata = testdata + "\r\nHello world.\n" b = self.data[i:i+MAX_BASE64]
# 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) a = binascii.b2a_base64(b)
lines.append(a) lines.append(a)
print a, res = ""
res = "" for line in lines:
for line in lines:
b = binascii.a2b_base64(line) b = binascii.a2b_base64(line)
res = res + b res = res + b
verify(res == testdata) 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)
# Test base64 with random invalid characters sprinkled throughout fillers = ""
# (This requires a new version of binascii.) valid = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789+/"
fillers = "" for i in xrange(256):
valid = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789+/"
for i in range(256):
c = chr(i) c = chr(i)
if c not in valid: if c not in valid:
fillers = fillers + c fillers += c
def addnoise(line): def addnoise(line):
noise = fillers noise = fillers
ratio = len(line) // len(noise) ratio = len(line) // len(noise)
res = "" res = ""
...@@ -61,69 +71,85 @@ def addnoise(line): ...@@ -61,69 +71,85 @@ def addnoise(line):
c, line = line[0], line[1:] c, line = line[0], line[1:]
else: else:
c, noise = noise[0], noise[1:] c, noise = noise[0], noise[1:]
res = res + c res += c
return res + noise + line return res + noise + line
res = "" res = ""
for line in map(addnoise, lines): for line in map(addnoise, lines):
b = binascii.a2b_base64(line) b = binascii.a2b_base64(line)
res = res + b res += b
verify(res == testdata) self.assertEqual(res, self.data)
# Test base64 with just invalid characters, which should return # Test base64 with just invalid characters, which should return
# empty strings. TBD: shouldn't it raise an exception instead ? # empty strings. TBD: shouldn't it raise an exception instead ?
verify(binascii.a2b_base64(fillers) == '') self.assertEqual(binascii.a2b_base64(fillers), '')
# Test uu def test_uu(self):
print "uu test" MAX_UU = 45
MAX_UU = 45 lines = []
lines = [] for i in range(0, len(self.data), MAX_UU):
for i in range(0, len(testdata), MAX_UU): b = self.data[i:i+MAX_UU]
b = testdata[i:i+MAX_UU]
a = binascii.b2a_uu(b) a = binascii.b2a_uu(b)
lines.append(a) lines.append(a)
print a, res = ""
res = "" for line in lines:
for line in lines:
b = binascii.a2b_uu(line) b = binascii.a2b_uu(line)
res = res + b res += b
verify(res == testdata) self.assertEqual(res, self.data)
# Test crc32() self.assertEqual(binascii.a2b_uu("\x7f"), "\x00"*31)
crc = binascii.crc32("Test the CRC-32 of") self.assertEqual(binascii.a2b_uu("\x80"), "\x00"*32)
crc = binascii.crc32(" this string.", crc) self.assertEqual(binascii.a2b_uu("\xff"), "\x00"*31)
if crc != 1571220330: self.assertRaises(binascii.Error, binascii.a2b_uu, "\xff\x00")
print "binascii.crc32() failed." self.assertRaises(binascii.Error, binascii.a2b_uu, "!!!!")
# The hqx test is in test_binhex.py self.assertRaises(binascii.Error, binascii.b2a_uu, 46*"!")
# test hexlification def test_crc32(self):
s = '{s\005\000\000\000worldi\002\000\000\000s\005\000\000\000helloi\001\000\000\0000' crc = binascii.crc32("Test the CRC-32 of")
t = binascii.b2a_hex(s) crc = binascii.crc32(" this string.", crc)
u = binascii.a2b_hex(t) self.assertEqual(crc, 1571220330)
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 self.assertRaises(TypeError, binascii.crc32)
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) # The hqx test is in test_binhex.py
try:
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}) binascii.a2b_qp("", **{1:1})
except TypeError: except TypeError:
pass pass
else: 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()
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment