1
0
mirror of https://github.com/osmarks/ngircd.git synced 2025-10-31 05:52:59 +00:00

Updated "test suite". From HEAD.

This commit is contained in:
Alexander Barton
2004-09-04 20:49:36 +00:00
parent 98b92e112a
commit cabd09d9ae
9 changed files with 227 additions and 25 deletions

View File

@@ -9,7 +9,7 @@
# Naehere Informationen entnehmen Sie bitter der Datei COPYING. Eine Liste # Naehere Informationen entnehmen Sie bitter der Datei COPYING. Eine Liste
# der an ngIRCd beteiligten Autoren finden Sie in der Datei AUTHORS. # der an ngIRCd beteiligten Autoren finden Sie in der Datei AUTHORS.
# #
# $Id: Makefile.am,v 1.9 2002/11/10 14:28:06 alex Exp $ # $Id: Makefile.am,v 1.9.6.1 2004/09/04 20:49:36 alex Exp $
# #
AUTOMAKE_OPTIONS = ../portab/ansi2knr AUTOMAKE_OPTIONS = ../portab/ansi2knr
@@ -17,12 +17,15 @@ AUTOMAKE_OPTIONS = ../portab/ansi2knr
INCLUDES = -I$(srcdir)/../portab INCLUDES = -I$(srcdir)/../portab
EXTRA_DIST = \ EXTRA_DIST = \
getpid.sh \ README getpid.sh \
start-server.sh stop-server.sh tests.sh stress-server.sh \ start-server.sh stop-server.sh tests.sh stress-server.sh \
test-loop.sh wait-tests.sh \
connect-test.e channel-test.e mode-test.e \ connect-test.e channel-test.e mode-test.e \
stress-A.e stress-B.e check-idle.e \ stress-A.e stress-B.e check-idle.e \
ngircd-test.conf ngircd-test.conf
all: ngircd-TEST-Binary ${TESTS}
clean-local: clean-local:
rm -rf logs tests *-test ngircd-test.log ngircd-test.motd \ rm -rf logs tests *-test ngircd-test.log ngircd-test.motd \
T-ngircd procs.tmp T-ngircd procs.tmp

72
src/testsuite/README Normal file
View File

@@ -0,0 +1,72 @@
ngIRCd - Next Generation IRC Server
(c)2001-2004 by Alexander Barton,
alex@barton.de, http://www.barton.de/
ngIRCd is free software and published under the
terms of the GNU General Public License.
-- README for the Test Suite --
I. Overview
~~~~~~~~~~~
The purpose of the "test suite" contained in this directory is to detect
bugs and incompatibilities in ngIRCd introduced during coding and after
building ngIRCd on a specific platform.
To run the "standard" tests call "make check". It will build ngIRCd (if
required) and run some tests on it. These tests should be portable and run
on all supported platforms without errors.
Please note: most tests of this suite depend on the external tools expect(1)
and telnet(1), so make sure you have them installed. If not, the tests will
not fail but simply be skipped.
II. Shell Scripts
~~~~~~~~~~~~~~~~
getpid.sh <name>
This script is used to detect the PID of the running process with
the given name in a portable manner. The result is echoed on the
console. It is a helper script for some other scripts of this suite.
start-server.sh
start-server.sh starts up the test binary, "T-ngircd". It makes sure
that getpid.sh is available and working, and that no other instance
of the test binary is already running.
The exit code is 0 if the test binary could be started.
stop-server.sh
This script uses getpid.sh to detect a running test binary "T-ngircd"
and then shuts it down using the TERM signal.
The exit code is 0 if the test binary could be stopped.
stress-server.sh
...
tests.sh
...
III. Scripts for expect(1)
~~~~~~~~~~~~~~~~~~~~~~~~~~
channel-test.e
check-idle.e
connect-test.e
mode-test.e
stress-A.e
stress-B.e
--
$Id: README,v 1.1.2.1 2004/09/04 20:49:36 alex Exp $

View File

