@@ -62,33 +62,29 @@ while [[ $# -gt 0 ]]; do
6262 esac
6363done
6464
65- # Determine what to test
65+ # Determine what to test (as tiers)
66+ TIERS_TO_RUN=()
67+
6668if [[ ${# PACKAGES[@]} -gt 0 ]]; then
67- TEST_PATHS=(" ${PACKAGES[@]} " )
69+ # Specific packages - run as single tier
70+ TIERS_TO_RUN+=(" ${PACKAGES[*]} " )
6871elif [[ -n " $TIER " ]]; then
72+ # Single tier
6973 case $TIER in
70- 1) read -ra TEST_PATHS <<< " $TIER1" ;;
71- 2) read -ra TEST_PATHS <<< " $TIER2" ;;
72- 3) read -ra TEST_PATHS <<< " $TIER3" ;;
74+ 1) TIERS_TO_RUN+=( " $TIER1 " ) ;;
75+ 2) TIERS_TO_RUN+=( " $TIER2 " ) ;;
76+ 3) TIERS_TO_RUN+=( " $TIER3 " ) ;;
7377 * ) echo " Invalid tier: $TIER " ; exit 1 ;;
7478 esac
7579else
76- # All tiers
77- read -ra T1 <<< " $TIER1"
78- read -ra T2 <<< " $TIER2"
79- read -ra T3 <<< " $TIER3"
80- TEST_PATHS=(" ${T1[@]} " " ${T2[@]} " " ${T3[@]} " )
80+ # All tiers - run sequentially
81+ TIERS_TO_RUN+=(" $TIER1 " )
82+ TIERS_TO_RUN+=(" $TIER2 " )
83+ TIERS_TO_RUN+=(" $TIER3 " )
8184fi
8285
83- # Filter out excluded packages
84- FILTERED_PATHS=()
85- for path in " ${TEST_PATHS[@]} " ; do
86- if ! is_excluded " $path " ; then
87- FILTERED_PATHS+=(" $path " )
88- fi
89- done
90- TEST_PATHS=(" ${FILTERED_PATHS[@]} " )
91-
86+ # Clean and recreate logs directory
87+ rm -rf " $LOGS_DIR "
9288mkdir -p " $LOGS_DIR "
9389
9490# Test a single package (runs in subshell)
@@ -105,81 +101,168 @@ test_package() {
105101 # Clear log file
106102 > " $log "
107103
108- echo " === Testing $name ===" | tee -a " $log "
104+ echo " 🏁 Starting $name "
105+ echo " === Testing $name ===" >> " $log "
109106
110107 # Build first if needed
111108 if is_type " $dir " " $BUILD_FIRST " && [[ -f " build.sh" ]]; then
112- ./build.sh 2>&1 | tee -a " $log " || { echo " FAIL $name (build)" ; return 1; }
109+ ./build.sh >> " $log " 2>&1 || { echo " ⛔️ Failed $name (build)" ; return 1; }
113110 fi
114111
115112 # Install npm deps if needed
116- [[ -f " package.json" ]] && npm install --verbose 2>&1 | tee -a " $log "
113+ [[ -f " package.json" ]] && npm install --silent >> " $log " 2>&1
117114
118115 local coverage=" "
119116
120117 if is_type " $dir " " $NPM_PACKAGES " ; then
121- npm test 2>&1 | tee -a " $log " || { echo " FAIL $name " ; return 1; }
118+ npm test >> " $log " 2>&1 || { echo " ⛔️ Failed $name " ; return 1; }
122119 elif is_type " $dir " " $NODE_INTEROP_PACKAGES " ; then
123120 # Node interop packages: use coverage CLI like NODE_PACKAGES
124- dart run " $COVERAGE_CLI " 2>&1 | tee -a " $log " || { echo " FAIL $name " ; return 1; }
121+ dart run " $COVERAGE_CLI " >> " $log " 2>&1 || { echo " ⛔️ Failed $name " ; return 1; }
125122 coverage=$( calc_coverage " coverage/lcov.info" )
126123 elif is_type " $dir " " $NODE_PACKAGES " ; then
127- dart run " $COVERAGE_CLI " 2>&1 | tee -a " $log " || { echo " FAIL $name " ; return 1; }
124+ dart run " $COVERAGE_CLI " >> " $log " 2>&1 || { echo " ⛔️ Failed $name " ; return 1; }
128125 coverage=$( calc_coverage " coverage/lcov.info" )
129126 elif is_type " $dir " " $BROWSER_PACKAGES " ; then
130127 # Browser packages: run Chrome tests, check coverage if lcov.info exists
131- dart test -p chrome --reporter expanded --fail-fast 2>&1 | tee -a " $log " || { echo " FAIL $name " ; return 1; }
128+ dart test -p chrome --reporter expanded --fail-fast >> " $log " 2>&1 || { echo " ⛔️ Failed $name " ; return 1; }
132129 [[ -f " coverage/lcov.info" ]] && coverage=$( calc_coverage " coverage/lcov.info" )
133130 else
134131 # Standard VM package with coverage
135- dart test --coverage=coverage --reporter expanded --fail-fast 2>&1 | tee -a " $log " || { echo " FAIL $name " ; return 1; }
136- dart pub global run coverage:format_coverage --lcov --in=coverage --out=coverage/lcov.info --report-on=lib 2>&1 | tee -a " $log "
132+ dart test --coverage=coverage --reporter expanded --fail-fast >> " $log " 2>&1 || { echo " ⛔️ Failed $name " ; return 1; }
133+ dart pub global run coverage:format_coverage --lcov --in=coverage --out=coverage/lcov.info --report-on=lib >> " $log " 2>&1
137134 coverage=$( calc_coverage " coverage/lcov.info" )
138135 fi
139136
140137 # Check coverage threshold if applicable
141138 if [[ -n " $coverage " ]]; then
142139 if [[ " $coverage " == " 0" ]] || (( $(echo "$coverage < $MIN_COVERAGE " | bc - l) )) ; then
143- echo " FAIL $name (coverage ${coverage} % < ${MIN_COVERAGE} %)"
140+ echo " ⛔️ Failed $name (coverage ${coverage} % < ${MIN_COVERAGE} %)"
144141 return 1
145142 fi
146- echo " PASS $name (${coverage} %)"
143+ echo " ✅ Succeeded $name (${coverage} %)"
147144 else
148- echo " PASS $name "
145+ echo " ✅ Succeeded $name "
149146 fi
150147 return 0
151148}
152149
153- # Run tests in parallel
154- run_parallel () {
150+ # Extract failure summary from a log file
151+ extract_failure () {
152+ local log=" $1 "
153+ local name=" $2 "
154+
155+ # Look for "Failed to load" or "Failed to run" errors
156+ if grep -q " Failed to load\|Failed to run\|Some tests failed" " $log " ; then
157+ echo " "
158+ echo " ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
159+ echo " FAILURE: $name "
160+ echo " ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
161+
162+ # Extract failed test file names
163+ grep " Failed to load\|Failed to run" " $log " | head -5 | while IFS= read -r line; do
164+ if [[ " $line " =~ Failed\ to\ load\ \" ([^\" ]+)\" ]]; then
165+ echo " Test: ${BASH_REMATCH[1]} "
166+ fi
167+ done
168+
169+ # Extract first error message
170+ echo " "
171+ echo " Error:"
172+ grep -A 1 " Failed to load\|Failed to run" " $log " | head -3 | sed ' s/^/ /'
173+ echo " "
174+ echo " Full log: $log "
175+ echo " ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
176+ fi
177+ }
178+
179+ # Run a tier of tests in parallel (wait for all, don't kill on failure)
180+ run_tier () {
181+ local tier_paths=(" $@ " )
155182 local pids=()
183+ local failed_packages=()
184+
185+ # Filter out excluded packages
186+ local filtered=()
187+ for path in " ${tier_paths[@]} " ; do
188+ if ! is_excluded " $path " ; then
189+ filtered+=(" $path " )
190+ fi
191+ done
156192
157- for dir in " ${TEST_PATHS[@]} " ; do
193+ [[ ${# filtered[@]} -eq 0 ]] && return 0
194+
195+ # Start all tests in parallel
196+ for dir in " ${filtered[@]} " ; do
158197 test_package " $dir " &
159198 pids+=($! )
160199 done
161200
162- # Wait for all and fail if any failed
163- local failed=0
164- for pid in " ${pids[@]} " ; do
165- wait " $pid " || failed=1
201+ # Wait for ALL jobs to complete, track failures
202+ for i in " ${! pids[@]} " ; do
203+ if ! wait " ${pids[$i]} " ; then
204+ failed_packages+=(" ${filtered[$i]} " )
205+ fi
166206 done
167207
168- return $failed
208+ # Report failures with details
209+ if [[ ${# failed_packages[@]} -gt 0 ]]; then
210+ echo " "
211+ echo " ╔════════════════════════════════════════════════════════════════╗"
212+ echo " ║ ${# failed_packages[@]} PACKAGE(S) FAILED"
213+ echo " ╚════════════════════════════════════════════════════════════════╝"
214+
215+ for dir in " ${failed_packages[@]} " ; do
216+ local name=$( basename " $dir " )
217+ local log=" $LOGS_DIR /$name .log"
218+ extract_failure " $log " " $name "
219+ done
220+
221+ return 1
222+ fi
223+
224+ return 0
169225}
170226
171227# Main
172- echo " Testing ${# TEST_PATHS [@]} packages (MIN_COVERAGE=${MIN_COVERAGE} %)"
228+ echo " Running ${# TIERS_TO_RUN [@]} tier(s) (MIN_COVERAGE=${MIN_COVERAGE} %)"
173229echo " Excluded: $EXCLUDED "
174230echo " Logs: $LOGS_DIR /"
175231echo " "
176232
177- if run_parallel; then
178- echo " "
179- echo " All tests passed"
180- exit 0
233+ # Determine actual tier number for display
234+ if [[ -n " $TIER " ]]; then
235+ TIER_LABEL=" TIER $TIER "
236+ elif [[ ${# PACKAGES[@]} -gt 0 ]]; then
237+ TIER_LABEL=" CUSTOM"
181238else
182- echo " "
183- echo " Tests failed"
184- exit 1
239+ TIER_LABEL=" ALL TIERS"
185240fi
241+
242+ tier_num=1
243+ for tier_spec in " ${TIERS_TO_RUN[@]} " ; do
244+ read -ra tier_paths <<< " $tier_spec"
245+
246+ # Display label
247+ if [[ " $TIER_LABEL " == " ALL TIERS" ]]; then
248+ echo " === TIER $tier_num : ${# tier_paths[@]} packages ==="
249+ else
250+ echo " === $TIER_LABEL : ${# tier_paths[@]} packages ==="
251+ fi
252+
253+ if ! run_tier " ${tier_paths[@]} " ; then
254+ echo " "
255+ if [[ " $TIER_LABEL " == " ALL TIERS" ]]; then
256+ echo " TIER $tier_num FAILED - stopping"
257+ else
258+ echo " $TIER_LABEL FAILED"
259+ fi
260+ exit 1
261+ fi
262+
263+ echo " "
264+ (( tier_num++ ))
265+ done
266+
267+ echo " All tests passed"
268+ exit 0
0 commit comments