From 8e735d1eea3af9e09bb5238ac450cee1192adcb8 Mon Sep 17 00:00:00 2001
From: Daniel Stenberg <daniel@haxx.se>
Date: Mon, 13 Nov 2000 16:06:16 +0000
Subject: [PATCH] converted shell script to perl

---
 tests/README        |  13 ++-
 tests/httpserver.pl |  62 +++++++++-
 tests/runtests.pl   | 275 ++++++++++++++++++++++++++++++++++++++++++++
 tests/runtests.sh   | 220 -----------------------------------
 4 files changed, 345 insertions(+), 225 deletions(-)
 create mode 100755 tests/runtests.pl
 delete mode 100755 tests/runtests.sh

diff --git a/tests/README b/tests/README
index 7c334c9c6c..64348004b0 100644
--- a/tests/README
+++ b/tests/README
@@ -13,6 +13,9 @@ Run:
   'make test'. This invokes the 'runtests.sh' shell script. Edit the top
   variables of that script in case you have some specific needs.
 
+  The script breaks on the first test that doesn't do OK. Run the script
+  with -v for more verbose output.
+
 Logs:
   All logs are generated in the logs/ subdirctory (it is emtpied first
   in the runtests.sh script)
@@ -29,4 +32,12 @@ Data:
     httpN.txt: the full dump of the HTTP protocol communication that curl is
                expected to use when performing this test
 
-    replyN.txt: the full dump the server should reply to curl for this test
+    replyN.txt: the full dump the server should reply to curl for this test.
+               If the final result that curl should've got is not in this
+               file, you can instead name the file replyN0001.txt. This enables
+               you to fiddle more. ;-)
+
+FIX:
+
+  * Make httpserver.pl work when we PUT without Content-Length:
+
diff --git a/tests/httpserver.pl b/tests/httpserver.pl
index 3d69385132..6ece59630d 100755
--- a/tests/httpserver.pl
+++ b/tests/httpserver.pl
@@ -1,22 +1,31 @@
 #!/usr/bin/perl
 use Socket;
 use Carp;
+use FileHandle;
 
 sub spawn;  # forward declaration
 sub logmsg { #print "$0 $$: @_ at ", scalar localtime, "\n"
  }
 
-my $port = shift || $ARGV[0];
+my $port = $ARGV[0];
 my $proto = getprotobyname('tcp');
 $port = $1 if $port =~ /(\d+)/; # untaint port number
 
+if($ARGV[1] =~ /^ftp$/i) {
+    $protocol="FTP";
+}
+else {
+    $protocol="HTTP";
+}
+
+
 socket(Server, PF_INET, SOCK_STREAM, $proto)|| die "socket: $!";
     setsockopt(Server, SOL_SOCKET, SO_REUSEADDR,
                pack("l", 1)) || die "setsockopt: $!";
 bind(Server, sockaddr_in($port, INADDR_ANY))|| die "bind: $!";
 listen(Server,SOMAXCONN) || die "listen: $!";
 
-logmsg "server started on port $port";
+print "$protocol server started on port $port\n";
 
 open(PID, ">.server.pid");
 print PID $$;
