]> granicus.if.org Git - curl/commitdiff
Make runtests.pl actually support any (valid) server specification
authorYang Tse <yangsita@gmail.com>
Tue, 12 Jan 2010 22:22:55 +0000 (22:22 +0000)
committerYang Tse <yangsita@gmail.com>
Tue, 12 Jan 2010 22:22:55 +0000 (22:22 +0000)
for the <killserver> section of test harness definition files.

tests/runtests.pl

index cd48c4f66151a6fc55345843e3590246964f08a4..3ddadbb46ca45be491a9f5c7c4b14bdaae4a2254 100755 (executable)
@@ -259,6 +259,7 @@ my $postmortem;   # display detailed info about failed tests
 
 my %run;          # running server
 my %doesntrun;    # servers that don't work, identified by pidfile
+my %serverpidfile;# all server pid file names, identified by server id
 
 # torture test variables
 my $torture;
@@ -316,6 +317,32 @@ $ENV{'SSL_CERT_DIR'}=undef;
 $ENV{'SSL_CERT_PATH'}=undef;
 $ENV{'CURL_CA_BUNDLE'}=undef;
 
+#######################################################################
+# Load serverpidfile hash with pidfile names for all possible servers.
+#
+sub init_serverpidfile_hash {
+  for my $proto (('ftp', 'http', 'imap', 'pop3', 'smtp')) {
+    for my $ssl (('', 's')) {
+      for my $ipvnum ((4, 6)) {
+        for my $idnum ((1, 2)) {
+          my $serv = servername_id("$proto$ssl", $ipvnum, $idnum);
+          my $pidf = server_pidfilename("$proto$ssl", $ipvnum, $idnum);
+          $serverpidfile{$serv} = $pidf;
+        }
+      }
+    }
+  }
+  for my $proto (('tftp', 'sftp', 'socks', 'ssh')) {
+    for my $ipvnum ((4, 6)) {
+      for my $idnum ((1, 2)) {
+        my $serv = servername_id($proto, $ipvnum, $idnum);
+        my $pidf = server_pidfilename($proto, $ipvnum, $idnum);
+        $serverpidfile{$serv} = $pidf;
+      }
+    }
+  }
+}
+
 #######################################################################
 # Check if a given child process has just died. Reaps it if so.
 #
@@ -2346,19 +2373,43 @@ sub singletest {
     my @killservers = getpart("client", "killserver");
     foreach my $serv (@killservers) {
         chomp $serv;
-        if($serv =~ /^(ftp|imap|pop3|smtp)(\d*)(-ipv6|)/) {
+        my $pid;
+        # handle given server no matter if secure or not
+        if($run{$serv}) {
+            # stop server pid(s) from %run hash clearing them
+            stopserver($run{$serv});
+            $run{$serv} = 0;
+        }
+        # deal with unexpectedly still alive server
+        $pid = processexists($serverpidfile{$serv});
+        if($pid > 0) {
+            print STDERR "Warning: $serv server unexpectedly alive\n";
+            stopserver($pid);
+        }
+        # handle unsecure server when given a secure one
+        my $unsec = $serv;
+        if($serv =~ /^(ftp|http|imap|pop3|smtp)s(.*)$/) {
+            $unsec = "$1$2";
+            # stop unsecure server when stopping a secure one
+            if($run{$unsec}) {
+                # stop server pid(s) from %run hash clearing them
+                stopserver($run{$unsec});
+                $run{$unsec} = 0;
+            }
+            # deal with unexpectedly still alive server
+            $pid = processexists($serverpidfile{$unsec});
+            if($pid > 0) {
+                print STDERR "Warning: $unsec server unexpectedly alive\n";
+                stopserver($pid);
+            }
+        }
+        # handle potentially still alive server sockfilters
+        if($unsec =~ /^(ftp|imap|pop3|smtp)(\d*)(-ipv6|)/) {
             my $proto  = $1;
             my $idnum  = ($2 && ($2 > 1)) ? $2 : 1;
             my $ipvnum = ($3 && ($3 =~ /6$/)) ? 6 : 4;
             killsockfilters($proto, $ipvnum, $idnum, $verbose);
         }
-        if($run{$serv}) {
-            stopserver($run{$serv}); # the pid file is in the hash table
-            $run{$serv}=0; # clear pid
-        }
-        else {
-            logmsg "RUN: The $serv server is not running\n";
-        }
     }
 
     # remove the test server commands file after each test
@@ -3316,12 +3367,18 @@ $SMTP6PORT = $base++;
 cleardir($LOGDIR);
 mkdir($LOGDIR, 0777);
 
+#######################################################################
+# initialize some variables
+#
+
+get_disttests();
+init_serverpidfile_hash();
+
 #######################################################################
 # Output curl version and host info being tested
 #
 
 if(!$listonly) {
-    get_disttests();
     checksystem();
 }