From 6258bcb5b8cb4530799be0c193b4a10867604bec Mon Sep 17 00:00:00 2001 From: Ahmed Abushagur Date: Fri, 13 Feb 2026 11:16:32 -0800 Subject: [PATCH] perf: run cloud tests and recordings in parallel Both mock.sh and record.sh now run each cloud's tests/recordings concurrently as background jobs instead of sequentially. Results are aggregated after all clouds finish. Co-Authored-By: Claude Opus 4.6 --- test/mock.sh | 80 +++++++++++++++++++++++++++++++++++++++++--------- test/record.sh | 38 +++++++++++++++++++++++- 2 files changed, 103 insertions(+), 15 deletions(-) diff --git a/test/mock.sh b/test/mock.sh index bae2fb15a..356d85eed 100644 --- a/test/mock.sh +++ b/test/mock.sh @@ -737,25 +737,77 @@ printf "Fixtures dir: %s\n" "${FIXTURES_DIR}" printf "Clouds: %s\n" "$CLOUDS" printf '\n' +# --- Run clouds in parallel --- +CLOUD_RESULTS_DIR="${TEST_DIR}/cloud_results" +mkdir -p "${CLOUD_RESULTS_DIR}" + +CLOUD_PIDS="" for cloud in $CLOUDS; do - printf '%b\n' "${CYAN}━━━ ${cloud} ━━━${NC}" + ( + # Isolated per-cloud state + CLOUD_TEST_DIR=$(mktemp -d) + MOCK_LOG="${CLOUD_TEST_DIR}/mock_calls.log" + CLOUD_PASSED=0 + CLOUD_FAILED=0 + CLOUD_SKIPPED=0 + + # Re-create mocks in per-cloud temp dir (curl/ssh/agents need own copies) + TEST_DIR="${CLOUD_TEST_DIR}" + setup_mock_curl + setup_mock_ssh + setup_mock_agents + + # Override counters used by assertions (they modify PASSED/FAILED/SKIPPED) + PASSED=0 + FAILED=0 + SKIPPED=0 + + printf '%b\n' "${CYAN}━━━ ${cloud} ━━━${NC}" + + if [[ -n "$FILTER_AGENT" ]]; then + AGENTS="$FILTER_AGENT" + else + AGENTS=$(discover_agents "$cloud") + fi - if [[ -n "$FILTER_AGENT" ]]; then - AGENTS="$FILTER_AGENT" - else - AGENTS=$(discover_agents "$cloud") - fi + if [[ -z "$AGENTS" ]]; then + printf '%b\n' " ${YELLOW}skip${NC} no agent scripts found in ${cloud}/" + SKIPPED=$((SKIPPED + 1)) + else + for agent in $AGENTS; do + run_test "$cloud" "$agent" + done + fi + printf '\n' - if [[ -z "$AGENTS" ]]; then - printf '%b\n' " ${YELLOW}skip${NC} no agent scripts found in ${cloud}/" - SKIPPED=$((SKIPPED + 1)) - continue + # Write counts to results file for aggregation + printf '%d %d %d\n' "$PASSED" "$FAILED" "$SKIPPED" > "${CLOUD_RESULTS_DIR}/${cloud}.counts" + + rm -rf "${CLOUD_TEST_DIR}" + ) > "${CLOUD_RESULTS_DIR}/${cloud}.log" 2>&1 & + CLOUD_PIDS="${CLOUD_PIDS} $!" +done + +# Wait for all clouds to finish +for pid in $CLOUD_PIDS; do + wait "$pid" 2>/dev/null || true +done + +# Print output from each cloud (in discovery order for consistent output) +for cloud in $CLOUDS; do + if [[ -f "${CLOUD_RESULTS_DIR}/${cloud}.log" ]]; then + cat "${CLOUD_RESULTS_DIR}/${cloud}.log" fi +done - for agent in $AGENTS; do - run_test "$cloud" "$agent" - done - printf '\n' +# Aggregate results from all clouds +for cloud in $CLOUDS; do + if [[ -f "${CLOUD_RESULTS_DIR}/${cloud}.counts" ]]; then + read -r p f s < "${CLOUD_RESULTS_DIR}/${cloud}.counts" + PASSED=$((PASSED + p)) + FAILED=$((FAILED + f)) + SKIPPED=$((SKIPPED + s)) + fi done # --- Summary --- diff --git a/test/record.sh b/test/record.sh index 4122bfc76..c33f78ce7 100644 --- a/test/record.sh +++ b/test/record.sh @@ -1051,10 +1051,46 @@ printf '\n' mkdir -p "$FIXTURES_DIR" +# --- Run clouds in parallel --- +RECORD_RESULTS_DIR=$(mktemp -d) +RECORD_PIDS="" + for cloud in $CLOUDS_TO_RECORD; do - record_cloud "$cloud" + ( + # Reset counters for this cloud (subshell isolation) + RECORDED=0 + SKIPPED=0 + ERRORS=0 + record_cloud "$cloud" + printf '%d %d %d\n' "$RECORDED" "$SKIPPED" "$ERRORS" > "${RECORD_RESULTS_DIR}/${cloud}.counts" + ) > "${RECORD_RESULTS_DIR}/${cloud}.log" 2>&1 & + RECORD_PIDS="${RECORD_PIDS} $!" +done + +# Wait for all clouds to finish +for pid in $RECORD_PIDS; do + wait "$pid" 2>/dev/null || true done +# Print output from each cloud (in order) +for cloud in $CLOUDS_TO_RECORD; do + if [[ -f "${RECORD_RESULTS_DIR}/${cloud}.log" ]]; then + cat "${RECORD_RESULTS_DIR}/${cloud}.log" + fi +done + +# Aggregate results +for cloud in $CLOUDS_TO_RECORD; do + if [[ -f "${RECORD_RESULTS_DIR}/${cloud}.counts" ]]; then + read -r r s e < "${RECORD_RESULTS_DIR}/${cloud}.counts" + RECORDED=$((RECORDED + r)) + SKIPPED=$((SKIPPED + s)) + ERRORS=$((ERRORS + e)) + fi +done + +rm -rf "${RECORD_RESULTS_DIR}" + # --- Summary --- printf '%b\n' "${CYAN}===============================${NC}" TOTAL=$((RECORDED + SKIPPED + ERRORS))