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