From 2dcb343a45f0ac829cc37b8736a08e06fbcf710e Mon Sep 17 00:00:00 2001 From: Lifei Zhou Date: Tue, 24 Mar 2026 16:22:23 +1100 Subject: [PATCH] more script change --- .agents/skills/e2e-app/SKILL.md | 4 +-- .../tests/e2e-tests/scripts/e2e-run-all.sh | 34 +++++++++---------- .../tests/e2e-tests/scripts/e2e-start.sh | 9 +++-- .../tests/e2e-tests/scripts/e2e-stop.sh | 7 ++-- ui/desktop/tests/e2e-tests/scripts/replay.sh | 2 +- 5 files changed, 31 insertions(+), 25 deletions(-) diff --git a/.agents/skills/e2e-app/SKILL.md b/.agents/skills/e2e-app/SKILL.md index ee911e4ff6..d1b87174f7 100644 --- a/.agents/skills/e2e-app/SKILL.md +++ b/.agents/skills/e2e-app/SKILL.md @@ -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 diff --git a/ui/desktop/tests/e2e-tests/scripts/e2e-run-all.sh b/ui/desktop/tests/e2e-tests/scripts/e2e-run-all.sh index 909a693600..6e474a1f3a 100755 --- a/ui/desktop/tests/e2e-tests/scripts/e2e-run-all.sh +++ b/ui/desktop/tests/e2e-tests/scripts/e2e-run-all.sh @@ -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 # 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" } diff --git a/ui/desktop/tests/e2e-tests/scripts/e2e-start.sh b/ui/desktop/tests/e2e-tests/scripts/e2e-start.sh index 04135c7d92..06b3ff6882 100755 --- a/ui/desktop/tests/e2e-tests/scripts/e2e-start.sh +++ b/ui/desktop/tests/e2e-tests/scripts/e2e-start.sh @@ -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 diff --git a/ui/desktop/tests/e2e-tests/scripts/e2e-stop.sh b/ui/desktop/tests/e2e-tests/scripts/e2e-stop.sh index 2c6c69cb59..adfc53901e 100755 --- a/ui/desktop/tests/e2e-tests/scripts/e2e-stop.sh +++ b/ui/desktop/tests/e2e-tests/scripts/e2e-stop.sh @@ -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 diff --git a/ui/desktop/tests/e2e-tests/scripts/replay.sh b/ui/desktop/tests/e2e-tests/scripts/replay.sh index 343ca4e224..f2814c6015 100755 --- a/ui/desktop/tests/e2e-tests/scripts/replay.sh +++ b/ui/desktop/tests/e2e-tests/scripts/replay.sh @@ -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..."