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))