@@ -1,4 +1,4 @@
# $Id: check-idle.e,v 1.1 2002/09/09 22:56:07 alex Exp $ # $Id: check-idle.e,v 1.1.8.1 2004/09/04 20:49:36 alex Exp $
spawn telnet localhost 6789 spawn telnet localhost 6789
expect { expect {
@@ -10,6 +10,7 @@ send "nick IdleTest\r"
send "user idle . . :Idle-Test\r" send "user idle . . :Idle-Test\r"
expect { expect {
timeout { exit 1 } timeout { exit 1 }
"433 * IdleTest :Nickname already in use" { exit 99 }
"376" "376"
} }

View File

@@ -1,10 +1,10 @@
#!/bin/sh #!/bin/sh
# ngIRCd Test Suite # ngIRCd Test Suite
# $Id: start-server.sh,v 1.11 2003/08/22 11:31:18 alex Exp $ # $Id: start-server.sh,v 1.11.2.1 2004/09/04 20:49:36 alex Exp $
[ -z "$srcdir" ] && srcdir=`dirname $0` [ -z "$srcdir" ] && srcdir=`dirname $0`
echo " starting server ..." echo -n " starting server ..."
# remove old logfiles # remove old logfiles
rm -rf logs *.log rm -rf logs *.log
@@ -13,14 +13,14 @@ rm -rf logs *.log
# test-server, because we won't be able to kill it at the end of the test. # test-server, because we won't be able to kill it at the end of the test.
./getpid.sh sh > /dev/null 2>&1 ./getpid.sh sh > /dev/null 2>&1
if [ $? -ne 0 ]; then if [ $? -ne 0 ]; then
echo " error: getpid.sh FAILED!" echo " getpid.sh failed!"
exit 1 exit 1
fi fi
# check if there is a test-server already running # check if there is a test-server already running
./getpid.sh T-ngircd > /dev/null 2>&1 ./getpid.sh T-ngircd > /dev/null 2>&1
if [ $? -eq 0 ]; then if [ $? -eq 0 ]; then
echo " error: test-server already running!" echo " failure: test-server already running!"
exit 1 exit 1
fi fi
@@ -28,11 +28,14 @@ fi
echo "This is an ngIRCd Test Server" > ngircd-test.motd echo "This is an ngIRCd Test Server" > ngircd-test.motd
# starting up test-server ... # starting up test-server ...
./T-ngircd -np -f ${srcdir}/ngircd-test.conf > ngircd-test.log 2>&1 & ./T-ngircd -np -f ${srcdir}/ngircd-test.conf $* > ngircd-test.log 2>&1 &
sleep 1 sleep 1
# validate running test-server # validate running test-server
pid=`./getpid.sh T-ngircd` pid=`./getpid.sh T-ngircd`
[ -n "$pid" ] && kill -0 $pid > /dev/null 2>&1 || exit 1 [ -n "$pid" ] && kill -0 $pid > /dev/null 2>&1; r=$?
[ $r -eq 0 ] && echo " ok." || echo " failure!"
exit
# -eof- # -eof-

View File

@@ -1,25 +1,29 @@
#!/bin/sh #!/bin/sh
# ngIRCd Test Suite # ngIRCd Test Suite
# $Id: stop-server.sh,v 1.10 2003/08/22 11:31:18 alex Exp $ # $Id: stop-server.sh,v 1.10.2.1 2004/09/04 20:49:36 alex Exp $
[ -z "$srcdir" ] && srcdir=`dirname $0` [ -z "$srcdir" ] && srcdir=`dirname $0`
echo " stopping server ..." echo -n " stopping server ..."
# stop test-server ... # stop test-server ...
pid=`./getpid.sh T-ngircd` pid=`./getpid.sh T-ngircd`
if [ -z "$pid" ]; then if [ -z "$pid" ]; then
echo " no running server found!?" echo " failure: no running server found!?"
exit 1 exit 1
fi fi
kill $pid > /dev/null 2>&1 || exit 1 kill $pid > /dev/null 2>&1 || exit 1
# waiting ... # waiting ...
for i in 1 2 3 4 5; do for i in 1 2 3 4 5; do
kill -0 $pid > /dev/null 2>&1 || exit 0 kill -0 $pid > /dev/null 2>&1; r=$?
if [ $r -eq 0 ]; then
echo " ok".
exit 0
fi
sleep 1 sleep 1
done done
echo " server still running!?" echo " failure: server still running!?"
exit 1 exit 1
# -eof- # -eof-

View File

@@ -1,15 +1,31 @@
#!/bin/sh #!/bin/sh
#
# ngIRCd Test Suite # ngIRCd Test Suite
# $Id: stress-server.sh,v 1.8 2003/08/22 11:31:18 alex Exp $ # Copyright (c)2002-2004 by Alexander Barton (alex@barton.de)
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 2 of the License, or
# (at your option) any later version.
# Please read the file COPYING, README and AUTHORS for more information.
#
# $Id: stress-server.sh,v 1.8.2.1 2004/09/04 20:49:36 alex Exp $
#
# detect source directory
[ -z "$srcdir" ] && srcdir=`dirname $0` [ -z "$srcdir" ] && srcdir=`dirname $0`
# parse command line
[ "$1" -gt 0 ] 2> /dev/null && CLIENTS="$1" || CLIENTS=5 [ "$1" -gt 0 ] 2> /dev/null && CLIENTS="$1" || CLIENTS=5
[ "$2" -gt 0 ] 2> /dev/null && MAX="$2" || MAX=-1
# get our name
name=`basename $0` name=`basename $0`
test=`echo ${name} | cut -d '.' -f 1`
# create directories
mkdir -p logs tests mkdir -p logs tests
# test for required external tools
type expect > /dev/null 2>&1 type expect > /dev/null 2>&1
if [ $? -ne 0 ]; then if [ $? -ne 0 ]; then
echo " ${name}: \"expect\" not found."; exit 77 echo " ${name}: \"expect\" not found."; exit 77
@@ -19,7 +35,10 @@ if [ $? -ne 0 ]; then
echo " ${name}: \"telnet\" not found."; exit 77 echo " ${name}: \"telnet\" not found."; exit 77
fi fi
echo " stressing server with $CLIENTS clients (be patient!) ..." # hello world! :-)
echo " stressing server with $CLIENTS clients (be patient!):"
# create scripts for expect(1)
no=0 no=0
while [ ${no} -lt $CLIENTS ]; do while [ ${no} -lt $CLIENTS ]; do
cat ${srcdir}/stress-A.e > tests/${no}.e cat ${srcdir}/stress-A.e > tests/${no}.e
@@ -27,20 +46,31 @@ while [ ${no} -lt $CLIENTS ]; do
cat ${srcdir}/stress-B.e >> tests/${no}.e cat ${srcdir}/stress-B.e >> tests/${no}.e
no=`expr ${no} + 1` no=`expr ${no} + 1`
done done
no=0 no=0
while [ ${no} -lt $CLIENTS ]; do while [ ${no} -lt $CLIENTS ]; do
expect tests/${no}.e > logs/stress-${no}.log 2> /dev/null & expect tests/${no}.e > logs/stress-${no}.log 2> /dev/null &
no=`expr ${no} + 1` no=`expr ${no} + 1`
echo " started client $no/$CLIENTS."
[ $MAX -gt 0 ] && $srcdir/wait-tests.sh $MAX
done done
echo -n " waiting for clients to complete: ."
touch logs/check-idle.log touch logs/check-idle.log
while true; do while true; do
expect ${srcdir}/check-idle.e >> logs/check-idle.log expect ${srcdir}/check-idle.e >> logs/check-idle.log; res=$?
res=$?
[ $res -eq 0 ] && exit 0
[ $res -eq 1 ] && exit 1
sleep 1
echo "====================" >> logs/check-idle.log echo "====================" >> logs/check-idle.log
[ $res -ne 99 ] && break
# there are still clients connected. Wait ...
sleep 3
echo -n "."
done done
[ $res -eq 0 ] && echo " ok." || echo " failure!"
exit $res
# -eof- # -eof-

37
src/testsuite/test-loop.sh Executable file
View File

@@ -0,0 +1,37 @@
#!/bin/sh
#
# ngIRCd Test Suite
# Copyright (c)2002-2004 by Alexander Barton (alex@barton.de)
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 2 of the License, or
# (at your option) any later version.
# Please read the file COPYING, README and AUTHORS for more information.
#
# $Id: test-loop.sh,v 1.2.2.1 2004/09/04 20:49:36 alex Exp $
#
# detect source directory
[ -z "$srcdir" ] && srcdir=`dirname $0`
# parse command line
[ "$1" -gt 0 ] 2> /dev/null && LOOPS="$1" || LOOPS=5
[ "$2" -gt 0 ] 2> /dev/null && WAIT="$2" || WAIT=5
loop=0
while [ ${loop} -lt $LOOPS ]; do
loop=`expr ${loop} + 1`
echo " loop $loop/$LOOPS starting:"
for s in $srcdir/*-test; do
sh $s; r=$?
[ $r -ne 0 ] && exit $r
sleep 1
done
if [ ${loop} -lt $LOOPS ]; then
echo " waiting $WAIT seconds ..."
sleep $WAIT
fi
done
# -eof-

View File

@@ -1,11 +1,19 @@
#!/bin/sh #!/bin/sh
# ngIRCd Test Suite # ngIRCd Test Suite
# $Id: tests.sh,v 1.4 2003/08/22 11:31:18 alex Exp $ # $Id: tests.sh,v 1.4.2.1 2004/09/04 20:49:36 alex Exp $
# detect source directory
[ -z "$srcdir" ] && srcdir=`dirname $0`
name=`basename $0` name=`basename $0`
test=`echo ${name} | cut -d '.' -f 1` test=`echo ${name} | cut -d '.' -f 1`
mkdir -p logs mkdir -p logs
if [ ! -r "$test" ]; then
echo " ${name}: test \"$test\" not found!"; exit 77
exit 1
fi
type expect > /dev/null 2>&1 type expect > /dev/null 2>&1
if [ $? -ne 0 ]; then if [ $? -ne 0 ]; then
echo " ${name}: \"expect\" not found."; exit 77 echo " ${name}: \"expect\" not found."; exit 77
@@ -15,7 +23,10 @@ if [ $? -ne 0 ]; then
echo " ${name}: \"telnet\" not found."; exit 77 echo " ${name}: \"telnet\" not found."; exit 77
fi fi
echo " doing ${test} ..." echo -n " running ${test} ..."
expect ${srcdir}/${test}.e > logs/${test}.log expect ${srcdir}/${test}.e > logs/${test}.log 2>&1; r=$?
[ $r -eq 0 ] && echo " ok." || echo " failure!"
exit $r
# -eof- # -eof-

41
src/testsuite/wait-tests.sh Executable file
View File

@@ -0,0 +1,41 @@
#!/bin/sh
#
# ngIRCd Test Suite
# Copyright (c)2002-2004 by Alexander Barton (alex@barton.de)
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 2 of the License, or
# (at your option) any later version.
# Please read the file COPYING, README and AUTHORS for more information.
#
# $Id: wait-tests.sh,v 1.3.2.1 2004/09/04 20:49:36 alex Exp $
#
[ "$1" -gt 0 ] 2> /dev/null && MAX="$1" || MAX=5
PS_FLAGS="-f"
ps $PS_FLAGS >/dev/null 2>&1
[ $? -ne 0 ] && PS_FLAGS="a"
msg=0
while true; do
count=`ps $PS_FLAGS | grep "expect " | wc -l`
count=`expr $count - 1`
[ $count -le $MAX ] && break
if [ $msg -lt 1 ]; then
echo -n " waiting for processes to settle: "
msg=1
fi
# there are still clients connected. Wait ...
echo -n "$count>$MAX "
sleep 1
done
[ $msg -gt 0 ] && echo "done: $count"
exit 0
# -eof-