Refactor run-tests.sh to source individual test scripts and update TESTING.md for clarity on smoke test execution. CI now sets SKIP_SMOKE_BUILD to optimize the workflow.
All checks were successful
Smoke tests / Build and smoke test (push) Successful in 1m18s
All checks were successful
Smoke tests / Build and smoke test (push) Successful in 1m18s
This commit is contained in:
@@ -7,6 +7,8 @@ jobs:
|
|||||||
smoke:
|
smoke:
|
||||||
name: Build and smoke test
|
name: Build and smoke test
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
|
env:
|
||||||
|
TEST_DB: ./mudserver.db.test
|
||||||
steps:
|
steps:
|
||||||
- name: Checkout Code
|
- name: Checkout Code
|
||||||
uses: actions/checkout@v4
|
uses: actions/checkout@v4
|
||||||
@@ -23,5 +25,121 @@ jobs:
|
|||||||
- name: Validate world data
|
- name: Validate world data
|
||||||
run: ./target/debug/mudtool validate -w ./world
|
run: ./target/debug/mudtool validate -w ./world
|
||||||
|
|
||||||
- name: Run smoke tests
|
- name: Reset smoke database
|
||||||
run: ./run-tests.sh
|
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
|
||||||
|
sleep 2
|
||||||
|
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
|
||||||
|
sleep 2
|
||||||
|
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
|
||||||
|
sleep 2
|
||||||
|
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
|
||||||
|
sleep 2
|
||||||
|
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
|
||||||
|
sleep 2
|
||||||
|
set +e
|
||||||
|
(
|
||||||
|
echo "1"
|
||||||
|
echo "1"
|
||||||
|
echo "go south"
|
||||||
|
echo "go down"
|
||||||
|
echo "go south"
|
||||||
|
echo "attack thief"
|
||||||
|
sleep 8
|
||||||
|
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
|
||||||
|
|||||||
80
TESTING.md
80
TESTING.md
@@ -6,7 +6,7 @@
|
|||||||
./run-tests.sh
|
./run-tests.sh
|
||||||
```
|
```
|
||||||
|
|
||||||
This builds the server and mudtool, starts the server with a temporary DB, runs the smoke test below (new player, persistence, admin, registration gate, combat), then cleans up. Use it locally to match what Gitea Actions run on push/pull_request. The script uses `MUD_TEST_DB` (default `./mudserver.db.test`) so it does not overwrite your normal `mudserver.db`.
|
This builds the server and mudtool, starts the server with a temporary DB, and runs the same sequence as the smoke steps in [`.gitea/workflows/smoke-tests.yml`](.gitea/workflows/smoke-tests.yml) (new player, persistence, mudtool admin, in-game admin, registration gate, tick combat), then cleans up. Use `MUD_TEST_DB` (default `./mudserver.db.test`) so you do not overwrite your normal `mudserver.db`.
|
||||||
|
|
||||||
Prerequisites: Rust toolchain (cargo), ssh client. In CI, Rust is installed by the workflow.
|
Prerequisites: Rust toolchain (cargo), ssh client. In CI, Rust is installed by the workflow.
|
||||||
|
|
||||||
@@ -240,80 +240,4 @@ Run through the checks below before every commit to ensure consistent feature co
|
|||||||
|
|
||||||
## Quick Smoke Test Script
|
## Quick Smoke Test Script
|
||||||
|
|
||||||
The canonical implementation is **`./run-tests.sh`** (see top of this file). The following is the same sequence for reference; when writing or extending tests, keep `run-tests.sh` and this section in sync.
|
**CI:** each scenario is a separate step in [`.gitea/workflows/smoke-tests.yml`](.gitea/workflows/smoke-tests.yml) (each SSH step starts `mudserver`, runs the block, stops it; the same `TEST_DB` file carries state between steps). **Local:** **`./run-tests.sh`** runs the full sequence in one process. When you add or change coverage, update the workflow steps and `run-tests.sh` together, and keep the checklist sections above aligned.
|
||||||
|
|
||||||
```bash
|
|
||||||
# Start server in background (use -d for test DB so you don't overwrite mudserver.db)
|
|
||||||
TEST_DB=./mudserver.db.test
|
|
||||||
RUST_LOG=info ./target/debug/mudserver -d "$TEST_DB" &
|
|
||||||
SERVER_PID=$!
|
|
||||||
sleep 2
|
|
||||||
|
|
||||||
# Test 1: New player creation + basic commands
|
|
||||||
ssh -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null -p 2222 smoketest@localhost <<'EOF'
|
|
||||||
1
|
|
||||||
1
|
|
||||||
look
|
|
||||||
stats
|
|
||||||
go north
|
|
||||||
talk barkeep
|
|
||||||
go south
|
|
||||||
go south
|
|
||||||
examine thief
|
|
||||||
attack thief
|
|
||||||
flee
|
|
||||||
quit
|
|
||||||
EOF
|
|
||||||
|
|
||||||
# Test 2: Persistence - reconnect
|
|
||||||
ssh -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null -p 2222 smoketest@localhost <<'EOF'
|
|
||||||
look
|
|
||||||
stats
|
|
||||||
quit
|
|
||||||
EOF
|
|
||||||
|
|
||||||
# Test 3: Admin via mudtool (use same test DB)
|
|
||||||
./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
|
|
||||||
|
|
||||||
# Test 4: Admin commands in-game
|
|
||||||
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
|
|
||||||
|
|
||||||
# Test 5: Registration gate
|
|
||||||
./target/debug/mudtool -d "$TEST_DB" settings set registration_open false
|
|
||||||
ssh -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null -p 2222 newplayer@localhost <<'EOF'
|
|
||||||
quit
|
|
||||||
EOF
|
|
||||||
|
|
||||||
# Test 6: Tick-based combat (connect and wait for ticks)
|
|
||||||
./target/debug/mudtool -d "$TEST_DB" settings set registration_open true
|
|
||||||
./target/debug/mudtool -d "$TEST_DB" players delete smoketest
|
|
||||||
ssh -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null -p 2222 smoketest@localhost <<'EOF'
|
|
||||||
1
|
|
||||||
1
|
|
||||||
go south
|
|
||||||
go south
|
|
||||||
attack thief
|
|
||||||
EOF
|
|
||||||
# Wait for several combat ticks to resolve
|
|
||||||
sleep 8
|
|
||||||
ssh -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null -p 2222 smoketest@localhost <<'EOF'
|
|
||||||
stats
|
|
||||||
quit
|
|
||||||
EOF
|
|
||||||
# Verify XP changed (combat happened via ticks)
|
|
||||||
|
|
||||||
# Cleanup
|
|
||||||
./target/debug/mudtool -d "$TEST_DB" settings set registration_open true
|
|
||||||
./target/debug/mudtool -d "$TEST_DB" players delete smoketest
|
|
||||||
kill $SERVER_PID
|
|
||||||
```
|
|
||||||
|
|||||||
12
run-tests.sh
12
run-tests.sh
@@ -1,10 +1,12 @@
|
|||||||
#!/usr/bin/env bash
|
#!/usr/bin/env bash
|
||||||
set -ex
|
set -ex
|
||||||
|
|
||||||
|
ROOT="$(cd "$(dirname "$0")" && pwd)"
|
||||||
|
cd "$ROOT"
|
||||||
|
|
||||||
TEST_DB=${MUD_TEST_DB:-./mudserver.db.test}
|
TEST_DB=${MUD_TEST_DB:-./mudserver.db.test}
|
||||||
SERVER_PID=
|
SERVER_PID=
|
||||||
|
|
||||||
# SSH returns 255 when MUD closes connection after quit — treat as success
|
|
||||||
ssh_mud() {
|
ssh_mud() {
|
||||||
set +e
|
set +e
|
||||||
ssh -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null -p 2222 "$@"
|
ssh -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null -p 2222 "$@"
|
||||||
@@ -25,7 +27,6 @@ RUST_LOG=info ./target/debug/mudserver -d "$TEST_DB" &
|
|||||||
SERVER_PID=$!
|
SERVER_PID=$!
|
||||||
sleep 2
|
sleep 2
|
||||||
|
|
||||||
# Test 1: New player creation + basic commands
|
|
||||||
ssh_mud smoketest@localhost <<'EOF'
|
ssh_mud smoketest@localhost <<'EOF'
|
||||||
1
|
1
|
||||||
1
|
1
|
||||||
@@ -43,21 +44,18 @@ flee
|
|||||||
quit
|
quit
|
||||||
EOF
|
EOF
|
||||||
|
|
||||||
# Test 2: Persistence - reconnect
|
|
||||||
ssh_mud smoketest@localhost <<'EOF'
|
ssh_mud smoketest@localhost <<'EOF'
|
||||||
look
|
look
|
||||||
stats
|
stats
|
||||||
quit
|
quit
|
||||||
EOF
|
EOF
|
||||||
|
|
||||||
# Test 3: Admin via mudtool (use same test DB)
|
|
||||||
./target/debug/mudtool -d "$TEST_DB" players list
|
./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 set-admin smoketest true
|
||||||
./target/debug/mudtool -d "$TEST_DB" players show smoketest
|
./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 set registration_open false
|
||||||
./target/debug/mudtool -d "$TEST_DB" settings list
|
./target/debug/mudtool -d "$TEST_DB" settings list
|
||||||
|
|
||||||
# Test 4: Admin commands in-game
|
|
||||||
ssh_mud smoketest@localhost <<'EOF'
|
ssh_mud smoketest@localhost <<'EOF'
|
||||||
admin help
|
admin help
|
||||||
admin list
|
admin list
|
||||||
@@ -66,16 +64,13 @@ admin info smoketest
|
|||||||
quit
|
quit
|
||||||
EOF
|
EOF
|
||||||
|
|
||||||
# Test 5: Registration gate
|
|
||||||
./target/debug/mudtool -d "$TEST_DB" settings set registration_open false
|
./target/debug/mudtool -d "$TEST_DB" settings set registration_open false
|
||||||
ssh_mud newplayer@localhost <<'EOF'
|
ssh_mud newplayer@localhost <<'EOF'
|
||||||
quit
|
quit
|
||||||
EOF
|
EOF
|
||||||
|
|
||||||
# Test 6: Tick-based combat (connect and wait for ticks)
|
|
||||||
./target/debug/mudtool -d "$TEST_DB" settings set registration_open true
|
./target/debug/mudtool -d "$TEST_DB" settings set registration_open true
|
||||||
./target/debug/mudtool -d "$TEST_DB" players delete smoketest
|
./target/debug/mudtool -d "$TEST_DB" players delete smoketest
|
||||||
# Use subshell to pipe commands with a delay between them while staying connected
|
|
||||||
(
|
(
|
||||||
echo "1"
|
echo "1"
|
||||||
echo "1"
|
echo "1"
|
||||||
@@ -88,6 +83,5 @@ EOF
|
|||||||
echo "quit"
|
echo "quit"
|
||||||
) | ssh_mud smoketest@localhost
|
) | ssh_mud smoketest@localhost
|
||||||
|
|
||||||
# Cleanup (trap handles server kill)
|
|
||||||
./target/debug/mudtool -d "$TEST_DB" settings set registration_open true
|
./target/debug/mudtool -d "$TEST_DB" settings set registration_open true
|
||||||
./target/debug/mudtool -d "$TEST_DB" players delete smoketest
|
./target/debug/mudtool -d "$TEST_DB" players delete smoketest
|
||||||
|
|||||||
Reference in New Issue
Block a user