#!/bin/awk -f # # Merge multiple ZTS tests results summaries into a single summary. This is # needed when you're running different parts of ZTS on different tests # runners or VMs. # # Usage: # # ./merge_summary.awk summary1.txt [summary2.txt] [summary3.txt] ... # # or: # # cat summary*.txt | ./merge_summary.awk # BEGIN { i=-1 pass=0 fail=0 skip=0 state="" cl=0 el=0 upl=0 ul=0 # Total seconds of tests runtime total=0; } # Skip empty lines /^\s*$/{next} # Skip Configuration and Test lines /^Test:/{state=""; next} /Configuration/{state="";next} # When we see "test-runner.py" stop saving config lines, and # save test runner lines /test-runner.py/{state="testrunner"; runner=runner$0"\n"; next} # We need to differentiate the PASS counts from test result lines that start # with PASS, like: # # PASS mv_files/setup # # Use state="pass_count" to differentiate # /Results Summary/{state="pass_count"; next} /PASS/{ if (state=="pass_count") {pass += $2}} /FAIL/{ if (state=="pass_count") {fail += $2}} /SKIP/{ if (state=="pass_count") {skip += $2}} /Running Time/{ state=""; running[i]=$3; split($3, arr, ":") total += arr[1] * 60 * 60; total += arr[2] * 60; total += arr[3] next; } /Tests with results other than PASS that are expected/{state="expected_lines"; next} /Tests with result of PASS that are unexpected/{state="unexpected_pass_lines"; next} /Tests with results other than PASS that are unexpected/{state="unexpected_lines"; next} { if (state == "expected_lines") { expected_lines[el] = $0 el++ } if (state == "unexpected_pass_lines") { unexpected_pass_lines[upl] = $0 upl++ } if (state == "unexpected_lines") { unexpected_lines[ul] = $0 ul++ } } # Reproduce summary END { print runner; print "\nResults Summary" print "PASS\t"pass print "FAIL\t"fail print "SKIP\t"skip print "" print "Running Time:\t"strftime("%T", total, 1) if (pass+fail+skip > 0) { percent_passed=(pass/(pass+fail+skip) * 100) } printf "Percent passed:\t%3.2f%", percent_passed print "\n\nTests with results other than PASS that are expected:" asort(expected_lines, sorted) for (j in sorted) print sorted[j] print "\n\nTests with result of PASS that are unexpected:" asort(unexpected_pass_lines, sorted) for (j in sorted) print sorted[j] print "\n\nTests with results other than PASS that are unexpected:" asort(unexpected_lines, sorted) for (j in sorted) print sorted[j] }