blob: 54f392d4d696a5ab08cb50d1e26d728856f0abde [file] [log] [blame]
Walter Dörwald21d3a322003-05-01 17:45:56 +00001import unittest
Benjamin Petersonee8712c2008-05-20 21:35:26 +00002from test import support
Walter Dörwald21d3a322003-05-01 17:45:56 +00003import base64
Guido van Rossum4581ae52007-05-22 21:56:47 +00004import binascii
Vinay Sajipf9596182012-03-02 01:01:13 +00005import os
Victor Stinner479736b2010-05-25 21:12:34 +00006import sys
7import subprocess
Nick Coghlanfdf239a2013-10-03 00:43:22 +10008import struct
9from array import array
Raymond Hettinger2ae87532002-05-18 00:25:10 +000010
Ezio Melottib3aedd42010-11-20 19:04:17 +000011
Barry Warsaw4f019d32004-01-04 01:13:02 +000012class LegacyBase64TestCase(unittest.TestCase):
Nick Coghlanfdf239a2013-10-03 00:43:22 +100013
14 # Legacy API is not as permissive as the modern API
15 def check_type_errors(self, f):
16 self.assertRaises(TypeError, f, "")
17 self.assertRaises(TypeError, f, [])
18 multidimensional = memoryview(b"1234").cast('B', (2, 2))
19 self.assertRaises(TypeError, f, multidimensional)
20 int_data = memoryview(b"1234").cast('I')
21 self.assertRaises(TypeError, f, int_data)
22
Georg Brandlb54d8012009-06-04 09:11:51 +000023 def test_encodebytes(self):
Barry Warsaw4f019d32004-01-04 01:13:02 +000024 eq = self.assertEqual
Georg Brandlb54d8012009-06-04 09:11:51 +000025 eq(base64.encodebytes(b"www.python.org"), b"d3d3LnB5dGhvbi5vcmc=\n")
26 eq(base64.encodebytes(b"a"), b"YQ==\n")
27 eq(base64.encodebytes(b"ab"), b"YWI=\n")
28 eq(base64.encodebytes(b"abc"), b"YWJj\n")
29 eq(base64.encodebytes(b""), b"")
30 eq(base64.encodebytes(b"abcdefghijklmnopqrstuvwxyz"
Guido van Rossum4581ae52007-05-22 21:56:47 +000031 b"ABCDEFGHIJKLMNOPQRSTUVWXYZ"
32 b"0123456789!@#0^&*();:<>,. []{}"),
33 b"YWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXpBQkNE"
34 b"RUZHSElKS0xNTk9QUVJTVFVWV1hZWjAxMjM0\nNT"
35 b"Y3ODkhQCMwXiYqKCk7Ojw+LC4gW117fQ==\n")
Serhiy Storchaka017523c2013-04-28 15:53:08 +030036 # Non-bytes
37 eq(base64.encodebytes(bytearray(b'abc')), b'YWJj\n')
Nick Coghlanfdf239a2013-10-03 00:43:22 +100038 eq(base64.encodebytes(memoryview(b'abc')), b'YWJj\n')
39 eq(base64.encodebytes(array('B', b'abc')), b'YWJj\n')
40 self.check_type_errors(base64.encodebytes)
Guido van Rossumcb682582002-08-22 19:18:56 +000041
Georg Brandlb54d8012009-06-04 09:11:51 +000042 def test_decodebytes(self):
Barry Warsaw4f019d32004-01-04 01:13:02 +000043 eq = self.assertEqual
Georg Brandlb54d8012009-06-04 09:11:51 +000044 eq(base64.decodebytes(b"d3d3LnB5dGhvbi5vcmc=\n"), b"www.python.org")
45 eq(base64.decodebytes(b"YQ==\n"), b"a")
46 eq(base64.decodebytes(b"YWI=\n"), b"ab")
47 eq(base64.decodebytes(b"YWJj\n"), b"abc")
48 eq(base64.decodebytes(b"YWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXpBQkNE"
Guido van Rossum4581ae52007-05-22 21:56:47 +000049 b"RUZHSElKS0xNTk9QUVJTVFVWV1hZWjAxMjM0\nNT"
50 b"Y3ODkhQCMwXiYqKCk7Ojw+LC4gW117fQ==\n"),
51 b"abcdefghijklmnopqrstuvwxyz"
52 b"ABCDEFGHIJKLMNOPQRSTUVWXYZ"
53 b"0123456789!@#0^&*();:<>,. []{}")
Georg Brandlb54d8012009-06-04 09:11:51 +000054 eq(base64.decodebytes(b''), b'')
Serhiy Storchaka017523c2013-04-28 15:53:08 +030055 # Non-bytes
56 eq(base64.decodebytes(bytearray(b'YWJj\n')), b'abc')
Nick Coghlanfdf239a2013-10-03 00:43:22 +100057 eq(base64.decodebytes(memoryview(b'YWJj\n')), b'abc')
58 eq(base64.decodebytes(array('B', b'YWJj\n')), b'abc')
59 self.check_type_errors(base64.decodebytes)
Barry Warsaw4f019d32004-01-04 01:13:02 +000060
61 def test_encode(self):
62 eq = self.assertEqual
Serhiy Storchakaabac0a72013-04-28 15:56:11 +030063 from io import BytesIO, StringIO
Guido van Rossum34d19282007-08-09 01:03:29 +000064 infp = BytesIO(b'abcdefghijklmnopqrstuvwxyz'
65 b'ABCDEFGHIJKLMNOPQRSTUVWXYZ'
66 b'0123456789!@#0^&*();:<>,. []{}')
67 outfp = BytesIO()
Barry Warsaw4f019d32004-01-04 01:13:02 +000068 base64.encode(infp, outfp)
69 eq(outfp.getvalue(),
Guido van Rossum34d19282007-08-09 01:03:29 +000070 b'YWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXpBQkNE'
71 b'RUZHSElKS0xNTk9QUVJTVFVWV1hZWjAxMjM0\nNT'
72 b'Y3ODkhQCMwXiYqKCk7Ojw+LC4gW117fQ==\n')
Serhiy Storchakaabac0a72013-04-28 15:56:11 +030073 # Non-binary files
74 self.assertRaises(TypeError, base64.encode, StringIO('abc'), BytesIO())
75 self.assertRaises(TypeError, base64.encode, BytesIO(b'abc'), StringIO())
76 self.assertRaises(TypeError, base64.encode, StringIO('abc'), StringIO())
Barry Warsaw4f019d32004-01-04 01:13:02 +000077
78 def test_decode(self):
Serhiy Storchakaabac0a72013-04-28 15:56:11 +030079 from io import BytesIO, StringIO
Guido van Rossum34d19282007-08-09 01:03:29 +000080 infp = BytesIO(b'd3d3LnB5dGhvbi5vcmc=')
81 outfp = BytesIO()
Barry Warsaw4f019d32004-01-04 01:13:02 +000082 base64.decode(infp, outfp)
Guido van Rossum34d19282007-08-09 01:03:29 +000083 self.assertEqual(outfp.getvalue(), b'www.python.org')
Serhiy Storchakaabac0a72013-04-28 15:56:11 +030084 # Non-binary files
85 self.assertRaises(TypeError, base64.encode, StringIO('YWJj\n'), BytesIO())
86 self.assertRaises(TypeError, base64.encode, BytesIO(b'YWJj\n'), StringIO())
87 self.assertRaises(TypeError, base64.encode, StringIO('YWJj\n'), StringIO())
Barry Warsaw4f019d32004-01-04 01:13:02 +000088
Ezio Melottib3aedd42010-11-20 19:04:17 +000089
Barry Warsaw4f019d32004-01-04 01:13:02 +000090class BaseXYTestCase(unittest.TestCase):
Nick Coghlanfdf239a2013-10-03 00:43:22 +100091
92 # Modern API completely ignores exported dimension and format data and
93 # treats any buffer as a stream of bytes
94 def check_encode_type_errors(self, f):
95 self.assertRaises(TypeError, f, "")
96 self.assertRaises(TypeError, f, [])
97
98 def check_decode_type_errors(self, f):
99 self.assertRaises(TypeError, f, [])
100
101 def check_other_types(self, f, bytes_data, expected):
102 eq = self.assertEqual
103 eq(f(bytearray(bytes_data)), expected)
104 eq(f(memoryview(bytes_data)), expected)
105 eq(f(array('B', bytes_data)), expected)
106 self.check_nonbyte_element_format(base64.b64encode, bytes_data)
107 self.check_multidimensional(base64.b64encode, bytes_data)
108
109 def check_multidimensional(self, f, data):
110 padding = b"\x00" if len(data) % 2 else b""
111 bytes_data = data + padding # Make sure cast works
112 shape = (len(bytes_data) // 2, 2)
113 multidimensional = memoryview(bytes_data).cast('B', shape)
114 self.assertEqual(f(multidimensional), f(bytes_data))
115
116 def check_nonbyte_element_format(self, f, data):
117 padding = b"\x00" * ((4 - len(data)) % 4)
118 bytes_data = data + padding # Make sure cast works
119 int_data = memoryview(bytes_data).cast('I')
120 self.assertEqual(f(int_data), f(bytes_data))
121
122
Barry Warsaw4f019d32004-01-04 01:13:02 +0000123 def test_b64encode(self):
124 eq = self.assertEqual
125 # Test default alphabet
Guido van Rossum4581ae52007-05-22 21:56:47 +0000126 eq(base64.b64encode(b"www.python.org"), b"d3d3LnB5dGhvbi5vcmc=")
127 eq(base64.b64encode(b'\x00'), b'AA==')
128 eq(base64.b64encode(b"a"), b"YQ==")
129 eq(base64.b64encode(b"ab"), b"YWI=")
130 eq(base64.b64encode(b"abc"), b"YWJj")
131 eq(base64.b64encode(b""), b"")
132 eq(base64.b64encode(b"abcdefghijklmnopqrstuvwxyz"
133 b"ABCDEFGHIJKLMNOPQRSTUVWXYZ"
134 b"0123456789!@#0^&*();:<>,. []{}"),
135 b"YWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXpBQkNE"
136 b"RUZHSElKS0xNTk9QUVJTVFVWV1hZWjAxMjM0NT"
137 b"Y3ODkhQCMwXiYqKCk7Ojw+LC4gW117fQ==")
Barry Warsaw4f019d32004-01-04 01:13:02 +0000138 # Test with arbitrary alternative characters
Alexandre Vassalotti5209857f2008-05-03 04:39:38 +0000139 eq(base64.b64encode(b'\xd3V\xbeo\xf7\x1d', altchars=b'*$'), b'01a*b$cd')
Serhiy Storchaka017523c2013-04-28 15:53:08 +0300140 eq(base64.b64encode(b'\xd3V\xbeo\xf7\x1d', altchars=bytearray(b'*$')),
141 b'01a*b$cd')
Nick Coghlanfdf239a2013-10-03 00:43:22 +1000142 eq(base64.b64encode(b'\xd3V\xbeo\xf7\x1d', altchars=memoryview(b'*$')),
143 b'01a*b$cd')
144 eq(base64.b64encode(b'\xd3V\xbeo\xf7\x1d', altchars=array('B', b'*$')),
145 b'01a*b$cd')
146 # Non-bytes
147 self.check_other_types(base64.b64encode, b'abcd', b'YWJjZA==')
148 self.check_encode_type_errors(base64.b64encode)
149 self.assertRaises(TypeError, base64.b64encode, b"", altchars="*$")
Barry Warsaw4f019d32004-01-04 01:13:02 +0000150 # Test standard alphabet
Guido van Rossum4581ae52007-05-22 21:56:47 +0000151 eq(base64.standard_b64encode(b"www.python.org"), b"d3d3LnB5dGhvbi5vcmc=")
152 eq(base64.standard_b64encode(b"a"), b"YQ==")
153 eq(base64.standard_b64encode(b"ab"), b"YWI=")
154 eq(base64.standard_b64encode(b"abc"), b"YWJj")
155 eq(base64.standard_b64encode(b""), b"")
156 eq(base64.standard_b64encode(b"abcdefghijklmnopqrstuvwxyz"
157 b"ABCDEFGHIJKLMNOPQRSTUVWXYZ"
158 b"0123456789!@#0^&*();:<>,. []{}"),
159 b"YWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXpBQkNE"
160 b"RUZHSElKS0xNTk9QUVJTVFVWV1hZWjAxMjM0NT"
161 b"Y3ODkhQCMwXiYqKCk7Ojw+LC4gW117fQ==")
Serhiy Storchaka017523c2013-04-28 15:53:08 +0300162 # Non-bytes
Nick Coghlanfdf239a2013-10-03 00:43:22 +1000163 self.check_other_types(base64.standard_b64encode,
164 b'abcd', b'YWJjZA==')
165 self.check_encode_type_errors(base64.standard_b64encode)
Barry Warsaw4f019d32004-01-04 01:13:02 +0000166 # Test with 'URL safe' alternative characters
Guido van Rossum4581ae52007-05-22 21:56:47 +0000167 eq(base64.urlsafe_b64encode(b'\xd3V\xbeo\xf7\x1d'), b'01a-b_cd')
Serhiy Storchaka017523c2013-04-28 15:53:08 +0300168 # Non-bytes
Nick Coghlanfdf239a2013-10-03 00:43:22 +1000169 self.check_other_types(base64.urlsafe_b64encode,
170 b'\xd3V\xbeo\xf7\x1d', b'01a-b_cd')
171 self.check_encode_type_errors(base64.urlsafe_b64encode)
Barry Warsaw4f019d32004-01-04 01:13:02 +0000172
173 def test_b64decode(self):
174 eq = self.assertEqual
Antoine Pitrouea6b4d52012-02-20 19:30:23 +0100175
176 tests = {b"d3d3LnB5dGhvbi5vcmc=": b"www.python.org",
177 b'AA==': b'\x00',
178 b"YQ==": b"a",
179 b"YWI=": b"ab",
180 b"YWJj": b"abc",
181 b"YWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXpBQkNE"
182 b"RUZHSElKS0xNTk9QUVJTVFVWV1hZWjAxMjM0\nNT"
183 b"Y3ODkhQCMwXiYqKCk7Ojw+LC4gW117fQ==":
184
185 b"abcdefghijklmnopqrstuvwxyz"
186 b"ABCDEFGHIJKLMNOPQRSTUVWXYZ"
187 b"0123456789!@#0^&*();:<>,. []{}",
188 b'': b'',
189 }
190 for data, res in tests.items():
191 eq(base64.b64decode(data), res)
192 eq(base64.b64decode(data.decode('ascii')), res)
Serhiy Storchaka017523c2013-04-28 15:53:08 +0300193 # Non-bytes
Nick Coghlanfdf239a2013-10-03 00:43:22 +1000194 self.check_other_types(base64.b64decode, b"YWJj", b"abc")
195 self.check_decode_type_errors(base64.b64decode)
Antoine Pitrouea6b4d52012-02-20 19:30:23 +0100196
Barry Warsaw4f019d32004-01-04 01:13:02 +0000197 # Test with arbitrary alternative characters
Antoine Pitrouea6b4d52012-02-20 19:30:23 +0100198 tests_altchars = {(b'01a*b$cd', b'*$'): b'\xd3V\xbeo\xf7\x1d',
199 }
200 for (data, altchars), res in tests_altchars.items():
201 data_str = data.decode('ascii')
202 altchars_str = altchars.decode('ascii')
203
204 eq(base64.b64decode(data, altchars=altchars), res)
205 eq(base64.b64decode(data_str, altchars=altchars), res)
206 eq(base64.b64decode(data, altchars=altchars_str), res)
207 eq(base64.b64decode(data_str, altchars=altchars_str), res)
208
Barry Warsaw4f019d32004-01-04 01:13:02 +0000209 # Test standard alphabet
Antoine Pitrouea6b4d52012-02-20 19:30:23 +0100210 for data, res in tests.items():
211 eq(base64.standard_b64decode(data), res)
212 eq(base64.standard_b64decode(data.decode('ascii')), res)
Serhiy Storchaka017523c2013-04-28 15:53:08 +0300213 # Non-bytes
Nick Coghlanfdf239a2013-10-03 00:43:22 +1000214 self.check_other_types(base64.standard_b64decode, b"YWJj", b"abc")
215 self.check_decode_type_errors(base64.standard_b64decode)
Antoine Pitrouea6b4d52012-02-20 19:30:23 +0100216
Barry Warsaw4f019d32004-01-04 01:13:02 +0000217 # Test with 'URL safe' alternative characters
Antoine Pitrouea6b4d52012-02-20 19:30:23 +0100218 tests_urlsafe = {b'01a-b_cd': b'\xd3V\xbeo\xf7\x1d',
219 b'': b'',
220 }
221 for data, res in tests_urlsafe.items():
222 eq(base64.urlsafe_b64decode(data), res)
223 eq(base64.urlsafe_b64decode(data.decode('ascii')), res)
Serhiy Storchaka017523c2013-04-28 15:53:08 +0300224 # Non-bytes
Nick Coghlanfdf239a2013-10-03 00:43:22 +1000225 self.check_other_types(base64.urlsafe_b64decode, b'01a-b_cd',
226 b'\xd3V\xbeo\xf7\x1d')
227 self.check_decode_type_errors(base64.urlsafe_b64decode)
Barry Warsaw4f019d32004-01-04 01:13:02 +0000228
R. David Murray64951362010-11-11 20:09:20 +0000229 def test_b64decode_padding_error(self):
Guido van Rossum4581ae52007-05-22 21:56:47 +0000230 self.assertRaises(binascii.Error, base64.b64decode, b'abc')
Antoine Pitrouea6b4d52012-02-20 19:30:23 +0100231 self.assertRaises(binascii.Error, base64.b64decode, 'abc')
Barry Warsaw4f019d32004-01-04 01:13:02 +0000232
R. David Murray64951362010-11-11 20:09:20 +0000233 def test_b64decode_invalid_chars(self):
234 # issue 1466065: Test some invalid characters.
235 tests = ((b'%3d==', b'\xdd'),
236 (b'$3d==', b'\xdd'),
237 (b'[==', b''),
238 (b'YW]3=', b'am'),
239 (b'3{d==', b'\xdd'),
240 (b'3d}==', b'\xdd'),
241 (b'@@', b''),
242 (b'!', b''),
243 (b'YWJj\nYWI=', b'abcab'))
244 for bstr, res in tests:
Ezio Melottib3aedd42010-11-20 19:04:17 +0000245 self.assertEqual(base64.b64decode(bstr), res)
Antoine Pitrouea6b4d52012-02-20 19:30:23 +0100246 self.assertEqual(base64.b64decode(bstr.decode('ascii')), res)
R. David Murray64951362010-11-11 20:09:20 +0000247 with self.assertRaises(binascii.Error):
248 base64.b64decode(bstr, validate=True)
Antoine Pitroudff46fa2012-02-20 19:46:26 +0100249 with self.assertRaises(binascii.Error):
Antoine Pitrouea6b4d52012-02-20 19:30:23 +0100250 base64.b64decode(bstr.decode('ascii'), validate=True)
R. David Murray64951362010-11-11 20:09:20 +0000251
Barry Warsaw4f019d32004-01-04 01:13:02 +0000252 def test_b32encode(self):
253 eq = self.assertEqual
Guido van Rossum4581ae52007-05-22 21:56:47 +0000254 eq(base64.b32encode(b''), b'')
255 eq(base64.b32encode(b'\x00'), b'AA======')
256 eq(base64.b32encode(b'a'), b'ME======')
257 eq(base64.b32encode(b'ab'), b'MFRA====')
258 eq(base64.b32encode(b'abc'), b'MFRGG===')
259 eq(base64.b32encode(b'abcd'), b'MFRGGZA=')
260 eq(base64.b32encode(b'abcde'), b'MFRGGZDF')
Serhiy Storchaka017523c2013-04-28 15:53:08 +0300261 # Non-bytes
Nick Coghlanfdf239a2013-10-03 00:43:22 +1000262 self.check_other_types(base64.b32encode, b'abcd', b'MFRGGZA=')
263 self.check_encode_type_errors(base64.b32encode)
Barry Warsaw4f019d32004-01-04 01:13:02 +0000264
265 def test_b32decode(self):
266 eq = self.assertEqual
Antoine Pitrouea6b4d52012-02-20 19:30:23 +0100267 tests = {b'': b'',
268 b'AA======': b'\x00',
269 b'ME======': b'a',
270 b'MFRA====': b'ab',
271 b'MFRGG===': b'abc',
272 b'MFRGGZA=': b'abcd',
273 b'MFRGGZDF': b'abcde',
274 }
275 for data, res in tests.items():
276 eq(base64.b32decode(data), res)
277 eq(base64.b32decode(data.decode('ascii')), res)
Serhiy Storchaka017523c2013-04-28 15:53:08 +0300278 # Non-bytes
Nick Coghlanfdf239a2013-10-03 00:43:22 +1000279 self.check_other_types(base64.b32decode, b'MFRGG===', b"abc")
280 self.check_decode_type_errors(base64.b32decode)
Barry Warsaw4f019d32004-01-04 01:13:02 +0000281
282 def test_b32decode_casefold(self):
283 eq = self.assertEqual
Antoine Pitrouea6b4d52012-02-20 19:30:23 +0100284 tests = {b'': b'',
285 b'ME======': b'a',
286 b'MFRA====': b'ab',
287 b'MFRGG===': b'abc',
288 b'MFRGGZA=': b'abcd',
289 b'MFRGGZDF': b'abcde',
290 # Lower cases
291 b'me======': b'a',
292 b'mfra====': b'ab',
293 b'mfrgg===': b'abc',
294 b'mfrggza=': b'abcd',
295 b'mfrggzdf': b'abcde',
296 }
297
298 for data, res in tests.items():
299 eq(base64.b32decode(data, True), res)
300 eq(base64.b32decode(data.decode('ascii'), True), res)
301
Serhiy Storchakaea2b4902013-05-28 15:27:29 +0300302 self.assertRaises(binascii.Error, base64.b32decode, b'me======')
303 self.assertRaises(binascii.Error, base64.b32decode, 'me======')
Antoine Pitrouea6b4d52012-02-20 19:30:23 +0100304
Barry Warsaw4f019d32004-01-04 01:13:02 +0000305 # Mapping zero and one
Guido van Rossum4581ae52007-05-22 21:56:47 +0000306 eq(base64.b32decode(b'MLO23456'), b'b\xdd\xad\xf3\xbe')
Antoine Pitrouea6b4d52012-02-20 19:30:23 +0100307 eq(base64.b32decode('MLO23456'), b'b\xdd\xad\xf3\xbe')
308
309 map_tests = {(b'M1023456', b'L'): b'b\xdd\xad\xf3\xbe',
310 (b'M1023456', b'I'): b'b\x1d\xad\xf3\xbe',
311 }
312 for (data, map01), res in map_tests.items():
313 data_str = data.decode('ascii')
314 map01_str = map01.decode('ascii')
315
316 eq(base64.b32decode(data, map01=map01), res)
317 eq(base64.b32decode(data_str, map01=map01), res)
318 eq(base64.b32decode(data, map01=map01_str), res)
319 eq(base64.b32decode(data_str, map01=map01_str), res)
Serhiy Storchakaea2b4902013-05-28 15:27:29 +0300320 self.assertRaises(binascii.Error, base64.b32decode, data)
321 self.assertRaises(binascii.Error, base64.b32decode, data_str)
Barry Warsaw4f019d32004-01-04 01:13:02 +0000322
323 def test_b32decode_error(self):
Serhiy Storchakaea2b4902013-05-28 15:27:29 +0300324 for data in [b'abc', b'ABCDEF==', b'==ABCDEF']:
Antoine Pitrouea6b4d52012-02-20 19:30:23 +0100325 with self.assertRaises(binascii.Error):
326 base64.b32decode(data)
Antoine Pitroudff46fa2012-02-20 19:46:26 +0100327 with self.assertRaises(binascii.Error):
Antoine Pitrouea6b4d52012-02-20 19:30:23 +0100328 base64.b32decode(data.decode('ascii'))
Barry Warsaw4f019d32004-01-04 01:13:02 +0000329
330 def test_b16encode(self):
331 eq = self.assertEqual
Guido van Rossum4581ae52007-05-22 21:56:47 +0000332 eq(base64.b16encode(b'\x01\x02\xab\xcd\xef'), b'0102ABCDEF')
333 eq(base64.b16encode(b'\x00'), b'00')
Serhiy Storchaka017523c2013-04-28 15:53:08 +0300334 # Non-bytes
Nick Coghlanfdf239a2013-10-03 00:43:22 +1000335 self.check_other_types(base64.b16encode, b'\x01\x02\xab\xcd\xef',
336 b'0102ABCDEF')
337 self.check_encode_type_errors(base64.b16encode)
Barry Warsaw4f019d32004-01-04 01:13:02 +0000338
339 def test_b16decode(self):
340 eq = self.assertEqual
Guido van Rossum4581ae52007-05-22 21:56:47 +0000341 eq(base64.b16decode(b'0102ABCDEF'), b'\x01\x02\xab\xcd\xef')
Antoine Pitrouea6b4d52012-02-20 19:30:23 +0100342 eq(base64.b16decode('0102ABCDEF'), b'\x01\x02\xab\xcd\xef')
Guido van Rossum4581ae52007-05-22 21:56:47 +0000343 eq(base64.b16decode(b'00'), b'\x00')
Antoine Pitrouea6b4d52012-02-20 19:30:23 +0100344 eq(base64.b16decode('00'), b'\x00')
Barry Warsaw4f019d32004-01-04 01:13:02 +0000345 # Lower case is not allowed without a flag
Guido van Rossum4581ae52007-05-22 21:56:47 +0000346 self.assertRaises(binascii.Error, base64.b16decode, b'0102abcdef')
Antoine Pitrouea6b4d52012-02-20 19:30:23 +0100347 self.assertRaises(binascii.Error, base64.b16decode, '0102abcdef')
Barry Warsaw4f019d32004-01-04 01:13:02 +0000348 # Case fold
Guido van Rossum4581ae52007-05-22 21:56:47 +0000349 eq(base64.b16decode(b'0102abcdef', True), b'\x01\x02\xab\xcd\xef')
Antoine Pitrouea6b4d52012-02-20 19:30:23 +0100350 eq(base64.b16decode('0102abcdef', True), b'\x01\x02\xab\xcd\xef')
Serhiy Storchaka017523c2013-04-28 15:53:08 +0300351 # Non-bytes
Nick Coghlanfdf239a2013-10-03 00:43:22 +1000352 self.check_other_types(base64.b16decode, b"0102ABCDEF",
353 b'\x01\x02\xab\xcd\xef')
354 self.check_decode_type_errors(base64.b16decode)
355 eq(base64.b16decode(bytearray(b"0102abcdef"), True),
356 b'\x01\x02\xab\xcd\xef')
357 eq(base64.b16decode(memoryview(b"0102abcdef"), True),
358 b'\x01\x02\xab\xcd\xef')
359 eq(base64.b16decode(array('B', b"0102abcdef"), True),
360 b'\x01\x02\xab\xcd\xef')
Antoine Pitrouea6b4d52012-02-20 19:30:23 +0100361
362 def test_decode_nonascii_str(self):
363 decode_funcs = (base64.b64decode,
364 base64.standard_b64decode,
365 base64.urlsafe_b64decode,
366 base64.b32decode,
367 base64.b16decode)
368 for f in decode_funcs:
369 self.assertRaises(ValueError, f, 'with non-ascii \xcb')
Guido van Rossum4581ae52007-05-22 21:56:47 +0000370
371 def test_ErrorHeritage(self):
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000372 self.assertTrue(issubclass(binascii.Error, ValueError))
Barry Warsaw4f019d32004-01-04 01:13:02 +0000373
374
Ezio Melottib3aedd42010-11-20 19:04:17 +0000375
Victor Stinner479736b2010-05-25 21:12:34 +0000376class TestMain(unittest.TestCase):
Vinay Sajipf9596182012-03-02 01:01:13 +0000377 def tearDown(self):
378 if os.path.exists(support.TESTFN):
379 os.unlink(support.TESTFN)
380
Victor Stinner479736b2010-05-25 21:12:34 +0000381 def get_output(self, *args, **options):
382 args = (sys.executable, '-m', 'base64') + args
383 return subprocess.check_output(args, **options)
384
385 def test_encode_decode(self):
386 output = self.get_output('-t')
387 self.assertSequenceEqual(output.splitlines(), (
388 b"b'Aladdin:open sesame'",
389 br"b'QWxhZGRpbjpvcGVuIHNlc2FtZQ==\n'",
390 b"b'Aladdin:open sesame'",
391 ))
392
393 def test_encode_file(self):
394 with open(support.TESTFN, 'wb') as fp:
395 fp.write(b'a\xffb\n')
396
397 output = self.get_output('-e', support.TESTFN)
Ezio Melottib3aedd42010-11-20 19:04:17 +0000398 self.assertEqual(output.rstrip(), b'Yf9iCg==')
Victor Stinner479736b2010-05-25 21:12:34 +0000399
400 with open(support.TESTFN, 'rb') as fp:
401 output = self.get_output('-e', stdin=fp)
Ezio Melottib3aedd42010-11-20 19:04:17 +0000402 self.assertEqual(output.rstrip(), b'Yf9iCg==')
Victor Stinner479736b2010-05-25 21:12:34 +0000403
404 def test_decode(self):
405 with open(support.TESTFN, 'wb') as fp:
406 fp.write(b'Yf9iCg==')
407 output = self.get_output('-d', support.TESTFN)
Ezio Melottib3aedd42010-11-20 19:04:17 +0000408 self.assertEqual(output.rstrip(), b'a\xffb')
Victor Stinner479736b2010-05-25 21:12:34 +0000409
410
Ezio Melottib3aedd42010-11-20 19:04:17 +0000411
Raymond Hettinger2ae87532002-05-18 00:25:10 +0000412def test_main():
Benjamin Petersonee8712c2008-05-20 21:35:26 +0000413 support.run_unittest(__name__)
Barry Warsaw4f019d32004-01-04 01:13:02 +0000414
415if __name__ == '__main__':
Guido van Rossumd8faa362007-04-27 19:54:29 +0000416 test_main()