1*62c56f98SSadaf Ebrahimi#!/bin/sh 2*62c56f98SSadaf Ebrahimi 3*62c56f98SSadaf Ebrahimi# basic-build-test.sh 4*62c56f98SSadaf Ebrahimi# 5*62c56f98SSadaf Ebrahimi# Copyright The Mbed TLS Contributors 6*62c56f98SSadaf Ebrahimi# SPDX-License-Identifier: Apache-2.0 OR GPL-2.0-or-later 7*62c56f98SSadaf Ebrahimi# 8*62c56f98SSadaf Ebrahimi# Purpose 9*62c56f98SSadaf Ebrahimi# 10*62c56f98SSadaf Ebrahimi# Executes the basic test suites, captures the results, and generates a simple 11*62c56f98SSadaf Ebrahimi# test report and code coverage report. 12*62c56f98SSadaf Ebrahimi# 13*62c56f98SSadaf Ebrahimi# The tests include: 14*62c56f98SSadaf Ebrahimi# * Unit tests - executed using tests/scripts/run-test-suite.pl 15*62c56f98SSadaf Ebrahimi# * Self-tests - executed using the test suites above 16*62c56f98SSadaf Ebrahimi# * System tests - executed using tests/ssl-opt.sh 17*62c56f98SSadaf Ebrahimi# * Interoperability tests - executed using tests/compat.sh 18*62c56f98SSadaf Ebrahimi# 19*62c56f98SSadaf Ebrahimi# The tests focus on functionality and do not consider performance. 20*62c56f98SSadaf Ebrahimi# 21*62c56f98SSadaf Ebrahimi# Note the tests self-adapt due to configurations in include/mbedtls/mbedtls_config.h 22*62c56f98SSadaf Ebrahimi# which can lead to some tests being skipped, and can cause the number of 23*62c56f98SSadaf Ebrahimi# available tests to fluctuate. 24*62c56f98SSadaf Ebrahimi# 25*62c56f98SSadaf Ebrahimi# This script has been written to be generic and should work on any shell. 26*62c56f98SSadaf Ebrahimi# 27*62c56f98SSadaf Ebrahimi# Usage: basic-build-test.sh 28*62c56f98SSadaf Ebrahimi# 29*62c56f98SSadaf Ebrahimi 30*62c56f98SSadaf Ebrahimi# Abort on errors (and uninitiliased variables) 31*62c56f98SSadaf Ebrahimiset -eu 32*62c56f98SSadaf Ebrahimi 33*62c56f98SSadaf Ebrahimiif [ -d library -a -d include -a -d tests ]; then :; else 34*62c56f98SSadaf Ebrahimi echo "Must be run from Mbed TLS root" >&2 35*62c56f98SSadaf Ebrahimi exit 1 36*62c56f98SSadaf Ebrahimifi 37*62c56f98SSadaf Ebrahimi 38*62c56f98SSadaf Ebrahimi: ${OPENSSL:="openssl"} 39*62c56f98SSadaf Ebrahimi: ${OPENSSL_LEGACY:="$OPENSSL"} 40*62c56f98SSadaf Ebrahimi: ${GNUTLS_CLI:="gnutls-cli"} 41*62c56f98SSadaf Ebrahimi: ${GNUTLS_SERV:="gnutls-serv"} 42*62c56f98SSadaf Ebrahimi: ${GNUTLS_LEGACY_CLI:="$GNUTLS_CLI"} 43*62c56f98SSadaf Ebrahimi: ${GNUTLS_LEGACY_SERV:="$GNUTLS_SERV"} 44*62c56f98SSadaf Ebrahimi 45*62c56f98SSadaf Ebrahimi# Used to make ssl-opt.sh deterministic. 46*62c56f98SSadaf Ebrahimi# 47*62c56f98SSadaf Ebrahimi# See also RELEASE_SEED in all.sh. Debugging is easier if both values are kept 48*62c56f98SSadaf Ebrahimi# in sync. If you change the value here because it breaks some tests, you'll 49*62c56f98SSadaf Ebrahimi# definitely want to change it in all.sh as well. 50*62c56f98SSadaf Ebrahimi: ${SEED:=1} 51*62c56f98SSadaf Ebrahimiexport SEED 52*62c56f98SSadaf Ebrahimi 53*62c56f98SSadaf Ebrahimi# if MAKEFLAGS is not set add the -j option to speed up invocations of make 54*62c56f98SSadaf Ebrahimiif [ -z "${MAKEFLAGS+set}" ]; then 55*62c56f98SSadaf Ebrahimi export MAKEFLAGS="-j" 56*62c56f98SSadaf Ebrahimifi 57*62c56f98SSadaf Ebrahimi 58*62c56f98SSadaf Ebrahimi# To avoid setting OpenSSL and GnuTLS for each call to compat.sh and ssl-opt.sh 59*62c56f98SSadaf Ebrahimi# we just export the variables they require 60*62c56f98SSadaf Ebrahimiexport OPENSSL="$OPENSSL" 61*62c56f98SSadaf Ebrahimiexport GNUTLS_CLI="$GNUTLS_CLI" 62*62c56f98SSadaf Ebrahimiexport GNUTLS_SERV="$GNUTLS_SERV" 63*62c56f98SSadaf Ebrahimi 64*62c56f98SSadaf EbrahimiCONFIG_H='include/mbedtls/mbedtls_config.h' 65*62c56f98SSadaf EbrahimiCONFIG_BAK="$CONFIG_H.bak" 66*62c56f98SSadaf Ebrahimi 67*62c56f98SSadaf Ebrahimi# Step 0 - print build environment info 68*62c56f98SSadaf EbrahimiOPENSSL="$OPENSSL" \ 69*62c56f98SSadaf Ebrahimi OPENSSL_LEGACY="$OPENSSL_LEGACY" \ 70*62c56f98SSadaf Ebrahimi GNUTLS_CLI="$GNUTLS_CLI" \ 71*62c56f98SSadaf Ebrahimi GNUTLS_SERV="$GNUTLS_SERV" \ 72*62c56f98SSadaf Ebrahimi GNUTLS_LEGACY_CLI="$GNUTLS_LEGACY_CLI" \ 73*62c56f98SSadaf Ebrahimi GNUTLS_LEGACY_SERV="$GNUTLS_LEGACY_SERV" \ 74*62c56f98SSadaf Ebrahimi scripts/output_env.sh 75*62c56f98SSadaf Ebrahimiecho 76*62c56f98SSadaf Ebrahimi 77*62c56f98SSadaf Ebrahimi# Step 1 - Make and instrumented build for code coverage 78*62c56f98SSadaf Ebrahimiexport CFLAGS=' --coverage -g3 -O0 ' 79*62c56f98SSadaf Ebrahimiexport LDFLAGS=' --coverage' 80*62c56f98SSadaf Ebrahimimake clean 81*62c56f98SSadaf Ebrahimicp "$CONFIG_H" "$CONFIG_BAK" 82*62c56f98SSadaf Ebrahimiscripts/config.py full 83*62c56f98SSadaf Ebrahimimake 84*62c56f98SSadaf Ebrahimi 85*62c56f98SSadaf Ebrahimi 86*62c56f98SSadaf Ebrahimi# Step 2 - Execute the tests 87*62c56f98SSadaf EbrahimiTEST_OUTPUT=out_${PPID} 88*62c56f98SSadaf Ebrahimicd tests 89*62c56f98SSadaf Ebrahimiif [ ! -f "seedfile" ]; then 90*62c56f98SSadaf Ebrahimi dd if=/dev/urandom of="seedfile" bs=64 count=1 91*62c56f98SSadaf Ebrahimifi 92*62c56f98SSadaf Ebrahimiecho 93*62c56f98SSadaf Ebrahimi 94*62c56f98SSadaf Ebrahimi# Step 2a - Unit Tests (keep going even if some tests fail) 95*62c56f98SSadaf Ebrahimiecho '################ Unit tests ################' 96*62c56f98SSadaf Ebrahimiperl scripts/run-test-suites.pl -v 2 |tee unit-test-$TEST_OUTPUT 97*62c56f98SSadaf Ebrahimiecho '^^^^^^^^^^^^^^^^ Unit tests ^^^^^^^^^^^^^^^^' 98*62c56f98SSadaf Ebrahimiecho 99*62c56f98SSadaf Ebrahimi 100*62c56f98SSadaf Ebrahimi# Step 2b - System Tests (keep going even if some tests fail) 101*62c56f98SSadaf Ebrahimiecho 102*62c56f98SSadaf Ebrahimiecho '################ ssl-opt.sh ################' 103*62c56f98SSadaf Ebrahimiecho "ssl-opt.sh will use SEED=$SEED for udp_proxy" 104*62c56f98SSadaf Ebrahimish ssl-opt.sh |tee sys-test-$TEST_OUTPUT 105*62c56f98SSadaf Ebrahimiecho '^^^^^^^^^^^^^^^^ ssl-opt.sh ^^^^^^^^^^^^^^^^' 106*62c56f98SSadaf Ebrahimiecho 107*62c56f98SSadaf Ebrahimi 108*62c56f98SSadaf Ebrahimi# Step 2c - Compatibility tests (keep going even if some tests fail) 109*62c56f98SSadaf Ebrahimiecho '################ compat.sh ################' 110*62c56f98SSadaf Ebrahimi{ 111*62c56f98SSadaf Ebrahimi echo '#### compat.sh: Default versions' 112*62c56f98SSadaf Ebrahimi sh compat.sh 113*62c56f98SSadaf Ebrahimi echo 114*62c56f98SSadaf Ebrahimi 115*62c56f98SSadaf Ebrahimi echo '#### compat.sh: legacy (null)' 116*62c56f98SSadaf Ebrahimi OPENSSL="$OPENSSL_LEGACY" \ 117*62c56f98SSadaf Ebrahimi GNUTLS_CLI="$GNUTLS_LEGACY_CLI" GNUTLS_SERV="$GNUTLS_LEGACY_SERV" \ 118*62c56f98SSadaf Ebrahimi sh compat.sh -e '^$' -f 'NULL' 119*62c56f98SSadaf Ebrahimi echo 120*62c56f98SSadaf Ebrahimi 121*62c56f98SSadaf Ebrahimi echo '#### compat.sh: next (ARIA, ChaCha)' 122*62c56f98SSadaf Ebrahimi OPENSSL="$OPENSSL_NEXT" sh compat.sh -e '^$' -f 'ARIA\|CHACHA' 123*62c56f98SSadaf Ebrahimi echo 124*62c56f98SSadaf Ebrahimi} | tee compat-test-$TEST_OUTPUT 125*62c56f98SSadaf Ebrahimiecho '^^^^^^^^^^^^^^^^ compat.sh ^^^^^^^^^^^^^^^^' 126*62c56f98SSadaf Ebrahimiecho 127*62c56f98SSadaf Ebrahimi 128*62c56f98SSadaf Ebrahimi# Step 3 - Process the coverage report 129*62c56f98SSadaf Ebrahimicd .. 130*62c56f98SSadaf Ebrahimi{ 131*62c56f98SSadaf Ebrahimi make lcov 132*62c56f98SSadaf Ebrahimi echo SUCCESS 133*62c56f98SSadaf Ebrahimi} | tee tests/cov-$TEST_OUTPUT 134*62c56f98SSadaf Ebrahimi 135*62c56f98SSadaf Ebrahimiif [ "$(tail -n1 tests/cov-$TEST_OUTPUT)" != "SUCCESS" ]; then 136*62c56f98SSadaf Ebrahimi echo >&2 "Fatal: 'make lcov' failed" 137*62c56f98SSadaf Ebrahimi exit 2 138*62c56f98SSadaf Ebrahimifi 139*62c56f98SSadaf Ebrahimi 140*62c56f98SSadaf Ebrahimi 141*62c56f98SSadaf Ebrahimi# Step 4 - Summarise the test report 142*62c56f98SSadaf Ebrahimiecho 143*62c56f98SSadaf Ebrahimiecho "=========================================================================" 144*62c56f98SSadaf Ebrahimiecho "Test Report Summary" 145*62c56f98SSadaf Ebrahimiecho 146*62c56f98SSadaf Ebrahimi 147*62c56f98SSadaf Ebrahimi# A failure of the left-hand side of a pipe is ignored (this is a limitation 148*62c56f98SSadaf Ebrahimi# of sh). We'll use the presence of this file as a marker that the generation 149*62c56f98SSadaf Ebrahimi# of the report succeeded. 150*62c56f98SSadaf Ebrahimirm -f "tests/basic-build-test-$$.ok" 151*62c56f98SSadaf Ebrahimi 152*62c56f98SSadaf Ebrahimi{ 153*62c56f98SSadaf Ebrahimi 154*62c56f98SSadaf Ebrahimi cd tests 155*62c56f98SSadaf Ebrahimi 156*62c56f98SSadaf Ebrahimi # Step 4a - Unit tests 157*62c56f98SSadaf Ebrahimi echo "Unit tests - tests/scripts/run-test-suites.pl" 158*62c56f98SSadaf Ebrahimi 159*62c56f98SSadaf Ebrahimi PASSED_TESTS=$(tail -n6 unit-test-$TEST_OUTPUT|sed -n -e 's/test cases passed :[\t]*\([0-9]*\)/\1/p'| tr -d ' ') 160*62c56f98SSadaf Ebrahimi SKIPPED_TESTS=$(tail -n6 unit-test-$TEST_OUTPUT|sed -n -e 's/skipped :[ \t]*\([0-9]*\)/\1/p'| tr -d ' ') 161*62c56f98SSadaf Ebrahimi TOTAL_SUITES=$(tail -n6 unit-test-$TEST_OUTPUT|sed -n -e 's/.* (\([0-9]*\) .*, [0-9]* tests run)/\1/p'| tr -d ' ') 162*62c56f98SSadaf Ebrahimi FAILED_TESTS=$(tail -n6 unit-test-$TEST_OUTPUT|sed -n -e 's/failed :[\t]*\([0-9]*\)/\1/p' |tr -d ' ') 163*62c56f98SSadaf Ebrahimi 164*62c56f98SSadaf Ebrahimi echo "No test suites : $TOTAL_SUITES" 165*62c56f98SSadaf Ebrahimi echo "Passed : $PASSED_TESTS" 166*62c56f98SSadaf Ebrahimi echo "Failed : $FAILED_TESTS" 167*62c56f98SSadaf Ebrahimi echo "Skipped : $SKIPPED_TESTS" 168*62c56f98SSadaf Ebrahimi echo "Total exec'd tests : $(($PASSED_TESTS + $FAILED_TESTS))" 169*62c56f98SSadaf Ebrahimi echo "Total avail tests : $(($PASSED_TESTS + $FAILED_TESTS + $SKIPPED_TESTS))" 170*62c56f98SSadaf Ebrahimi echo 171*62c56f98SSadaf Ebrahimi 172*62c56f98SSadaf Ebrahimi TOTAL_PASS=$PASSED_TESTS 173*62c56f98SSadaf Ebrahimi TOTAL_FAIL=$FAILED_TESTS 174*62c56f98SSadaf Ebrahimi TOTAL_SKIP=$SKIPPED_TESTS 175*62c56f98SSadaf Ebrahimi TOTAL_AVAIL=$(($PASSED_TESTS + $FAILED_TESTS + $SKIPPED_TESTS)) 176*62c56f98SSadaf Ebrahimi TOTAL_EXED=$(($PASSED_TESTS + $FAILED_TESTS)) 177*62c56f98SSadaf Ebrahimi 178*62c56f98SSadaf Ebrahimi # Step 4b - TLS Options tests 179*62c56f98SSadaf Ebrahimi echo "TLS Options tests - tests/ssl-opt.sh" 180*62c56f98SSadaf Ebrahimi 181*62c56f98SSadaf Ebrahimi PASSED_TESTS=$(tail -n5 sys-test-$TEST_OUTPUT|sed -n -e 's/.* (\([0-9]*\) \/ [0-9]* tests ([0-9]* skipped))$/\1/p') 182*62c56f98SSadaf Ebrahimi SKIPPED_TESTS=$(tail -n5 sys-test-$TEST_OUTPUT|sed -n -e 's/.* ([0-9]* \/ [0-9]* tests (\([0-9]*\) skipped))$/\1/p') 183*62c56f98SSadaf Ebrahimi TOTAL_TESTS=$(tail -n5 sys-test-$TEST_OUTPUT|sed -n -e 's/.* ([0-9]* \/ \([0-9]*\) tests ([0-9]* skipped))$/\1/p') 184*62c56f98SSadaf Ebrahimi FAILED_TESTS=$(($TOTAL_TESTS - $PASSED_TESTS)) 185*62c56f98SSadaf Ebrahimi 186*62c56f98SSadaf Ebrahimi echo "Passed : $PASSED_TESTS" 187*62c56f98SSadaf Ebrahimi echo "Failed : $FAILED_TESTS" 188*62c56f98SSadaf Ebrahimi echo "Skipped : $SKIPPED_TESTS" 189*62c56f98SSadaf Ebrahimi echo "Total exec'd tests : $TOTAL_TESTS" 190*62c56f98SSadaf Ebrahimi echo "Total avail tests : $(($TOTAL_TESTS + $SKIPPED_TESTS))" 191*62c56f98SSadaf Ebrahimi echo 192*62c56f98SSadaf Ebrahimi 193*62c56f98SSadaf Ebrahimi TOTAL_PASS=$(($TOTAL_PASS+$PASSED_TESTS)) 194*62c56f98SSadaf Ebrahimi TOTAL_FAIL=$(($TOTAL_FAIL+$FAILED_TESTS)) 195*62c56f98SSadaf Ebrahimi TOTAL_SKIP=$(($TOTAL_SKIP+$SKIPPED_TESTS)) 196*62c56f98SSadaf Ebrahimi TOTAL_AVAIL=$(($TOTAL_AVAIL + $TOTAL_TESTS + $SKIPPED_TESTS)) 197*62c56f98SSadaf Ebrahimi TOTAL_EXED=$(($TOTAL_EXED + $TOTAL_TESTS)) 198*62c56f98SSadaf Ebrahimi 199*62c56f98SSadaf Ebrahimi 200*62c56f98SSadaf Ebrahimi # Step 4c - System Compatibility tests 201*62c56f98SSadaf Ebrahimi echo "System/Compatibility tests - tests/compat.sh" 202*62c56f98SSadaf Ebrahimi 203*62c56f98SSadaf Ebrahimi PASSED_TESTS=$(cat compat-test-$TEST_OUTPUT | sed -n -e 's/.* (\([0-9]*\) \/ [0-9]* tests ([0-9]* skipped))$/\1/p' | awk 'BEGIN{ s = 0 } { s += $1 } END{ print s }') 204*62c56f98SSadaf Ebrahimi SKIPPED_TESTS=$(cat compat-test-$TEST_OUTPUT | sed -n -e 's/.* ([0-9]* \/ [0-9]* tests (\([0-9]*\) skipped))$/\1/p' | awk 'BEGIN{ s = 0 } { s += $1 } END{ print s }') 205*62c56f98SSadaf Ebrahimi EXED_TESTS=$(cat compat-test-$TEST_OUTPUT | sed -n -e 's/.* ([0-9]* \/ \([0-9]*\) tests ([0-9]* skipped))$/\1/p' | awk 'BEGIN{ s = 0 } { s += $1 } END{ print s }') 206*62c56f98SSadaf Ebrahimi FAILED_TESTS=$(($EXED_TESTS - $PASSED_TESTS)) 207*62c56f98SSadaf Ebrahimi 208*62c56f98SSadaf Ebrahimi echo "Passed : $PASSED_TESTS" 209*62c56f98SSadaf Ebrahimi echo "Failed : $FAILED_TESTS" 210*62c56f98SSadaf Ebrahimi echo "Skipped : $SKIPPED_TESTS" 211*62c56f98SSadaf Ebrahimi echo "Total exec'd tests : $EXED_TESTS" 212*62c56f98SSadaf Ebrahimi echo "Total avail tests : $(($EXED_TESTS + $SKIPPED_TESTS))" 213*62c56f98SSadaf Ebrahimi echo 214*62c56f98SSadaf Ebrahimi 215*62c56f98SSadaf Ebrahimi TOTAL_PASS=$(($TOTAL_PASS+$PASSED_TESTS)) 216*62c56f98SSadaf Ebrahimi TOTAL_FAIL=$(($TOTAL_FAIL+$FAILED_TESTS)) 217*62c56f98SSadaf Ebrahimi TOTAL_SKIP=$(($TOTAL_SKIP+$SKIPPED_TESTS)) 218*62c56f98SSadaf Ebrahimi TOTAL_AVAIL=$(($TOTAL_AVAIL + $EXED_TESTS + $SKIPPED_TESTS)) 219*62c56f98SSadaf Ebrahimi TOTAL_EXED=$(($TOTAL_EXED + $EXED_TESTS)) 220*62c56f98SSadaf Ebrahimi 221*62c56f98SSadaf Ebrahimi 222*62c56f98SSadaf Ebrahimi # Step 4d - Grand totals 223*62c56f98SSadaf Ebrahimi echo "-------------------------------------------------------------------------" 224*62c56f98SSadaf Ebrahimi echo "Total tests" 225*62c56f98SSadaf Ebrahimi 226*62c56f98SSadaf Ebrahimi echo "Total Passed : $TOTAL_PASS" 227*62c56f98SSadaf Ebrahimi echo "Total Failed : $TOTAL_FAIL" 228*62c56f98SSadaf Ebrahimi echo "Total Skipped : $TOTAL_SKIP" 229*62c56f98SSadaf Ebrahimi echo "Total exec'd tests : $TOTAL_EXED" 230*62c56f98SSadaf Ebrahimi echo "Total avail tests : $TOTAL_AVAIL" 231*62c56f98SSadaf Ebrahimi echo 232*62c56f98SSadaf Ebrahimi 233*62c56f98SSadaf Ebrahimi 234*62c56f98SSadaf Ebrahimi # Step 4e - Coverage report 235*62c56f98SSadaf Ebrahimi echo "Coverage statistics:" 236*62c56f98SSadaf Ebrahimi sed -n '1,/^Overall coverage/d; /%/p' cov-$TEST_OUTPUT 237*62c56f98SSadaf Ebrahimi echo 238*62c56f98SSadaf Ebrahimi 239*62c56f98SSadaf Ebrahimi rm unit-test-$TEST_OUTPUT 240*62c56f98SSadaf Ebrahimi rm sys-test-$TEST_OUTPUT 241*62c56f98SSadaf Ebrahimi rm compat-test-$TEST_OUTPUT 242*62c56f98SSadaf Ebrahimi rm cov-$TEST_OUTPUT 243*62c56f98SSadaf Ebrahimi 244*62c56f98SSadaf Ebrahimi # Mark the report generation as having succeeded. This must be the 245*62c56f98SSadaf Ebrahimi # last thing in the report generation. 246*62c56f98SSadaf Ebrahimi touch "basic-build-test-$$.ok" 247*62c56f98SSadaf Ebrahimi} | tee coverage-summary.txt 248*62c56f98SSadaf Ebrahimi 249*62c56f98SSadaf Ebrahimimake clean 250*62c56f98SSadaf Ebrahimi 251*62c56f98SSadaf Ebrahimiif [ -f "$CONFIG_BAK" ]; then 252*62c56f98SSadaf Ebrahimi mv "$CONFIG_BAK" "$CONFIG_H" 253*62c56f98SSadaf Ebrahimifi 254*62c56f98SSadaf Ebrahimi 255*62c56f98SSadaf Ebrahimi# The file must exist, otherwise it means something went wrong while generating 256*62c56f98SSadaf Ebrahimi# the coverage report. If something did go wrong, rm will complain so this 257*62c56f98SSadaf Ebrahimi# script will exit with a failure status. 258*62c56f98SSadaf Ebrahimirm "tests/basic-build-test-$$.ok" 259