blob: ca94504b1cd36d6c9ca785064343944c30c21873 [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
Guido van Rossum4581ae52007-05-22 21:56:47 +0000106 eq(base64.b64decode(b"d3d3LnB5dGhvbi5vcmc="), b"www.python.org")
107 eq(base64.b64decode(b'AA=='), b'\x00')
108 eq(base64.b64decode(b"YQ=="), b"a")
109 eq(base64.b64decode(b"YWI="), b"ab")
110 eq(base64.b64decode(b"YWJj"), b"abc")
111 eq(base64.b64decode(b"YWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXpBQkNE"
112 b"RUZHSElKS0xNTk9QUVJTVFVWV1hZWjAxMjM0\nNT"
113 b"Y3ODkhQCMwXiYqKCk7Ojw+LC4gW117fQ=="),
114 b"abcdefghijklmnopqrstuvwxyz"
115 b"ABCDEFGHIJKLMNOPQRSTUVWXYZ"
116 b"0123456789!@#0^&*();:<>,. []{}")
117 eq(base64.b64decode(b''), b'')
Barry Warsaw4f019d32004-01-04 01:13:02 +0000118 # Test with arbitrary alternative characters
Alexandre Vassalotti5209857f2008-05-03 04:39:38 +0000119 eq(base64.b64decode(b'01a*b$cd', altchars=b'*$'), b'\xd3V\xbeo\xf7\x1d')
120 # Check if passing a str object raises an error
121 self.assertRaises(TypeError, base64.b64decode, "")
122 self.assertRaises(TypeError, base64.b64decode, b"", altchars="")
Barry Warsaw4f019d32004-01-04 01:13:02 +0000123 # Test standard alphabet
Guido van Rossum4581ae52007-05-22 21:56:47 +0000124 eq(base64.standard_b64decode(b"d3d3LnB5dGhvbi5vcmc="), b"www.python.org")
125 eq(base64.standard_b64decode(b"YQ=="), b"a")
126 eq(base64.standard_b64decode(b"YWI="), b"ab")
127 eq(base64.standard_b64decode(b"YWJj"), b"abc")
128 eq(base64.standard_b64decode(b""), b"")
129 eq(base64.standard_b64decode(b"YWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXpBQkNE"
130 b"RUZHSElKS0xNTk9QUVJTVFVWV1hZWjAxMjM0NT"
131 b"Y3ODkhQCMwXiYqKCk7Ojw+LC4gW117fQ=="),
132 b"abcdefghijklmnopqrstuvwxyz"
133 b"ABCDEFGHIJKLMNOPQRSTUVWXYZ"
134 b"0123456789!@#0^&*();:<>,. []{}")
Alexandre Vassalotti5209857f2008-05-03 04:39:38 +0000135 # Check if passing a str object raises an error
136 self.assertRaises(TypeError, base64.standard_b64decode, "")
137 self.assertRaises(TypeError, base64.standard_b64decode, b"", altchars="")
Barry Warsaw4f019d32004-01-04 01:13:02 +0000138 # Test with 'URL safe' alternative characters
Guido van Rossum4581ae52007-05-22 21:56:47 +0000139 eq(base64.urlsafe_b64decode(b'01a-b_cd'), b'\xd3V\xbeo\xf7\x1d')
Alexandre Vassalotti5209857f2008-05-03 04:39:38 +0000140 self.assertRaises(TypeError, base64.urlsafe_b64decode, "")
Barry Warsaw4f019d32004-01-04 01:13:02 +0000141
R. David Murray64951362010-11-11 20:09:20 +0000142 def test_b64decode_padding_error(self):
Guido van Rossum4581ae52007-05-22 21:56:47 +0000143 self.assertRaises(binascii.Error, base64.b64decode, b'abc')
Barry Warsaw4f019d32004-01-04 01:13:02 +0000144
R. David Murray64951362010-11-11 20:09:20 +0000145 def test_b64decode_invalid_chars(self):
146 # issue 1466065: Test some invalid characters.
147 tests = ((b'%3d==', b'\xdd'),
148 (b'$3d==', b'\xdd'),
149 (b'[==', b''),
150 (b'YW]3=', b'am'),
151 (b'3{d==', b'\xdd'),
152 (b'3d}==', b'\xdd'),
153 (b'@@', b''),
154 (b'!', b''),
155 (b'YWJj\nYWI=', b'abcab'))
156 for bstr, res in tests:
Ezio Melottib3aedd42010-11-20 19:04:17 +0000157 self.assertEqual(base64.b64decode(bstr), res)
R. David Murray64951362010-11-11 20:09:20 +0000158 with self.assertRaises(binascii.Error):
159 base64.b64decode(bstr, validate=True)
160
Barry Warsaw4f019d32004-01-04 01:13:02 +0000161 def test_b32encode(self):
162 eq = self.assertEqual
Guido van Rossum4581ae52007-05-22 21:56:47 +0000163 eq(base64.b32encode(b''), b'')
164 eq(base64.b32encode(b'\x00'), b'AA======')
165 eq(base64.b32encode(b'a'), b'ME======')
166 eq(base64.b32encode(b'ab'), b'MFRA====')
167 eq(base64.b32encode(b'abc'), b'MFRGG===')
168 eq(base64.b32encode(b'abcd'), b'MFRGGZA=')
169 eq(base64.b32encode(b'abcde'), b'MFRGGZDF')
Alexandre Vassalotti5209857f2008-05-03 04:39:38 +0000170 self.assertRaises(TypeError, base64.b32encode, "")
Barry Warsaw4f019d32004-01-04 01:13:02 +0000171
172 def test_b32decode(self):
173 eq = self.assertEqual
Guido van Rossum4581ae52007-05-22 21:56:47 +0000174 eq(base64.b32decode(b''), b'')
175 eq(base64.b32decode(b'AA======'), b'\x00')
176 eq(base64.b32decode(b'ME======'), b'a')
177 eq(base64.b32decode(b'MFRA===='), b'ab')
178 eq(base64.b32decode(b'MFRGG==='), b'abc')
179 eq(base64.b32decode(b'MFRGGZA='), b'abcd')
180 eq(base64.b32decode(b'MFRGGZDF'), b'abcde')
Alexandre Vassalotti5209857f2008-05-03 04:39:38 +0000181 self.assertRaises(TypeError, base64.b32decode, "")
Barry Warsaw4f019d32004-01-04 01:13:02 +0000182
183 def test_b32decode_casefold(self):
184 eq = self.assertEqual
Guido van Rossum4581ae52007-05-22 21:56:47 +0000185 eq(base64.b32decode(b'', True), b'')
186 eq(base64.b32decode(b'ME======', True), b'a')
187 eq(base64.b32decode(b'MFRA====', True), b'ab')
188 eq(base64.b32decode(b'MFRGG===', True), b'abc')
189 eq(base64.b32decode(b'MFRGGZA=', True), b'abcd')
190 eq(base64.b32decode(b'MFRGGZDF', True), b'abcde')
Barry Warsaw4f019d32004-01-04 01:13:02 +0000191 # Lower cases
Guido van Rossum4581ae52007-05-22 21:56:47 +0000192 eq(base64.b32decode(b'me======', True), b'a')
193 eq(base64.b32decode(b'mfra====', True), b'ab')
194 eq(base64.b32decode(b'mfrgg===', True), b'abc')
195 eq(base64.b32decode(b'mfrggza=', True), b'abcd')
196 eq(base64.b32decode(b'mfrggzdf', True), b'abcde')
Barry Warsaw4f019d32004-01-04 01:13:02 +0000197 # Expected exceptions
Guido van Rossum4581ae52007-05-22 21:56:47 +0000198 self.assertRaises(TypeError, base64.b32decode, b'me======')
Barry Warsaw4f019d32004-01-04 01:13:02 +0000199 # Mapping zero and one
Guido van Rossum4581ae52007-05-22 21:56:47 +0000200 eq(base64.b32decode(b'MLO23456'), b'b\xdd\xad\xf3\xbe')
201 eq(base64.b32decode(b'M1023456', map01=b'L'), b'b\xdd\xad\xf3\xbe')
202 eq(base64.b32decode(b'M1023456', map01=b'I'), b'b\x1d\xad\xf3\xbe')
Alexandre Vassalotti5209857f2008-05-03 04:39:38 +0000203 self.assertRaises(TypeError, base64.b32decode, b"", map01="")
Barry Warsaw4f019d32004-01-04 01:13:02 +0000204
205 def test_b32decode_error(self):
Guido van Rossum4581ae52007-05-22 21:56:47 +0000206 self.assertRaises(binascii.Error, base64.b32decode, b'abc')
207 self.assertRaises(binascii.Error, base64.b32decode, b'ABCDEF==')
Barry Warsaw4f019d32004-01-04 01:13:02 +0000208
209 def test_b16encode(self):
210 eq = self.assertEqual
Guido van Rossum4581ae52007-05-22 21:56:47 +0000211 eq(base64.b16encode(b'\x01\x02\xab\xcd\xef'), b'0102ABCDEF')
212 eq(base64.b16encode(b'\x00'), b'00')
Alexandre Vassalotti5209857f2008-05-03 04:39:38 +0000213 self.assertRaises(TypeError, base64.b16encode, "")
Barry Warsaw4f019d32004-01-04 01:13:02 +0000214
215 def test_b16decode(self):
216 eq = self.assertEqual
Guido van Rossum4581ae52007-05-22 21:56:47 +0000217 eq(base64.b16decode(b'0102ABCDEF'), b'\x01\x02\xab\xcd\xef')
218 eq(base64.b16decode(b'00'), b'\x00')
Barry Warsaw4f019d32004-01-04 01:13:02 +0000219 # Lower case is not allowed without a flag
Guido van Rossum4581ae52007-05-22 21:56:47 +0000220 self.assertRaises(binascii.Error, base64.b16decode, b'0102abcdef')
Barry Warsaw4f019d32004-01-04 01:13:02 +0000221 # Case fold
Guido van Rossum4581ae52007-05-22 21:56:47 +0000222 eq(base64.b16decode(b'0102abcdef', True), b'\x01\x02\xab\xcd\xef')
Alexandre Vassalotti5209857f2008-05-03 04:39:38 +0000223 self.assertRaises(TypeError, base64.b16decode, "")
Guido van Rossum4581ae52007-05-22 21:56:47 +0000224
225 def test_ErrorHeritage(self):
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000226 self.assertTrue(issubclass(binascii.Error, ValueError))
Barry Warsaw4f019d32004-01-04 01:13:02 +0000227
228
Ezio Melottib3aedd42010-11-20 19:04:17 +0000229
Victor Stinner479736b2010-05-25 21:12:34 +0000230class TestMain(unittest.TestCase):
Vinay Sajipf9596182012-03-02 01:01:13 +0000231 def tearDown(self):
232 if os.path.exists(support.TESTFN):
233 os.unlink(support.TESTFN)
234
Victor Stinner479736b2010-05-25 21:12:34 +0000235 def get_output(self, *args, **options):
236 args = (sys.executable, '-m', 'base64') + args
237 return subprocess.check_output(args, **options)
238
239 def test_encode_decode(self):
240 output = self.get_output('-t')
241 self.assertSequenceEqual(output.splitlines(), (
242 b"b'Aladdin:open sesame'",
243 br"b'QWxhZGRpbjpvcGVuIHNlc2FtZQ==\n'",
244 b"b'Aladdin:open sesame'",
245 ))
246
247 def test_encode_file(self):
248 with open(support.TESTFN, 'wb') as fp:
249 fp.write(b'a\xffb\n')
250
251 output = self.get_output('-e', support.TESTFN)
Ezio Melottib3aedd42010-11-20 19:04:17 +0000252 self.assertEqual(output.rstrip(), b'Yf9iCg==')
Victor Stinner479736b2010-05-25 21:12:34 +0000253
254 with open(support.TESTFN, 'rb') as fp:
255 output = self.get_output('-e', stdin=fp)
Ezio Melottib3aedd42010-11-20 19:04:17 +0000256 self.assertEqual(output.rstrip(), b'Yf9iCg==')
Victor Stinner479736b2010-05-25 21:12:34 +0000257
258 def test_decode(self):
259 with open(support.TESTFN, 'wb') as fp:
260 fp.write(b'Yf9iCg==')
261 output = self.get_output('-d', support.TESTFN)
Ezio Melottib3aedd42010-11-20 19:04:17 +0000262 self.assertEqual(output.rstrip(), b'a\xffb')
Victor Stinner479736b2010-05-25 21:12:34 +0000263
264
Ezio Melottib3aedd42010-11-20 19:04:17 +0000265
Raymond Hettinger2ae87532002-05-18 00:25:10 +0000266def test_main():
Benjamin Petersonee8712c2008-05-20 21:35:26 +0000267 support.run_unittest(__name__)
Barry Warsaw4f019d32004-01-04 01:13:02 +0000268
269if __name__ == '__main__':
Guido van Rossumd8faa362007-04-27 19:54:29 +0000270 test_main()