randyk      2004/07/12 06:10:14

  Added:       glue/perl/t/apreq upload.t
               glue/perl/t/response/TestApReq upload.pm
  Log:
  Reviewed by:  joes
  add upload test for the perl glue involving uploading text and binary files.
  
  Revision  Changes    Path
  1.1                  httpd-apreq-2/glue/perl/t/apreq/upload.t
  
  Index: upload.t
  ===================================================================
  use strict;
  use warnings FATAL => 'all';
  
  use Apache::Test;
  use Apache::TestUtil;
  use Apache::TestRequest qw(UPLOAD_BODY GET_BODY_ASSERT);
  use Cwd;
  require File::Basename;
  
  my $cwd = getcwd();
  my $location = "/TestApReq__upload";
  
  my %types = (perl => 'application/octet-stream',
               httpd => 'application/octet-stream',
               'perltoc.pod' => 'text/x-pod',
               'perlport.pod' => 'text/x-pod');
  my @names = sort keys %types;
  my @methods = sort qw/slurp fh tempname link io/;
  
  plan tests => @names * @methods, have_lwp;
  
  foreach my $name (@names) {
      my $url = ( ($name =~ /\.pod$/) ?
          "getfiles-perl-pod/" : "/getfiles-binary-" ) . $name;
      my $content = GET_BODY_ASSERT($url);
      my $path = File::Spec->catfile($cwd, $name);
      open my $fh, ">", $path or die "Cannot open $path: $!";
      binmode $fh;
      print $fh $content;
      close $fh;
  }
  
  eval {require Digest::MD5;};
  my $has_md5 = $@ ? 0 : 1;
  
  foreach my $file( map {File::Spec->catfile($cwd, $_)} @names) {
      my $size = -s $file;
      my $cs = $has_md5 ? cs($file) : 0;
      my $basename = File::Basename::basename($file);
  
      for my $method ( @methods) {
          my $result = UPLOAD_BODY("$location?method=$method;has_md5=$has_md5", 
                                   filename => $file);
          my $expected = <<END;
  
  type: $types{$basename}
  size: $size
  filename: $basename
  md5: $cs
  END
          ok t_cmp($result, $expected, "$method test for $basename");
      }
      unlink $file if -f $file;
  }
  
  sub cs {
      my $file = shift;
      open my $fh, '<', $file or die qq{Cannot open "$file": $!};
      binmode $fh;
      my $md5 = Digest::MD5->new->addfile($fh)->hexdigest;
      close $fh;
      return $md5;
  }
  
  
  
  1.1                  httpd-apreq-2/glue/perl/t/response/TestApReq/upload.pm
  
  Index: upload.pm
  ===================================================================
  package TestApReq::upload;
  
  use strict;
  use warnings FATAL => 'all';
  
  use Apache::RequestRec;
  use Apache::RequestIO;
  use Apache::Request ();
  use Apache::Upload;
  use File::Spec;
  require File::Basename;
  
  sub handler {
      my $r = shift;
      my $req = Apache::Request->new($r);
      my $temp_dir = File::Spec->tmpdir;
  
      my $method  = $req->args('method');
      my $has_md5  = $req->args('has_md5');
      require Digest::MD5 if $has_md5;
      my $upload = $req->upload(($req->upload)[0]);
      my $type = $upload->type;
      my $basename = File::Basename::basename($upload->filename);
      my ($data, $fh);
  
      if ($method eq 'slurp') {
          $upload->slurp($data);
      }
      elsif ($method eq 'fh') {
          read $upload->fh, $data, $upload->size;
      }
      elsif ($method eq 'tempname') {
          my $name = $upload->tempname;
          open $fh, "<:APR", $name, $upload->pool 
              or die "Can't open $name: $!";
          binmode $fh;
          read $fh, $data, $upload->size;
          close $fh;
      }
      elsif ($method eq 'link') {
          my $link_file = File::Spec->catfile($temp_dir, "linkfile");
          unlink $link_file if -f $link_file;
          $upload->link($link_file) or die "Can't link to $link_file: $!";
          open $fh, "<", $link_file or die "Can't open $link_file: $!";
          binmode $fh;
          read $fh, $data, $upload->size;
          close $fh;
          unlink $link_file if -f $link_file;
      }
      elsif ($method eq 'io') {
         read $upload->io, $data, $upload->size;
      }
      else  {
          die "unknown method: $method";
      }
  
      my $temp_file = File::Spec->catfile($temp_dir, $basename);
      unlink $temp_file if -f $temp_file;
      open my $wfh, ">", $temp_file or die "Can't open $temp_file: $!";
      binmode $wfh;
      print $wfh $data;
      close $wfh;
      my $cs = $has_md5 ? cs($temp_file) : 0;
   
      $req->content_type('text/plain');
      my $size = -s $temp_file;
      $r->print(<<END);
  
  type: $type
  size: $size
  filename: $basename
  md5: $cs
  END
      unlink $temp_file if -f $temp_file;
      return 0;
  }
  
  sub cs {
      my $file = shift;
      open my $fh, '<', $file or die qq{Cannot open "$file": $!};
      binmode $fh;
      my $md5 = Digest::MD5->new->addfile($fh)->hexdigest;
      close $fh;
      return $md5;
  }
  
  1;
  __END__
  
  
  

Reply via email to