blob: 228a0fb23dd2babb1452aac4791cebfdb40e13c2 [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
Victor Stinner479736b2010-05-25 21:12:34 +00005import sys
6import subprocess
Raymond Hettinger2ae87532002-05-18 00:25:10 +00007
Raymond Hettinger2ae87532002-05-18 00:25:10 +00008
Barry Warsaw4f019d32004-01-04 01:13:02 +00009
10class LegacyBase64TestCase(unittest.TestCase):
Georg Brandlb54d8012009-06-04 09:11:51 +000011 def test_encodebytes(self):
Barry Warsaw4f019d32004-01-04 01:13:02 +000012 eq = self.assertEqual
Georg Brandlb54d8012009-06-04 09:11:51 +000013 eq(base64.encodebytes(b"www.python.org"), b"d3d3LnB5dGhvbi5vcmc=\n")
14 eq(base64.encodebytes(b"a"), b"YQ==\n")
15 eq(base64.encodebytes(b"ab"), b"YWI=\n")
16 eq(base64.encodebytes(b"abc"), b"YWJj\n")
17 eq(base64.encodebytes(b""), b"")
18 eq(base64.encodebytes(b"abcdefghijklmnopqrstuvwxyz"
Guido van Rossum4581ae52007-05-22 21:56:47 +000019 b"ABCDEFGHIJKLMNOPQRSTUVWXYZ"
20 b"0123456789!@#0^&*();:<>,. []{}"),
21 b"YWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXpBQkNE"
22 b"RUZHSElKS0xNTk9QUVJTVFVWV1hZWjAxMjM0\nNT"
23 b"Y3ODkhQCMwXiYqKCk7Ojw+LC4gW117fQ==\n")
Georg Brandlb54d8012009-06-04 09:11:51 +000024 self.assertRaises(TypeError, base64.encodebytes, "")
Guido van Rossumcb682582002-08-22 19:18:56 +000025
Georg Brandlb54d8012009-06-04 09:11:51 +000026 def test_decodebytes(self):
Barry Warsaw4f019d32004-01-04 01:13:02 +000027 eq = self.assertEqual
Georg Brandlb54d8012009-06-04 09:11:51 +000028 eq(base64.decodebytes(b"d3d3LnB5dGhvbi5vcmc=\n"), b"www.python.org")
29 eq(base64.decodebytes(b"YQ==\n"), b"a")
30 eq(base64.decodebytes(b"YWI=\n"), b"ab")
31 eq(base64.decodebytes(b"YWJj\n"), b"abc")
32 eq(base64.decodebytes(b"YWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXpBQkNE"
Guido van Rossum4581ae52007-05-22 21:56:47 +000033 b"RUZHSElKS0xNTk9QUVJTVFVWV1hZWjAxMjM0\nNT"
34 b"Y3ODkhQCMwXiYqKCk7Ojw+LC4gW117fQ==\n"),
35 b"abcdefghijklmnopqrstuvwxyz"
36 b"ABCDEFGHIJKLMNOPQRSTUVWXYZ"
37 b"0123456789!@#0^&*();:<>,. []{}")
Georg Brandlb54d8012009-06-04 09:11:51 +000038 eq(base64.decodebytes(b''), b'')
39 self.assertRaises(TypeError, base64.decodebytes, "")
Barry Warsaw4f019d32004-01-04 01:13:02 +000040
41 def test_encode(self):
42 eq = self.assertEqual
Guido van Rossum34d19282007-08-09 01:03:29 +000043 from io import BytesIO
44 infp = BytesIO(b'abcdefghijklmnopqrstuvwxyz'
45 b'ABCDEFGHIJKLMNOPQRSTUVWXYZ'
46 b'0123456789!@#0^&*();:<>,. []{}')
47 outfp = BytesIO()
Barry Warsaw4f019d32004-01-04 01:13:02 +000048 base64.encode(infp, outfp)
49 eq(outfp.getvalue(),
Guido van Rossum34d19282007-08-09 01:03:29 +000050 b'YWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXpBQkNE'
51 b'RUZHSElKS0xNTk9QUVJTVFVWV1hZWjAxMjM0\nNT'
52 b'Y3ODkhQCMwXiYqKCk7Ojw+LC4gW117fQ==\n')
Barry Warsaw4f019d32004-01-04 01:13:02 +000053
54 def test_decode(self):
Guido van Rossum34d19282007-08-09 01:03:29 +000055 from io import BytesIO
56 infp = BytesIO(b'd3d3LnB5dGhvbi5vcmc=')
57 outfp = BytesIO()
Barry Warsaw4f019d32004-01-04 01:13:02 +000058 base64.decode(infp, outfp)
Guido van Rossum34d19282007-08-09 01:03:29 +000059 self.assertEqual(outfp.getvalue(), b'www.python.org')
Barry Warsaw4f019d32004-01-04 01:13:02 +000060
Barry Warsaw4f019d32004-01-04 01:13:02 +000061
62class BaseXYTestCase(unittest.TestCase):
63 def test_b64encode(self):
64 eq = self.assertEqual
65 # Test default alphabet
Guido van Rossum4581ae52007-05-22 21:56:47 +000066 eq(base64.b64encode(b"www.python.org"), b"d3d3LnB5dGhvbi5vcmc=")
67 eq(base64.b64encode(b'\x00'), b'AA==')
68 eq(base64.b64encode(b"a"), b"YQ==")
69 eq(base64.b64encode(b"ab"), b"YWI=")
70 eq(base64.b64encode(b"abc"), b"YWJj")
71 eq(base64.b64encode(b""), b"")
72 eq(base64.b64encode(b"abcdefghijklmnopqrstuvwxyz"
73 b"ABCDEFGHIJKLMNOPQRSTUVWXYZ"
74 b"0123456789!@#0^&*();:<>,. []{}"),
75 b"YWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXpBQkNE"
76 b"RUZHSElKS0xNTk9QUVJTVFVWV1hZWjAxMjM0NT"
77 b"Y3ODkhQCMwXiYqKCk7Ojw+LC4gW117fQ==")
Barry Warsaw4f019d32004-01-04 01:13:02 +000078 # Test with arbitrary alternative characters
Alexandre Vassalotti5209857f2008-05-03 04:39:38 +000079 eq(base64.b64encode(b'\xd3V\xbeo\xf7\x1d', altchars=b'*$'), b'01a*b$cd')
80 # Check if passing a str object raises an error
81 self.assertRaises(TypeError, base64.b64encode, "")
82 self.assertRaises(TypeError, base64.b64encode, b"", altchars="")
Barry Warsaw4f019d32004-01-04 01:13:02 +000083 # Test standard alphabet
Guido van Rossum4581ae52007-05-22 21:56:47 +000084 eq(base64.standard_b64encode(b"www.python.org"), b"d3d3LnB5dGhvbi5vcmc=")
85 eq(base64.standard_b64encode(b"a"), b"YQ==")
86 eq(base64.standard_b64encode(b"ab"), b"YWI=")
87 eq(base64.standard_b64encode(b"abc"), b"YWJj")
88 eq(base64.standard_b64encode(b""), b"")
89 eq(base64.standard_b64encode(b"abcdefghijklmnopqrstuvwxyz"
90 b"ABCDEFGHIJKLMNOPQRSTUVWXYZ"
91 b"0123456789!@#0^&*();:<>,. []{}"),
92 b"YWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXpBQkNE"
93 b"RUZHSElKS0xNTk9QUVJTVFVWV1hZWjAxMjM0NT"
94 b"Y3ODkhQCMwXiYqKCk7Ojw+LC4gW117fQ==")
Alexandre Vassalotti5209857f2008-05-03 04:39:38 +000095 # Check if passing a str object raises an error
96 self.assertRaises(TypeError, base64.standard_b64encode, "")
97 self.assertRaises(TypeError, base64.standard_b64encode, b"", altchars="")
Barry Warsaw4f019d32004-01-04 01:13:02 +000098 # Test with 'URL safe' alternative characters
Guido van Rossum4581ae52007-05-22 21:56:47 +000099 eq(base64.urlsafe_b64encode(b'\xd3V\xbeo\xf7\x1d'), b'01a-b_cd')
Alexandre Vassalotti5209857f2008-05-03 04:39:38 +0000100 # Check if passing a str object raises an error
101 self.assertRaises(TypeError, base64.urlsafe_b64encode, "")
Barry Warsaw4f019d32004-01-04 01:13:02 +0000102
103 def test_b64decode(self):
104 eq = self.assertEqual
Guido van Rossum4581ae52007-05-22 21:56:47 +0000105 eq(base64.b64decode(b"d3d3LnB5dGhvbi5vcmc="), b"www.python.org")
106 eq(base64.b64decode(b'AA=='), b'\x00')
107 eq(base64.b64decode(b"YQ=="), b"a")
108 eq(base64.b64decode(b"YWI="), b"ab")
109 eq(base64.b64decode(b"YWJj"), b"abc")
110 eq(base64.b64decode(b"YWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXpBQkNE"
111 b"RUZHSElKS0xNTk9QUVJTVFVWV1hZWjAxMjM0\nNT"
112 b"Y3ODkhQCMwXiYqKCk7Ojw+LC4gW117fQ=="),
113 b"abcdefghijklmnopqrstuvwxyz"
114 b"ABCDEFGHIJKLMNOPQRSTUVWXYZ"
115 b"0123456789!@#0^&*();:<>,. []{}")
116 eq(base64.b64decode(b''), b'')
Barry Warsaw4f019d32004-01-04 01:13:02 +0000117 # Test with arbitrary alternative characters
Alexandre Vassalotti5209857f2008-05-03 04:39:38 +0000118 eq(base64.b64decode(b'01a*b$cd', altchars=b'*$'), b'\xd3V\xbeo\xf7\x1d')
119 # Check if passing a str object raises an error
120 self.assertRaises(TypeError, base64.b64decode, "")
121 self.assertRaises(TypeError, base64.b64decode, b"", altchars="")
Barry Warsaw4f019d32004-01-04 01:13:02 +0000122 # Test standard alphabet
Guido van Rossum4581ae52007-05-22 21:56:47 +0000123 eq(base64.standard_b64decode(b"d3d3LnB5dGhvbi5vcmc="), b"www.python.org")
124 eq(base64.standard_b64decode(b"YQ=="), b"a")
125 eq(base64.standard_b64decode(b"YWI="), b"ab")
126 eq(base64.standard_b64decode(b"YWJj"), b"abc")
127 eq(base64.standard_b64decode(b""), b"")
128 eq(base64.standard_b64decode(b"YWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXpBQkNE"
129 b"RUZHSElKS0xNTk9QUVJTVFVWV1hZWjAxMjM0NT"
130 b"Y3ODkhQCMwXiYqKCk7Ojw+LC4gW117fQ=="),
131 b"abcdefghijklmnopqrstuvwxyz"
132 b"ABCDEFGHIJKLMNOPQRSTUVWXYZ"
133 b"0123456789!@#0^&*();:<>,. []{}")
Alexandre Vassalotti5209857f2008-05-03 04:39:38 +0000134 # Check if passing a str object raises an error
135 self.assertRaises(TypeError, base64.standard_b64decode, "")
136 self.assertRaises(TypeError, base64.standard_b64decode, b"", altchars="")
Barry Warsaw4f019d32004-01-04 01:13:02 +0000137 # Test with 'URL safe' alternative characters
Guido van Rossum4581ae52007-05-22 21:56:47 +0000138 eq(base64.urlsafe_b64decode(b'01a-b_cd'), b'\xd3V\xbeo\xf7\x1d')
Alexandre Vassalotti5209857f2008-05-03 04:39:38 +0000139 self.assertRaises(TypeError, base64.urlsafe_b64decode, "")
Barry Warsaw4f019d32004-01-04 01:13:02 +0000140
R. David Murray64951362010-11-11 20:09:20 +0000141 def test_b64decode_padding_error(self):
Guido van Rossum4581ae52007-05-22 21:56:47 +0000142 self.assertRaises(binascii.Error, base64.b64decode, b'abc')
Barry Warsaw4f019d32004-01-04 01:13:02 +0000143
R. David Murray64951362010-11-11 20:09:20 +0000144 def test_b64decode_invalid_chars(self):
145 # issue 1466065: Test some invalid characters.
146 tests = ((b'%3d==', b'\xdd'),
147 (b'$3d==', b'\xdd'),
148 (b'[==', b''),
149 (b'YW]3=', b'am'),
150 (b'3{d==', b'\xdd'),
151 (b'3d}==', b'\xdd'),
152 (b'@@', b''),
153 (b'!', b''),
154 (b'YWJj\nYWI=', b'abcab'))
155 for bstr, res in tests:
156 self.assertEquals(base64.b64decode(bstr), res)
157 with self.assertRaises(binascii.Error):
158 base64.b64decode(bstr, validate=True)
159
Barry Warsaw4f019d32004-01-04 01:13:02 +0000160 def test_b32encode(self):
161 eq = self.assertEqual
Guido van Rossum4581ae52007-05-22 21:56:47 +0000162 eq(base64.b32encode(b''), b'')
163 eq(base64.b32encode(b'\x00'), b'AA======')
164 eq(base64.b32encode(b'a'), b'ME======')
165 eq(base64.b32encode(b'ab'), b'MFRA====')
166 eq(base64.b32encode(b'abc'), b'MFRGG===')
167 eq(base64.b32encode(b'abcd'), b'MFRGGZA=')
168 eq(base64.b32encode(b'abcde'), b'MFRGGZDF')
Alexandre Vassalotti5209857f2008-05-03 04:39:38 +0000169 self.assertRaises(TypeError, base64.b32encode, "")
Barry Warsaw4f019d32004-01-04 01:13:02 +0000170
171 def test_b32decode(self):
172 eq = self.assertEqual
Guido van Rossum4581ae52007-05-22 21:56:47 +0000173 eq(base64.b32decode(b''), b'')
174 eq(base64.b32decode(b'AA======'), b'\x00')
175 eq(base64.b32decode(b'ME======'), b'a')
176 eq(base64.b32decode(b'MFRA===='), b'ab')
177 eq(base64.b32decode(b'MFRGG==='), b'abc')
178 eq(base64.b32decode(b'MFRGGZA='), b'abcd')
179 eq(base64.b32decode(b'MFRGGZDF'), b'abcde')
Alexandre Vassalotti5209857f2008-05-03 04:39:38 +0000180 self.assertRaises(TypeError, base64.b32decode, "")
Barry Warsaw4f019d32004-01-04 01:13:02 +0000181
182 def test_b32decode_casefold(self):
183 eq = self.assertEqual
Guido van Rossum4581ae52007-05-22 21:56:47 +0000184 eq(base64.b32decode(b'', True), b'')
185 eq(base64.b32decode(b'ME======', True), b'a')
186 eq(base64.b32decode(b'MFRA====', True), b'ab')
187 eq(base64.b32decode(b'MFRGG===', True), b'abc')
188 eq(base64.b32decode(b'MFRGGZA=', True), b'abcd')
189 eq(base64.b32decode(b'MFRGGZDF', True), b'abcde')
Barry Warsaw4f019d32004-01-04 01:13:02 +0000190 # Lower cases
Guido van Rossum4581ae52007-05-22 21:56:47 +0000191 eq(base64.b32decode(b'me======', True), b'a')
192 eq(base64.b32decode(b'mfra====', True), b'ab')
193 eq(base64.b32decode(b'mfrgg===', True), b'abc')
194 eq(base64.b32decode(b'mfrggza=', True), b'abcd')
195 eq(base64.b32decode(b'mfrggzdf', True), b'abcde')
Barry Warsaw4f019d32004-01-04 01:13:02 +0000196 # Expected exceptions
Guido van Rossum4581ae52007-05-22 21:56:47 +0000197 self.assertRaises(TypeError, base64.b32decode, b'me======')
Barry Warsaw4f019d32004-01-04 01:13:02 +0000198 # Mapping zero and one
Guido van Rossum4581ae52007-05-22 21:56:47 +0000199 eq(base64.b32decode(b'MLO23456'), b'b\xdd\xad\xf3\xbe')
200 eq(base64.b32decode(b'M1023456', map01=b'L'), b'b\xdd\xad\xf3\xbe')
201 eq(base64.b32decode(b'M1023456', map01=b'I'), b'b\x1d\xad\xf3\xbe')
Alexandre Vassalotti5209857f2008-05-03 04:39:38 +0000202 self.assertRaises(TypeError, base64.b32decode, b"", map01="")
Barry Warsaw4f019d32004-01-04 01:13:02 +0000203
204 def test_b32decode_error(self):
Guido van Rossum4581ae52007-05-22 21:56:47 +0000205 self.assertRaises(binascii.Error, base64.b32decode, b'abc')
206 self.assertRaises(binascii.Error, base64.b32decode, b'ABCDEF==')
Barry Warsaw4f019d32004-01-04 01:13:02 +0000207
208 def test_b16encode(self):
209 eq = self.assertEqual
Guido van Rossum4581ae52007-05-22 21:56:47 +0000210 eq(base64.b16encode(b'\x01\x02\xab\xcd\xef'), b'0102ABCDEF')
211 eq(base64.b16encode(b'\x00'), b'00')
Alexandre Vassalotti5209857f2008-05-03 04:39:38 +0000212 self.assertRaises(TypeError, base64.b16encode, "")
Barry Warsaw4f019d32004-01-04 01:13:02 +0000213
214 def test_b16decode(self):
215 eq = self.assertEqual
Guido van Rossum4581ae52007-05-22 21:56:47 +0000216 eq(base64.b16decode(b'0102ABCDEF'), b'\x01\x02\xab\xcd\xef')
217 eq(base64.b16decode(b'00'), b'\x00')
Barry Warsaw4f019d32004-01-04 01:13:02 +0000218 # Lower case is not allowed without a flag
Guido van Rossum4581ae52007-05-22 21:56:47 +0000219 self.assertRaises(binascii.Error, base64.b16decode, b'0102abcdef')
Barry Warsaw4f019d32004-01-04 01:13:02 +0000220 # Case fold
Guido van Rossum4581ae52007-05-22 21:56:47 +0000221 eq(base64.b16decode(b'0102abcdef', True), b'\x01\x02\xab\xcd\xef')
Alexandre Vassalotti5209857f2008-05-03 04:39:38 +0000222 self.assertRaises(TypeError, base64.b16decode, "")
Guido van Rossum4581ae52007-05-22 21:56:47 +0000223
224 def test_ErrorHeritage(self):
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000225 self.assertTrue(issubclass(binascii.Error, ValueError))
Barry Warsaw4f019d32004-01-04 01:13:02 +0000226
227
228
Victor Stinner479736b2010-05-25 21:12:34 +0000229class TestMain(unittest.TestCase):
230 def get_output(self, *args, **options):
231 args = (sys.executable, '-m', 'base64') + args
232 return subprocess.check_output(args, **options)
233
234 def test_encode_decode(self):
235 output = self.get_output('-t')
236 self.assertSequenceEqual(output.splitlines(), (
237 b"b'Aladdin:open sesame'",
238 br"b'QWxhZGRpbjpvcGVuIHNlc2FtZQ==\n'",
239 b"b'Aladdin:open sesame'",
240 ))
241
242 def test_encode_file(self):
243 with open(support.TESTFN, 'wb') as fp:
244 fp.write(b'a\xffb\n')
245
246 output = self.get_output('-e', support.TESTFN)
247 self.assertEquals(output.rstrip(), b'Yf9iCg==')
248
249 with open(support.TESTFN, 'rb') as fp:
250 output = self.get_output('-e', stdin=fp)
251 self.assertEquals(output.rstrip(), b'Yf9iCg==')
252
253 def test_decode(self):
254 with open(support.TESTFN, 'wb') as fp:
255 fp.write(b'Yf9iCg==')
256 output = self.get_output('-d', support.TESTFN)
Victor Stinner0dee1b82010-05-25 22:17:22 +0000257 self.assertEquals(output.rstrip(), b'a\xffb')
Victor Stinner479736b2010-05-25 21:12:34 +0000258
259
260
Raymond Hettinger2ae87532002-05-18 00:25:10 +0000261def test_main():
Benjamin Petersonee8712c2008-05-20 21:35:26 +0000262 support.run_unittest(__name__)
Barry Warsaw4f019d32004-01-04 01:13:02 +0000263
264if __name__ == '__main__':
Guido van Rossumd8faa362007-04-27 19:54:29 +0000265 test_main()