removed lots of external program dependencies (for windows compliance)
authorDaniel Stenberg <daniel@haxx.se>
Tue, 14 Nov 2000 10:18:44 +0000 (10:18 +0000)
committerDaniel Stenberg <daniel@haxx.se>
Tue, 14 Nov 2000 10:18:44 +0000 (10:18 +0000)
added lots of comments
added -s for short output and made it possible to run specific test cases
from the command line

tests/runtests.pl

index cb4e5e5..e5e3a1b 100755 (executable)
@@ -26,19 +26,41 @@ $TESTCASES="all";
 
 $PIDFILE=".server.pid";
 
+#######################################################################
+# Return the pid of the http server as found in the pid file
+#
+sub serverpid {
+    open(PFILE, "<$PIDFILE");
+    my $PID=<PFILE>;
+    close(PFILE);
+    chomp $PID;
+    return $PID;
+}
+
+#######################################################################
+# stop the test http server
+#
 sub stopserver {
     # check for pidfile
     if ( -f $PIDFILE ) {
-        $PID=`cat $PIDFILE`;
-        kill (9, $PID); # die!
+        $PID = serverpid();
+        $res = kill (9, $PID); # die!
         unlink $PIDFILE; # server is killed
+
+        if($res) {
+            print "TCP server signalled to die\n";
+        }
     }
 }
 
