1BEGIN {
2    if ($ENV{'PERL_CORE'}){
3        chdir 't' if -d 't';
4        @INC = '../lib';
5    }
6}
7
8use strict;
9use MIME::Base64;
10
11print "1..283\n";
12
13print "# Testing MIME::Base64-", $MIME::Base64::VERSION, "\n";
14
15BEGIN {
16 if (ord('A') == 0x41) {
17  *ASCII = sub { return $_[0] };
18 }
19 else {
20  require Encode;
21  *ASCII = sub { Encode::encode('ascii',$_[0]) };
22 }
23}
24
25my $testno = 1;
26# instead of "for my $test (...)" , which is my preference.
27# Not sure which perl version has started supporting.  MIME::Base64
28# was supposed to work with very old perl5, right?
29my $test;
30
31encodeTest();
32decodeTest();
33
34# This used to generate a warning
35print "not " unless decode_base64(encode_base64("foo")) eq "foo";
36print "ok ", $testno++, "\n";
37
38sub encodeTest
39{
40    print "# encode test\n";
41
42    my @encode_tests = (
43	# All values
44	["\000" => "AA=="],
45	["\001" => "AQ=="],
46	["\002" => "Ag=="],
47	["\003" => "Aw=="],
48	["\004" => "BA=="],
49	["\005" => "BQ=="],
50	["\006" => "Bg=="],
51	["\007" => "Bw=="],
52	["\010" => "CA=="],
53	["\011" => "CQ=="],
54	["\012" => "Cg=="],
55	["\013" => "Cw=="],
56	["\014" => "DA=="],
57	["\015" => "DQ=="],
58	["\016" => "Dg=="],
59	["\017" => "Dw=="],
60	["\020" => "EA=="],
61	["\021" => "EQ=="],
62	["\022" => "Eg=="],
63	["\023" => "Ew=="],
64	["\024" => "FA=="],
65	["\025" => "FQ=="],
66	["\026" => "Fg=="],
67	["\027" => "Fw=="],
68	["\030" => "GA=="],
69	["\031" => "GQ=="],
70	["\032" => "Gg=="],
71	["\033" => "Gw=="],
72	["\034" => "HA=="],
73	["\035" => "HQ=="],
74	["\036" => "Hg=="],
75	["\037" => "Hw=="],
76	["\040" => "IA=="],
77	["\041" => "IQ=="],
78	["\042" => "Ig=="],
79	["\043" => "Iw=="],
80	["\044" => "JA=="],
81	["\045" => "JQ=="],
82	["\046" => "Jg=="],
83	["\047" => "Jw=="],
84	["\050" => "KA=="],
85	["\051" => "KQ=="],
86	["\052" => "Kg=="],
87	["\053" => "Kw=="],
88	["\054" => "LA=="],
89	["\055" => "LQ=="],
90	["\056" => "Lg=="],
91	["\057" => "Lw=="],
92	["\060" => "MA=="],
93	["\061" => "MQ=="],
94	["\062" => "Mg=="],
95	["\063" => "Mw=="],
96	["\064" => "NA=="],
97	["\065" => "NQ=="],
98	["\066" => "Ng=="],
99	["\067" => "Nw=="],
100	["\070" => "OA=="],
101	["\071" => "OQ=="],
102	["\072" => "Og=="],
103	["\073" => "Ow=="],
104	["\074" => "PA=="],
105	["\075" => "PQ=="],
106	["\076" => "Pg=="],
107	["\077" => "Pw=="],
108	["\100" => "QA=="],
109	["\101" => "QQ=="],
110	["\102" => "Qg=="],
111	["\103" => "Qw=="],
112	["\104" => "RA=="],
113	["\105" => "RQ=="],
114	["\106" => "Rg=="],
115	["\107" => "Rw=="],
116	["\110" => "SA=="],
117	["\111" => "SQ=="],
118	["\112" => "Sg=="],
119	["\113" => "Sw=="],
120	["\114" => "TA=="],
121	["\115" => "TQ=="],
122	["\116" => "Tg=="],
123	["\117" => "Tw=="],
124	["\120" => "UA=="],
125	["\121" => "UQ=="],
126	["\122" => "Ug=="],
127	["\123" => "Uw=="],
128	["\124" => "VA=="],
129	["\125" => "VQ=="],
130	["\126" => "Vg=="],
131	["\127" => "Vw=="],
132	["\130" => "WA=="],
133	["\131" => "WQ=="],
134	["\132" => "Wg=="],
135	["\133" => "Ww=="],
136	["\134" => "XA=="],
137	["\135" => "XQ=="],
138	["\136" => "Xg=="],
139	["\137" => "Xw=="],
140	["\140" => "YA=="],
141	["\141" => "YQ=="],
142	["\142" => "Yg=="],
143	["\143" => "Yw=="],
144	["\144" => "ZA=="],
145	["\145" => "ZQ=="],
146	["\146" => "Zg=="],
147	["\147" => "Zw=="],
148	["\150" => "aA=="],
149	["\151" => "aQ=="],
150	["\152" => "ag=="],
151	["\153" => "aw=="],
152	["\154" => "bA=="],
153	["\155" => "bQ=="],
154	["\156" => "bg=="],
155	["\157" => "bw=="],
156	["\160" => "cA=="],
157	["\161" => "cQ=="],
158	["\162" => "cg=="],
159	["\163" => "cw=="],
160	["\164" => "dA=="],
161	["\165" => "dQ=="],
162	["\166" => "dg=="],
163	["\167" => "dw=="],
164	["\170" => "eA=="],
165	["\171" => "eQ=="],
166	["\172" => "eg=="],
167	["\173" => "ew=="],
168	["\174" => "fA=="],
169	["\175" => "fQ=="],
170	["\176" => "fg=="],
171	["\177" => "fw=="],
172	["\200" => "gA=="],
173	["\201" => "gQ=="],
174	["\202" => "gg=="],
175	["\203" => "gw=="],
176	["\204" => "hA=="],
177	["\205" => "hQ=="],
178	["\206" => "hg=="],
179	["\207" => "hw=="],
180	["\210" => "iA=="],
181	["\211" => "iQ=="],
182	["\212" => "ig=="],
183	["\213" => "iw=="],
184	["\214" => "jA=="],
185	["\215" => "jQ=="],
186	["\216" => "jg=="],
187	["\217" => "jw=="],
188	["\220" => "kA=="],
189	["\221" => "kQ=="],
190	["\222" => "kg=="],
191	["\223" => "kw=="],
192	["\224" => "lA=="],
193	["\225" => "lQ=="],
194	["\226" => "lg=="],
195	["\227" => "lw=="],
196	["\230" => "mA=="],
197	["\231" => "mQ=="],
198	["\232" => "mg=="],
199	["\233" => "mw=="],
200	["\234" => "nA=="],
201	["\235" => "nQ=="],
202	["\236" => "ng=="],
203	["\237" => "nw=="],
204	["\240" => "oA=="],
205	["\241" => "oQ=="],
206	["\242" => "og=="],
207	["\243" => "ow=="],
208	["\244" => "pA=="],
209	["\245" => "pQ=="],
210	["\246" => "pg=="],
211	["\247" => "pw=="],
212	["\250" => "qA=="],
213	["\251" => "qQ=="],
214	["\252" => "qg=="],
215	["\253" => "qw=="],
216	["\254" => "rA=="],
217	["\255" => "rQ=="],
218	["\256" => "rg=="],
219	["\257" => "rw=="],
220	["\260" => "sA=="],
221	["\261" => "sQ=="],
222	["\262" => "sg=="],
223	["\263" => "sw=="],
224	["\264" => "tA=="],
225	["\265" => "tQ=="],
226	["\266" => "tg=="],
227	["\267" => "tw=="],
228	["\270" => "uA=="],
229	["\271" => "uQ=="],
230	["\272" => "ug=="],
231	["\273" => "uw=="],
232	["\274" => "vA=="],
233	["\275" => "vQ=="],
234	["\276" => "vg=="],
235	["\277" => "vw=="],
236	["\300" => "wA=="],
237	["\301" => "wQ=="],
238	["\302" => "wg=="],
239	["\303" => "ww=="],
240	["\304" => "xA=="],
241	["\305" => "xQ=="],
242	["\306" => "xg=="],
243	["\307" => "xw=="],
244	["\310" => "yA=="],
245	["\311" => "yQ=="],
246	["\312" => "yg=="],
247	["\313" => "yw=="],
248	["\314" => "zA=="],
249	["\315" => "zQ=="],
250	["\316" => "zg=="],
251	["\317" => "zw=="],
252	["\320" => "0A=="],
253	["\321" => "0Q=="],
254	["\322" => "0g=="],
255	["\323" => "0w=="],
256	["\324" => "1A=="],
257	["\325" => "1Q=="],
258	["\326" => "1g=="],
259	["\327" => "1w=="],
260	["\330" => "2A=="],
261	["\331" => "2Q=="],
262	["\332" => "2g=="],
263	["\333" => "2w=="],
264	["\334" => "3A=="],
265	["\335" => "3Q=="],
266	["\336" => "3g=="],
267	["\337" => "3w=="],
268	["\340" => "4A=="],
269	["\341" => "4Q=="],
270	["\342" => "4g=="],
271	["\343" => "4w=="],
272	["\344" => "5A=="],
273	["\345" => "5Q=="],
274	["\346" => "5g=="],
275	["\347" => "5w=="],
276	["\350" => "6A=="],
277	["\351" => "6Q=="],
278	["\352" => "6g=="],
279	["\353" => "6w=="],
280	["\354" => "7A=="],
281	["\355" => "7Q=="],
282	["\356" => "7g=="],
283	["\357" => "7w=="],
284	["\360" => "8A=="],
285	["\361" => "8Q=="],
286	["\362" => "8g=="],
287	["\363" => "8w=="],
288	["\364" => "9A=="],
289	["\365" => "9Q=="],
290	["\366" => "9g=="],
291	["\367" => "9w=="],
292	["\370" => "+A=="],
293	["\371" => "+Q=="],
294	["\372" => "+g=="],
295	["\373" => "+w=="],
296	["\374" => "/A=="],
297	["\375" => "/Q=="],
298	["\376" => "/g=="],
299	["\377" => "/w=="],
300
301	["\000\377" => "AP8="],
302	["\377\000" => "/wA="],
303	["\000\000\000" => "AAAA"],
304
305        [''    => ''],
306	[ASCII('a')   => 'YQ=='],
307	[ASCII('aa')  => 'YWE='],
308	[ASCII('aaa') => 'YWFh'],
309
310	[ASCII('aaa') => 'YWFh'],
311	[ASCII('aaa') => 'YWFh'],
312	[ASCII('aaa') => 'YWFh'],
313
314
315	# from HTTP spec
316	[ASCII('Aladdin:open sesame') => 'QWxhZGRpbjpvcGVuIHNlc2FtZQ=='],
317
318	[ASCII('a') x 100 => 'YWFh' x 33 . 'YQ=='],
319
320	[ASCII('Multipurpose Internet Mail Extensions: The Base64 Content-Transfer-Encoding is designed to represent sequences of octets in a form that is not humanly readable. ')
321	=> "TXVsdGlwdXJwb3NlIEludGVybmV0IE1haWwgRXh0ZW5zaW9uczogVGhlIEJhc2U2NCBDb250ZW50LVRyYW5zZmVyLUVuY29kaW5nIGlzIGRlc2lnbmVkIHRvIHJlcHJlc2VudCBzZXF1ZW5jZXMgb2Ygb2N0ZXRzIGluIGEgZm9ybSB0aGF0IGlzIG5vdCBodW1hbmx5IHJlYWRhYmxlLiA="],
322
323    );
324
325    for $test (@encode_tests) {
326	my($plain, $expected) = ($$test[0], $$test[1]);
327
328	my $encoded = encode_base64($plain, '');
329	if ($encoded ne $expected) {
330	    print "test $testno ($plain): expected $expected, got $encoded\n";
331            print "not ";
332	}
333	my $decoded = decode_base64($encoded);
334	if ($decoded ne $plain) {
335	    print "test $testno ($encoded): expected $plain, got $decoded\n";
336            print "not ";
337	}
338
339	print "ok $testno\n";
340	$testno++;
341    }
342}
343
344sub decodeTest
345{
346    print "# decode test\n";
347
348    local $SIG{__WARN__} = sub { print $_[0] };  # avoid warnings on stderr
349
350    my @decode_tests = (
351	['YWE='   => ASCII('aa')],
352	[' YWE='  =>  ASCII('aa')],
353	['Y WE='  =>  ASCII('aa')],
354	['YWE= '  =>  ASCII('aa')],
355	["Y\nW\r\nE=" =>  ASCII('aa')],
356
357	# These will generate some warnings
358        ['YWE=====' =>  ASCII('aa')],    # extra padding
359	['YWE'      =>  ASCII('aa')],    # missing padding
360        ['YWFh====' =>  ASCII('aaa')],
361        ['YQ'       =>  ASCII('a')],
362        ['Y'        => ''],
363        ['x=='      => ''],
364        [''         => ''],
365        [undef()    => ''],
366    );
367
368    for $test (@decode_tests) {
369	my($encoded, $expected) = ($$test[0], $$test[1]);
370
371	my $decoded = decode_base64($encoded);
372	if ($decoded ne $expected) {
373	    die "test $testno ($encoded): expected $expected, got $decoded\n";
374	}
375	print "ok $testno\n";
376	$testno++;
377    }
378}
379