ddnet/scripts/integration_test.sh
2022-05-26 01:22:14 +02:00

223 lines
4.4 KiB
Bash
Executable file

#!/bin/bash
if [ ! -f ./scripts/integration_test.sh ] || [ ! -f CMakeLists.txt ]
then
echo "Error: make sure your are in the root of the repo"
exit 1
fi
arg_build_dir="build"
arg_end_args=0
arg_verbose=0
for arg in "$@"
do
if [[ "${arg::1}" == "-" ]] && [[ "$arg_end_args" == "0" ]]
then
if [ "$arg" == "-h" ] || [ "$arg" == "--help" ]
then
echo "usage: $(basename "$0") [OPTION..] [build dir]"
echo "description:"
echo " Runs a simple integration test of the client and server"
echo " binaries from the given build dir"
echo "options:"
echo " --help|-h show this help"
echo " --verbose|-v verbose output"
elif [ "$arg" == "-v" ] || [ "$arg" == "--verbose" ]
then
arg_verbose=1
elif [ "$arg" == "--" ]
then
arg_end_args=1
else
echo "Error: unknown arg '$arg'"
fi
else
arg_build_dir="$arg"
fi
done
if [ ! -d "$arg_build_dir" ]
then
echo "Error: build directory '$arg_build_dir' not found"
exit 1
fi
if [ ! -f "$arg_build_dir"/DDNet ]
then
echo "Error: client binary not found '$arg_build_dir/DDNet' not found"
exit 1
fi
if [ ! -f "$arg_build_dir"/DDNet-Server ]
then
echo "Error: server binary not found '$arg_build_dir/DDNet-Server' not found"
exit 1
fi
mkdir -p test
cp "$arg_build_dir"/DDNet* test
cd test || exit 1
function kill_all() {
if [ "$arg_verbose" == "1" ]
then
echo "[*] shutting down test clients and server ..."
fi
sleep 1
echo "shutdown" > server.fifo
echo "quit" > client1.fifo
echo "quit" > client2.fifo
}
got_cleanup=0
function cleanup() {
# needed to fix hang fifo with additional ctrl+c
if [ "$got_cleanup" == "1" ]
then
exit
fi
got_cleanup=1
kill_all
}
trap cleanup EXIT
{
echo $'add_path $CURRENTDIR'
echo $'add_path $USERDIR'
echo $'add_path $DATADIR'
echo $'add_path ../data'
} > storage.cfg
function fail()
{
sleep 1
tail -n2 "$1".log > fail_"$1".txt
echo "$1 exited with code $2" >> fail_"$1".txt
echo "[-] $1 exited with code $2"
}
if test -n "$(find . -maxdepth 1 -name '*.fifo' -print -quit)"
then
rm ./*.fifo
fi
if test -n "$(find . -maxdepth 1 -name 'SAN.*' -print -quit)"
then
rm SAN.*
fi
if test -n "$(find . -maxdepth 1 -name 'fail_*' -print -quit)"
then
rm ./fail_*
fi
if [ -f ddnet-server.sqlite ]
then
rm ddnet-server.sqlite
fi
# TODO: check for open ports instead
port=17822
cp ../ubsan.supp .
if [[ $OSTYPE == 'darwin'* ]]; then
DETECT_LEAKS=0
else
DETECT_LEAKS=1
fi
export UBSAN_OPTIONS=suppressions=./ubsan.supp:log_path=./SAN:print_stacktrace=1:halt_on_errors=0
export ASAN_OPTIONS=log_path=./SAN:print_stacktrace=1:check_initialization_order=1:detect_leaks=$DETECT_LEAKS:halt_on_errors=0
function print_san() {
if test -n "$(find . -maxdepth 1 -name 'SAN.*' -print -quit)"
then
cat ./SAN.*
return 1
fi
return 0
}
./DDNet-Server \
"sv_input_fifo server.fifo;
sv_map coverage;
sv_sqlite_file ddnet-server.sqlite;
sv_port $port" &> server.log || fail server "$?" &
./DDNet \
"cl_input_fifo client1.fifo;
player_name client1;
cl_download_skins 0;
connect localhost:$port" &> client1.log || fail client1 "$?" &
sleep 0.5
./DDNet \
"cl_input_fifo client2.fifo;
player_name client2;
cl_download_skins 0;
connect localhost:$port" &> client2.log || fail client2 "$?" &
fails=0
# give the client time to launch and create the fifo file
# but assume after 3 secs that the client crashed before
# being able to create the file
while [[ ! -p client1.fifo ]]
do
fails="$((fails+1))"
if [ "$arg_verbose" == "1" ]
then
echo "[!] client fifo not found (attempts $fails/3)"
fi
if [ "$fails" -gt "2" ]
then
print_san
echo "[-] Error: client possibly crashed on launch"
exit 1
fi
sleep 1
done
sleep 2
kill_all
wait
sleep 1
ranks="$(sqlite3 ddnet-server.sqlite < <(echo "select * from record_race;"))"
num_ranks="$(echo "$ranks" | wc -l | xargs)"
if [ "$ranks" == "" ]
then
touch fail_ranks.txt
echo "[-] Error: no ranks found in database"
elif [ "$num_ranks" != "1" ]
then
touch fail_ranks.txt
echo "[-] Error: expected 1 rank got $num_ranks"
elif ! echo "$ranks" | grep -q client1
then
touch fail_ranks.txt
echo "[-] Error: expected a rank from client1 instead got:"
echo " $ranks"
fi
if test -n "$(find . -maxdepth 1 -name 'fail_*' -print -quit)"
then
if [ "$arg_verbose" == "1" ]
then
for fail in ./fail_*
do
cat "$fail"
done
fi
print_san
echo "[-] Test failed. See errors above."
exit 1
else
echo "[*] all tests passed"
fi
print_san || exit 1