1 """Test the binascii C module."""
3 from test
import support
7 class BinASCIITest(unittest
.TestCase
):
9 # Create binary test data
10 data
= b
"The quick brown fox jumps over the lazy dog.\r\n"
11 # Be slow so we don't depend on other modules
12 data
+= bytes(range(256))
13 data
+= b
"\r\nHello world.\n"
15 def test_exceptions(self
):
16 # Check module exceptions
17 self
.assert_(issubclass(binascii
.Error
, Exception))
18 self
.assert_(issubclass(binascii
.Incomplete
, Exception))
20 def test_functions(self
):
21 # Check presence of all functions
23 for suffix
in "base64", "hqx", "uu", "hex":
24 prefixes
= ["a2b_", "b2a_"]
26 prefixes
.extend(["crc_", "rlecode_", "rledecode_"])
27 for prefix
in prefixes
:
28 name
= prefix
+ suffix
29 self
.assert_(hasattr(getattr(binascii
, name
), '__call__'))
30 self
.assertRaises(TypeError, getattr(binascii
, name
))
31 for name
in ("hexlify", "unhexlify"):
32 self
.assert_(hasattr(getattr(binascii
, name
), '__call__'))
33 self
.assertRaises(TypeError, getattr(binascii
, name
))
35 def test_base64valid(self
):
36 # Test base64 with valid data
39 for i
in range(0, len(self
.data
), MAX_BASE64
):
40 b
= self
.data
[i
:i
+MAX_BASE64
]
41 a
= binascii
.b2a_base64(b
)
45 b
= binascii
.a2b_base64(line
)
47 self
.assertEqual(res
, self
.data
)
49 def test_base64invalid(self
):
50 # Test base64 with random invalid characters sprinkled throughout
51 # (This requires a new version of binascii.)
54 for i
in range(0, len(self
.data
), MAX_BASE64
):
55 b
= self
.data
[i
:i
+MAX_BASE64
]
56 a
= binascii
.b2a_base64(b
)
60 valid
= b
"abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789+/"
66 ratio
= len(line
) // len(noise
)
69 if len(line
) // len(noise
) > ratio
:
70 c
, line
= line
[0], line
[1:]
72 c
, noise
= noise
[0], noise
[1:]
74 return res
+ noise
+ line
76 for line
in map(addnoise
, lines
):
77 b
= binascii
.a2b_base64(line
)
79 self
.assertEqual(res
, self
.data
)
81 # Test base64 with just invalid characters, which should return
82 # empty strings. TBD: shouldn't it raise an exception instead ?
83 self
.assertEqual(binascii
.a2b_base64(fillers
), b
'')
88 for i
in range(0, len(self
.data
), MAX_UU
):
89 b
= self
.data
[i
:i
+MAX_UU
]
90 a
= binascii
.b2a_uu(b
)
94 b
= binascii
.a2b_uu(line
)
96 self
.assertEqual(res
, self
.data
)
98 self
.assertEqual(binascii
.a2b_uu(b
"\x7f"), b
"\x00"*31)
99 self
.assertEqual(binascii
.a2b_uu(b
"\x80"), b
"\x00"*32)
100 self
.assertEqual(binascii
.a2b_uu(b
"\xff"), b
"\x00"*31)
101 self
.assertRaises(binascii
.Error
, binascii
.a2b_uu
, b
"\xff\x00")
102 self
.assertRaises(binascii
.Error
, binascii
.a2b_uu
, b
"!!!!")
104 self
.assertRaises(binascii
.Error
, binascii
.b2a_uu
, 46*b
"!")
106 def test_crc32(self
):
107 crc
= binascii
.crc32(b
"Test the CRC-32 of")
108 crc
= binascii
.crc32(b
" this string.", crc
)
109 self
.assertEqual(crc
, 1571220330)
111 self
.assertRaises(TypeError, binascii
.crc32
)
113 # The hqx test is in test_binhex.py
117 s
= b
'{s\005\000\000\000worldi\002\000\000\000s\005\000\000\000helloi\001\000\000\0000'
118 t
= binascii
.b2a_hex(s
)
119 u
= binascii
.a2b_hex(t
)
120 self
.assertEqual(s
, u
)
121 self
.assertRaises(binascii
.Error
, binascii
.a2b_hex
, t
[:-1])
122 self
.assertRaises(binascii
.Error
, binascii
.a2b_hex
, t
[:-1] + b
'q')
124 self
.assertEqual(binascii
.hexlify(b
'a'), b
'61')
127 # A test for SF bug 534347 (segfaults without the proper fix)
129 binascii
.a2b_qp("", **{1:1})
133 self
.fail("binascii.a2b_qp(**{1:1}) didn't raise TypeError")
134 self
.assertEqual(binascii
.a2b_qp(b
"= "), b
"= ")
135 self
.assertEqual(binascii
.a2b_qp(b
"=="), b
"=")
136 self
.assertEqual(binascii
.a2b_qp(b
"=AX"), b
"=AX")
137 self
.assertRaises(TypeError, binascii
.b2a_qp
, foo
="bar")
138 self
.assertEqual(binascii
.a2b_qp(b
"=00\r\n=00"), b
"\x00\r\n\x00")
140 binascii
.b2a_qp(b
"\xff\r\n\xff\n\xff"),
144 binascii
.b2a_qp(b
"0"*75+b
"\xff\r\n\xff\r\n\xff"),
145 b
"0"*75+b
"=\r\n=FF\r\n=FF\r\n=FF"
148 self
.assertEqual(binascii
.b2a_qp(b
'\0\n'), b
'=00\n')
149 self
.assertEqual(binascii
.b2a_qp(b
'\0\n', quotetabs
=True), b
'=00\n')
150 self
.assertEqual(binascii
.b2a_qp(b
'foo\tbar\t\n'), b
'foo\tbar=09\n')
151 self
.assertEqual(binascii
.b2a_qp(b
'foo\tbar\t\n', quotetabs
=True),
154 self
.assertEqual(binascii
.b2a_qp(b
'.'), b
'=2E')
155 self
.assertEqual(binascii
.b2a_qp(b
'.\n'), b
'=2E\n')
156 self
.assertEqual(binascii
.b2a_qp(b
'a.\n'), b
'a.\n')
158 def test_empty_string(self
):
159 # A test for SF bug #1022953. Make sure SystemError is not raised.
160 for n
in ['b2a_qp', 'a2b_hex', 'b2a_base64', 'a2b_uu', 'a2b_qp',
161 'b2a_hex', 'unhexlify', 'hexlify', 'crc32', 'b2a_hqx',
162 'a2b_hqx', 'a2b_base64', 'rlecode_hqx', 'b2a_uu',
164 f
= getattr(binascii
, n
)
167 except SystemError as err
:
168 self
.fail("%s(b'') raises SystemError: %s" % (n
, err
))
169 binascii
.crc_hqx(b
'', 0)
171 def test_no_binary_strings(self
):
172 # b2a_ must not accept strings
173 for f
in (binascii
.b2a_uu
, binascii
.b2a_base64
,
174 binascii
.b2a_hqx
, binascii
.b2a_qp
,
175 binascii
.hexlify
, binascii
.rlecode_hqx
,
176 binascii
.crc_hqx
, binascii
.crc32
):
177 self
.assertRaises(TypeError, f
, "test")
180 support
.run_unittest(BinASCIITest
)
182 if __name__
== "__main__":