Commit | Line | Data |
5a046520 |
1 | print "1..5\n"; |
3357b1b1 |
2 | |
3 | use strict; |
4d5cc332 |
4 | use Digest::MD5 qw(md5 md5_hex md5_base64); |
3357b1b1 |
5 | |
6 | # |
5a046520 |
7 | # This is the output of: 'md5sum Changes README MD5.pm MD5.xs rfc1321.txt' |
3357b1b1 |
8 | # |
5a046520 |
9 | my $EXPECT = <<EOT; |
10 | 23cafa2de11474f0df8f808cc588bcc9 Changes |
11 | 3519f3d02c7c91158f732f0f00064657 README |
12 | 0268931475ae2a2e843ff58504cfa3f0 MD5.pm |
13 | 1be293491bba726810f8e87671ee0328 MD5.xs |
14 | 754b9db19f79dbc4992f7166eb0f37ce rfc1321.txt |
fed3f325 |
15 | EOT |
5a046520 |
16 | |
17 | if (!(-f "README") && -f "../README") { |
18 | chdir("..") or die "Can't chdir: $!"; |
fed3f325 |
19 | } |
8c42d64c |
20 | |
5a046520 |
21 | my $testno = 0; |
22 | |
4d5cc332 |
23 | my $B64 = 1; |
24 | eval { require MIME::Base64; }; |
25 | if ($@) { |
26 | print $@; |
5a046520 |
27 | print "Will not test base64 methods\n"; |
4d5cc332 |
28 | $B64 = 0; |
29 | } |
30 | |
3357b1b1 |
31 | for (split /^/, $EXPECT) { |
32 | my($md5hex, $file) = split ' '; |
3357b1b1 |
33 | my $md5bin = pack("H*", $md5hex); |
4d5cc332 |
34 | my $md5b64; |
35 | if ($B64) { |
36 | $md5b64 = MIME::Base64::encode($md5bin, ""); |
37 | chop($md5b64); chop($md5b64); # remove padding |
38 | } |
3357b1b1 |
39 | my $failed; |
40 | |
41 | if (digest_file($file, 'digest') ne $md5bin) { |
42 | print "$file: Bad digest\n"; |
43 | $failed++; |
44 | } |
45 | |
46 | if (digest_file($file, 'hexdigest') ne $md5hex) { |
47 | print "$file: Bad hexdigest\n"; |
48 | $failed++; |
49 | } |
50 | |
4d5cc332 |
51 | if ($B64 && digest_file($file, 'b64digest') ne $md5b64) { |
52 | print "$file: Bad b64digest\n"; |
53 | $failed++; |
54 | } |
55 | |
3357b1b1 |
56 | my $data = cat_file($file); |
57 | if (md5($data) ne $md5bin) { |
58 | print "$file: md5() failed\n"; |
59 | $failed++; |
60 | } |
61 | if (md5_hex($data) ne $md5hex) { |
62 | print "$file: md5_hex() failed\n"; |
63 | $failed++; |
64 | } |
4d5cc332 |
65 | if ($B64 && md5_base64($data) ne $md5b64) { |
66 | print "$file: md5_base64() failed\n"; |
67 | $failed++; |
68 | } |
3357b1b1 |
69 | |
70 | if (Digest::MD5->new->add($data)->digest ne $md5bin) { |
71 | print "$file: MD5->new->add(...)->digest failed\n"; |
72 | $failed++; |
73 | } |
74 | if (Digest::MD5->new->add($data)->hexdigest ne $md5hex) { |
75 | print "$file: MD5->new->add(...)->hexdigest failed\n"; |
76 | $failed++; |
77 | } |
4d5cc332 |
78 | if ($B64 && Digest::MD5->new->add($data)->b64digest ne $md5b64) { |
79 | print "$file: MD5->new->add(...)->b64digest failed\n"; |
80 | $failed++; |
81 | } |
3357b1b1 |
82 | |
83 | my @data = split //, $data; |
84 | if (md5(@data) ne $md5bin) { |
85 | print "$file: md5(\@data) failed\n"; |
86 | $failed++; |
87 | } |
88 | if (Digest::MD5->new->add(@data)->digest ne $md5bin) { |
89 | print "$file: MD5->new->add(\@data)->digest failed\n"; |
90 | $failed++; |
91 | } |
92 | my $md5 = Digest::MD5->new; |
93 | for (@data) { |
94 | $md5->add($_); |
95 | } |
96 | if ($md5->digest ne $md5bin) { |
97 | print "$file: $md5->add()-loop failed\n"; |
98 | $failed++; |
99 | } |
100 | |
101 | print "not " if $failed; |
102 | print "ok ", ++$testno, "\n"; |
103 | } |
104 | |
105 | |
106 | sub digest_file |
107 | { |
108 | my($file, $method) = @_; |
109 | $method ||= "digest"; |
110 | #print "$file $method\n"; |
111 | |
112 | open(FILE, $file) or die "Can't open $file: $!"; |
5a046520 |
113 | binmode(FILE); |
3357b1b1 |
114 | my $digest = Digest::MD5->new->addfile(*FILE)->$method(); |
115 | close(FILE); |
116 | |
117 | $digest; |
118 | } |
119 | |
120 | sub cat_file |
121 | { |
122 | my($file) = @_; |
123 | local $/; # slurp |
124 | open(FILE, $file) or die "Can't open $file: $!"; |
5a046520 |
125 | binmode(FILE); |
3357b1b1 |
126 | my $tmp = <FILE>; |
127 | close(FILE); |
128 | $tmp; |
129 | } |
130 | |