blob: 6f886957d8285a4d641b9d8a3b9b60d88e9b377a [file] [log] [blame]
Walter Dörwald21d3a322003-05-01 17:45:56 +00001import unittest
2from test import test_support
3import base64
Guido van Rossum4581ae52007-05-22 21:56:47 +00004import binascii
Raymond Hettinger2ae87532002-05-18 00:25:10 +00005
Raymond Hettinger2ae87532002-05-18 00:25:10 +00006
Barry Warsaw4f019d32004-01-04 01:13:02 +00007
8class LegacyBase64TestCase(unittest.TestCase):
Guido van Rossumcb682582002-08-22 19:18:56 +00009 def test_encodestring(self):
Barry Warsaw4f019d32004-01-04 01:13:02 +000010 eq = self.assertEqual
Guido van Rossum4581ae52007-05-22 21:56:47 +000011 eq(base64.encodestring(b"www.python.org"), b"d3d3LnB5dGhvbi5vcmc=\n")
12 eq(base64.encodestring(b"a"), b"YQ==\n")
13 eq(base64.encodestring(b"ab"), b"YWI=\n")
14 eq(base64.encodestring(b"abc"), b"YWJj\n")
15 eq(base64.encodestring(b""), b"")
16 eq(base64.encodestring(b"abcdefghijklmnopqrstuvwxyz"
17 b"ABCDEFGHIJKLMNOPQRSTUVWXYZ"
18 b"0123456789!@#0^&*();:<>,. []{}"),
19 b"YWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXpBQkNE"
20 b"RUZHSElKS0xNTk9QUVJTVFVWV1hZWjAxMjM0\nNT"
21 b"Y3ODkhQCMwXiYqKCk7Ojw+LC4gW117fQ==\n")
Guido van Rossumcb682582002-08-22 19:18:56 +000022
23 def test_decodestring(self):
Barry Warsaw4f019d32004-01-04 01:13:02 +000024 eq = self.assertEqual
Guido van Rossum4581ae52007-05-22 21:56:47 +000025 eq(base64.decodestring(b"d3d3LnB5dGhvbi5vcmc=\n"), b"www.python.org")
26 eq(base64.decodestring(b"YQ==\n"), b"a")
27 eq(base64.decodestring(b"YWI=\n"), b"ab")
28 eq(base64.decodestring(b"YWJj\n"), b"abc")
29 eq(base64.decodestring(b"YWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXpBQkNE"
30 b"RUZHSElKS0xNTk9QUVJTVFVWV1hZWjAxMjM0\nNT"
31 b"Y3ODkhQCMwXiYqKCk7Ojw+LC4gW117fQ==\n"),
32 b"abcdefghijklmnopqrstuvwxyz"
33 b"ABCDEFGHIJKLMNOPQRSTUVWXYZ"
34 b"0123456789!@#0^&*();:<>,. []{}")
35 eq(base64.decodestring(b''), b'')
Barry Warsaw4f019d32004-01-04 01:13:02 +000036
37 def test_encode(self):
38 eq = self.assertEqual
Guido van Rossum34d19282007-08-09 01:03:29 +000039 from io import BytesIO
40 infp = BytesIO(b'abcdefghijklmnopqrstuvwxyz'
41 b'ABCDEFGHIJKLMNOPQRSTUVWXYZ'
42 b'0123456789!@#0^&*();:<>,. []{}')
43 outfp = BytesIO()
Barry Warsaw4f019d32004-01-04 01:13:02 +000044 base64.encode(infp, outfp)
45 eq(outfp.getvalue(),
Guido van Rossum34d19282007-08-09 01:03:29 +000046 b'YWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXpBQkNE'
47 b'RUZHSElKS0xNTk9QUVJTVFVWV1hZWjAxMjM0\nNT'
48 b'Y3ODkhQCMwXiYqKCk7Ojw+LC4gW117fQ==\n')
Barry Warsaw4f019d32004-01-04 01:13:02 +000049
50 def test_decode(self):
Guido van Rossum34d19282007-08-09 01:03:29 +000051 from io import BytesIO
52 infp = BytesIO(b'd3d3LnB5dGhvbi5vcmc=')
53 outfp = BytesIO()
Barry Warsaw4f019d32004-01-04 01:13:02 +000054 base64.decode(infp, outfp)
Guido van Rossum34d19282007-08-09 01:03:29 +000055 self.assertEqual(outfp.getvalue(), b'www.python.org')
Barry Warsaw4f019d32004-01-04 01:13:02 +000056
57
58
59class BaseXYTestCase(unittest.TestCase):
60 def test_b64encode(self):
61 eq = self.assertEqual
62 # Test default alphabet
Guido van Rossum4581ae52007-05-22 21:56:47 +000063 eq(base64.b64encode(b"www.python.org"), b"d3d3LnB5dGhvbi5vcmc=")
64 eq(base64.b64encode(b'\x00'), b'AA==')
65 eq(base64.b64encode(b"a"), b"YQ==")
66 eq(base64.b64encode(b"ab"), b"YWI=")
67 eq(base64.b64encode(b"abc"), b"YWJj")
68 eq(base64.b64encode(b""), b"")
69 eq(base64.b64encode(b"abcdefghijklmnopqrstuvwxyz"
70 b"ABCDEFGHIJKLMNOPQRSTUVWXYZ"
71 b"0123456789!@#0^&*();:<>,. []{}"),
72 b"YWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXpBQkNE"
73 b"RUZHSElKS0xNTk9QUVJTVFVWV1hZWjAxMjM0NT"
74 b"Y3ODkhQCMwXiYqKCk7Ojw+LC4gW117fQ==")
Barry Warsaw4f019d32004-01-04 01:13:02 +000075 # Test with arbitrary alternative characters
Guido van Rossum4581ae52007-05-22 21:56:47 +000076 eq(base64.b64encode(b'\xd3V\xbeo\xf7\x1d', altchars='*$'), b'01a*b$cd')
Barry Warsaw4f019d32004-01-04 01:13:02 +000077 # Test standard alphabet
Guido van Rossum4581ae52007-05-22 21:56:47 +000078 eq(base64.standard_b64encode(b"www.python.org"), b"d3d3LnB5dGhvbi5vcmc=")
79 eq(base64.standard_b64encode(b"a"), b"YQ==")
80 eq(base64.standard_b64encode(b"ab"), b"YWI=")
81 eq(base64.standard_b64encode(b"abc"), b"YWJj")
82 eq(base64.standard_b64encode(b""), b"")
83 eq(base64.standard_b64encode(b"abcdefghijklmnopqrstuvwxyz"
84 b"ABCDEFGHIJKLMNOPQRSTUVWXYZ"
85 b"0123456789!@#0^&*();:<>,. []{}"),
86 b"YWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXpBQkNE"
87 b"RUZHSElKS0xNTk9QUVJTVFVWV1hZWjAxMjM0NT"
88 b"Y3ODkhQCMwXiYqKCk7Ojw+LC4gW117fQ==")
Barry Warsaw4f019d32004-01-04 01:13:02 +000089 # Test with 'URL safe' alternative characters
Guido van Rossum4581ae52007-05-22 21:56:47 +000090 eq(base64.urlsafe_b64encode(b'\xd3V\xbeo\xf7\x1d'), b'01a-b_cd')
Barry Warsaw4f019d32004-01-04 01:13:02 +000091
92 def test_b64decode(self):
93 eq = self.assertEqual
Guido van Rossum4581ae52007-05-22 21:56:47 +000094 eq(base64.b64decode(b"d3d3LnB5dGhvbi5vcmc="), b"www.python.org")
95 eq(base64.b64decode(b'AA=='), b'\x00')
96 eq(base64.b64decode(b"YQ=="), b"a")
97 eq(base64.b64decode(b"YWI="), b"ab")
98 eq(base64.b64decode(b"YWJj"), b"abc")
99 eq(base64.b64decode(b"YWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXpBQkNE"
100 b"RUZHSElKS0xNTk9QUVJTVFVWV1hZWjAxMjM0\nNT"
101 b"Y3ODkhQCMwXiYqKCk7Ojw+LC4gW117fQ=="),
102 b"abcdefghijklmnopqrstuvwxyz"
103 b"ABCDEFGHIJKLMNOPQRSTUVWXYZ"
104 b"0123456789!@#0^&*();:<>,. []{}")
105 eq(base64.b64decode(b''), b'')
Barry Warsaw4f019d32004-01-04 01:13:02 +0000106 # Test with arbitrary alternative characters
Guido van Rossum4581ae52007-05-22 21:56:47 +0000107 eq(base64.b64decode(b'01a*b$cd', altchars='*$'), b'\xd3V\xbeo\xf7\x1d')
Barry Warsaw4f019d32004-01-04 01:13:02 +0000108 # Test standard alphabet
Guido van Rossum4581ae52007-05-22 21:56:47 +0000109 eq(base64.standard_b64decode(b"d3d3LnB5dGhvbi5vcmc="), b"www.python.org")
110 eq(base64.standard_b64decode(b"YQ=="), b"a")
111 eq(base64.standard_b64decode(b"YWI="), b"ab")
112 eq(base64.standard_b64decode(b"YWJj"), b"abc")
113 eq(base64.standard_b64decode(b""), b"")
114 eq(base64.standard_b64decode(b"YWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXpBQkNE"
115 b"RUZHSElKS0xNTk9QUVJTVFVWV1hZWjAxMjM0NT"
116 b"Y3ODkhQCMwXiYqKCk7Ojw+LC4gW117fQ=="),
117 b"abcdefghijklmnopqrstuvwxyz"
118 b"ABCDEFGHIJKLMNOPQRSTUVWXYZ"
119 b"0123456789!@#0^&*();:<>,. []{}")
Barry Warsaw4f019d32004-01-04 01:13:02 +0000120 # Test with 'URL safe' alternative characters
Guido van Rossum4581ae52007-05-22 21:56:47 +0000121 eq(base64.urlsafe_b64decode(b'01a-b_cd'), b'\xd3V\xbeo\xf7\x1d')
Barry Warsaw4f019d32004-01-04 01:13:02 +0000122
123 def test_b64decode_error(self):
Guido van Rossum4581ae52007-05-22 21:56:47 +0000124 self.assertRaises(binascii.Error, base64.b64decode, b'abc')
Barry Warsaw4f019d32004-01-04 01:13:02 +0000125
126 def test_b32encode(self):
127 eq = self.assertEqual
Guido van Rossum4581ae52007-05-22 21:56:47 +0000128 eq(base64.b32encode(b''), b'')
129 eq(base64.b32encode(b'\x00'), b'AA======')
130 eq(base64.b32encode(b'a'), b'ME======')
131 eq(base64.b32encode(b'ab'), b'MFRA====')
132 eq(base64.b32encode(b'abc'), b'MFRGG===')
133 eq(base64.b32encode(b'abcd'), b'MFRGGZA=')
134 eq(base64.b32encode(b'abcde'), b'MFRGGZDF')
Barry Warsaw4f019d32004-01-04 01:13:02 +0000135
136 def test_b32decode(self):
137 eq = self.assertEqual
Guido van Rossum4581ae52007-05-22 21:56:47 +0000138 eq(base64.b32decode(b''), b'')
139 eq(base64.b32decode(b'AA======'), b'\x00')
140 eq(base64.b32decode(b'ME======'), b'a')
141 eq(base64.b32decode(b'MFRA===='), b'ab')
142 eq(base64.b32decode(b'MFRGG==='), b'abc')
143 eq(base64.b32decode(b'MFRGGZA='), b'abcd')
144 eq(base64.b32decode(b'MFRGGZDF'), b'abcde')
Barry Warsaw4f019d32004-01-04 01:13:02 +0000145
146 def test_b32decode_casefold(self):
147 eq = self.assertEqual
Guido van Rossum4581ae52007-05-22 21:56:47 +0000148 eq(base64.b32decode(b'', True), b'')
149 eq(base64.b32decode(b'ME======', True), b'a')
150 eq(base64.b32decode(b'MFRA====', True), b'ab')
151 eq(base64.b32decode(b'MFRGG===', True), b'abc')
152 eq(base64.b32decode(b'MFRGGZA=', True), b'abcd')
153 eq(base64.b32decode(b'MFRGGZDF', True), b'abcde')
Barry Warsaw4f019d32004-01-04 01:13:02 +0000154 # Lower cases
Guido van Rossum4581ae52007-05-22 21:56:47 +0000155 eq(base64.b32decode(b'me======', True), b'a')
156 eq(base64.b32decode(b'mfra====', True), b'ab')
157 eq(base64.b32decode(b'mfrgg===', True), b'abc')
158 eq(base64.b32decode(b'mfrggza=', True), b'abcd')
159 eq(base64.b32decode(b'mfrggzdf', True), b'abcde')
Barry Warsaw4f019d32004-01-04 01:13:02 +0000160 # Expected exceptions
Guido van Rossum4581ae52007-05-22 21:56:47 +0000161 self.assertRaises(TypeError, base64.b32decode, b'me======')
Barry Warsaw4f019d32004-01-04 01:13:02 +0000162 # Mapping zero and one
Guido van Rossum4581ae52007-05-22 21:56:47 +0000163 eq(base64.b32decode(b'MLO23456'), b'b\xdd\xad\xf3\xbe')
164 eq(base64.b32decode(b'M1023456', map01=b'L'), b'b\xdd\xad\xf3\xbe')
165 eq(base64.b32decode(b'M1023456', map01=b'I'), b'b\x1d\xad\xf3\xbe')
Barry Warsaw4f019d32004-01-04 01:13:02 +0000166
167 def test_b32decode_error(self):
Guido van Rossum4581ae52007-05-22 21:56:47 +0000168 self.assertRaises(binascii.Error, base64.b32decode, b'abc')
169 self.assertRaises(binascii.Error, base64.b32decode, b'ABCDEF==')
Barry Warsaw4f019d32004-01-04 01:13:02 +0000170
171 def test_b16encode(self):
172 eq = self.assertEqual
Guido van Rossum4581ae52007-05-22 21:56:47 +0000173 eq(base64.b16encode(b'\x01\x02\xab\xcd\xef'), b'0102ABCDEF')
174 eq(base64.b16encode(b'\x00'), b'00')
Barry Warsaw4f019d32004-01-04 01:13:02 +0000175
176 def test_b16decode(self):
177 eq = self.assertEqual
Guido van Rossum4581ae52007-05-22 21:56:47 +0000178 eq(base64.b16decode(b'0102ABCDEF'), b'\x01\x02\xab\xcd\xef')
179 eq(base64.b16decode(b'00'), b'\x00')
Barry Warsaw4f019d32004-01-04 01:13:02 +0000180 # Lower case is not allowed without a flag
Guido van Rossum4581ae52007-05-22 21:56:47 +0000181 self.assertRaises(binascii.Error, base64.b16decode, b'0102abcdef')
Barry Warsaw4f019d32004-01-04 01:13:02 +0000182 # Case fold
Guido van Rossum4581ae52007-05-22 21:56:47 +0000183 eq(base64.b16decode(b'0102abcdef', True), b'\x01\x02\xab\xcd\xef')
184
185 def test_ErrorHeritage(self):
186 self.assert_(issubclass(binascii.Error, ValueError))
Barry Warsaw4f019d32004-01-04 01:13:02 +0000187
188
189
Raymond Hettinger2ae87532002-05-18 00:25:10 +0000190def test_main():
Guido van Rossumd8faa362007-04-27 19:54:29 +0000191 test_support.run_unittest(__name__)
Barry Warsaw4f019d32004-01-04 01:13:02 +0000192
193if __name__ == '__main__':
Guido van Rossumd8faa362007-04-27 19:54:29 +0000194 test_main()