Integrate Digest-1.00 and Digest-MD5-2.13, from Gisle Aas.
[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 = <<EOT;
15 9e1d1183ff41717c91a563c41e08d672  ext/Digest/MD5/MD5.pm
16 61debd0ec12e131e1ba220e2f3ad2d26  ext/Digest/MD5/MD5.xs
17 EOT
18
19 my $testno = 0;
20
21 use File::Spec;
22
23 for (split /^/, $EXPECT) {
24      my($md5hex, $file) = split ' ';
25      my @path = split(m:/:, $file);
26      my $last = pop @path;
27      my $path = File::Spec->updir;
28      while (@path) {
29          $path = File::Spec->catdir($path, shift @path);
30      }
31      $file = File::Spec->catfile($path, $last);
32      my $md5bin = pack("H*", $md5hex);
33      my $failed;
34
35      if (digest_file($file, 'digest') ne $md5bin) {
36          print "$file: Bad digest\n";
37          $failed++;
38      }
39
40      if (digest_file($file, 'hexdigest') ne $md5hex) {
41          print "$file: Bad hexdigest\n";
42          $failed++;
43      }
44
45      my $data = cat_file($file);
46      if (md5($data) ne $md5bin) {
47          print "$file: md5() failed\n";
48          $failed++;
49      }
50      if (md5_hex($data) ne $md5hex) {
51          print "$file: md5_hex() failed\n";
52          $failed++;
53      }
54
55      if (Digest::MD5->new->add($data)->digest ne $md5bin) {
56          print "$file: MD5->new->add(...)->digest failed\n";
57          $failed++;
58      }
59      if (Digest::MD5->new->add($data)->hexdigest ne $md5hex) {
60          print "$file: MD5->new->add(...)->hexdigest failed\n";
61          $failed++;
62      }
63
64      my @data = split //, $data;
65      if (md5(@data) ne $md5bin) {
66          print "$file: md5(\@data) failed\n";
67          $failed++;
68      }
69      if (Digest::MD5->new->add(@data)->digest ne $md5bin) {
70          print "$file: MD5->new->add(\@data)->digest failed\n";
71          $failed++;
72      }
73      my $md5 = Digest::MD5->new;
74      for (@data) {
75          $md5->add($_);
76      }
77      if ($md5->digest ne $md5bin) {
78          print "$file: $md5->add()-loop failed\n";
79          $failed++;
80      }
81
82      print "not " if $failed;
83      print "ok ", ++$testno, "\n";
84 }
85
86
87 sub digest_file
88 {
89     my($file, $method) = @_;
90     $method ||= "digest";
91     #print "$file $method\n";
92
93     open(FILE, $file) or die "Can't open $file: $!";
94     binmode(FILE);
95     my $digest = Digest::MD5->new->addfile(*FILE)->$method();
96     close(FILE);
97
98     $digest;
99 }
100
101 sub cat_file
102 {
103     my($file) = @_;
104     local $/;  # slurp
105     open(FILE, $file) or die "Can't open $file: $!";
106     binmode(FILE);
107     my $tmp = <FILE>;
108     close(FILE);
109     $tmp;
110 }
111