1*62c56f98SSadaf Ebrahimi#!/bin/sh 2*62c56f98SSadaf Ebrahimi 3*62c56f98SSadaf Ebrahimi# This script runs tests before and after a PR and analyzes the results in 4*62c56f98SSadaf Ebrahimi# order to highlight any difference in the set of tests skipped. 5*62c56f98SSadaf Ebrahimi# 6*62c56f98SSadaf Ebrahimi# It can be used to check the first testing criterion mentioned in strategy.md, 7*62c56f98SSadaf Ebrahimi# end of section "Supporting builds with drivers without the software 8*62c56f98SSadaf Ebrahimi# implementation", namely: the sets of tests skipped in the default config and 9*62c56f98SSadaf Ebrahimi# the full config must be the same before and after the PR. 10*62c56f98SSadaf Ebrahimi# 11*62c56f98SSadaf Ebrahimi# USAGE: 12*62c56f98SSadaf Ebrahimi# - First, commit any uncommited changes. (Also, see warning below.) 13*62c56f98SSadaf Ebrahimi# - Then launch --> [SKIP_SSL_OPT=1] docs/architecture/psa-migration/outcome-analysis.sh 14*62c56f98SSadaf Ebrahimi# - SKIP_SSL_OPT=1 can optionally be set to skip ssl-opt.sh tests 15*62c56f98SSadaf Ebrahimi# 16*62c56f98SSadaf Ebrahimi# WARNING: this script checks out a commit other than the head of the current 17*62c56f98SSadaf Ebrahimi# branch; it checks out the current branch again when running successfully, 18*62c56f98SSadaf Ebrahimi# but while the script is running, or if it terminates early in error, you 19*62c56f98SSadaf Ebrahimi# should be aware that you might be at a different commit than expected. 20*62c56f98SSadaf Ebrahimi# 21*62c56f98SSadaf Ebrahimi# NOTE: you can comment out parts that don't need to be re-done when 22*62c56f98SSadaf Ebrahimi# re-running this script (for example "get numbers before this PR"). 23*62c56f98SSadaf Ebrahimi 24*62c56f98SSadaf Ebrahimiset -eu 25*62c56f98SSadaf Ebrahimi 26*62c56f98SSadaf Ebrahimi: ${SKIP_SSL_OPT:=0} 27*62c56f98SSadaf Ebrahimi 28*62c56f98SSadaf Ebrahimicleanup() { 29*62c56f98SSadaf Ebrahimi make clean 30*62c56f98SSadaf Ebrahimi git checkout -- include/mbedtls/mbedtls_config.h include/psa/crypto_config.h 31*62c56f98SSadaf Ebrahimi} 32*62c56f98SSadaf Ebrahimi 33*62c56f98SSadaf Ebrahimirecord() { 34*62c56f98SSadaf Ebrahimi export MBEDTLS_TEST_OUTCOME_FILE="$PWD/outcome-$1.csv" 35*62c56f98SSadaf Ebrahimi rm -f $MBEDTLS_TEST_OUTCOME_FILE 36*62c56f98SSadaf Ebrahimi 37*62c56f98SSadaf Ebrahimi make check 38*62c56f98SSadaf Ebrahimi 39*62c56f98SSadaf Ebrahimi if [ $SKIP_SSL_OPT -eq 0 ]; then 40*62c56f98SSadaf Ebrahimi make -C programs ssl/ssl_server2 ssl/ssl_client2 \ 41*62c56f98SSadaf Ebrahimi test/udp_proxy test/query_compile_time_config 42*62c56f98SSadaf Ebrahimi tests/ssl-opt.sh 43*62c56f98SSadaf Ebrahimi fi 44*62c56f98SSadaf Ebrahimi} 45*62c56f98SSadaf Ebrahimi 46*62c56f98SSadaf Ebrahimi# save current HEAD. 47*62c56f98SSadaf Ebrahimi# Note: this can optionally be updated to 48*62c56f98SSadaf Ebrahimi# HEAD=$(git branch --show-current) 49*62c56f98SSadaf Ebrahimi# when using a Git version above 2.22 50*62c56f98SSadaf EbrahimiHEAD=$(git rev-parse --abbrev-ref HEAD) 51*62c56f98SSadaf Ebrahimi 52*62c56f98SSadaf Ebrahimi# get the numbers before this PR for default and full 53*62c56f98SSadaf Ebrahimicleanup 54*62c56f98SSadaf Ebrahimigit checkout $(git merge-base HEAD development) 55*62c56f98SSadaf Ebrahimi 56*62c56f98SSadaf Ebrahimirecord "before-default" 57*62c56f98SSadaf Ebrahimi 58*62c56f98SSadaf Ebrahimicleanup 59*62c56f98SSadaf Ebrahimi 60*62c56f98SSadaf Ebrahimiscripts/config.py full 61*62c56f98SSadaf Ebrahimirecord "before-full" 62*62c56f98SSadaf Ebrahimi 63*62c56f98SSadaf Ebrahimi# get the numbers now for default and full 64*62c56f98SSadaf Ebrahimicleanup 65*62c56f98SSadaf Ebrahimigit checkout $HEAD 66*62c56f98SSadaf Ebrahimi 67*62c56f98SSadaf Ebrahimirecord "after-default" 68*62c56f98SSadaf Ebrahimi 69*62c56f98SSadaf Ebrahimicleanup 70*62c56f98SSadaf Ebrahimi 71*62c56f98SSadaf Ebrahimiscripts/config.py full 72*62c56f98SSadaf Ebrahimirecord "after-full" 73*62c56f98SSadaf Ebrahimi 74*62c56f98SSadaf Ebrahimicleanup 75*62c56f98SSadaf Ebrahimi 76*62c56f98SSadaf Ebrahimi# analysis 77*62c56f98SSadaf Ebrahimi 78*62c56f98SSadaf Ebrahimipopulate_suites () { 79*62c56f98SSadaf Ebrahimi SUITES='' 80*62c56f98SSadaf Ebrahimi make generated_files >/dev/null 81*62c56f98SSadaf Ebrahimi data_files=$(cd tests/suites && echo *.data) 82*62c56f98SSadaf Ebrahimi for data in $data_files; do 83*62c56f98SSadaf Ebrahimi suite=${data%.data} 84*62c56f98SSadaf Ebrahimi SUITES="$SUITES $suite" 85*62c56f98SSadaf Ebrahimi done 86*62c56f98SSadaf Ebrahimi make neat 87*62c56f98SSadaf Ebrahimi 88*62c56f98SSadaf Ebrahimi if [ $SKIP_SSL_OPT -eq 0 ]; then 89*62c56f98SSadaf Ebrahimi SUITES="$SUITES ssl-opt" 90*62c56f98SSadaf Ebrahimi extra_files=$(cd tests/opt-testcases && echo *.sh) 91*62c56f98SSadaf Ebrahimi for extra in $extra_files; do 92*62c56f98SSadaf Ebrahimi suite=${extra%.sh} 93*62c56f98SSadaf Ebrahimi SUITES="$SUITES $suite" 94*62c56f98SSadaf Ebrahimi done 95*62c56f98SSadaf Ebrahimi fi 96*62c56f98SSadaf Ebrahimi} 97*62c56f98SSadaf Ebrahimi 98*62c56f98SSadaf Ebrahimicompare_suite () { 99*62c56f98SSadaf Ebrahimi ref="outcome-$1.csv" 100*62c56f98SSadaf Ebrahimi new="outcome-$2.csv" 101*62c56f98SSadaf Ebrahimi suite="$3" 102*62c56f98SSadaf Ebrahimi 103*62c56f98SSadaf Ebrahimi pattern_suite=";$suite;" 104*62c56f98SSadaf Ebrahimi total=$(grep -c "$pattern_suite" "$ref") 105*62c56f98SSadaf Ebrahimi sed_cmd="s/^.*$pattern_suite\(.*\);SKIP.*/\1/p" 106*62c56f98SSadaf Ebrahimi sed -n "$sed_cmd" "$ref" > skipped-ref 107*62c56f98SSadaf Ebrahimi sed -n "$sed_cmd" "$new" > skipped-new 108*62c56f98SSadaf Ebrahimi nb_ref=$(wc -l <skipped-ref) 109*62c56f98SSadaf Ebrahimi nb_new=$(wc -l <skipped-new) 110*62c56f98SSadaf Ebrahimi 111*62c56f98SSadaf Ebrahimi name=${suite#test_suite_} 112*62c56f98SSadaf Ebrahimi printf "%40s: total %4d; skipped %4d -> %4d\n" \ 113*62c56f98SSadaf Ebrahimi $name $total $nb_ref $nb_new 114*62c56f98SSadaf Ebrahimi if diff skipped-ref skipped-new | grep '^> '; then 115*62c56f98SSadaf Ebrahimi ret=1 116*62c56f98SSadaf Ebrahimi else 117*62c56f98SSadaf Ebrahimi ret=0 118*62c56f98SSadaf Ebrahimi fi 119*62c56f98SSadaf Ebrahimi rm skipped-ref skipped-new 120*62c56f98SSadaf Ebrahimi return $ret 121*62c56f98SSadaf Ebrahimi} 122*62c56f98SSadaf Ebrahimi 123*62c56f98SSadaf Ebrahimicompare_builds () { 124*62c56f98SSadaf Ebrahimi printf "\n*** Comparing $1 -> $2 ***\n" 125*62c56f98SSadaf Ebrahimi failed='' 126*62c56f98SSadaf Ebrahimi for suite in $SUITES; do 127*62c56f98SSadaf Ebrahimi if compare_suite "$1" "$2" "$suite"; then :; else 128*62c56f98SSadaf Ebrahimi failed="$failed $suite" 129*62c56f98SSadaf Ebrahimi fi 130*62c56f98SSadaf Ebrahimi done 131*62c56f98SSadaf Ebrahimi if [ -z "$failed" ]; then 132*62c56f98SSadaf Ebrahimi printf "No coverage gap found.\n" 133*62c56f98SSadaf Ebrahimi else 134*62c56f98SSadaf Ebrahimi printf "Suites with less coverage:%s\n" "$failed" 135*62c56f98SSadaf Ebrahimi fi 136*62c56f98SSadaf Ebrahimi} 137*62c56f98SSadaf Ebrahimi 138*62c56f98SSadaf Ebrahimipopulate_suites 139*62c56f98SSadaf Ebrahimicompare_builds before-default after-default 140*62c56f98SSadaf Ebrahimicompare_builds before-full after-full 141