diff options
Diffstat (limited to 'tests')
| -rwxr-xr-x | tests/runtests.pl | 265 | 
1 files changed, 159 insertions, 106 deletions
| diff --git a/tests/runtests.pl b/tests/runtests.pl index 06d27462a..f6e897965 100755 --- a/tests/runtests.pl +++ b/tests/runtests.pl @@ -373,13 +373,125 @@ sub stopserver {  }  ####################################################################### +# Verify that the server that runs on $ip, $port is our server.  This also +# implies that we can speak with it, as there might be occasions when the +# server runs fine but we cannot talk to it ("Failed to connect to ::1: Can't +# assign requested address" # + +sub verifyhttp { +    my ($proto, $ip, $port) = @_; +    my $cmd = "$CURL -m4 -o log/verifiedserver -ksvg \"$proto://$ip:$port/verifiedserver\" 2>log/verifyhttp"; +    my $pid; + +    # verify if our/any server is running on this port +    print "CMD; $cmd\n" if ($verbose); +    my $res = system($cmd); + +    $res >>= 8; # rotate the result +    my $data; + +    if($res && $verbose) { +        open(ERR, "<log/verifyhttp"); +        my @e = <ERR>; +        close(ERR); +        print "RUN: curl command returned $res\n"; +        for(@e) { +            if($_ !~ /^([ \t]*)$/) { +                print "RUN: $_"; +            } +        } +    } +    open(FILE, "<log/verifiedserver"); +    my @file=<FILE>; +    close(FILE); +    $data=$file[0]; # first line + +    if ( $data =~ /WE ROOLZ: (\d+)/ ) { +        $pid = 0+$1; +    } +    elsif($res == 6) { +        # curl: (6) Couldn't resolve host '::1' +        print "RUN: failed to resolve host\n"; +        return 0; +    } +    elsif($data || ($res != 7)) { +        print "RUN: Unknown server is running on port $port\n"; +        return 0; +    } +    return $pid; +} + +####################################################################### +# Verify that the server that runs on $ip, $port is our server.  This also +# implies that we can speak with it, as there might be occasions when the +# server runs fine but we cannot talk to it ("Failed to connect to ::1: Can't +# assign requested address" # + +sub verifyftp { +    my ($proto, $ip, $port) = @_; +    my $pid; +    my $time=time(); +    my $cmd="$CURL -m4 --silent -vg \"$proto://$ip:$port/verifiedserver\" 2>log/verifyftp"; +    # check if this is our server running on this port: +    my @data=`$cmd`; +    print "RUN: $cmd\n" if($verbose); +    my $line; + +    # if this took more than 2 secs, we assume it "hung" on a weird server +    my $took = time()-$time; + +    foreach $line (@data) { +        if ( $line =~ /WE ROOLZ: (\d+)/ ) { +            # this is our test server with a known pid! +            $pid = 0+$1; +            last; +        } +    } +    if($pid <= 0 && $data[0]) { +        # this is not a known server +        print "RUN: Unknown server on our FTP port: $port\n"; +        return 0; +    } +    return $pid; +} + +####################################################################### +# Verify that the server that runs on $ip, $port is our server. +# Retry during 5 seconds before giving up. +# + +my %protofunc = ('http' => \&verifyhttp, +                 'https' => \&verifyhttp, +                 'ftp' => \&verifyftp); + +sub verifyserver { +    my ($proto, $ip, $port) = @_; + +    my $count = 5; # try for this many seconds +    my $pid; + +    while($count--) { +        my $fun = $protofunc{$proto}; + +        $pid = &$fun($proto, $ip, $port); + +        if($pid) { +            last; +        } +        sleep(1); +    } +    return $pid; +} + + + +#######################################################################  # start the http server  #  sub runhttpserver {      my ($verbose, $ipv6) = @_;      my $RUNNING;      my $pid; -    my $cmd;      my $pidfile = $HTTPPIDFILE;      my $port = $HTTPPORT;      my $ip = $HOSTIP; @@ -395,55 +507,8 @@ sub runhttpserver {      $pid = checkserver($pidfile); -    if($pid <= 0 ) { - -        # verify if our/any server is running on this port -        $cmd = "$CURL -o log/verifiedserver -g \"http://$ip:$port/verifiedserver\" 2>log/verifyhttp"; -        print "CMD; $cmd\n" if ($verbose); -        my $res = system($cmd); - -        $res >>= 8; # rotate the result -        my $data; - -        if($res && $verbose) { -            open(ERR, "<log/verifystderr"); -            my @e = <ERR>; -            close(ERR); -            print "RUN: curl command returned $res\n"; -            for(@e) { -                if($_ !~ /^([ \t]*)$/) { -                    print "RUN: $_"; -                } -            } -        } -        open(FILE, "<log/verifiedserver"); -        my @file=<FILE>; -        close(FILE); -        $data=$file[0]; # first line - -        if ( $data =~ /WE ROOLZ: (\d+)/ ) { -            $pid = 0+$1; -        } -        elsif($res == 6) { -            # curl: (6) Couldn't resolve host '::1' -            print "RUN: failed to resolve host\n"; -            return -3; -        } -        elsif($data || ($res != 7)) { -            print "RUN: Unknown server is running on port $port\n"; -            return -2; -        } -    } -      if($pid > 0) { -        my $res = kill (9, $pid); # die! -        if(!$res) { -            print "RUN: Failed to kill test HTTP$nameext server, do it ", -            "manually and restart the tests.\n"; -            stopservers($verbose); -            exit; -        } -        sleep(1); +        stopserver($pid);      }      my $flag=$debugprotocol?"-v ":""; @@ -451,7 +516,8 @@ sub runhttpserver {      if($dir) {          $flag .= "-d \"$dir\" ";      } -    $cmd="$perl $srcdir/httpserver.pl -p $pidfile $flag $port $ipv6"; + +    my $cmd="$perl $srcdir/httpserver.pl -p $pidfile $flag $port $ipv6";      my ($httppid, $pid2) =          startnew($cmd, $pidfile); # start the server in a new process @@ -462,6 +528,14 @@ sub runhttpserver {          exit;      } +    # Server is up. Verify that we can speak to it. +    if(!verifyserver("http", $ip, $port)) { +        print "RUN: HTTP$nameext server failed verification\n"; +        # failed to talk to it properly. Kill the server and return failure +        stopserver("$httppid $pid2"); +        return (0,0); +    } +      if($verbose) {          print "RUN: HTTP$nameext server is now running PID $httppid\n";      } @@ -475,14 +549,20 @@ sub runhttpserver {  # start the https server (or rather, tunnel)  #  sub runhttpsserver { -    my $verbose = $_[0]; +    my ($verbose, $ipv6) = @_;      my $STATUS;      my $RUNNING; +    my $ip = $HOSTIP;      if(!$stunnel) {          return 0;      } +    if($ipv6) { +        # not complete yet +        $ip = $HOST6IP; +    } +      my $pid=checkserver($HTTPSPIDFILE);      if($pid > 0) { @@ -502,6 +582,14 @@ sub runhttpsserver {          exit;      } +    # Server is up. Verify that we can speak to it. +    if(!verifyserver("https", $ip, $HTTPSPORT)) { +        print "RUN: HTTPS server failed verification\n"; +        # failed to talk to it properly. Kill the server and return failure +        stopserver("$httpspid $pid2"); +        return (0,0); +    } +      if($verbose) {          print "RUN: HTTPS server is now running PID $httpspid\n";      } @@ -511,7 +599,6 @@ sub runhttpsserver {      return ($httpspid, $pid2);  } -  #######################################################################  # start the ftp server  # @@ -524,6 +611,7 @@ sub runftpserver {      my $pidfile = $id?$FTP2PIDFILE:$FTPPIDFILE;      my $ip=$HOSTIP;      my $nameext; +    my $cmd;      if($ipv6) {          # if IPv6, use a different setup @@ -534,46 +622,13 @@ sub runftpserver {      }      my $pid = checkserver($pidfile); - -    if ($pid <= 0) { -        print "RUN: Check port $port for the FTP$id$nameext server\n" -            if ($verbose); - -        my $time=time(); -        my $cmd="$CURL -m4 --silent -vg \"ftp://$ip:$port/verifiedserver\" 2>log/verifyftp"; -        # check if this is our server running on this port: -        my @data=`$cmd`; -        print "RUN: $cmd\n" if($verbose); -        my $line; - -        # if this took more than 2 secs, we assume it "hung" on a weird server -        my $took = time()-$time; - -        foreach $line (@data) { -            if ( $line =~ /WE ROOLZ: (\d+)/ ) { -                # this is our test server with a known pid! -                $pid = 0+$1; -            } -        } -        if($pid <= 0 && $data[0]) { -            # this is not a known server -            print "RUN: Unknown server on our favourite FTP$nameext port: $port\n"; -            return -1; -        } -    } - -    if($pid > 0) { -        print "RUN: Killing a previous server using pid $pid\n" if($verbose); -        my $res = kill(9, $pid); # die! -        if(!$res) { -            print "RUN: Failed to kill FTP$id$nameext test server, do it manually and", -            " restart the tests.\n"; -            return -1; -        } +    if($pid >= 0) { +        stopserver($pid);      } +    # kill possible still-running slaves      ftpkillslaves($verbose); -    # now (re-)start our server: +    # start our server:      my $flag=$debugprotocol?"-v ":"";      $flag .= "-s \"$srcdir\" ";      if($id) { @@ -582,7 +637,7 @@ sub runftpserver {      if($ipv6) {          $flag .="--ipv6 ";      } -    my $cmd="$perl $srcdir/ftpserver.pl --pidfile $pidfile $flag --port $port"; +    $cmd="$perl $srcdir/ftpserver.pl --pidfile $pidfile $flag --port $port";      my ($ftppid, $pid2) = startnew($cmd, $pidfile); @@ -592,16 +647,12 @@ sub runftpserver {          return -1;      } -    # Make sure there is a pidfile present before we proceed. Because if we -    # don't see one within a few secs, the server doesn't work. This mostly -    # happens when the server finds out it cannot use the ipv6 protocol. -    my $count=3; -    while(! -f $pidfile) { -        if(!$count--) { -            print "RUN: failed starting FTP$id$nameext server (no pidfile)!\n"; -            return -1; -        } -        sleep(1); +    # Server is up. Verify that we can speak to it. +    if(!verifyserver("ftp", $ip, $port)) { +        print "RUN: FTP$id$nameext server failed verification\n"; +        # failed to talk to it properly. Kill the server and return failure +        stopserver("$ftppid $pid2"); +        return (0,0);      }      if($verbose) { @@ -917,6 +968,7 @@ sub singletest {      my @what;      my $why;      my %feature; +    my $cmd;      # load the test case file definition      if(loadtest("${TESTDIR}/test${testnum}")) { @@ -997,7 +1049,7 @@ sub singletest {      if(!$why) {          my @precheck = getpart("client", "precheck"); -        my $cmd = $precheck[0]; +        $cmd = $precheck[0];          chomp $cmd;          if($cmd) {              my @o = `$cmd 2>/dev/null`; @@ -1109,7 +1161,8 @@ sub singletest {      }      # get the command line options to use -    my ($cmd, @blaha)= getpart("client", "command"); +    my @blaha; +    ($cmd, @blaha)= getpart("client", "command");      # make some nice replace operations      $cmd =~ s/\n//g; # no newlines please @@ -1124,9 +1177,9 @@ sub singletest {      my @inputfile=getpart("client", "file");      if(@inputfile) {          # we need to generate a file before this test is invoked -        my %hash = getpartattr("client", "file"); +        my %fileattr = getpartattr("client", "file"); -        my $filename=$hash{'name'}; +        my $filename=$fileattr{'name'};          if(!$filename) {              print "ERROR: section client=>file has no name attribute!\n"; @@ -1547,8 +1600,8 @@ sub stopservers {          my $pid;          foreach $pid (split(" ", $pids)) { -            printf ("* kill pid for %-5s => %-5d\n", -                    $server, $pid) if($verbose); +            printf("* kill pid for %-5s => %-5d\n", +                   $server, $pid) if($verbose);              stopserver($pid);          }      } | 
