]> sjero.net Git - wget/blobdiff - tests/HTTPTest.pm
[svn] New OO Architecture for Wget Test Suite
[wget] / tests / HTTPTest.pm
diff --git a/tests/HTTPTest.pm b/tests/HTTPTest.pm
new file mode 100755 (executable)
index 0000000..f174865
--- /dev/null
@@ -0,0 +1,103 @@
+#!/usr/bin/perl -w
+
+use Test;
+
+package HTTPTest;
+our @ISA = qw(Test);
+$VERSION = 0.01;
+
+use strict;
+
+use HTTPServer;
+
+
+{
+    my %_attr_data = ( # DEFAULT
+        _urls         => {},
+        _cmdline      => "",
+        _errcode      => 0,
+        _downloads    => {},
+    );
+    
+       sub _default_for
+       {
+               my ($self, $attr) = @_;
+        return $_attr_data{$attr} if exists $_attr_data{$attr};
+               return $self->SUPER::_default_for($attr);
+       }
+
+       sub _standard_keys 
+       {
+        my ($self) = @_;
+               ($self->SUPER::_standard_keys(), keys %_attr_data);
+       }
+}
+    
+
+sub run {
+    my $self = shift;
+
+    my $pid = fork();
+
+    if($pid == 0) {
+        my $server = HTTPServer->new (LocalAddr => 'localhost',
+                                      LocalPort => '8080',
+                                      ReuseAddr => 1) or die "Cannot create server!!!";
+        $server->run ($self->{_urls});
+    }
+
+    # print "Spawned HTTP server with pid: $pid\n"; 
+
+    # print "Calling $self->{_cmdline}\n";
+    my $errcode = system ($self->{_cmdline});
+
+    kill ('TERM', $pid);
+
+    # print "Killed HTTP server\n";
+
+    $errcode == $self->{_errcode}
+        or die "Test failed: wrong code returned (was: $errcode, expected: $self->{_errcode})";
+
+    if (my $error_str = $self->_verify_download()) {
+        die $error_str;
+    }
+
+    print "Test successful.\n"
+}
+
+
+sub _verify_download {    
+    my $self = shift;
+
+    # use slurp mode to read file content
+    my $old_input_record_separator = $/;
+    undef $/;
+    
+    while (my ($filename, $filedata) = each %{$self->{_downloads}}) {
+        open (FILE, $filename) 
+            or return "Test failed: file $filename not downloaded";
+        
+        my $content = <FILE>;
+        $content eq $filedata->{'content'} 
+            or return "Test failed: wrong content for file $filename";
+
+        if (exists($filedata->{'timestamp'})) {
+            my ($dev,$ino,$mode,$nlink,$uid,$gid,$rdev,$size,
+                $atime,$mtime,$ctime,$blksize,$blocks) = stat FILE;
+
+            $mtime == $filedata->{'timestamp'} 
+                or return "Test failed: wrong timestamp for file $filename";
+        }
+        
+        close (FILE);
+    } 
+    
+    $/ = $old_input_record_separator;
+
+    return "";
+}
+
+1;
+
+# vim: et ts=4 sw=4
+