Add script to diff test results between changes
Merge of http://go/wvgerrit/74965 It isn't always obvious which changes introduced test failures or fixes, and similarly, it's unideal to have to manually run the tests for HEAD and with a new change to determine the test diff, so this script runs it for the last n changes, and diffs the test results by comparing the test runs. It doesn't handle flaky tests, partly because I don't think it can. Change-Id: I5380abcb2f5bcadf172dba3c1270e4258e0c8a82
This commit is contained in:
92
libwvdrmengine/diff_changes.sh
Executable file
92
libwvdrmengine/diff_changes.sh
Executable file
@@ -0,0 +1,92 @@
|
||||
#!/bin/bash
|
||||
|
||||
set -e
|
||||
|
||||
log_dir="${PWD}/diff_change_logs"
|
||||
rm -rf "${log_dir}"
|
||||
mkdir "${log_dir}"
|
||||
|
||||
EXECUTABLE=""
|
||||
EXEC_ARGS=""
|
||||
NUM_CHANGES=-1
|
||||
while getopts "e:a:n:" opt; do
|
||||
case "${opt}" in
|
||||
e)
|
||||
EXECUTABLE="${OPTARG}"
|
||||
;;
|
||||
a)
|
||||
EXEC_ARGS="${OPTARG}"
|
||||
;;
|
||||
n)
|
||||
NUM_CHANGES=${OPTARG}
|
||||
;;
|
||||
\?)
|
||||
echo "Usage: diff_changes.sh -e<build_and_test_executable> -a\"<executable_args>\" -n<number_of_changes>"
|
||||
exit 1;
|
||||
;;
|
||||
esac
|
||||
done
|
||||
|
||||
if [ ! "${EXECUTABLE}" ] || [ "${NUM_CHANGES}" -lt 0 ]; then
|
||||
echo "EXECUTABLE cannot be empty and NUM_CHANGES must be >= 0"
|
||||
exit 1;
|
||||
else
|
||||
EXECUTABLE="./${EXECUTABLE}"
|
||||
fi
|
||||
|
||||
# We search for test cases by searching for lines that start with the RUN header
|
||||
# and FAILED or OK footers. Note that we capture the test name to make sure the
|
||||
# header and footer refer to the same test. We also exclude the header from
|
||||
# showing up again so we only match single tests.
|
||||
header="\[ RUN \]"
|
||||
footer="(\[ FAILED \]|\[ OK \])"
|
||||
test_regex="/(${header} ([\S]+)((?!${header})[\s\S])+${footer} \2) \([0-9]+ ms\)/g"
|
||||
|
||||
while [ "${NUM_CHANGES}" -ge 0 ]; do
|
||||
current_change="HEAD"
|
||||
for i in $(seq 1 "${NUM_CHANGES}"); do
|
||||
current_change="${current_change}^"
|
||||
done
|
||||
git checkout "${current_change}" >/dev/null
|
||||
sha=$(git rev-parse HEAD)
|
||||
run_exec="${EXECUTABLE} ${EXEC_ARGS}"
|
||||
run_success=true
|
||||
# Restore HEAD regardless if executable ran.
|
||||
{
|
||||
$run_exec |& tee "${log_dir}/build_and_test_results_${sha}.txt"
|
||||
} || {
|
||||
run_success=false
|
||||
}
|
||||
if [ "${current_change}" != "HEAD" ]; then
|
||||
git checkout 'HEAD@{1}' >/dev/null
|
||||
fi
|
||||
if [ "${run_success}" = false ]; then
|
||||
exit 1
|
||||
fi
|
||||
NUM_CHANGES=$((NUM_CHANGES - 1))
|
||||
done
|
||||
|
||||
# Compute diffs of test results oldest first.
|
||||
file_list=$(find "${log_dir}" -type f -print0 | xargs -0 ls -tr)
|
||||
file_arr=($file_list)
|
||||
last_index=$((${#file_arr[@]} - 1));
|
||||
|
||||
for current_index in "${!file_arr[@]}"; do
|
||||
if [ "${current_index}" -lt "${last_index}" ]; then
|
||||
next_index=$((current_index + 1))
|
||||
first_sha=$(echo "${file_arr[current_index]}" | \
|
||||
sed 's/.*build_and_test_results_\(.\+\).txt$/\1/')
|
||||
second_sha=$(echo "${file_arr[next_index]}" | \
|
||||
sed 's/.*build_and_test_results_\(.\+\).txt$/\1/')
|
||||
output_diff="${log_dir}/test_diff_between_${second_sha}_and_${first_sha}"
|
||||
perl_exec="perl -0777 -e \
|
||||
'open FILE, \$ARGV[0]; while (<FILE>) { \$file_text .= \$_; } \
|
||||
while (\$file_text =~ ${test_regex}) { \
|
||||
print \"\$1\n\"; \
|
||||
}'"
|
||||
first_test_results=$(eval "${perl_exec} ${file_arr[current_index]}")
|
||||
second_test_results=$(eval "${perl_exec} ${file_arr[next_index]}")
|
||||
diff <(echo "${first_test_results}") <(echo "${second_test_results}") \
|
||||
&> "${output_diff}"
|
||||
fi
|
||||
done
|
||||
Reference in New Issue
Block a user