@@ -46,8 +55,53 @@ for ( $waitedpid = 0;
     # this code is forked and run
     spawn sub {
         my ($request, $path, $ver, $left, $cl);
+
+        if($protocol eq "FTP") {
+
+            # < 220 pm1 FTP server (SunOS 5.7) ready.
+            # > USER anonymous
+            # < 331 Guest login ok, send ident as password.
+            # > PASS curl_by_daniel@haxx.se
+            # < 230 Guest login ok, access restrictions apply.
+            # * We have successfully logged in
+            # * Connected to pm1 (193.15.23.1)
+            # > PASV
+            # < 227 Entering Passive Mode (193,15,23,1,231,59)
+            # * Connecting to pm1 (193.15.23.1) port 59195
+            # > TYPE A
+            # < 200 Type set to A.
+            # > LIST
+            # < 150 ASCII data connection for /bin/ls (193.15.23.1,59196) (0 bytes).
+            # * Getting file with size: -1
+
+            print "220-running the curl suite test server\r\n",
+            "220-running the curl suite test server\r\n",
+            "220 running the curl suite test server\r\n";
+
+            STDOUT->autoflush(1);
+
+            while(1) {
+
+                last unless defined ($_ = <STDIN>);
+
+                # Remove trailing CRLF.
+                s/[\n\r]+$//;
+
+                unless (m/^([A-Z]{3,4})\s?(.*)/i)
+                {
+                    print STDERR
+                        "badly formed command received: ".$_;
+                    exit 0;
+                }
+                 
+                print STDERR "GOT: $_\n";
+            }
+            exit;
+        }
+        # otherwise, we're doing HTTP
+
         while(<STDIN>) {
-            if($_ =~ /(GET|POST|HEAD) (.*) HTTP\/1.(\d)/) {
+            if($_ =~ /([A-Z]*) (.*) HTTP\/1.(\d)/) {
                 $request=$1;
                 $path=$2;
                 $ver=$3;
@@ -68,7 +122,7 @@ for ( $waitedpid = 0;
 
             if(!$left &&
                ($_ eq "\r\n") or ($_ eq "")) {
-                if($request eq "POST") {
+                if($request =~ /^(POST|PUT)$/) {
                     $left=$cl;
                 }
                 else {
diff --git a/tests/runtests.pl b/tests/runtests.pl
new file mode 100755
index 0000000000..2eeb8bbf7e
--- /dev/null
+++ b/tests/runtests.pl
@@ -0,0 +1,275 @@
+#!/usr/bin/perl
+#
+# Main curl test script, in perl to run on more platforms
+#
+#######################################################################
+# These should be the only variables that might be needed to get edited:
+
+$HOSTIP="127.0.0.1";
+$HOSTPORT=8999;
+$CURL="../src/curl";
+$LOGDIR="log";
+$TESTDIR="data";
+$SERVERIN="$LOGDIR/server.input";
+$CURLOUT="$LOGDIR/curl.out";
+
+# Normally, all test cases should be run, but at times it is handy to
+# simply run a particular one:
+$TESTCASES="all";
+
+# To run specific test cases, set them like:
+# $TESTCASES="1 2 3 7 8";
+
+#######################################################################
+# No variables below this point should need to be modified
+#
+
+$PIDFILE=".server.pid";
+
+sub stopserver {
+    # check for pidfile
+    if ( -f $PIDFILE ) {
+        $PID=`cat $PIDFILE`;
+        kill (9, $PID); # die!
+        unlink $PIDFILE; # server is killed
+    }
+}
+
+sub runserver {
+    # check for pidfile
+    if ( -f $PIDFILE ) {
+        $PID=`cat $PIDFILE`;
+        if ($PID ne "" && kill(0, $PID)) {
+            $STATUS="httpd (pid $PID) running";
+            $RUNNING=1;
+        }
+        else {
+            $STATUS="httpd (pid $PID?) not running";
+            $RUNNING=0;
+        }
+    }
+    else {
+        $STATUS="httpd (no pid file) not running";
+        $RUNNING=0;
+    }
+
+    if ($RUNNING != 1) {
+        system("perl ./httpserver.pl $HOSTPORT &");
+        sleep 1; # give it a little time to start
+    }
+    else {
+        print "$STATUS\n";
+
+        # verify that our server is one one running on this port:
+        $data=`$CURL --silent -i $HOSTIP:$HOSTPORT/verifiedserver`;
+
+        if ( $data !~ /WE ROOLZ/ ) {
+            print "Another HTTP server is running on port $HOSTPORT\n",
+            "Edit runtests.pl to use another port and rerun the test script\n";
+            exit;
+        }
+
+        print "The running HTTP server has been verified to be our server\n";
+    }
+}
+
+sub filteroff {
+    my $infile=$_[0];
+    my $filter=$_[1];
+    my $ofile=$_[2];
+
+    open(IN, "<$infile")
+        || return 1;
+
+    open(OUT, ">$ofile")
+        || return 1;
+
+    # print "FILTER: off $filter from $infile to $ofile\n";
+
+    # system("egrep -v \"$strip\" < $first > $LOGDIR/generated.tmp");
+    while(<IN>) {
+        $_ =~ s/$filter//;
+        print OUT $_;
+    }
+    close(IN);
+    close(OUT);    
+    return 0;
+}
+sub compare {
+    # filter off the 4 pattern before compare!
+
+    my $first=$_[0];
+    my $sec=$_[1];
+    my $text=$_[2];
+    my $strip=$_[3];
+
+    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;
+    if ($res != 0) {
+        print " $text FAILED\n";
+        return 1;
+    }
+
+    print " $text OK\n";
+    return 0;
+}
+
+sub displaydata {
+    my $version=`$CURL -V`;
+    my $hostname=`hostname`;
+    my $hosttype=`uname -a`;
+
+    print "Running tests on:\n",
+    "$version",
+    "host $hostname",
+    "system $hosttype";
+}
+
+sub singletest {
+    my $NUMBER=$_[0];
+    my $REPLY="${TESTDIR}/reply${NUMBER}.txt";
+
+    if ( -f "$TESTDIR/reply${NUMBER}0001.txt" ) {
+        # we use this file instead to check the final output against
+        $REPLY="$TESTDIR/reply${NUMBER}0001.txt";
+    }
+
+    # curl command to run
+    $CURLCMD="$TESTDIR/command$NUMBER.txt";
+
+    # this is the valid HTTP we should generate
+    $HTTP="$TESTDIR/http$NUMBER.txt";
+
+    # name of the test
+    $DESC=`cat $TESTDIR/name$NUMBER.txt | tr -d '\012'`;
+
+    # redirected stdout here
+    $STDOUT="$LOGDIR/stdout$NUMBER";
+
+    # if this file exist, we verify that the stdout contained this:
+    $VALIDOUT="$TESTDIR/stdout$NUMBER.txt";
+
+    print "test $NUMBER... [$DESC]\n";
+
+    # get the command line options to use
+
+    open(COMMAND, "<$CURLCMD");
+    $cmd=<COMMAND>;
+    chomp $cmd;
+    close(COMMAND);
+
+    # make some nice replace operations
+    $cmd =~ s/%HOSTIP/$HOSTIP/g;
+    $cmd =~ s/%HOSTPORT/$HOSTPORT/g;
+    $cmd =~ s/%HOSTNAME/$HOSTNAME/g;
+
+    # run curl, add -v for debug information output
+    $CMDLINE="$CURL --output $CURLOUT --include --silent $cmd >$STDOUT";
+
+    if($verbose) {
+        print "$CMDLINE\n";
+    }
+
+    # run the command line we built
+    $res = system("$CMDLINE");
+    $res /= 256;
+
+    if ($res != 0) {
+        print "Failed to invoke curl for test $NUMBER\n";
+    }
+    else {
+        # verify the received data
+        $res = compare($CURLOUT, $REPLY, "data");
+        $res /= 256;
+
+        if ($res) {
+            exit;
+        }
+
+        # verify the sent request
+        $res = compare($SERVERIN, $HTTP, "http",
+                       "^(User-Agent:|--curl|Content-Type: multipart/form-data; boundary=).*\r\n");
+        $res /= 256;
+
+        # The strip pattern above is for stripping off User-Agent: since
+        # that'll be different in all versions, and the lines in a
+        # RFC1876-post that are randomly generated and therefore are doomed to
+        # always differ!
+
+        if($res) {
+            exit;
+        }
+
+        if ( -r "$VALIDOUT" ) {
+
+            $res = compare($STDOUT, $VALIDOUT, "stdout");
+            $res /= 256;
+            if($res) {
+                exit;
+            }
+        }
+
+        # remove the stdout file
+        unlink("$STDOUT");
+
+    }
+
+    return 0;
+}
+
+
+#######################################################################
+# Check options to this test program
+#
+
+if ($ARGV[0] eq "-v") {
+    $verbose=1;
+}
+
+#######################################################################
+# Output curl version and host info being tested
+#
+
+displaydata();
+
+#######################################################################
+# remove and recreate logging directory:
+#
+system("rm -rf $LOGDIR");
+mkdir("$LOGDIR", 0777);
+
+#######################################################################
+# First, start the TCP server
+#
+
+runserver();
+
+#######################################################################
+# The main test-loop
+#
+
+if ( $TESTCASES eq "all") {
+    $TESTCASES=`ls -1 $TESTDIR/command*.txt | sed -e 's/[a-z\/\.]*//g' | sort -n`;
+}
+
+foreach $testnum (split(" ", $TESTCASES)) {
+
+    singletest($testnum);
+
+    # loop for next test
+}
+
+#######################################################################
+# Tests done, stop the server
+#
+
+stopserver();
diff --git a/tests/runtests.sh b/tests/runtests.sh
deleted file mode 100755
index dba9129784..0000000000
--- a/tests/runtests.sh
+++ /dev/null
@@ -1,220 +0,0 @@
-#!/bin/sh
-#
-# Main curl test script
-#
-#######################################################################
-# These should be the only variables that might be needed to get edited:
-
-HOSTIP=127.0.0.1
-HOSTPORT=8999
-CURL=../src/curl
-LOGDIR=log
-SERVERIN=$LOGDIR/server.input
-CURLOUT=$LOGDIR/curl.out
-NC=nc
-
-# Normally, all test cases should be run, but at times it is handy to
-# simply run a particular one:
-TESTCASES=all
-
-# To run specific test cases, set them like:
-# TESTCASES="1 2 3 7 8"
-
-#######################################################################
-# No variables below this point should need to be modified
-#
-
-PIDFILE=".server.pid"
-
-stopserver() {
-  # check for pidfile
-  if [ -f $PIDFILE ] ; then
-      PID=`cat $PIDFILE`
-      kill -9 $PID
-      rm -f $PIDFILE # server is killed
-  fi
-}
-
-runserver () {
-  # check for pidfile
-  if [ -f $PIDFILE ] ; then
-      PID=`cat $PIDFILE`
-      if [ "x$PID" != "x" ] && kill -0 $PID 2>/dev/null ; then
-          STATUS="httpd (pid $PID) running"
-          RUNNING=1
-      else
-          STATUS="httpd (pid $PID?) not running"
-          RUNNING=0
-      fi
-  else
-      STATUS="httpd (no pid file) not running"
-      RUNNING=0
-  fi
-
-  if [ $RUNNING != "1" ]; then
-    ./httpserver.pl $HOSTPORT &
-    sleep 1 # give it a little time to start
-  else
-    echo $STATUS
-
-    # verify that our server is one one running on this port:
-    data=`$CURL --silent -i $HOSTIP:$HOSTPORT/verifiedserver`;
-
-    if { echo $data | grep -v "WE ROOLZ" >/dev/null 2>&1; } then
-        echo "Another HTTP server is running on port $HOSTPORT"
-        echo "Edit runtests.sh to use another port and rerun the test script"
-        exit
-    fi
-
-    echo "The running HTTP server has been verified to be our test server"
-
-  fi
-}
-
-compare () {
-  # filter off the $4 pattern before compare!
-
-  first="$1"
-  sec="$2"
-  text="$3"
-  strip="$4"
-
-  if test -n "$strip"; then
-    egrep -v "$strip" < $first > $LOGDIR/generated.tmp
-    egrep -v "$strip" < $sec > $LOGDIR/stored.tmp
-
-    first="$LOGDIR/generated.tmp"
-    sec="$LOGDIR/stored.tmp"
-  fi
-
-  cmp $first $sec
-  if [ $? != "0" ]; then
-    echo " $text FAILED"
-    return 1
-  else
-    echo " $text OK"
-    return 0
-  fi
-}
-
-singletest ()
-{
-  NUMBER="$1"
-
-  REPLY=data/reply$NUMBER.txt
-  CURLCMD=data/command$NUMBER.txt
-  HTTP=data/http$NUMBER.txt
-  DESC=`cat data/name$NUMBER.txt | tr -d '\012'`
-
-  echo "test $NUMBER... [$DESC]"
-
-  # get the command line options to use
-  cmd=`sed -e "s/%HOSTIP/$HOSTIP/g" \
-           -e "s/%HOSTPORT/$HOSTPORT/g" \
-           -e "s/%HOSTNAME/$HOSTNAME/g" <$CURLCMD `
-
-  # run curl
-  CMDLINE="$CURL -o $CURLOUT -i --silent $cmd"
-
-  if test -n "$verbose"; then
-    echo "$CMDLINE"
-  fi
-
-  # we do it the eval way to deal with quotes and similar stuff
-  eval $CMDLINE
-
-  if [ $? != "0" ]; then
-    echo "Failed to invoke curl for test $NUMBER"
-  else
-    # when curl is done, the server has closed down as well
-
-    # verify the received data
-    compare $CURLOUT $REPLY " fetch"
-
-    if [ $? != "0" ]; then
-      exit;
-    fi
-
-    # verify the sent request
-    compare $SERVERIN $HTTP " command" \
-     "(User-Agent:|^--curl|Content-Type: multipart/form-data; boundary=)"
-
-    #
-    # The strip pattern above is for stripping off User-Agent: since that'll
-    # be different in all versions, and the lines in a RFC1876-post that are
-    # randomly generated and therefore are doomed to always differ!
-    #
-
-
-    if [ $? != "0" ]; then
-      exit;
-    fi
-  fi
-
-  return 0
-}
-
-
-#######################################################################
-# Check options to this test program
-#
-
-if test "$1" = "-v"; then
-  verbose="1"
-fi
-
-if test -n "$NEWSETUP"; then
-
-  #######################################################################
-  # Make sure the Host: lines are correct for this setup
-  #
-
-  HOST="$HOSTIP:$HOSTPORT"
-  for test in data/http*.txt; do
-   sed -e "s/Host: \([0-9.:]*\)/Host: $HOST/g" < $test > $test.tmp
-   mv $test.tmp $test
-  done
-fi
-
-#######################################################################
-# Output curl version being tested
-#
-VERSION=`$CURL -V`
-HOSTNAME=`hostname`
-
-echo "Running tests on:"
-echo $VERSION
-echo "host $HOSTNAME"
-
-#######################################################################
-# remove and recreate logging directory:
-#
-rm -rf $LOGDIR
-mkdir $LOGDIR
-
-#######################################################################
-# First, start the TCP server
-#
-
-runserver
-
-#######################################################################
-# The main test-loop
-#
-
-if [ x$TESTCASES = xall ]; then
-  TESTCASES=`ls -1 data/command*.txt | sed -e 's/[a-z\/\.]*//g'`
-fi
-
-for NUMBER in $TESTCASES; do
-
-  singletest $NUMBER
-
-  # loop for next test
-done
-
-#######################################################################
-# Tests done, stop server
-#
-
-stopserver
-- 
GitLab