aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rwxr-xr-xtests/runtests.pl75
1 files changed, 66 insertions, 9 deletions
diff --git a/tests/runtests.pl b/tests/runtests.pl
index cd48c4f66..3ddadbb46 100755
--- a/tests/runtests.pl
+++ b/tests/runtests.pl
@@ -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;
@@ -317,6 +318,32 @@ $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.
#
sub checkdied {
@@ -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
@@ -3317,11 +3368,17 @@ 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();
}