From ba40b3950057c54609f8e4a56139563d30f8b84f Mon Sep 17 00:00:00 2001 From: sfan5 Date: Wed, 21 Apr 2021 18:21:12 +0200 Subject: [PATCH] Add basic client-server test to CI --- .github/workflows/build.yml | 8 +++- util/ci/common.sh | 4 +- util/test_multiplayer.sh | 79 ++++++++++++++++++++++--------------- 3 files changed, 57 insertions(+), 34 deletions(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 0cf18d228..d268aa0cb 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -80,7 +80,7 @@ jobs: - name: Install deps run: | source ./util/ci/common.sh - install_linux_deps clang-3.9 + install_linux_deps clang-3.9 gdb - name: Build run: | @@ -89,10 +89,14 @@ jobs: CC: clang-3.9 CXX: clang++-3.9 - - name: Test + - name: Unittest run: | ./bin/minetest --run-unittests + - name: Integration test + run: | + ./util/test_multiplayer.sh + # This is the current clang version clang_9: runs-on: ubuntu-18.04 diff --git a/util/ci/common.sh b/util/ci/common.sh index 1083581b5..eb282c823 100644 --- a/util/ci/common.sh +++ b/util/ci/common.sh @@ -11,7 +11,9 @@ install_linux_deps() { shift pkgs+=(libirrlicht-dev) else - wget "https://github.com/minetest/irrlicht/releases/download/1.9.0mt1/ubuntu-bionic.tar.gz" + # TODO: return old URL when IrrlichtMt 1.9.0mt2 is tagged + #wget "https://github.com/minetest/irrlicht/releases/download/1.9.0mt1/ubuntu-bionic.tar.gz" + wget "http://minetest.kitsunemimi.pw/irrlichtmt-patched-temporary.tgz" -O ubuntu-bionic.tar.gz sudo tar -xaf ubuntu-bionic.tar.gz -C /usr/local fi diff --git a/util/test_multiplayer.sh b/util/test_multiplayer.sh index 176cf11d9..9fb894a30 100755 --- a/util/test_multiplayer.sh +++ b/util/test_multiplayer.sh @@ -3,41 +3,58 @@ dir="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )" gameid=devtest minetest=$dir/../bin/minetest testspath=$dir/../tests -worldpath=$testspath/testworld_$gameid -configpath=$testspath/configs -logpath=$testspath/log -conf_server=$configpath/minetest.conf.multi.server -conf_client1=$configpath/minetest.conf.multi.client1 -conf_client2=$configpath/minetest.conf.multi.client2 -log_server=$logpath/server.log -log_client1=$logpath/client1.log -log_client2=$logpath/client2.log +conf_client1=$testspath/client1.conf +conf_server=$testspath/server.conf +worldpath=$testspath/world -mkdir -p $worldpath -mkdir -p $configpath -mkdir -p $logpath +waitfor () { + n=30 + while [ $n -gt 0 ]; do + [ -f "$1" ] && return 0 + sleep 0.5 + ((n-=1)) + done + echo "Waiting for ${1##*/} timed out" + pkill -P $$ + exit 1 +} -echo -ne 'client1::shout,interact,settime,teleport,give -client2::shout,interact,settime,teleport,give -' > $worldpath/auth.txt +gdbrun () { + gdb -q -ex 'set confirm off' -ex 'r' -ex 'bt' -ex 'quit' --args "$@" +} -echo -ne '' > $conf_server +[ -e $minetest ] || { echo "executable $minetest missing"; exit 1; } -echo -ne '# client 1 config -screenW=500 -screenH=380 -name=client1 -viewing_range_nodes_min=10 -' > $conf_client1 +rm -rf $worldpath +mkdir -p $worldpath/worldmods/test -echo -ne '# client 2 config -screenW=500 -screenH=380 -name=client2 -viewing_range_nodes_min=10 -' > $conf_client2 +printf '%s\n' >$testspath/client1.conf \ + video_driver=null name=client1 viewing_range=10 \ + enable_{sound,minimap,shaders}=false -echo $(sleep 1; $minetest --disable-unittests --logfile $log_client1 --config $conf_client1 --go --address localhost) & -echo $(sleep 2; $minetest --disable-unittests --logfile $log_client2 --config $conf_client2 --go --address localhost) & -$minetest --disable-unittests --server --logfile $log_server --config $conf_server --world $worldpath --gameid $gameid +printf '%s\n' >$testspath/server.conf \ + max_block_send_distance=1 +cat >$worldpath/worldmods/test/init.lua <<"LUA" +core.after(0, function() + io.close(io.open(core.get_worldpath() .. "/startup", "w")) +end) +core.register_on_joinplayer(function(player) + io.close(io.open(core.get_worldpath() .. "/player_joined", "w")) + core.request_shutdown("", false, 2) +end) +LUA + +echo "Starting server" +gdbrun $minetest --server --config $conf_server --world $worldpath --gameid $gameid 2>&1 | sed -u 's/^/(server) /' & +waitfor $worldpath/startup + +echo "Starting client" +gdbrun $minetest --config $conf_client1 --go --address 127.0.0.1 2>&1 | sed -u 's/^/(client) /' & +waitfor $worldpath/player_joined + +echo "Waiting for client and server to exit" +wait + +echo "Success" +exit 0