blob: d03c5a22627974c3ef4a4eeb5c049bd3e1253f8b [file] [log] [blame]
Manuel Pégourié-Gonnardfb2ed582022-07-21 11:04:52 +02001#!/bin/sh
2
Manuel Pégourié-Gonnard222bc852022-12-29 13:47:25 +01003# This script runs tests before and after a PR and analyzes the results in
4# order to highlight any difference in the set of tests skipped.
Manuel Pégourié-Gonnardfca4dc62022-07-26 10:10:07 +02005#
Manuel Pégourié-Gonnard222bc852022-12-29 13:47:25 +01006# It can be used to check the first testing criterion mentioned in strategy.md,
Manuel Pégourié-Gonnardfca4dc62022-07-26 10:10:07 +02007# end of section "Supporting builds with drivers without the software
Manuel Pégourié-Gonnard222bc852022-12-29 13:47:25 +01008# implementation", namely: the sets of tests skipped in the default config and
9# the full config must be the same before and after the PR.
Manuel Pégourié-Gonnardfca4dc62022-07-26 10:10:07 +020010#
Manuel Pégourié-Gonnard6bbeba62022-12-29 14:02:05 +010011# USAGE:
12# - First, commit any uncommited changes. (Also, see warning below.)
Manuel Pégourié-Gonnard5a2e0262023-01-23 12:51:52 +010013# - Then launch --> [SKIP_SSL_OPT=1] docs/architecture/psa-migration/outcome-analysis.sh
14# - SKIP_SSL_OPT=1 can optionally be set to skip ssl-opt.sh tests
Manuel Pégourié-Gonnard6bbeba62022-12-29 14:02:05 +010015#
Manuel Pégourié-Gonnardfca4dc62022-07-26 10:10:07 +020016# WARNING: this script checks out a commit other than the head of the current
Manuel Pégourié-Gonnard68429fc2022-07-27 20:37:12 +020017# branch; it checks out the current branch again when running successfully,
Manuel Pégourié-Gonnardfca4dc62022-07-26 10:10:07 +020018# but while the script is running, or if it terminates early in error, you
Manuel Pégourié-Gonnard68429fc2022-07-27 20:37:12 +020019# should be aware that you might be at a different commit than expected.
Manuel Pégourié-Gonnardfca4dc62022-07-26 10:10:07 +020020#
Manuel Pégourié-Gonnard222bc852022-12-29 13:47:25 +010021# NOTE: you can comment out parts that don't need to be re-done when
Manuel Pégourié-Gonnardfb2ed582022-07-21 11:04:52 +020022# re-running this script (for example "get numbers before this PR").
23
Manuel Pégourié-Gonnardfb2ed582022-07-21 11:04:52 +020024set -eu
25
Manuel Pégourié-Gonnard6bbeba62022-12-29 14:02:05 +010026: ${SKIP_SSL_OPT:=0}
27
Manuel Pégourié-Gonnardfb2ed582022-07-21 11:04:52 +020028cleanup() {
29 make clean
30 git checkout -- include/mbedtls/mbedtls_config.h include/psa/crypto_config.h
31}
32
33record() {
34 export MBEDTLS_TEST_OUTCOME_FILE="$PWD/outcome-$1.csv"
35 rm -f $MBEDTLS_TEST_OUTCOME_FILE
Manuel Pégourié-Gonnard6bbeba62022-12-29 14:02:05 +010036
Manuel Pégourié-Gonnardfb2ed582022-07-21 11:04:52 +020037 make check
Manuel Pégourié-Gonnard6bbeba62022-12-29 14:02:05 +010038
39 if [ $SKIP_SSL_OPT -eq 0 ]; then
40 make -C programs ssl/ssl_server2 ssl/ssl_client2 \
41 test/udp_proxy test/query_compile_time_config
42 tests/ssl-opt.sh
43 fi
Manuel Pégourié-Gonnardfb2ed582022-07-21 11:04:52 +020044}
45
Valerio Setticcb03442023-07-31 15:07:49 +020046# save current HEAD.
47# Note: unfortunately "git branch --show-current" was added only in GIT
48# version 2.22.
49GIT_VERSION="$(git --version | sed 's/git version //')"
50if dpkg --compare-versions "$GIT_VERSION" "gt" "2.22.0"; then
51 HEAD=$(git branch --show-current)
52else
53 HEAD=$(git rev-parse --abbrev-ref HEAD)
54fi
Manuel Pégourié-Gonnardfb2ed582022-07-21 11:04:52 +020055
Przemek Stekiel93986642022-11-09 15:06:44 +010056# get the numbers before this PR for default and full
Manuel Pégourié-Gonnardfb2ed582022-07-21 11:04:52 +020057cleanup
Przemek Stekiel93986642022-11-09 15:06:44 +010058git checkout $(git merge-base HEAD development)
Manuel Pégourié-Gonnard6bbeba62022-12-29 14:02:05 +010059
Przemek Stekiel93986642022-11-09 15:06:44 +010060record "before-default"
Manuel Pégourié-Gonnardfb2ed582022-07-21 11:04:52 +020061
62cleanup
Manuel Pégourié-Gonnard6bbeba62022-12-29 14:02:05 +010063
Przemek Stekiel93986642022-11-09 15:06:44 +010064scripts/config.py full
65record "before-full"
66
67# get the numbers now for default and full
68cleanup
69git checkout $HEAD
Manuel Pégourié-Gonnard6bbeba62022-12-29 14:02:05 +010070
Przemek Stekiel93986642022-11-09 15:06:44 +010071record "after-default"
72
73cleanup
Manuel Pégourié-Gonnard6bbeba62022-12-29 14:02:05 +010074
Przemek Stekiel93986642022-11-09 15:06:44 +010075scripts/config.py full
76record "after-full"
77
Manuel Pégourié-Gonnard6bbeba62022-12-29 14:02:05 +010078cleanup
79
Manuel Pégourié-Gonnardfb2ed582022-07-21 11:04:52 +020080# analysis
81
Manuel Pégourié-Gonnard2bb2f152022-10-12 10:57:31 +020082populate_suites () {
83 SUITES=''
84 make generated_files >/dev/null
85 data_files=$(cd tests/suites && echo *.data)
86 for data in $data_files; do
Manuel Pégourié-Gonnard6bbeba62022-12-29 14:02:05 +010087 suite=${data%.data}
Manuel Pégourié-Gonnard222bc852022-12-29 13:47:25 +010088 SUITES="$SUITES $suite"
Manuel Pégourié-Gonnard2bb2f152022-10-12 10:57:31 +020089 done
90 make neat
Manuel Pégourié-Gonnard6bbeba62022-12-29 14:02:05 +010091
92 if [ $SKIP_SSL_OPT -eq 0 ]; then
93 SUITES="$SUITES ssl-opt"
94 extra_files=$(cd tests/opt-testcases && echo *.sh)
95 for extra in $extra_files; do
96 suite=${extra%.sh}
97 SUITES="$SUITES $suite"
98 done
99 fi
Manuel Pégourié-Gonnard2bb2f152022-10-12 10:57:31 +0200100}
101
Manuel Pégourié-Gonnardfb2ed582022-07-21 11:04:52 +0200102compare_suite () {
103 ref="outcome-$1.csv"
104 new="outcome-$2.csv"
105 suite="$3"
106
Manuel Pégourié-Gonnard6bbeba62022-12-29 14:02:05 +0100107 pattern_suite=";$suite;"
Manuel Pégourié-Gonnardfb2ed582022-07-21 11:04:52 +0200108 total=$(grep -c "$pattern_suite" "$ref")
109 sed_cmd="s/^.*$pattern_suite\(.*\);SKIP.*/\1/p"
110 sed -n "$sed_cmd" "$ref" > skipped-ref
111 sed -n "$sed_cmd" "$new" > skipped-new
112 nb_ref=$(wc -l <skipped-ref)
113 nb_new=$(wc -l <skipped-new)
114
Manuel Pégourié-Gonnard6bbeba62022-12-29 14:02:05 +0100115 name=${suite#test_suite_}
116 printf "%40s: total %4d; skipped %4d -> %4d\n" \
117 $name $total $nb_ref $nb_new
Manuel Pégourié-Gonnard2bb2f152022-10-12 10:57:31 +0200118 if diff skipped-ref skipped-new | grep '^> '; then
119 ret=1
120 else
121 ret=0
122 fi
Manuel Pégourié-Gonnardfb2ed582022-07-21 11:04:52 +0200123 rm skipped-ref skipped-new
Manuel Pégourié-Gonnard2bb2f152022-10-12 10:57:31 +0200124 return $ret
Manuel Pégourié-Gonnardfb2ed582022-07-21 11:04:52 +0200125}
126
127compare_builds () {
128 printf "\n*** Comparing $1 -> $2 ***\n"
Manuel Pégourié-Gonnard2bb2f152022-10-12 10:57:31 +0200129 failed=''
Manuel Pégourié-Gonnardfb2ed582022-07-21 11:04:52 +0200130 for suite in $SUITES; do
Manuel Pégourié-Gonnard2bb2f152022-10-12 10:57:31 +0200131 if compare_suite "$1" "$2" "$suite"; then :; else
132 failed="$failed $suite"
133 fi
Manuel Pégourié-Gonnardfb2ed582022-07-21 11:04:52 +0200134 done
Manuel Pégourié-Gonnardb51051f2022-10-18 09:42:30 +0200135 if [ -z "$failed" ]; then
136 printf "No coverage gap found.\n"
137 else
138 printf "Suites with less coverage:%s\n" "$failed"
139 fi
Manuel Pégourié-Gonnardfb2ed582022-07-21 11:04:52 +0200140}
141
Manuel Pégourié-Gonnard2bb2f152022-10-12 10:57:31 +0200142populate_suites
Przemek Stekiel93986642022-11-09 15:06:44 +0100143compare_builds before-default after-default
144compare_builds before-full after-full