+#######################################################################
+# start the http server, or if it already runs, verify that it is our
+# test server on the test-port!
+#
 sub runserver {
     # check for pidfile
     if ( -f $PIDFILE ) {
-        $PID=`cat $PIDFILE`;
+        $PID=serverpid();
         if ($PID ne "" && kill(0, $PID)) {
             $STATUS="httpd (pid $PID) running";
             $RUNNING=1;
@@ -73,6 +95,62 @@ sub runserver {
     }
 }
 
+#######################################################################
+# This function compares two binary files and return non-zero if they
+# differ
+#
+sub comparefiles {
+    my $source=$_[0];
+    my $dest=$_[1];
+
+    open(S, "<$source") ||
+        return 1;
+    open(D, "<$dest") ||
+        return 1;
+
+    # silly win-crap
+    binmode S;
+    binmode D;
+    
+    $m = 20;
+    do {
+        $snum = read(S, $s, $m);
+        $dnum = read(D, $d, $m);
+        if(($snum != $dnum) ||
+           ($s ne $d)) {
+            print "$source and $dest differ\n";
+            last;
+        }
+    } while($snum);
+    close(S);
+    close(D);
+    return 0;
+}
+
+#######################################################################
+# Remove all files in the specified directory
+#
+sub cleardir {
+    my $dir = $_[0];
+    my $count;
+
+    # Get all files
+    opendir(DIR, $dir) ||
+        return 0; # can't open dir
+    while($file = readdir(DIR)) {
+        if($file !~ /^\./) {
+            unlink("$dir/$file");
+            $count++;
+        }
+    }
+    closedir DIR;
+    return $count;
+}
+
+#######################################################################
+# filter out the specified pattern from the given input file and store the
+# results in the given output file
+#
 sub filteroff {
     my $infile=$_[0];
     my $filter=$_[1];
@@ -86,7 +164,6 @@ sub filteroff {
 
     # print "FILTER: off $filter from $infile to $ofile\n";
 
-    # system("egrep -v \"$strip\" < $first > $LOGDIR/generated.tmp");
     while(<IN>) {
         $_ =~ s/$filter//;
         print OUT $_;
@@ -95,6 +172,12 @@ sub filteroff {
     close(OUT);    
     return 0;
 }
+
+#######################################################################
+# compare test results with the expected output, we might filter off
+# some pattern that is allowed to differ, output test results
+#
+
 sub compare {
     # filter off the 4 pattern before compare!
 
@@ -106,23 +189,27 @@ sub compare {
     if ($strip ne "") {
         filteroff($first, $strip, "$LOGDIR/generated.tmp");
         filteroff($sec, $strip, "$LOGDIR/stored.tmp");
-#        system("egrep -v \"$strip\" < $sec > $LOGDIR/stored.tmp");
                 
         $first="$LOGDIR/generated.tmp";
         $sec="$LOGDIR/stored.tmp";
     }
 
-    $res = system("cmp $first $sec");
-    $res /= 256;
+#    $res = system("cmp $first $sec");
+#    $res /= 256;
+
+    comparefiles($first, $sec);
     if ($res != 0) {
-        print " $text FAILED\n";
+        print " $text FAILED";
         return 1;
     }
 
-    print " $text OK\n";
+    print " $text OK";
     return 0;
 }
 
+#######################################################################
+# display information about curl and the host the test suite runs on
+#
 sub displaydata {
     my $version=`$CURL -V`;
     my $hostname=`hostname`;
@@ -134,6 +221,10 @@ sub displaydata {
     "* system $hosttype";
 }
 
+#######################################################################
+# Run a single specified test case
+#
+
 sub singletest {
     my $NUMBER=$_[0];
     my $REPLY="${TESTDIR}/reply${NUMBER}.txt";
@@ -150,7 +241,10 @@ sub singletest {
     $HTTP="$TESTDIR/http$NUMBER.txt";
 
     # name of the test
-    $DESC=`cat $TESTDIR/name$NUMBER.txt | tr -d '\012'`;
+    open(N, "<$TESTDIR/name$NUMBER.txt");
+    $DESC=<N>;
+    close(N);
+    $DESC =~ s/[\r\n]//g;
 
     # redirected stdout/stderr here
     $STDOUT="$LOGDIR/stdout$NUMBER";
@@ -159,7 +253,10 @@ sub singletest {
     # if this file exist, we verify that the stdout contained this:
     $VALIDOUT="$TESTDIR/stdout$NUMBER.txt";
 
-    print "test $NUMBER... [$DESC]\n";
+    print "test $NUMBER...";
+    if(!$short) {
+        print "[$DESC]\n";
+    }
 
     # get the command line options to use
 
@@ -227,6 +324,7 @@ sub singletest {
         unlink($STDERR);
 
     }
+    print "\n";
 
     return 0;
 }
@@ -236,9 +334,19 @@ sub singletest {
 # Check options to this test program
 #
 
-if ($ARGV[0] eq "-v") {
-    $verbose=1;
-}
+do {
+    if ($ARGV[0] eq "-v") {
+        # verbose output
+        $verbose=1;
+    }
+    elsif($ARGV[0] eq "-s") {
+        # short output
+        $short=1;
+    }
+    elsif($ARGV[0] =~ /^(\d+)/) {
+        $TESTCASES=$ARGV[0]; # run these tests
+    }
+} while(shift @ARGV);
 
 #######################################################################
 # Output curl version and host info being tested
@@ -247,10 +355,10 @@ if ($ARGV[0] eq "-v") {
 displaydata();
 
 #######################################################################
-# remove and recreate logging directory:
+# clear and create logging directory:
 #
-system("rm -rf $LOGDIR");
-mkdir("$LOGDIR", 0777);
+cleardir($LOGDIR);
+mkdir($LOGDIR, 0777);
 
 #######################################################################
 # First, start the TCP server
@@ -259,13 +367,27 @@ mkdir("$LOGDIR", 0777);
 runserver();
 
 #######################################################################
-# The main test-loop
+# If 'all' tests are requested, find out all test numbers
 #
 
 if ( $TESTCASES eq "all") {
-    $TESTCASES=`ls -1 $TESTDIR/command*.txt | sed -e 's/[a-z\/\.]*//g' | sort -n`;
+    # Get all commands and find out their test numbers
+    opendir(DIR, $TESTDIR) || die "can't opendir $TESTDIR: $!";
+    my @cmds = grep { /^command/ && -f "$TESTDIR/$_" } readdir(DIR);
+    closedir DIR;
+
+    $TESTCASES="";
+    for(@cmds) {
+        # cut off everything but the digits 
+        $_ =~ s/[a-z\/\.]*//g;
+        $TESTCASES .= " $_";
+    }
 }
 
+#######################################################################
+# The main test-loop
+#
+
 foreach $testnum (split(" ", $TESTCASES)) {
 
     singletest($testnum);