Files
mudserver/.gitea/workflows/smoke-tests.yml
AI Agent 33e9f817c5
Some checks failed
Smoke tests / Build and smoke test (push) Has been cancelled
Smoke tests / Build and smoke test (pull_request) Successful in 1m26s
Implement robust logging with flexi_logger and update CI to verify logs
2026-03-19 21:07:58 -06:00

203 lines
7.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 - 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."