mirror of
https://github.com/block/goose.git
synced 2026-07-17 12:56:20 +02:00
more script change
This commit is contained in:
@@ -23,8 +23,8 @@ Then wait for the port file and verify the app is listening:
|
||||
```bash
|
||||
# Wait for port file and app to be ready (up to 30s)
|
||||
for i in $(seq 1 30); do
|
||||
if [[ -f "/tmp/goose-e2e/$TEST_SESSION_NAME/.port" ]]; then
|
||||
CDP_PORT=$(cat /tmp/goose-e2e/$TEST_SESSION_NAME/.port)
|
||||
if [[ -f "/tmp/goose-e2e/sessions/$TEST_SESSION_NAME/.port" ]]; then
|
||||
CDP_PORT=$(cat /tmp/goose-e2e/sessions/$TEST_SESSION_NAME/.port)
|
||||
if lsof -i :"$CDP_PORT" &>/dev/null; then
|
||||
echo "App ready — Test session name: $TEST_SESSION_NAME, CDP port: $CDP_PORT"
|
||||
break
|
||||
|
||||
@@ -9,6 +9,7 @@ DESKTOP_DIR="$(cd "$SCRIPT_DIR/../../.." && pwd)"
|
||||
PROJECT_DIR="$(cd "$DESKTOP_DIR/../.." && pwd)"
|
||||
RECORDINGS_DIR="$SCRIPT_DIR/../recordings"
|
||||
RESULTS_DIR="$SCRIPT_DIR/../results"
|
||||
BASE_DIR="/tmp/goose-e2e"
|
||||
|
||||
source "$PROJECT_DIR/bin/activate-hermit"
|
||||
WORKERS=4
|
||||
@@ -39,8 +40,8 @@ if [[ ${#RECORDINGS[@]} -eq 0 ]]; then
|
||||
fi
|
||||
|
||||
# Clean up previous test sessions
|
||||
pkill -9 -f "/tmp/goose-e2e" 2>/dev/null || true
|
||||
rm -rf /tmp/goose-e2e
|
||||
pkill -9 -f "$BASE_DIR" 2>/dev/null || true
|
||||
rm -rf "$BASE_DIR"
|
||||
rm -rf "$RESULTS_DIR"
|
||||
mkdir -p "$RESULTS_DIR/logs" "$RESULTS_DIR/screenshots"
|
||||
|
||||
@@ -48,19 +49,17 @@ echo "Installing agent-browser..."
|
||||
cd "$DESKTOP_DIR"
|
||||
pnpm exec agent-browser install
|
||||
|
||||
ts() { date '+%H:%M:%S'; }
|
||||
|
||||
echo "=== E2E Test Runner ==="
|
||||
echo "Recordings: ${#RECORDINGS[@]}, Workers: $WORKERS, Timeout: ${TIMEOUT}s"
|
||||
|
||||
cleanup_sessions() {
|
||||
bash "$SCRIPT_DIR/e2e-stop.sh" 2>/dev/null || true
|
||||
}
|
||||
|
||||
# Wait for the app to write its port file and the port to be listening.
|
||||
# Usage: wait_for_app <test-name>
|
||||
# Prints the CDP port on success, returns 1 on timeout.
|
||||
wait_for_app() {
|
||||
local TEST_NAME="$1"
|
||||
local PORT_FILE="/tmp/goose-e2e/$TEST_NAME/.port"
|
||||
local PORT_FILE="$BASE_DIR/sessions/${TEST_NAME}/.port"
|
||||
for _ in $(seq 1 30); do
|
||||
sleep 1
|
||||
if [[ -f "$PORT_FILE" ]]; then
|
||||
@@ -86,17 +85,18 @@ run_one() {
|
||||
local LOG_FILE="$RESULTS_DIR/logs/$TEST_NAME.log"
|
||||
local EXIT_CODE
|
||||
|
||||
echo "[$(date '+%H:%M:%S')] [$TEST_NAME] Starting app..."
|
||||
echo "[$(ts)] [$TEST_NAME] Starting app..."
|
||||
screen -dmS "$TEST_NAME" bash -c "bash '$SCRIPT_DIR/e2e-start.sh' '$TEST_NAME'" 2>/dev/null
|
||||
|
||||
local CDP_PORT
|
||||
if ! CDP_PORT=$(wait_for_app "$TEST_NAME"); then
|
||||
local DURATION=$(( SECONDS - START_TIME ))
|
||||
echo "[$(date '+%H:%M:%S')] [$TEST_NAME] FAIL — app did not start within 30s (${DURATION}s)"
|
||||
echo "[$(ts)] [$TEST_NAME] FAIL — app did not start within 30s (${DURATION}s)"
|
||||
echo "FAIL ${DURATION}s" > "$STATUS_DIR/$TEST_NAME"
|
||||
bash "$SCRIPT_DIR/e2e-stop.sh" "$TEST_NAME" 2>/dev/null || true
|
||||
return
|
||||
fi
|
||||
echo "[$(date '+%H:%M:%S')] [$TEST_NAME] App ready: port=$CDP_PORT"
|
||||
echo "[$(ts)] [$TEST_NAME] App ready: port=$CDP_PORT"
|
||||
|
||||
set +e
|
||||
timeout "$TIMEOUT" bash "$SCRIPT_DIR/replay.sh" \
|
||||
@@ -104,34 +104,34 @@ run_one() {
|
||||
--connect "$CDP_PORT" \
|
||||
--browser-session "$TEST_NAME" \
|
||||
--results-dir "$RESULTS_DIR" \
|
||||
2>&1 | tee "$LOG_FILE"
|
||||
2>&1 | tee -a "$LOG_FILE"
|
||||
EXIT_CODE=${PIPESTATUS[0]}
|
||||
set -e
|
||||
|
||||
local DURATION=$(( SECONDS - START_TIME ))
|
||||
if [[ "$EXIT_CODE" -eq 0 ]]; then
|
||||
echo "PASS ${DURATION}s" > "$STATUS_DIR/$TEST_NAME"
|
||||
echo "[$(date '+%H:%M:%S')] [$TEST_NAME] PASS (${DURATION}s)"
|
||||
echo "[$(ts)] [$TEST_NAME] PASS (${DURATION}s)"
|
||||
elif [[ "$EXIT_CODE" -eq 124 ]]; then
|
||||
echo "TIMEOUT ${DURATION}s" > "$STATUS_DIR/$TEST_NAME"
|
||||
echo "[$(date '+%H:%M:%S')] [$TEST_NAME] TIMEOUT (${DURATION}s)"
|
||||
echo "[$(ts)] [$TEST_NAME] TIMEOUT (${DURATION}s)"
|
||||
else
|
||||
echo "FAIL ${DURATION}s" > "$STATUS_DIR/$TEST_NAME"
|
||||
echo "[$(date '+%H:%M:%S')] [$TEST_NAME] FAIL (${DURATION}s, exit=$EXIT_CODE)"
|
||||
echo "[$(ts)] [$TEST_NAME] FAIL (${DURATION}s, exit=$EXIT_CODE)"
|
||||
fi
|
||||
|
||||
bash "$SCRIPT_DIR/e2e-stop.sh" "$TEST_NAME" 2>/dev/null || true
|
||||
}
|
||||
|
||||
export -f wait_for_app run_one
|
||||
export SCRIPT_DIR TIMEOUT RESULTS_DIR
|
||||
export -f ts wait_for_app run_one
|
||||
export BASE_DIR SCRIPT_DIR TIMEOUT RESULTS_DIR
|
||||
|
||||
# Temp dir for pass/fail status
|
||||
STATUS_DIR=$(mktemp -d)
|
||||
cleanup_and_exit() {
|
||||
local exit_code="${1:-$?}"
|
||||
trap - EXIT INT TERM
|
||||
cleanup_sessions
|
||||
bash "$SCRIPT_DIR/e2e-stop.sh" 2>/dev/null || true
|
||||
rm -rf "$STATUS_DIR"
|
||||
exit "$exit_code"
|
||||
}
|
||||
|
||||
@@ -9,13 +9,14 @@ DESKTOP_DIR="$(cd "$SCRIPT_DIR/../../.." && pwd)"
|
||||
PROJECT_DIR="$(cd "$DESKTOP_DIR/../.." && pwd)"
|
||||
FIXTURES_DIR="$SCRIPT_DIR/../fixtures"
|
||||
BASE_DIR="/tmp/goose-e2e"
|
||||
SESSIONS_DIR="$BASE_DIR/sessions"
|
||||
|
||||
source "$PROJECT_DIR/bin/activate-hermit"
|
||||
|
||||
cd "$DESKTOP_DIR"
|
||||
|
||||
TEST_SESSION_NAME="${1:-$(date +"%y%m%d-%H%M%S")}"
|
||||
SESSION_DIR="$BASE_DIR/$TEST_SESSION_NAME"
|
||||
SESSION_DIR="$SESSIONS_DIR/$TEST_SESSION_NAME"
|
||||
|
||||
# Pick an available port in range 9300-9399, using a lock file to prevent
|
||||
# parallel instances from selecting the same port (TOCTOU race condition).
|
||||
@@ -42,6 +43,7 @@ pick_port() {
|
||||
CDP_PORT=$(pick_port)
|
||||
|
||||
# Create clean session directory
|
||||
mkdir -p "$SESSIONS_DIR"
|
||||
rm -rf "$SESSION_DIR"
|
||||
mkdir -p "$SESSION_DIR/root"
|
||||
mkdir -p "$SESSION_DIR/workspace"
|
||||
@@ -56,6 +58,9 @@ echo "CDP port: $CDP_PORT"
|
||||
echo "Session dir: $SESSION_DIR"
|
||||
echo ""
|
||||
|
||||
# Clean up lock file when Electron exits
|
||||
trap 'rm -f "$BASE_DIR/.port-locks/$CDP_PORT"' EXIT
|
||||
|
||||
# Start the app in foreground (Ctrl+C to stop)
|
||||
export GOOSE_ALLOWLIST_BYPASS=true
|
||||
export GOOSE_DISABLE_KEYRING=1
|
||||
@@ -67,4 +72,4 @@ export ANTHROPIC_API_KEY="${ANTHROPIC_API_KEY:?ANTHROPIC_API_KEY must be set}"
|
||||
export GOOSE_TELEMETRY_ENABLED=false
|
||||
export ENABLE_PLAYWRIGHT=true
|
||||
export PLAYWRIGHT_DEBUG_PORT="$CDP_PORT"
|
||||
exec pnpm exec electron-forge start
|
||||
pnpm exec electron-forge start
|
||||
|
||||
@@ -4,10 +4,11 @@
|
||||
set -euo pipefail
|
||||
|
||||
BASE_DIR="/tmp/goose-e2e"
|
||||
SESSIONS_DIR="$BASE_DIR/sessions"
|
||||
|
||||
stop_session() {
|
||||
local TEST_SESSION_NAME="$1"
|
||||
local SESSION_DIR="$BASE_DIR/$TEST_SESSION_NAME"
|
||||
local SESSION_DIR="$SESSIONS_DIR/$TEST_SESSION_NAME"
|
||||
|
||||
if [[ ! -d "$SESSION_DIR" ]]; then
|
||||
echo "Error: session not found: $SESSION_DIR" >&2
|
||||
@@ -35,11 +36,11 @@ if [[ $# -gt 0 ]]; then
|
||||
exit 0
|
||||
fi
|
||||
|
||||
if [[ ! -d "$BASE_DIR" ]]; then
|
||||
if [[ ! -d "$SESSIONS_DIR" ]]; then
|
||||
exit 0
|
||||
fi
|
||||
|
||||
for session_dir in "$BASE_DIR"/*; do
|
||||
for session_dir in "$SESSIONS_DIR"/*; do
|
||||
[[ -d "$session_dir" ]] || continue
|
||||
stop_session "$(basename "$session_dir")" || true
|
||||
done
|
||||
|
||||
@@ -52,7 +52,7 @@ if [[ -n "$CONNECT_PORT" ]]; then
|
||||
break
|
||||
fi
|
||||
if [[ "$attempt" -eq "$MAX_CONNECT_RETRIES" ]]; then
|
||||
echo "Failed to connect after $MAX_CONNECT_RETRIES attempts"
|
||||
echo "[$(ts)] Failed to connect after $MAX_CONNECT_RETRIES attempts"
|
||||
exit 1
|
||||
fi
|
||||
echo "[$(ts)] Connect failed, retrying in ${CONNECT_RETRY_DELAY}s..."
|
||||
|
||||
Reference in New Issue
Block a user