Integrate mainline
[p5sagit/p5-mst-13.2.git] / ext / MIME / Base64 / t / base64.t
1 BEGIN {
2     if ($ENV{'PERL_CORE'}){
3         chdir 't';
4         unshift @INC, '../lib';
5     }
6 }
7
8 use strict;
9 use MIME::Base64;
10
11 print "1..283\n";
12
13 print "# Testing MIME::Base64-", $MIME::Base64::VERSION, "\n";
14
15 BEGIN {
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
25 my $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?
29 my $test;
30
31 encodeTest();
32 decodeTest();
33
34 # This used to generate a warning
35 print "not " unless decode_base64(encode_base64("foo")) eq "foo";
36 print "ok ", $testno++, "\n";
37
38 sub 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         if (ord('A') != 193) { # perl versions broken on EBCDIC
340         # Try the old Perl versions too
341         if ($encoded ne MIME::Base64::old_encode_base64($plain, '')) {
342             print "old_encode_base64 give different result.\n";
343             print "not ";
344         }
345         if ($plain ne MIME::Base64::old_decode_base64($encoded)) {
346             print "old_decode_base64 give different result.\n";
347             print "not ";
348         }
349         }
350                 
351         print "ok $testno\n";
352         $testno++;
353     }
354 }
355
356 sub decodeTest
357 {
358     print "# decode test\n";
359
360     local $SIG{__WARN__} = sub { print $_[0] };  # avoid warnings on stderr
361
362     my @decode_tests = (
363         ['YWE='   => ASCII('aa')],
364         [' YWE='  =>  ASCII('aa')],
365         ['Y WE='  =>  ASCII('aa')],
366         ['YWE= '  =>  ASCII('aa')],
367         ["Y\nW\r\nE=" =>  ASCII('aa')],
368
369         # These will generate some warnings
370         ['YWE=====' =>  ASCII('aa')],    # extra padding
371         ['YWE'      =>  ASCII('aa')],    # missing padding
372         ['YWFh====' =>  ASCII('aaa')],
373         ['YQ'       =>  ASCII('a')],
374         ['Y'        => ''],
375         ['x=='      => ''],
376         [''         => ''],
377         [undef()    => ''],
378     );
379
380     for $test (@decode_tests) {
381         my($encoded, $expected) = ($$test[0], $$test[1]);
382
383         my $decoded = decode_base64($encoded);
384         if ($decoded ne $expected) {
385             die "test $testno ($encoded): expected $expected, got $decoded\n";
386         }
387         print "ok $testno\n";
388         $testno++;
389     }
390 }