curl/tests/runtests.sh

221 lines
4.7 KiB
Bash
Executable File

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