Bash · 3987 bytes Raw Blame History
1 #!/bin/sh
2 # =====================================
3 # Fortsh Integration Test Runner
4 # =====================================
5 # Runs all integration test suites and aggregates results.
6 # Can be called standalone or from the main run_all_tests.sh
7
8 # Portable timeout: macOS lacks GNU timeout
9 if command -v timeout >/dev/null 2>&1; then
10 run_with_timeout() { timeout "$@"; }
11 elif command -v gtimeout >/dev/null 2>&1; then
12 run_with_timeout() { gtimeout "$@"; }
13 else
14 run_with_timeout() {
15 _rwt_secs="$1"; shift
16 _rwt_tmp=$(mktemp /tmp/fortsh_timeout.XXXXXX)
17 ( "$@" ) > "$_rwt_tmp" 2>&1 &
18 _rwt_pid=$!
19 ( sleep "$_rwt_secs"; kill "$_rwt_pid" 2>/dev/null ) &
20 _rwt_wd=$!
21 wait "$_rwt_pid" 2>/dev/null
22 _rwt_rc=$?
23 kill "$_rwt_wd" 2>/dev/null
24 wait "$_rwt_wd" 2>/dev/null
25 cat "$_rwt_tmp"
26 rm -f "$_rwt_tmp"
27 return $_rwt_rc
28 }
29 fi
30
31 RED='\033[0;31m'
32 GREEN='\033[0;32m'
33 YELLOW='\033[1;33m'
34 BLUE='\033[0;34m'
35 CYAN='\033[0;36m'
36 BOLD='\033[1m'
37 NC='\033[0m'
38
39 VERBOSE=0
40 for arg in "$@"; do
41 case "$arg" in
42 -v|--verbose) VERBOSE=1 ;;
43 esac
44 done
45
46 SCRIPT_DIR=$(cd "$(dirname "$0")" && pwd)
47 FORTSH_BIN="${FORTSH_BIN:-$SCRIPT_DIR/../../../bin/fortsh}"
48 export FORTSH_BIN
49
50 if [ ! -x "$FORTSH_BIN" ]; then
51 printf "${RED}ERROR${NC}: fortsh binary not found at %s\n" "$FORTSH_BIN"
52 printf "Please run 'make' first or set FORTSH_BIN environment variable\n"
53 exit 1
54 fi
55
56 TOTAL_PASSED=0
57 TOTAL_FAILED=0
58 TOTAL_SKIPPED=0
59 SUITES_PASSED=0
60 SUITES_FAILED=0
61 FAILED_SUITES=""
62
63 for test_file in "$SCRIPT_DIR"/test_int_*.sh; do
64 [ ! -x "$test_file" ] && continue
65 suite_name=$(basename "$test_file")
66
67 if [ "$VERBOSE" -eq 1 ]; then
68 printf "\n${CYAN}── %s ──${NC}\n" "$suite_name"
69 output=$(run_with_timeout 120 "$test_file" 2>&1)
70 exit_code=$?
71 echo "$output"
72 else
73 output=$(run_with_timeout 120 "$test_file" 2>&1)
74 exit_code=$?
75 fi
76
77 # Strip ANSI codes for parsing
78 clean=$(echo "$output" | sed 's/\x1b\[[0-9;]*m//g')
79 passed=$(echo "$clean" | grep -i "^Passed:" | tail -1 | awk '{print $2}')
80 failed=$(echo "$clean" | grep -i "^Failed:" | tail -1 | awk '{print $2}')
81 skipped=$(echo "$clean" | grep -i "^Skipped:" | tail -1 | awk '{print $2}')
82
83 passed=${passed:-0}
84 failed=${failed:-0}
85 skipped=${skipped:-0}
86
87 TOTAL_PASSED=$((TOTAL_PASSED + passed))
88 TOTAL_FAILED=$((TOTAL_FAILED + failed))
89 TOTAL_SKIPPED=$((TOTAL_SKIPPED + skipped))
90
91 if [ "$exit_code" -eq 0 ]; then
92 printf "${GREEN}${NC} %-35s ${GREEN}%d passed${NC}" "$suite_name" "$passed"
93 [ "$skipped" -gt 0 ] && printf " ${YELLOW}%d skipped${NC}" "$skipped"
94 printf "\n"
95 SUITES_PASSED=$((SUITES_PASSED + 1))
96 else
97 printf "${RED}${NC} %-35s ${GREEN}%d passed${NC} ${RED}%d failed${NC}" "$suite_name" "$passed" "$failed"
98 [ "$skipped" -gt 0 ] && printf " ${YELLOW}%d skipped${NC}" "$skipped"
99 printf "\n"
100 SUITES_FAILED=$((SUITES_FAILED + 1))
101 FAILED_SUITES="${FAILED_SUITES} - ${suite_name}\n"
102 fi
103 done
104
105 printf "\n==========================================\n"
106 printf "INTEGRATION TEST RESULTS\n"
107 printf "==========================================\n"
108 printf "Passed: %d\n" "$TOTAL_PASSED"
109 printf "Failed: %d\n" "$TOTAL_FAILED"
110 printf "Skipped: %d\n" "$TOTAL_SKIPPED"
111 printf "Total: %d\n" "$((TOTAL_PASSED + TOTAL_FAILED + TOTAL_SKIPPED))"
112 printf "==========================================\n"
113
114 if [ $((TOTAL_PASSED + TOTAL_FAILED)) -gt 0 ]; then
115 PASS_RATE=$((TOTAL_PASSED * 100 / (TOTAL_PASSED + TOTAL_FAILED)))
116 printf "Pass rate: %d%%\n" "$PASS_RATE"
117 fi
118
119 if [ "$SUITES_FAILED" -gt 0 ]; then
120 printf "\n${RED}Failed suites:${NC}\n"
121 printf "%b" "$FAILED_SUITES"
122 printf "==========================================\n"
123 fi
124
125 if [ "$TOTAL_FAILED" -eq 0 ]; then
126 printf "ALL INTEGRATION TESTS PASSED!\n"
127 exit 0
128 else
129 exit 1
130 fi