]> sjero.net Git - wget/blob - tests/HTTPTest.pm
[svn] New OO Architecture for Wget Test Suite
[wget] / tests / HTTPTest.pm
1 #!/usr/bin/perl -w
2
3 use Test;
4
5 package HTTPTest;
6 our @ISA = qw(Test);
7 $VERSION = 0.01;
8
9 use strict;
10
11 use HTTPServer;
12
13
14 {
15     my %_attr_data = ( # DEFAULT
16         _urls         => {},
17         _cmdline      => "",
18         _errcode      => 0,
19         _downloads    => {},
20     );
21     
22         sub _default_for
23         {
24                 my ($self, $attr) = @_;
25         return $_attr_data{$attr} if exists $_attr_data{$attr};
26                 return $self->SUPER::_default_for($attr);
27         }
28
29         sub _standard_keys 
30         {
31         my ($self) = @_;
32                 ($self->SUPER::_standard_keys(), keys %_attr_data);
33         }
34 }
35     
36
37 sub run {
38     my $self = shift;
39
40     my $pid = fork();
41
42     if($pid == 0) {
43         my $server = HTTPServer->new (LocalAddr => 'localhost',
44                                       LocalPort => '8080',
45                                       ReuseAddr => 1) or die "Cannot create server!!!";
46         $server->run ($self->{_urls});
47     }
48
49     # print "Spawned HTTP server with pid: $pid\n"; 
50
51     # print "Calling $self->{_cmdline}\n";
52     my $errcode = system ($self->{_cmdline});
53
54     kill ('TERM', $pid);
55
56     # print "Killed HTTP server\n";
57
58     $errcode == $self->{_errcode}
59         or die "Test failed: wrong code returned (was: $errcode, expected: $self->{_errcode})";
60
61     if (my $error_str = $self->_verify_download()) {
62         die $error_str;
63     }
64
65     print "Test successful.\n"
66 }
67
68
69 sub _verify_download {    
70     my $self = shift;
71
72     # use slurp mode to read file content
73     my $old_input_record_separator = $/;
74     undef $/;
75     
76     while (my ($filename, $filedata) = each %{$self->{_downloads}}) {
77         open (FILE, $filename) 
78             or return "Test failed: file $filename not downloaded";
79         
80         my $content = <FILE>;
81         $content eq $filedata->{'content'} 
82             or return "Test failed: wrong content for file $filename";
83
84         if (exists($filedata->{'timestamp'})) {
85             my ($dev,$ino,$mode,$nlink,$uid,$gid,$rdev,$size,
86                 $atime,$mtime,$ctime,$blksize,$blocks) = stat FILE;
87
88             $mtime == $filedata->{'timestamp'} 
89                 or return "Test failed: wrong timestamp for file $filename";
90         }
91         
92         close (FILE);
93     } 
94     
95     $/ = $old_input_record_separator;
96
97     return "";
98 }
99
100 1;
101
102 # vim: et ts=4 sw=4
103