blob: 25694762a98c1c7bc36f8951b2c515ede6987bdd [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
Raymond Hettinger2ae87532002-05-18 00:25:10 +00008
Raymond Hettinger2ae87532002-05-18 00:25:10 +00009
Ezio Melottib3aedd42010-11-20 19:04:17 +000010
Barry Warsaw4f019d32004-01-04 01:13:02 +000011class LegacyBase64TestCase(unittest.TestCase):
Georg Brandlb54d8012009-06-04 09:11:51 +000012 def test_encodebytes(self):
Barry Warsaw4f019d32004-01-04 01:13:02 +000013 eq = self.assertEqual
Georg Brandlb54d8012009-06-04 09:11:51 +000014 eq(base64.encodebytes(b"www.python.org"), b"d3d3LnB5dGhvbi5vcmc=\n")
15 eq(base64.encodebytes(b"a"), b"YQ==\n")
16 eq(base64.encodebytes(b"ab"), b"YWI=\n")
17 eq(base64.encodebytes(b"abc"), b"YWJj\n")
18 eq(base64.encodebytes(b""), b"")
19 eq(base64.encodebytes(b"abcdefghijklmnopqrstuvwxyz"
Guido van Rossum4581ae52007-05-22 21:56:47 +000020 b"ABCDEFGHIJKLMNOPQRSTUVWXYZ"
21 b"0123456789!@#0^&*();:<>,. []{}"),
22 b"YWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXpBQkNE"
23 b"RUZHSElKS0xNTk9QUVJTVFVWV1hZWjAxMjM0\nNT"
24 b"Y3ODkhQCMwXiYqKCk7Ojw+LC4gW117fQ==\n")
Georg Brandlb54d8012009-06-04 09:11:51 +000025 self.assertRaises(TypeError, base64.encodebytes, "")
Guido van Rossumcb682582002-08-22 19:18:56 +000026
Georg Brandlb54d8012009-06-04 09:11:51 +000027 def test_decodebytes(self):
Barry Warsaw4f019d32004-01-04 01:13:02 +000028 eq = self.assertEqual
Georg Brandlb54d8012009-06-04 09:11:51 +000029 eq(base64.decodebytes(b"d3d3LnB5dGhvbi5vcmc=\n"), b"www.python.org")
30 eq(base64.decodebytes(b"YQ==\n"), b"a")
31 eq(base64.decodebytes(b"YWI=\n"), b"ab")
32 eq(base64.decodebytes(b"YWJj\n"), b"abc")
33 eq(base64.decodebytes(b"YWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXpBQkNE"
Guido van Rossum4581ae52007-05-22 21:56:47 +000034 b"RUZHSElKS0xNTk9QUVJTVFVWV1hZWjAxMjM0\nNT"
35 b"Y3ODkhQCMwXiYqKCk7Ojw+LC4gW117fQ==\n"),
36 b"abcdefghijklmnopqrstuvwxyz"
37 b"ABCDEFGHIJKLMNOPQRSTUVWXYZ"
38 b"0123456789!@#0^&*();:<>,. []{}")
Georg Brandlb54d8012009-06-04 09:11:51 +000039 eq(base64.decodebytes(b''), b'')
40 self.assertRaises(TypeError, base64.decodebytes, "")
Barry Warsaw4f019d32004-01-04 01:13:02 +000041
42 def test_encode(self):
43 eq = self.assertEqual
Guido van Rossum34d19282007-08-09 01:03:29 +000044 from io import BytesIO
45 infp = BytesIO(b'abcdefghijklmnopqrstuvwxyz'
46 b'ABCDEFGHIJKLMNOPQRSTUVWXYZ'
47 b'0123456789!@#0^&*();:<>,. []{}')
48 outfp = BytesIO()
Barry Warsaw4f019d32004-01-04 01:13:02 +000049 base64.encode(infp, outfp)
50 eq(outfp.getvalue(),
Guido van Rossum34d19282007-08-09 01:03:29 +000051 b'YWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXpBQkNE'
52 b'RUZHSElKS0xNTk9QUVJTVFVWV1hZWjAxMjM0\nNT'
53 b'Y3ODkhQCMwXiYqKCk7Ojw+LC4gW117fQ==\n')
Barry Warsaw4f019d32004-01-04 01:13:02 +000054
55 def test_decode(self):
Guido van Rossum34d19282007-08-09 01:03:29 +000056 from io import BytesIO
57 infp = BytesIO(b'd3d3LnB5dGhvbi5vcmc=')
58 outfp = BytesIO()
Barry Warsaw4f019d32004-01-04 01:13:02 +000059 base64.decode(infp, outfp)
Guido van Rossum34d19282007-08-09 01:03:29 +000060 self.assertEqual(outfp.getvalue(), b'www.python.org')
Barry Warsaw4f019d32004-01-04 01:13:02 +000061
Ezio Melottib3aedd42010-11-20 19:04:17 +000062
Barry Warsaw4f019d32004-01-04 01:13:02 +000063class BaseXYTestCase(unittest.TestCase):
64 def test_b64encode(self):
65 eq = self.assertEqual
66 # Test default alphabet
Guido van Rossum4581ae52007-05-22 21:56:47 +000067 eq(base64.b64encode(b"www.python.org"), b"d3d3LnB5dGhvbi5vcmc=")
68 eq(base64.b64encode(b'\x00'), b'AA==')
69 eq(base64.b64encode(b"a"), b"YQ==")
70 eq(base64.b64encode(b"ab"), b"YWI=")
71 eq(base64.b64encode(b"abc"), b"YWJj")
72 eq(base64.b64encode(b""), b"")
73 eq(base64.b64encode(b"abcdefghijklmnopqrstuvwxyz"
74 b"ABCDEFGHIJKLMNOPQRSTUVWXYZ"
75 b"0123456789!@#0^&*();:<>,. []{}"),
76 b"YWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXpBQkNE"
77 b"RUZHSElKS0xNTk9QUVJTVFVWV1hZWjAxMjM0NT"
78 b"Y3ODkhQCMwXiYqKCk7Ojw+LC4gW117fQ==")
Barry Warsaw4f019d32004-01-04 01:13:02 +000079 # Test with arbitrary alternative characters
Alexandre Vassalotti5209857f2008-05-03 04:39:38 +000080 eq(base64.b64encode(b'\xd3V\xbeo\xf7\x1d', altchars=b'*$'), b'01a*b$cd')
81 # Check if passing a str object raises an error
82 self.assertRaises(TypeError, base64.b64encode, "")
83 self.assertRaises(TypeError, base64.b64encode, b"", altchars="")
Barry Warsaw4f019d32004-01-04 01:13:02 +000084 # Test standard alphabet
Guido van Rossum4581ae52007-05-22 21:56:47 +000085 eq(base64.standard_b64encode(b"www.python.org"), b"d3d3LnB5dGhvbi5vcmc=")
86 eq(base64.standard_b64encode(b"a"), b"YQ==")
87 eq(base64.standard_b64encode(b"ab"), b"YWI=")
88 eq(base64.standard_b64encode(b"abc"), b"YWJj")
89 eq(base64.standard_b64encode(b""), b"")
90 eq(base64.standard_b64encode(b"abcdefghijklmnopqrstuvwxyz"
91 b"ABCDEFGHIJKLMNOPQRSTUVWXYZ"
92 b"0123456789!@#0^&*();:<>,. []{}"),
93 b"YWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXpBQkNE"
94 b"RUZHSElKS0xNTk9QUVJTVFVWV1hZWjAxMjM0NT"
95 b"Y3ODkhQCMwXiYqKCk7Ojw+LC4gW117fQ==")
Alexandre Vassalotti5209857f2008-05-03 04:39:38 +000096 # Check if passing a str object raises an error
97 self.assertRaises(TypeError, base64.standard_b64encode, "")
98 self.assertRaises(TypeError, base64.standard_b64encode, b"", altchars="")
Barry Warsaw4f019d32004-01-04 01:13:02 +000099 # Test with 'URL safe' alternative characters
Guido van Rossum4581ae52007-05-22 21:56:47 +0000100 eq(base64.urlsafe_b64encode(b'\xd3V\xbeo\xf7\x1d'), b'01a-b_cd')
Alexandre Vassalotti5209857f2008-05-03 04:39:38 +0000101 # Check if passing a str object raises an error
102 self.assertRaises(TypeError, base64.urlsafe_b64encode, "")
Barry Warsaw4f019d32004-01-04 01:13:02 +0000103
104 def test_b64decode(self):
105 eq = self.assertEqual
Antoine Pitrouea6b4d52012-02-20 19:30:23 +0100106
107 tests = {b"d3d3LnB5dGhvbi5vcmc=": b"www.python.org",
108 b'AA==': b'\x00',
109 b"YQ==": b"a",
110 b"YWI=": b"ab",
111 b"YWJj": b"abc",
112 b"YWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXpBQkNE"
113 b"RUZHSElKS0xNTk9QUVJTVFVWV1hZWjAxMjM0\nNT"
114 b"Y3ODkhQCMwXiYqKCk7Ojw+LC4gW117fQ==":
115
116 b"abcdefghijklmnopqrstuvwxyz"
117 b"ABCDEFGHIJKLMNOPQRSTUVWXYZ"
118 b"0123456789!@#0^&*();:<>,. []{}",
119 b'': b'',
120 }
121 for data, res in tests.items():
122 eq(base64.b64decode(data), res)
123 eq(base64.b64decode(data.decode('ascii')), res)
124
Barry Warsaw4f019d32004-01-04 01:13:02 +0000125 # Test with arbitrary alternative characters
Antoine Pitrouea6b4d52012-02-20 19:30:23 +0100126 tests_altchars = {(b'01a*b$cd', b'*$'): b'\xd3V\xbeo\xf7\x1d',
127 }
128 for (data, altchars), res in tests_altchars.items():
129 data_str = data.decode('ascii')
130 altchars_str = altchars.decode('ascii')
131
132 eq(base64.b64decode(data, altchars=altchars), res)
133 eq(base64.b64decode(data_str, altchars=altchars), res)
134 eq(base64.b64decode(data, altchars=altchars_str), res)
135 eq(base64.b64decode(data_str, altchars=altchars_str), res)
136
Barry Warsaw4f019d32004-01-04 01:13:02 +0000137 # Test standard alphabet
Antoine Pitrouea6b4d52012-02-20 19:30:23 +0100138 for data, res in tests.items():
139 eq(base64.standard_b64decode(data), res)
140 eq(base64.standard_b64decode(data.decode('ascii')), res)
141
Barry Warsaw4f019d32004-01-04 01:13:02 +0000142 # Test with 'URL safe' alternative characters
Antoine Pitrouea6b4d52012-02-20 19:30:23 +0100143 tests_urlsafe = {b'01a-b_cd': b'\xd3V\xbeo\xf7\x1d',
144 b'': b'',
145 }
146 for data, res in tests_urlsafe.items():
147 eq(base64.urlsafe_b64decode(data), res)
148 eq(base64.urlsafe_b64decode(data.decode('ascii')), res)
Barry Warsaw4f019d32004-01-04 01:13:02 +0000149
R. David Murray64951362010-11-11 20:09:20 +0000150 def test_b64decode_padding_error(self):
Guido van Rossum4581ae52007-05-22 21:56:47 +0000151 self.assertRaises(binascii.Error, base64.b64decode, b'abc')
Antoine Pitrouea6b4d52012-02-20 19:30:23 +0100152 self.assertRaises(binascii.Error, base64.b64decode, 'abc')
Barry Warsaw4f019d32004-01-04 01:13:02 +0000153
R. David Murray64951362010-11-11 20:09:20 +0000154 def test_b64decode_invalid_chars(self):
155 # issue 1466065: Test some invalid characters.
156 tests = ((b'%3d==', b'\xdd'),
157 (b'$3d==', b'\xdd'),
158 (b'[==', b''),
159 (b'YW]3=', b'am'),
160 (b'3{d==', b'\xdd'),
161 (b'3d}==', b'\xdd'),
162 (b'@@', b''),
163 (b'!', b''),
164 (b'YWJj\nYWI=', b'abcab'))
165 for bstr, res in tests:
Ezio Melottib3aedd42010-11-20 19:04:17 +0000166 self.assertEqual(base64.b64decode(bstr), res)
Antoine Pitrouea6b4d52012-02-20 19:30:23 +0100167 self.assertEqual(base64.b64decode(bstr.decode('ascii')), res)
R. David Murray64951362010-11-11 20:09:20 +0000168 with self.assertRaises(binascii.Error):
169 base64.b64decode(bstr, validate=True)
Antoine Pitroudff46fa2012-02-20 19:46:26 +0100170 with self.assertRaises(binascii.Error):
Antoine Pitrouea6b4d52012-02-20 19:30:23 +0100171 base64.b64decode(bstr.decode('ascii'), validate=True)
R. David Murray64951362010-11-11 20:09:20 +0000172
Barry Warsaw4f019d32004-01-04 01:13:02 +0000173 def test_b32encode(self):
174 eq = self.assertEqual
Guido van Rossum4581ae52007-05-22 21:56:47 +0000175 eq(base64.b32encode(b''), b'')
176 eq(base64.b32encode(b'\x00'), b'AA======')
177 eq(base64.b32encode(b'a'), b'ME======')
178 eq(base64.b32encode(b'ab'), b'MFRA====')
179 eq(base64.b32encode(b'abc'), b'MFRGG===')
180 eq(base64.b32encode(b'abcd'), b'MFRGGZA=')
181 eq(base64.b32encode(b'abcde'), b'MFRGGZDF')
Alexandre Vassalotti5209857f2008-05-03 04:39:38 +0000182 self.assertRaises(TypeError, base64.b32encode, "")
Barry Warsaw4f019d32004-01-04 01:13:02 +0000183
184 def test_b32decode(self):
185 eq = self.assertEqual
Antoine Pitrouea6b4d52012-02-20 19:30:23 +0100186 tests = {b'': b'',
187 b'AA======': b'\x00',
188 b'ME======': b'a',
189 b'MFRA====': b'ab',
190 b'MFRGG===': b'abc',
191 b'MFRGGZA=': b'abcd',
192 b'MFRGGZDF': b'abcde',
193 }
194 for data, res in tests.items():
195 eq(base64.b32decode(data), res)
196 eq(base64.b32decode(data.decode('ascii')), res)
Barry Warsaw4f019d32004-01-04 01:13:02 +0000197
198 def test_b32decode_casefold(self):
199 eq = self.assertEqual
Antoine Pitrouea6b4d52012-02-20 19:30:23 +0100200 tests = {b'': b'',
201 b'ME======': b'a',
202 b'MFRA====': b'ab',
203 b'MFRGG===': b'abc',
204 b'MFRGGZA=': b'abcd',
205 b'MFRGGZDF': b'abcde',
206 # Lower cases
207 b'me======': b'a',
208 b'mfra====': b'ab',
209 b'mfrgg===': b'abc',
210 b'mfrggza=': b'abcd',
211 b'mfrggzdf': b'abcde',
212 }
213
214 for data, res in tests.items():
215 eq(base64.b32decode(data, True), res)
216 eq(base64.b32decode(data.decode('ascii'), True), res)
217
Guido van Rossum4581ae52007-05-22 21:56:47 +0000218 self.assertRaises(TypeError, base64.b32decode, b'me======')
Antoine Pitrouea6b4d52012-02-20 19:30:23 +0100219 self.assertRaises(TypeError, base64.b32decode, 'me======')
220
Barry Warsaw4f019d32004-01-04 01:13:02 +0000221 # Mapping zero and one
Guido van Rossum4581ae52007-05-22 21:56:47 +0000222 eq(base64.b32decode(b'MLO23456'), b'b\xdd\xad\xf3\xbe')
Antoine Pitrouea6b4d52012-02-20 19:30:23 +0100223 eq(base64.b32decode('MLO23456'), b'b\xdd\xad\xf3\xbe')
224
225 map_tests = {(b'M1023456', b'L'): b'b\xdd\xad\xf3\xbe',
226 (b'M1023456', b'I'): b'b\x1d\xad\xf3\xbe',
227 }
228 for (data, map01), res in map_tests.items():
229 data_str = data.decode('ascii')
230 map01_str = map01.decode('ascii')
231
232 eq(base64.b32decode(data, map01=map01), res)
233 eq(base64.b32decode(data_str, map01=map01), res)
234 eq(base64.b32decode(data, map01=map01_str), res)
235 eq(base64.b32decode(data_str, map01=map01_str), res)
Barry Warsaw4f019d32004-01-04 01:13:02 +0000236
237 def test_b32decode_error(self):
Antoine Pitrouea6b4d52012-02-20 19:30:23 +0100238 for data in [b'abc', b'ABCDEF==']:
239 with self.assertRaises(binascii.Error):
240 base64.b32decode(data)
Antoine Pitroudff46fa2012-02-20 19:46:26 +0100241 with self.assertRaises(binascii.Error):
Antoine Pitrouea6b4d52012-02-20 19:30:23 +0100242 base64.b32decode(data.decode('ascii'))
Barry Warsaw4f019d32004-01-04 01:13:02 +0000243
244 def test_b16encode(self):
245 eq = self.assertEqual
Guido van Rossum4581ae52007-05-22 21:56:47 +0000246 eq(base64.b16encode(b'\x01\x02\xab\xcd\xef'), b'0102ABCDEF')
247 eq(base64.b16encode(b'\x00'), b'00')
Alexandre Vassalotti5209857f2008-05-03 04:39:38 +0000248 self.assertRaises(TypeError, base64.b16encode, "")
Barry Warsaw4f019d32004-01-04 01:13:02 +0000249
250 def test_b16decode(self):
251 eq = self.assertEqual
Guido van Rossum4581ae52007-05-22 21:56:47 +0000252 eq(base64.b16decode(b'0102ABCDEF'), b'\x01\x02\xab\xcd\xef')
Antoine Pitrouea6b4d52012-02-20 19:30:23 +0100253 eq(base64.b16decode('0102ABCDEF'), b'\x01\x02\xab\xcd\xef')
Guido van Rossum4581ae52007-05-22 21:56:47 +0000254 eq(base64.b16decode(b'00'), b'\x00')
Antoine Pitrouea6b4d52012-02-20 19:30:23 +0100255 eq(base64.b16decode('00'), b'\x00')
Barry Warsaw4f019d32004-01-04 01:13:02 +0000256 # Lower case is not allowed without a flag
Guido van Rossum4581ae52007-05-22 21:56:47 +0000257 self.assertRaises(binascii.Error, base64.b16decode, b'0102abcdef')
Antoine Pitrouea6b4d52012-02-20 19:30:23 +0100258 self.assertRaises(binascii.Error, base64.b16decode, '0102abcdef')
Barry Warsaw4f019d32004-01-04 01:13:02 +0000259 # Case fold
Guido van Rossum4581ae52007-05-22 21:56:47 +0000260 eq(base64.b16decode(b'0102abcdef', True), b'\x01\x02\xab\xcd\xef')
Antoine Pitrouea6b4d52012-02-20 19:30:23 +0100261 eq(base64.b16decode('0102abcdef', True), b'\x01\x02\xab\xcd\xef')
262
263 def test_decode_nonascii_str(self):
264 decode_funcs = (base64.b64decode,
265 base64.standard_b64decode,
266 base64.urlsafe_b64decode,
267 base64.b32decode,
268 base64.b16decode)
269 for f in decode_funcs:
270 self.assertRaises(ValueError, f, 'with non-ascii \xcb')
Guido van Rossum4581ae52007-05-22 21:56:47 +0000271
272 def test_ErrorHeritage(self):
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000273 self.assertTrue(issubclass(binascii.Error, ValueError))
Barry Warsaw4f019d32004-01-04 01:13:02 +0000274
275
Ezio Melottib3aedd42010-11-20 19:04:17 +0000276
Victor Stinner479736b2010-05-25 21:12:34 +0000277class TestMain(unittest.TestCase):
Vinay Sajipf9596182012-03-02 01:01:13 +0000278 def tearDown(self):
279 if os.path.exists(support.TESTFN):
280 os.unlink(support.TESTFN)
281
Victor Stinner479736b2010-05-25 21:12:34 +0000282 def get_output(self, *args, **options):
283 args = (sys.executable, '-m', 'base64') + args
284 return subprocess.check_output(args, **options)
285
286 def test_encode_decode(self):
287 output = self.get_output('-t')
288 self.assertSequenceEqual(output.splitlines(), (
289 b"b'Aladdin:open sesame'",
290 br"b'QWxhZGRpbjpvcGVuIHNlc2FtZQ==\n'",
291 b"b'Aladdin:open sesame'",
292 ))
293
294 def test_encode_file(self):
295 with open(support.TESTFN, 'wb') as fp:
296 fp.write(b'a\xffb\n')
297
298 output = self.get_output('-e', support.TESTFN)
Ezio Melottib3aedd42010-11-20 19:04:17 +0000299 self.assertEqual(output.rstrip(), b'Yf9iCg==')
Victor Stinner479736b2010-05-25 21:12:34 +0000300
301 with open(support.TESTFN, 'rb') as fp:
302 output = self.get_output('-e', stdin=fp)
Ezio Melottib3aedd42010-11-20 19:04:17 +0000303 self.assertEqual(output.rstrip(), b'Yf9iCg==')
Victor Stinner479736b2010-05-25 21:12:34 +0000304
305 def test_decode(self):
306 with open(support.TESTFN, 'wb') as fp:
307 fp.write(b'Yf9iCg==')
308 output = self.get_output('-d', support.TESTFN)
Ezio Melottib3aedd42010-11-20 19:04:17 +0000309 self.assertEqual(output.rstrip(), b'a\xffb')
Victor Stinner479736b2010-05-25 21:12:34 +0000310
311
Ezio Melottib3aedd42010-11-20 19:04:17 +0000312
Raymond Hettinger2ae87532002-05-18 00:25:10 +0000313def test_main():
Benjamin Petersonee8712c2008-05-20 21:35:26 +0000314 support.run_unittest(__name__)
Barry Warsaw4f019d32004-01-04 01:13:02 +0000315
316if __name__ == '__main__':
Guido van Rossumd8faa362007-04-27 19:54:29 +0000317 test_main()