#!/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