gem/tests/agent_lifecycle.sh
2026-08-30 18:24:55 -06:00

72 lines
2 KiB
Bash
Executable file

#!/bin/sh
set -eu
if [ "$#" -ne 3 ]; then
echo "usage: $0 GEM FAKE_SERVER FAKE_HAX" >&2
exit 1
fi
gem=$1
server=$2
hax=$3
port=$((20000 + $$ % 20000))
pid_file=$(mktemp /private/tmp/gem-agent-server-pid.XXXXXX)
occupied_pid=
cleanup() {
if [ -n "$occupied_pid" ]; then
kill "$occupied_pid" 2>/dev/null || true
wait "$occupied_pid" 2>/dev/null || true
fi
rm -f "$pid_file"
}
trap cleanup EXIT
GEM_TEST_PORT=$port GEM_FAKE_SERVER_PID_FILE=$pid_file \
"$gem" agent --model /tmp/gemma-4-31b.gguf --llama-server "$server" \
--hax "$hax" --port "$port" --startup-timeout 5
[ -s "$pid_file" ]
server_pid=$(sed -n '1p' "$pid_file")
if kill -0 "$server_pid" 2>/dev/null; then
echo "gem: managed server remained alive after hax exited: $server_pid" >&2
exit 1
fi
set +e
GEM_TEST_PORT=$port GEM_TEST_HAX_EXIT=7 GEM_FAKE_SERVER_PID_FILE=$pid_file \
"$gem" agent --model /tmp/gemma-4-31b.gguf --llama-server "$server" \
--hax "$hax" --port "$port" --startup-timeout 5
hax_status=$?
set -e
[ "$hax_status" -eq 7 ]
server_pid=$(sed -n '1p' "$pid_file")
if kill -0 "$server_pid" 2>/dev/null; then
echo "gem: managed server remained alive after failing hax: $server_pid" >&2
exit 1
fi
"$server" --port "$port" &
occupied_pid=$!
ready=false
for _attempt in 1 2 3 4 5 6 7 8 9 10; do
if curl --fail --silent "http://127.0.0.1:$port/health" >/dev/null; then
ready=true
break
fi
sleep 0.1
done
[ "$ready" = true ]
if GEM_TEST_PORT=$port "$gem" agent --model /tmp/gemma-4-31b.gguf \
--llama-server "$server" --hax "$hax" --port "$port" --startup-timeout 1; then
echo "gem: agent accepted a port owned by another server" >&2
exit 1
fi
kill "$occupied_pid"
wait "$occupied_pid" 2>/dev/null || true
occupied_pid=
if "$gem" agent --model /tmp/gemma-4-31b.gguf --llama-server /usr/bin/false \
--hax "$hax" --port "$port" --startup-timeout 1; then
echo "gem: agent accepted a server that exited before readiness" >&2
exit 1
fi