This is a live mirror of the Perl 5 development currently hosted at https://github.com/perl/perl5
Digest-MD5: Consolidate byte-swapping paths
[perl5.git] / cpan / Digest-MD5 / t / files.t
CommitLineData
326fafaa 1
c8780a73 2print "1..3\n";
3357b1b1
JH
3
4use strict;
4d5cc332 5use Digest::MD5 qw(md5 md5_hex md5_base64);
3357b1b1 6
8ff693ee
JH
7# To update the EBCDIC section even on a Latin 1 platform,
8# run this script with $ENV{EBCDIC_MD5SUM} set to a true value.
9# (You'll need to have Perl 5.7.3 or later, to have the Encode installed.)
10# (And remember that under the Perl core distribution you should
11# also have the $ENV{PERL_CORE} set to a true value.)
12
9a03235d 13my $EXPECT;
9508959b
JH
14if (ord "A" == 193) { # EBCDIC
15 $EXPECT = <<EOT;
0a3486ef 160956ffb4f6416082b27d6680b4cf73fc README
05a6ec77 1760a80f534f0017745eb755f36a946fe7 MD5.xs
e69a2255
JH
18276da0aa4e9a08b7fe09430c9c5690aa rfc1321.txt
19EOT
9508959b 20} else {
c8780a73 21 # This is the output of: 'md5sum README MD5.xs rfc1321.txt'
9508959b 22 $EXPECT = <<EOT;
0a3486ef 232f93400875dbb56f36691d5f69f3eba5 README
ee9ac1cd 245b8b4f96bc27a425501307c5461970db MD5.xs
9508959b
JH
25754b9db19f79dbc4992f7166eb0f37ce rfc1321.txt
26EOT
27}
5a046520
JH
28
29if (!(-f "README") && -f "../README") {
30 chdir("..") or die "Can't chdir: $!";
fed3f325 31}
8c42d64c 32
5a046520
JH
33my $testno = 0;
34
4d5cc332
JH
35my $B64 = 1;
36eval { require MIME::Base64; };
37if ($@) {
9508959b 38 print "# $@: Will not test base64 methods\n";
4d5cc332
JH
39 $B64 = 0;
40}
41
3357b1b1
JH
42for (split /^/, $EXPECT) {
43 my($md5hex, $file) = split ' ';
8ff693ee 44 my $base = $file;
f05fc781 45# print "# $base\n";
9508959b 46 if ($ENV{PERL_CORE}) {
8db65552
SH
47 # Don't have these in core.
48 if ($file eq 'rfc1321.txt' or $file eq 'README') {
9508959b
JH
49 print "ok ", ++$testno, " # Skip: PERL_CORE\n";
50 next;
51 }
9508959b
JH
52 }
53# print "# file = $file\n";
8ff693ee
JH
54 unless (-f $file) {
55 warn "No such file: $file\n";
56 next;
57 }
58 if ($ENV{EBCDIC_MD5SUM}) {
0dfa9f37 59 require Encode;
8ff693ee 60 my $data = cat_file($file);
0dfa9f37 61 Encode::from_to($data, 'latin1', 'cp1047');
e69a2255
JH
62 print md5_hex($data), " $base\n";
63 next;
64 }
3357b1b1 65 my $md5bin = pack("H*", $md5hex);
4d5cc332
JH
66 my $md5b64;
67 if ($B64) {
68 $md5b64 = MIME::Base64::encode($md5bin, "");
69 chop($md5b64); chop($md5b64); # remove padding
70 }
3357b1b1 71 my $failed;
9508959b 72 my $got;
3357b1b1
JH
73
74 if (digest_file($file, 'digest') ne $md5bin) {
75 print "$file: Bad digest\n";
76 $failed++;
77 }
78
9508959b
JH
79 if (($got = digest_file($file, 'hexdigest')) ne $md5hex) {
80 print "$file: Bad hexdigest: got $got expected $md5hex\n";
3357b1b1
JH
81 $failed++;
82 }
83
4d5cc332
JH
84 if ($B64 && digest_file($file, 'b64digest') ne $md5b64) {
85 print "$file: Bad b64digest\n";
86 $failed++;
87 }
88
3357b1b1
JH
89 my $data = cat_file($file);
90 if (md5($data) ne $md5bin) {
91 print "$file: md5() failed\n";
92 $failed++;
93 }
94 if (md5_hex($data) ne $md5hex) {
95 print "$file: md5_hex() failed\n";
96 $failed++;
97 }
4d5cc332
JH
98 if ($B64 && md5_base64($data) ne $md5b64) {
99 print "$file: md5_base64() failed\n";
100 $failed++;
101 }
3357b1b1
JH
102
103 if (Digest::MD5->new->add($data)->digest ne $md5bin) {
104 print "$file: MD5->new->add(...)->digest failed\n";
105 $failed++;
106 }
107 if (Digest::MD5->new->add($data)->hexdigest ne $md5hex) {
108 print "$file: MD5->new->add(...)->hexdigest failed\n";
109 $failed++;
110 }
4d5cc332
JH
111 if ($B64 && Digest::MD5->new->add($data)->b64digest ne $md5b64) {
112 print "$file: MD5->new->add(...)->b64digest failed\n";
113 $failed++;
114 }
3357b1b1
JH
115
116 my @data = split //, $data;
117 if (md5(@data) ne $md5bin) {
118 print "$file: md5(\@data) failed\n";
119 $failed++;
120 }
121 if (Digest::MD5->new->add(@data)->digest ne $md5bin) {
122 print "$file: MD5->new->add(\@data)->digest failed\n";
123 $failed++;
124 }
125 my $md5 = Digest::MD5->new;
126 for (@data) {
127 $md5->add($_);
128 }
129 if ($md5->digest ne $md5bin) {
130 print "$file: $md5->add()-loop failed\n";
131 $failed++;
132 }
133
134 print "not " if $failed;
135 print "ok ", ++$testno, "\n";
136}
137
138
139sub digest_file
140{
141 my($file, $method) = @_;
142 $method ||= "digest";
143 #print "$file $method\n";
144
145 open(FILE, $file) or die "Can't open $file: $!";
3357b1b1
JH
146 my $digest = Digest::MD5->new->addfile(*FILE)->$method();
147 close(FILE);
148
149 $digest;
150}
151
152sub cat_file
153{
154 my($file) = @_;
155 local $/; # slurp
156 open(FILE, $file) or die "Can't open $file: $!";
19f0e64f 157
9a03235d
GA
158 # For PerlIO in case of UTF-8 locales.
159 eval 'binmode(FILE, ":bytes")' if $] >= 5.008;
19f0e64f 160
3357b1b1
JH
161 my $tmp = <FILE>;
162 close(FILE);
163 $tmp;
164}
165