232 lines
8.1 KiB
YAML
232 lines
8.1 KiB
YAML
name: Smoke tests
|
|
on:
|
|
workflow_dispatch:
|
|
push:
|
|
pull_request:
|
|
|
|
jobs:
|
|
smoke:
|
|
name: Build and smoke test
|
|
runs-on: ubuntu-latest
|
|
env:
|
|
TEST_DB: ./mudserver.db.test
|
|
steps:
|
|
- name: Checkout Code
|
|
uses: actions/checkout@v4
|
|
|
|
- name: Install needed tools
|
|
env:
|
|
DEBIAN_FRONTEND: noninteractive
|
|
run: |
|
|
set -e
|
|
sudo apt-get update
|
|
sudo apt-get install -y --no-install-recommends openssh-client netcat-openbsd ca-certificates curl
|
|
curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh -s -- -y
|
|
echo "$HOME/.cargo/bin" >> "$GITHUB_PATH"
|
|
|
|
- name: Build
|
|
run: cargo build
|
|
|
|
- name: Validate world data
|
|
run: ./target/debug/mudtool validate -w ./world
|
|
|
|
- name: Reset smoke database
|
|
run: rm -f "$TEST_DB"
|
|
|
|
- name: Smoke - new player and basics
|
|
run: |
|
|
set -euo pipefail
|
|
RUST_LOG=info ./target/debug/mudserver -d "$TEST_DB" &
|
|
MUD_PID=$!
|
|
trap 'kill $MUD_PID 2>/dev/null || true' EXIT
|
|
bash scripts/ci/wait-for-tcp.sh 127.0.0.1 2222
|
|
set +e
|
|
ssh -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null -p 2222 smoketest@localhost <<'EOF'
|
|
1
|
|
1
|
|
look
|
|
stats
|
|
go south
|
|
go down
|
|
go north
|
|
talk barkeep
|
|
go south
|
|
go south
|
|
examine thief
|
|
attack thief
|
|
flee
|
|
quit
|
|
EOF
|
|
r=$?
|
|
set -e
|
|
[[ $r -eq 0 || $r -eq 255 ]]
|
|
|
|
- name: Smoke - weather and time
|
|
run: |
|
|
set -euo pipefail
|
|
RUST_LOG=info ./target/debug/mudserver -d "$TEST_DB" &
|
|
MUD_PID=$!
|
|
trap 'kill $MUD_PID 2>/dev/null || true' EXIT
|
|
bash scripts/ci/wait-for-tcp.sh 127.0.0.1 2222
|
|
set +e
|
|
ssh -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null -p 2222 smoketest@localhost <<'EOF' > weather_test.out
|
|
go south
|
|
go down
|
|
look
|
|
quit
|
|
EOF
|
|
r=$?
|
|
set -e
|
|
[[ $r -eq 0 || $r -eq 255 ]]
|
|
if ! grep -q "The sky is\|raining\|storm\|snow\|fog" weather_test.out; then
|
|
echo "Error: Weather info not found in look output"
|
|
cat weather_test.out
|
|
exit 1
|
|
fi
|
|
if ! grep -q "\[Night\]\|\[Morning\]\|\[Afternoon\]\|\[Evening\]" weather_test.out; then
|
|
echo "Error: Time of day info not found in look output"
|
|
cat weather_test.out
|
|
exit 1
|
|
fi
|
|
rm weather_test.out
|
|
|
|
- name: Smoke - persistence (reconnect)
|
|
run: |
|
|
set -euo pipefail
|
|
RUST_LOG=info ./target/debug/mudserver -d "$TEST_DB" &
|
|
MUD_PID=$!
|
|
trap 'kill $MUD_PID 2>/dev/null || true' EXIT
|
|
bash scripts/ci/wait-for-tcp.sh 127.0.0.1 2222
|
|
set +e
|
|
ssh -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null -p 2222 smoketest@localhost <<'EOF'
|
|
look
|
|
stats
|
|
quit
|
|
EOF
|
|
r=$?
|
|
set -e
|
|
[[ $r -eq 0 || $r -eq 255 ]]
|
|
|
|
- name: Smoke - mudtool admin
|
|
run: |
|
|
set -euo pipefail
|
|
./target/debug/mudtool -d "$TEST_DB" players list
|
|
./target/debug/mudtool -d "$TEST_DB" players set-admin smoketest true
|
|
./target/debug/mudtool -d "$TEST_DB" players show smoketest
|
|
./target/debug/mudtool -d "$TEST_DB" settings set registration_open false
|
|
./target/debug/mudtool -d "$TEST_DB" settings list
|
|
|
|
- name: Smoke - in-game admin
|
|
run: |
|
|
set -euo pipefail
|
|
RUST_LOG=info ./target/debug/mudserver -d "$TEST_DB" &
|
|
MUD_PID=$!
|
|
trap 'kill $MUD_PID 2>/dev/null || true' EXIT
|
|
bash scripts/ci/wait-for-tcp.sh 127.0.0.1 2222
|
|
set +e
|
|
ssh -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null -p 2222 smoketest@localhost <<'EOF'
|
|
admin help
|
|
admin list
|
|
admin registration on
|
|
admin info smoketest
|
|
quit
|
|
EOF
|
|
r=$?
|
|
set -e
|
|
[[ $r -eq 0 || $r -eq 255 ]]
|
|
|
|
- name: Smoke - registration gate
|
|
run: |
|
|
set -euo pipefail
|
|
./target/debug/mudtool -d "$TEST_DB" settings set registration_open false
|
|
RUST_LOG=info ./target/debug/mudserver -d "$TEST_DB" &
|
|
MUD_PID=$!
|
|
trap 'kill $MUD_PID 2>/dev/null || true' EXIT
|
|
bash scripts/ci/wait-for-tcp.sh 127.0.0.1 2222
|
|
set +e
|
|
ssh -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null -p 2222 newplayer@localhost <<'EOF'
|
|
quit
|
|
EOF
|
|
r=$?
|
|
set -e
|
|
[[ $r -eq 0 || $r -eq 255 ]]
|
|
|
|
- name: Smoke - tick-based combat
|
|
run: |
|
|
set -euo pipefail
|
|
./target/debug/mudtool -d "$TEST_DB" settings set registration_open true
|
|
./target/debug/mudtool -d "$TEST_DB" players delete smoketest
|
|
RUST_LOG=info ./target/debug/mudserver -d "$TEST_DB" &
|
|
MUD_PID=$!
|
|
trap 'kill $MUD_PID 2>/dev/null || true' EXIT
|
|
bash scripts/ci/wait-for-tcp.sh 127.0.0.1 2222
|
|
set +e
|
|
(
|
|
echo "1"
|
|
echo "1"
|
|
echo "go south"
|
|
echo "go down"
|
|
echo "go south"
|
|
echo "attack thief"
|
|
sleep 15
|
|
echo "stats"
|
|
echo "quit"
|
|
) | ssh -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null -p 2222 smoketest@localhost
|
|
r=$?
|
|
set -e
|
|
[[ $r -eq 0 || $r -eq 255 ]]
|
|
./target/debug/mudtool -d "$TEST_DB" settings set registration_open true
|
|
./target/debug/mudtool -d "$TEST_DB" players delete smoketest
|
|
|
|
- name: Smoke - JSON-RPC list_commands
|
|
run: |
|
|
set -euo pipefail
|
|
RUST_LOG=info ./target/debug/mudserver -d "$TEST_DB" &
|
|
MUD_PID=$!
|
|
trap 'kill $MUD_PID 2>/dev/null || true' EXIT
|
|
bash scripts/ci/wait-for-tcp.sh 127.0.0.1 2222
|
|
set +e
|
|
ssh -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null -p 2222 rpctest@localhost <<'EOF'
|
|
1
|
|
1
|
|
quit
|
|
EOF
|
|
r=$?
|
|
set -e
|
|
[[ $r -eq 0 || $r -eq 255 ]]
|
|
echo '{"_jsonrpc": "2.0", "method": "login", "params": {"username": "rpctest"}, "id": 1}' | nc -w 2 localhost 2223 > rpc_resp.json
|
|
echo '{"_jsonrpc": "2.0", "method": "list_commands", "params": {}, "id": 2}' | nc -w 2 localhost 2223 >> rpc_resp.json
|
|
grep -q '"shop"' rpc_resp.json
|
|
rm rpc_resp.json
|
|
./target/debug/mudtool -d "$TEST_DB" players delete rpctest
|
|
|
|
- name: Verify logging
|
|
run: |
|
|
set +e
|
|
if [ ! -d "logs" ]; then
|
|
echo "Error: logs directory not found"
|
|
exit 1
|
|
fi
|
|
|
|
FAILED=0
|
|
|
|
echo "Checking mudserver logs..."
|
|
grep -q "World '.*': .* rooms" logs/mudserver_*.log || { echo "Failed: World loading log missing"; FAILED=1; }
|
|
grep -q "MUD server listening on" logs/mudserver_*.log || { echo "Failed: Listen log missing"; FAILED=1; }
|
|
grep -q "New character created: smoketest" logs/mudserver_*.log || { echo "Failed: smoketest creation log missing"; FAILED=1; }
|
|
grep -q "Admin action: registration setting updated: '.*'" logs/mudserver_*.log || { echo "Failed: Admin action log missing"; FAILED=1; }
|
|
|
|
echo "Checking combat logs..."
|
|
grep -q "Combat: Player 'smoketest' (ID .*) engaged NPC 'Shadowy Thief'" logs/combat_*.log || { echo "Failed: Combat engagement log missing"; FAILED=1; }
|
|
grep -q "Combat: Player 'smoketest' (ID .*) killed NPC 'Shadowy Thief'" logs/combat_*.log || { echo "Failed: NPC kill log missing"; FAILED=1; }
|
|
|
|
if [ $FAILED -ne 0 ]; then
|
|
echo "--- LOG VERIFICATION FAILED ---"
|
|
echo "--- MUDSERVER LOG CONTENTS ---"
|
|
cat logs/mudserver_*.log
|
|
echo "--- COMBAT LOG CONTENTS ---"
|
|
cat logs/combat_*.log
|
|
exit 1
|
|
fi
|
|
echo "Logging verification passed."
|