EBCDIC patches for Digest::MD5 tests from Peter Prymmer.
[p5sagit/p5-mst-13.2.git] / t / lib / md5-file.t
1 BEGIN {
2         chdir 't' if -d 't';
3         @INC = '../lib';
4 }
5
6 print "1..2\n";
7
8 use strict;
9 use Digest::MD5 qw(md5 md5_hex);
10
11 #
12 # This is the output of: 'md5sum MD5.pm MD5.xs'
13 #
14 my $EXPECT;
15
16 if (ord('A' == 193) { # EBCDIC
17 $EXPECT = <<EOT;
18 9e1d1183ff41717c91a563c41e08d672  ext/Digest/MD5/MD5.pm
19 61debd0ec12e131e1ba220e2f3ad2d26  ext/Digest/MD5/MD5.xs
20 EOT
21 } else { # ASCII
22 $EXPECT = <<EOT;
23 9e1d1183ff41717c91a563c41e08d672  ext/Digest/MD5/MD5.pm
24 61debd0ec12e131e1ba220e2f3ad2d26  ext/Digest/MD5/MD5.xs
25 EOT
26 }
27 my $testno = 0;
28
29 use File::Spec;
30
31 for (split /^/, $EXPECT) {
32      my($md5hex, $file) = split ' ';
33      my @path = split(m:/:, $file);
34      my $last = pop @path;
35      my $path = File::Spec->updir;
36      while (@path) {
37          $path = File::Spec->catdir($path, shift @path);
38      }
39      $file = File::Spec->catfile($path, $last);
40      my $md5bin = pack("H*", $md5hex);
41      my $failed;
42
43      if (digest_file($file, 'digest') ne $md5bin) {
44          print "$file: Bad digest\n";
45          $failed++;
46      }
47
48      if (digest_file($file, 'hexdigest') ne $md5hex) {
49          print "$file: Bad hexdigest\n";
50          $failed++;
51      }
52
53      my $data = cat_file($file);
54      if (md5($data) ne $md5bin) {
55          print "$file: md5() failed\n";
56          $failed++;
57      }
58      if (md5_hex($data) ne $md5hex) {
59          print "$file: md5_hex() failed\n";
60          $failed++;
61      }
62
63      if (Digest::MD5->new->add($data)->digest ne $md5bin) {
64          print "$file: MD5->new->add(...)->digest failed\n";
65          $failed++;
66      }
67      if (Digest::MD5->new->add($data)->hexdigest ne $md5hex) {
68          print "$file: MD5->new->add(...)->hexdigest failed\n";
69          $failed++;
70      }
71
72      my @data = split //, $data;
73      if (md5(@data) ne $md5bin) {
74          print "$file: md5(\@data) failed\n";
75          $failed++;
76      }
77      if (Digest::MD5->new->add(@data)->digest ne $md5bin) {
78          print "$file: MD5->new->add(\@data)->digest failed\n";
79          $failed++;
80      }
81      my $md5 = Digest::MD5->new;
82      for (@data) {
83          $md5->add($_);
84      }
85      if ($md5->digest ne $md5bin) {
86          print "$file: $md5->add()-loop failed\n";
87          $failed++;
88      }
89
90      print "not " if $failed;
91      print "ok ", ++$testno, "\n";
92 }
93
94
95 sub digest_file
96 {
97     my($file, $method) = @_;
98     $method ||= "digest";
99     #print "$file $method\n";
100
101     open(FILE, $file) or die "Can't open $file: $!";
102     binmode(FILE);
103     my $digest = Digest::MD5->new->addfile(*FILE)->$method();
104     close(FILE);
105
106     $digest;
107 }
108
109 sub cat_file
110 {
111     my($file) = @_;
112     local $/;  # slurp
113     open(FILE, $file) or die "Can't open $file: $!";
114     binmode(FILE);
115     my $tmp = <FILE>;
116     close(FILE);
117     $tmp;
118 }
119