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