blob: b8a7da55d38154e9c66675d059ecdd4ae04ba7ed [file] [log] [blame]
Andres AG31f9b5b2016-10-04 17:14:38 +01001#! /usr/bin/env sh
Manuel Pégourié-Gonnard80955ee2014-03-19 18:29:01 +01002
Simon Butcher3ea7f522016-03-07 23:22:10 +00003# all.sh
4#
SimonB2e23c822016-04-16 21:54:39 +01005# This file is part of mbed TLS (https://tls.mbed.org)
6#
Gilles Peskine192c72f2017-12-21 15:59:21 +01007# Copyright (c) 2014-2017, ARM Limited, All Rights Reserved
8
9
10
11################################################################
12#### Documentation
13################################################################
14
Simon Butcher3ea7f522016-03-07 23:22:10 +000015# Purpose
Gilles Peskine192c72f2017-12-21 15:59:21 +010016# -------
Simon Butcher3ea7f522016-03-07 23:22:10 +000017#
SimonB2e23c822016-04-16 21:54:39 +010018# To run all tests possible or available on the platform.
Manuel Pégourié-Gonnard80955ee2014-03-19 18:29:01 +010019#
Gilles Peskine192c72f2017-12-21 15:59:21 +010020# Notes for users
21# ---------------
22#
SimonB2e23c822016-04-16 21:54:39 +010023# Warning: the test is destructive. It includes various build modes and
24# configurations, and can and will arbitrarily change the current CMake
Gilles Peskine192c72f2017-12-21 15:59:21 +010025# configuration. The following files must be committed into git:
26# * include/mbedtls/config.h
27# * Makefile, library/Makefile, programs/Makefile, tests/Makefile
28# After running this script, the CMake cache will be lost and CMake
29# will no longer be initialised.
Manuel Pégourié-Gonnard3895f5a2014-03-27 14:44:04 +010030#
Gilles Peskine192c72f2017-12-21 15:59:21 +010031# The script assumes the presence of a number of tools:
32# * Basic Unix tools (Windows users note: a Unix-style find must be before
33# the Windows find in the PATH)
34# * Perl
35# * GNU Make
36# * CMake
37# * GCC and Clang (recent enough for using ASan with gcc and MemSan with clang, or valgrind)
38# * arm-gcc and mingw-gcc
39# * ArmCC 5 and ArmCC 6, unless invoked with --no-armcc
40# * Yotta build dependencies, unless invoked with --no-yotta
41# * OpenSSL and GnuTLS command line tools, recent enough for the
42# interoperability tests. If they don't support SSLv3 then a legacy
43# version of these tools must be present as well (search for LEGACY
44# below).
45# See the invocation of check_tools below for details.
46#
47# This script must be invoked from the toplevel directory of a git
48# working copy of Mbed TLS.
49#
50# Note that the output is not saved. You may want to run
51# script -c tests/scripts/all.sh
52# or
53# tests/scripts/all.sh >all.log 2>&1
54#
55# Notes for maintainers
56# ---------------------
57#
Gilles Peskine2906a0a2019-01-09 22:29:17 +010058# The bulk of the code is organized into functions that follow one of the
59# following naming conventions:
60# * pre_XXX: things to do before running the tests, in order.
61# * component_XXX: independent components. They can be run in any order.
62# * component_check_XXX: quick tests that aren't worth parallelizing.
63# * component_build_XXX: build things but don't run them.
64# * component_test_XXX: build and test.
65# * support_XXX: if support_XXX exists and returns false then
66# component_XXX is not run by default.
67# * post_XXX: things to do after running the tests.
68# * other: miscellaneous support functions.
69#
70# Each component must start by invoking `msg` with a short informative message.
71#
72# The framework performs some cleanup tasks after each component. This
73# means that components can assume that the working directory is in a
74# cleaned-up state, and don't need to perform the cleanup themselves.
75# * Run `make clean`.
76# * Restore `include/mbedtks/config.h` from a backup made before running
77# the component.
78# * Check out `Makefile`, `library/Makefile`, `programs/Makefile` and
79# `tests/Makefile` from git. This cleans up after an in-tree use of
80# CMake.
81#
82# Any command that is expected to fail must be protected so that the
83# script keeps running in --keep-going mode despite `set -e`. In keep-going
84# mode, if a protected command fails, this is logged as a failure and the
85# script will exit with a failure status once it has run all components.
86# Commands can be protected in any of the following ways:
87# * `make` is a function which runs the `make` command with protection.
88# Note that you must write `make VAR=value`, not `VAR=value make`,
89# because the `VAR=value make` syntax doesn't work with functions.
90# * Put `report_status` before the command to protect it.
91# * Put `if_build_successful` before a command. This protects it, and
92# additionally skips it if a prior invocation of `make` in the same
93# component failed.
94#
Gilles Peskine192c72f2017-12-21 15:59:21 +010095# The tests are roughly in order from fastest to slowest. This doesn't
96# have to be exact, but in general you should add slower tests towards
97# the end and fast checks near the beginning.
Gilles Peskine192c72f2017-12-21 15:59:21 +010098
99
100
101################################################################
102#### Initialization and command line parsing
103################################################################
Manuel Pégourié-Gonnard80955ee2014-03-19 18:29:01 +0100104
SimonB2e23c822016-04-16 21:54:39 +0100105# Abort on errors (and uninitialised variables)
Manuel Pégourié-Gonnard80955ee2014-03-19 18:29:01 +0100106set -eu
107
Gilles Peskine57db6ff2019-01-08 22:04:31 +0100108pre_check_environment () {
Gilles Peskine770ad7e2019-01-08 23:19:08 +0100109 if [ -d library -a -d include -a -d tests ]; then :; else
Gilles Peskine57db6ff2019-01-08 22:04:31 +0100110 echo "Must be run from mbed TLS root" >&2
111 exit 1
112 fi
113}
Manuel Pégourié-Gonnard80955ee2014-03-19 18:29:01 +0100114
Gilles Peskine57db6ff2019-01-08 22:04:31 +0100115pre_initialize_variables () {
116 CONFIG_H='include/mbedtls/config.h'
117 CONFIG_BAK="$CONFIG_H.bak"
Manuel Pégourié-Gonnarde73b2632014-07-12 04:00:00 +0200118
Gilles Peskine57db6ff2019-01-08 22:04:31 +0100119 MEMORY=0
120 FORCE=0
121 KEEP_GOING=0
Gilles Peskine57db6ff2019-01-08 22:04:31 +0100122 YOTTA=1
Manuel Pégourié-Gonnard80955ee2014-03-19 18:29:01 +0100123
Gilles Peskine57db6ff2019-01-08 22:04:31 +0100124 # Default commands, can be overriden by the environment
125 : ${OPENSSL:="openssl"}
126 : ${OPENSSL_LEGACY:="$OPENSSL"}
127 : ${GNUTLS_CLI:="gnutls-cli"}
128 : ${GNUTLS_SERV:="gnutls-serv"}
129 : ${GNUTLS_LEGACY_CLI:="$GNUTLS_CLI"}
130 : ${GNUTLS_LEGACY_SERV:="$GNUTLS_SERV"}
131 : ${OUT_OF_SOURCE_DIR:=./mbedtls_out_of_source_build}
132 : ${ARMC5_BIN_DIR:=/usr/bin}
133 : ${ARMC6_BIN_DIR:=/usr/bin}
Andres AGdc192212016-08-31 17:33:13 +0100134
Gilles Peskine57db6ff2019-01-08 22:04:31 +0100135 # if MAKEFLAGS is not set add the -j option to speed up invocations of make
Gilles Peskine7120f772019-01-06 20:15:26 +0000136 if [ -z "${MAKEFLAGS+set}" ]; then
Gilles Peskine57db6ff2019-01-08 22:04:31 +0100137 export MAKEFLAGS="-j"
138 fi
Gilles Peskine1a2ca722019-01-08 22:35:16 +0100139
140 # Gather the list of available components. These are the functions
141 # defined in this script whose name starts with "component_".
142 # Parse the script with sed, because in sh there is no way to list
143 # defined functions.
144 ALL_COMPONENTS=$(sed -n 's/^ *component_\([0-9A-Z_a-z]*\) *().*/\1/p' <"$0")
Gilles Peskine3fbdd212019-01-08 23:33:45 +0100145
146 # Exclude components that are not supported on this platform.
147 SUPPORTED_COMPONENTS=
148 for component in $ALL_COMPONENTS; do
149 case $(type "support_$component" 2>&1) in
150 *' function'*)
151 if ! support_$component; then continue; fi;;
152 esac
153 SUPPORTED_COMPONENTS="$SUPPORTED_COMPONENTS $component"
154 done
Gilles Peskine57db6ff2019-01-08 22:04:31 +0100155}
Andres AG38495a32016-07-12 16:54:33 +0100156
Gilles Peskine3fbdd212019-01-08 23:33:45 +0100157# Test whether $1 is excluded via the command line.
Gilles Peskine6e984232018-11-27 21:37:53 +0100158is_component_excluded()
159{
Gilles Peskine3fbdd212019-01-08 23:33:45 +0100160 # Is $1 excluded via $COMPONENTS (a space-separated list of wildcard
161 # patterns)?
Gilles Peskine6e984232018-11-27 21:37:53 +0100162 set -f
Gilles Peskineeb39b9b2019-01-08 23:41:00 +0100163 for pattern in $COMMAND_LINE_COMPONENTS; do
Gilles Peskine6e984232018-11-27 21:37:53 +0100164 set +f
165 case ${1#component_} in $pattern) return 0;; esac
166 done
167 set +f
168 return 1
169}
170
Simon Butcher41eeccf2016-09-07 00:07:09 +0100171usage()
SimonB2e23c822016-04-16 21:54:39 +0100172{
Gilles Peskine709346a2017-12-10 23:43:39 +0100173 cat <<EOF
Gilles Peskine91bd8b72019-01-08 23:01:34 +0100174Usage: $0 [OPTION]... [COMPONENT]...
175Run mbedtls release validation tests.
176By default, run all tests. With one or more COMPONENT, run only those.
177
178Special options:
179 -h|--help Print this help and exit.
Gilles Peskineb3241cb2019-01-08 23:44:07 +0100180 --list-all-components List all available test components and exit.
181 --list-components List components supported on this platform and exit.
Gilles Peskine709346a2017-12-10 23:43:39 +0100182
183General options:
184 -f|--force Force the tests to overwrite any modified files.
Gilles Peskine7c652162017-12-11 00:01:40 +0100185 -k|--keep-going Run all tests and report errors at the end.
Gilles Peskine709346a2017-12-10 23:43:39 +0100186 -m|--memory Additional optional memory tests.
Gilles Peskinebca6ab92017-12-19 18:24:31 +0100187 --armcc Run ARM Compiler builds (on by default).
Gilles Peskine6e984232018-11-27 21:37:53 +0100188 --except If some components are passed on the command line,
189 run all the tests except for these components. In
190 this mode, you can pass shell wildcard patterns as
191 component names, e.g. "$0 --except 'test_*'" to
192 exclude all components that run tests.
Gilles Peskinebca6ab92017-12-19 18:24:31 +0100193 --no-armcc Skip ARM Compiler builds.
Gilles Peskine19ceb712018-03-21 08:40:26 +0100194 --no-force Refuse to overwrite modified files (default).
195 --no-keep-going Stop at the first error (default).
196 --no-memory No additional memory tests (default).
Gilles Peskine2a22a802017-12-21 15:19:00 +0100197 --no-yotta Skip yotta module build.
Gilles Peskine709346a2017-12-10 23:43:39 +0100198 --out-of-source-dir=<path> Directory used for CMake out-of-source build tests.
Gilles Peskine19ceb712018-03-21 08:40:26 +0100199 --random-seed Use a random seed value for randomized tests (default).
Gilles Peskine709346a2017-12-10 23:43:39 +0100200 -r|--release-test Run this script in release mode. This fixes the seed value to 1.
201 -s|--seed Integer seed value to use for this test run.
Gilles Peskine2a22a802017-12-21 15:19:00 +0100202 --yotta Build yotta module (on by default).
Gilles Peskine709346a2017-12-10 23:43:39 +0100203
204Tool path options:
205 --armc5-bin-dir=<ARMC5_bin_dir_path> ARM Compiler 5 bin directory.
206 --armc6-bin-dir=<ARMC6_bin_dir_path> ARM Compiler 6 bin directory.
207 --gnutls-cli=<GnuTLS_cli_path> GnuTLS client executable to use for most tests.
208 --gnutls-serv=<GnuTLS_serv_path> GnuTLS server executable to use for most tests.
209 --gnutls-legacy-cli=<GnuTLS_cli_path> GnuTLS client executable to use for legacy tests.
210 --gnutls-legacy-serv=<GnuTLS_serv_path> GnuTLS server executable to use for legacy tests.
211 --openssl=<OpenSSL_path> OpenSSL executable to use for most tests.
212 --openssl-legacy=<OpenSSL_path> OpenSSL executable to use for legacy tests e.g. SSLv3.
213EOF
SimonB2e23c822016-04-16 21:54:39 +0100214}
Manuel Pégourié-Gonnard80955ee2014-03-19 18:29:01 +0100215
216# remove built files as well as the cmake cache/config
217cleanup()
218{
Gilles Peskinea71d64c2018-03-21 12:16:57 +0100219 if [ -n "${MBEDTLS_ROOT_DIR+set}" ]; then
220 cd "$MBEDTLS_ROOT_DIR"
221 fi
222
Gilles Peskine7c652162017-12-11 00:01:40 +0100223 command make clean
Manuel Pégourié-Gonnarde73b2632014-07-12 04:00:00 +0200224
Gilles Peskine31b07e22018-03-21 12:15:06 +0100225 # Remove CMake artefacts
226 find . -name .git -prune -o -name yotta -prune -o \
227 -iname CMakeFiles -exec rm -rf {} \+ -o \
228 \( -iname cmake_install.cmake -o \
229 -iname CTestTestfile.cmake -o \
230 -iname CMakeCache.txt \) -exec rm {} \+
231 # Recover files overwritten by in-tree CMake builds
Manuel Pégourié-Gonnard7f809972015-03-09 17:05:11 +0000232 rm -f include/Makefile include/mbedtls/Makefile programs/*/Makefile
Paul Bakkerfe0984d2014-06-13 00:13:45 +0200233 git update-index --no-skip-worktree Makefile library/Makefile programs/Makefile tests/Makefile
234 git checkout -- Makefile library/Makefile programs/Makefile tests/Makefile
Manuel Pégourié-Gonnarde73b2632014-07-12 04:00:00 +0200235
236 if [ -f "$CONFIG_BAK" ]; then
237 mv "$CONFIG_BAK" "$CONFIG_H"
238 fi
Manuel Pégourié-Gonnard80955ee2014-03-19 18:29:01 +0100239}
240
Gilles Peskine7c652162017-12-11 00:01:40 +0100241# Executed on exit. May be redefined depending on command line options.
242final_report () {
243 :
244}
245
246fatal_signal () {
247 cleanup
248 final_report $1
249 trap - $1
250 kill -$1 $$
251}
252
253trap 'fatal_signal HUP' HUP
254trap 'fatal_signal INT' INT
255trap 'fatal_signal TERM' TERM
Manuel Pégourié-Gonnarde73b2632014-07-12 04:00:00 +0200256
Manuel Pégourié-Gonnard3895f5a2014-03-27 14:44:04 +0100257msg()
258{
Gilles Peskine11ddca62018-12-04 12:49:28 +0100259 if [ -n "${current_component:-}" ]; then
260 current_section="${current_component#component_}: $1"
261 else
262 current_section="$1"
263 fi
Manuel Pégourié-Gonnard3895f5a2014-03-27 14:44:04 +0100264 echo ""
265 echo "******************************************************************"
Gilles Peskine11ddca62018-12-04 12:49:28 +0100266 echo "* $current_section "
Manuel Pégourié-Gonnard392d3dd2015-01-26 14:03:56 +0000267 printf "* "; date
Manuel Pégourié-Gonnard3895f5a2014-03-27 14:44:04 +0100268 echo "******************************************************************"
269}
Manuel Pégourié-Gonnard80955ee2014-03-19 18:29:01 +0100270
Gilles Peskine57db6ff2019-01-08 22:04:31 +0100271armc6_build_test()
272{
273 FLAGS="$1"
Andres AGa5cd9732016-10-17 15:23:10 +0100274
Gilles Peskine57db6ff2019-01-08 22:04:31 +0100275 msg "build: ARM Compiler 6 ($FLAGS), make"
276 ARM_TOOL_VARIANT="ult" CC="$ARMC6_CC" AR="$ARMC6_AR" CFLAGS="$FLAGS" \
277 WARNING_CFLAGS='-xc -std=c99' make lib
278 make clean
279}
Andres AGa5cd9732016-10-17 15:23:10 +0100280
Andres AGd9eba4b2016-08-26 14:42:14 +0100281err_msg()
282{
283 echo "$1" >&2
284}
285
286check_tools()
287{
288 for TOOL in "$@"; do
Andres AG98393602017-01-31 17:04:45 +0000289 if ! `type "$TOOL" >/dev/null 2>&1`; then
Andres AGd9eba4b2016-08-26 14:42:14 +0100290 err_msg "$TOOL not found!"
291 exit 1
292 fi
293 done
294}
295
Gilles Peskine57db6ff2019-01-08 22:04:31 +0100296pre_parse_command_line () {
Gilles Peskineeb39b9b2019-01-08 23:41:00 +0100297 COMMAND_LINE_COMPONENTS=
298 all_except=
Gilles Peskine53084872019-01-09 23:13:54 +0100299 no_armcc=
Gilles Peskine6e984232018-11-27 21:37:53 +0100300
Gilles Peskine57db6ff2019-01-08 22:04:31 +0100301 while [ $# -gt 0 ]; do
302 case "$1" in
Gilles Peskine53084872019-01-09 23:13:54 +0100303 --armcc) no_armcc=;;
Gilles Peskine57db6ff2019-01-08 22:04:31 +0100304 --armc5-bin-dir) shift; ARMC5_BIN_DIR="$1";;
305 --armc6-bin-dir) shift; ARMC6_BIN_DIR="$1";;
Gilles Peskineeb39b9b2019-01-08 23:41:00 +0100306 --except) all_except=1;;
Gilles Peskine57db6ff2019-01-08 22:04:31 +0100307 --force|-f) FORCE=1;;
308 --gnutls-cli) shift; GNUTLS_CLI="$1";;
309 --gnutls-legacy-cli) shift; GNUTLS_LEGACY_CLI="$1";;
310 --gnutls-legacy-serv) shift; GNUTLS_LEGACY_SERV="$1";;
311 --gnutls-serv) shift; GNUTLS_SERV="$1";;
312 --help|-h) usage; exit;;
313 --keep-going|-k) KEEP_GOING=1;;
Gilles Peskineb3241cb2019-01-08 23:44:07 +0100314 --list-all-components) printf '%s\n' $ALL_COMPONENTS; exit;;
315 --list-components) printf '%s\n' $SUPPORTED_COMPONENTS; exit;;
Gilles Peskine57db6ff2019-01-08 22:04:31 +0100316 --memory|-m) MEMORY=1;;
Gilles Peskine53084872019-01-09 23:13:54 +0100317 --no-armcc) no_armcc=1;;
Gilles Peskine57db6ff2019-01-08 22:04:31 +0100318 --no-force) FORCE=0;;
319 --no-keep-going) KEEP_GOING=0;;
320 --no-memory) MEMORY=0;;
321 --no-yotta) YOTTA=0;;
322 --openssl) shift; OPENSSL="$1";;
323 --openssl-legacy) shift; OPENSSL_LEGACY="$1";;
324 --out-of-source-dir) shift; OUT_OF_SOURCE_DIR="$1";;
325 --random-seed) unset SEED;;
326 --release-test|-r) SEED=1;;
327 --seed|-s) shift; SEED="$1";;
328 --yotta) YOTTA=1;;
Gilles Peskine91bd8b72019-01-08 23:01:34 +0100329 -*)
Gilles Peskine57db6ff2019-01-08 22:04:31 +0100330 echo >&2 "Unknown option: $1"
331 echo >&2 "Run $0 --help for usage."
332 exit 120
333 ;;
Gilles Peskineeb39b9b2019-01-08 23:41:00 +0100334 *) COMMAND_LINE_COMPONENTS="$COMMAND_LINE_COMPONENTS $1";;
Gilles Peskine57db6ff2019-01-08 22:04:31 +0100335 esac
336 shift
337 done
Gilles Peskine91bd8b72019-01-08 23:01:34 +0100338
Gilles Peskineeb39b9b2019-01-08 23:41:00 +0100339 if [ -z "$COMMAND_LINE_COMPONENTS" ]; then
340 all_except=1
341 fi
342
Gilles Peskine53084872019-01-09 23:13:54 +0100343 # --no-armcc is a legacy option. The modern way is --except '*_armcc*'.
344 # Ignore it if components are listed explicitly on the command line.
345 if [ -n "$no_armcc" ] && [ -n "$all_except" ]; then
346 COMMAND_LINE_COMPONENTS="$COMMAND_LINE_COMPONENTS *_armcc*"
347 # --no-armcc also disables yotta.
348 COMMAND_LINE_COMPONENTS="$COMMAND_LINE_COMPONENTS *_yotta*"
349 fi
350
Gilles Peskineeb39b9b2019-01-08 23:41:00 +0100351 # Build the list of components to run.
352 if [ -n "$all_except" ]; then
Gilles Peskine6e984232018-11-27 21:37:53 +0100353 RUN_COMPONENTS=
Gilles Peskine3fbdd212019-01-08 23:33:45 +0100354 for component in $SUPPORTED_COMPONENTS; do
Gilles Peskine6e984232018-11-27 21:37:53 +0100355 if ! is_component_excluded "$component"; then
356 RUN_COMPONENTS="$RUN_COMPONENTS $component"
357 fi
358 done
Gilles Peskine6e984232018-11-27 21:37:53 +0100359 else
Gilles Peskineeb39b9b2019-01-08 23:41:00 +0100360 RUN_COMPONENTS="$COMMAND_LINE_COMPONENTS"
Gilles Peskine91bd8b72019-01-08 23:01:34 +0100361 fi
Gilles Peskineeb39b9b2019-01-08 23:41:00 +0100362
363 unset all_except
Gilles Peskine53084872019-01-09 23:13:54 +0100364 unset no_armcc
Gilles Peskine57db6ff2019-01-08 22:04:31 +0100365}
SimonB2e23c822016-04-16 21:54:39 +0100366
Gilles Peskine57db6ff2019-01-08 22:04:31 +0100367pre_check_git () {
368 if [ $FORCE -eq 1 ]; then
369 if [ $YOTTA -eq 1 ]; then
370 rm -rf yotta/module "$OUT_OF_SOURCE_DIR"
371 fi
372 git checkout-index -f -q $CONFIG_H
373 cleanup
374 else
375
376 if [ $YOTTA -ne 0 ] && [ -d yotta/module ]; then
377 err_msg "Warning - there is an existing yotta module in the directory 'yotta/module'"
378 echo "You can either delete your work and retry, or force the test to overwrite the"
379 echo "test by rerunning the script as: $0 --force"
380 exit 1
381 fi
382
383 if [ -d "$OUT_OF_SOURCE_DIR" ]; then
384 echo "Warning - there is an existing directory at '$OUT_OF_SOURCE_DIR'" >&2
385 echo "You can either delete this directory manually, or force the test by rerunning"
386 echo "the script as: $0 --force --out-of-source-dir $OUT_OF_SOURCE_DIR"
387 exit 1
388 fi
389
Gilles Peskinec9663b12019-01-09 22:30:01 +0100390 if ! git diff --quiet include/mbedtls/config.h; then
Gilles Peskine57db6ff2019-01-08 22:04:31 +0100391 err_msg "Warning - the configuration file 'include/mbedtls/config.h' has been edited. "
392 echo "You can either delete or preserve your work, or force the test by rerunning the"
393 echo "script as: $0 --force"
394 exit 1
395 fi
Gilles Peskineda519252017-11-30 13:22:04 +0100396 fi
Gilles Peskine57db6ff2019-01-08 22:04:31 +0100397}
SimonB2e23c822016-04-16 21:54:39 +0100398
Gilles Peskine57db6ff2019-01-08 22:04:31 +0100399pre_setup_keep_going () {
Gilles Peskine7c652162017-12-11 00:01:40 +0100400 failure_summary=
401 failure_count=0
402 start_red=
403 end_color=
404 if [ -t 1 ]; then
Gilles Peskine9736b9d2018-01-02 21:54:17 +0100405 case "${TERM:-}" in
Gilles Peskine7c652162017-12-11 00:01:40 +0100406 *color*|cygwin|linux|rxvt*|screen|[Eex]term*)
407 start_red=$(printf '\033[31m')
408 end_color=$(printf '\033[0m')
409 ;;
410 esac
411 fi
412 record_status () {
413 if "$@"; then
414 last_status=0
415 else
416 last_status=$?
417 text="$current_section: $* -> $last_status"
418 failure_summary="$failure_summary
419$text"
420 failure_count=$((failure_count + 1))
421 echo "${start_red}^^^^$text^^^^${end_color}"
422 fi
423 }
424 make () {
425 case "$*" in
426 *test|*check)
427 if [ $build_status -eq 0 ]; then
428 record_status command make "$@"
429 else
430 echo "(skipped because the build failed)"
431 fi
432 ;;
433 *)
434 record_status command make "$@"
435 build_status=$last_status
436 ;;
437 esac
438 }
439 final_report () {
440 if [ $failure_count -gt 0 ]; then
441 echo
442 echo "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!"
443 echo "${start_red}FAILED: $failure_count${end_color}$failure_summary"
444 echo "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!"
Jaeden Amero5113bde2018-07-20 16:42:14 +0100445 exit 1
Gilles Peskine7c652162017-12-11 00:01:40 +0100446 elif [ -z "${1-}" ]; then
447 echo "SUCCESS :)"
448 fi
449 if [ -n "${1-}" ]; then
450 echo "Killed by SIG$1."
451 fi
452 }
Gilles Peskine57db6ff2019-01-08 22:04:31 +0100453}
454
Gilles Peskine7c652162017-12-11 00:01:40 +0100455if_build_succeeded () {
456 if [ $build_status -eq 0 ]; then
457 record_status "$@"
458 fi
459}
460
Gilles Peskine57db6ff2019-01-08 22:04:31 +0100461pre_print_configuration () {
462 msg "info: $0 configuration"
463 echo "MEMORY: $MEMORY"
464 echo "FORCE: $FORCE"
465 echo "SEED: ${SEED-"UNSET"}"
466 echo "OPENSSL: $OPENSSL"
467 echo "OPENSSL_LEGACY: $OPENSSL_LEGACY"
468 echo "GNUTLS_CLI: $GNUTLS_CLI"
469 echo "GNUTLS_SERV: $GNUTLS_SERV"
470 echo "GNUTLS_LEGACY_CLI: $GNUTLS_LEGACY_CLI"
471 echo "GNUTLS_LEGACY_SERV: $GNUTLS_LEGACY_SERV"
472 echo "ARMC5_BIN_DIR: $ARMC5_BIN_DIR"
473 echo "ARMC6_BIN_DIR: $ARMC6_BIN_DIR"
474}
Andres AG7770ea82016-10-10 15:46:20 +0100475
Andres AGd9eba4b2016-08-26 14:42:14 +0100476# Make sure the tools we need are available.
Gilles Peskine57db6ff2019-01-08 22:04:31 +0100477pre_check_tools () {
Gilles Peskine541fb1e2019-01-06 22:40:00 +0000478 # Build the list of variables to pass to output_env.sh.
479 set env
Gilles Peskine57db6ff2019-01-08 22:04:31 +0100480
Gilles Peskine541fb1e2019-01-06 22:40:00 +0000481 case " $RUN_COMPONENTS " in
482 # Require OpenSSL and GnuTLS if running any tests (as opposed to
483 # only doing builds). Not all tests run OpenSSL and GnuTLS, but this
484 # is a good enough approximation in practice.
485 *" test_"*)
486 # To avoid setting OpenSSL and GnuTLS for each call to compat.sh
487 # and ssl-opt.sh, we just export the variables they require.
488 export OPENSSL_CMD="$OPENSSL"
489 export GNUTLS_CLI="$GNUTLS_CLI"
490 export GNUTLS_SERV="$GNUTLS_SERV"
491 # Avoid passing --seed flag in every call to ssl-opt.sh
492 if [ -n "${SEED-}" ]; then
493 export SEED
494 fi
495 set "$@" OPENSSL="$OPENSSL" OPENSSL_LEGACY="$OPENSSL_LEGACY"
496 set "$@" GNUTLS_CLI="$GNUTLS_CLI" GNUTLS_SERV="$GNUTLS_SERV"
497 set "$@" GNUTLS_LEGACY_CLI="$GNUTLS_LEGACY_CLI"
498 set "$@" GNUTLS_LEGACY_SERV="$GNUTLS_LEGACY_SERV"
499 check_tools "$OPENSSL" "$OPENSSL_LEGACY" \
500 "$GNUTLS_CLI" "$GNUTLS_SERV" \
501 "$GNUTLS_LEGACY_CLI" "$GNUTLS_LEGACY_SERV"
502 ;;
503 esac
Gilles Peskine57db6ff2019-01-08 22:04:31 +0100504
Gilles Peskine541fb1e2019-01-06 22:40:00 +0000505 case " $RUN_COMPONENTS " in
506 *_doxygen[_\ ]*) check_tools "doxygen" "dot";;
507 esac
Gilles Peskine57db6ff2019-01-08 22:04:31 +0100508
Gilles Peskine541fb1e2019-01-06 22:40:00 +0000509 case " $RUN_COMPONENTS " in
510 *_arm_none_eabi_gcc[_\ ]*) check_tools "arm-none-eabi-gcc";;
511 esac
512
513 case " $RUN_COMPONENTS " in
514 *_mingw[_\ ]*) check_tools "i686-w64-mingw32-gcc";;
515 esac
516
517 case " $RUN_COMPONENTS " in
Gilles Peskine53084872019-01-09 23:13:54 +0100518 *_armcc*|*_yotta*)
Gilles Peskine541fb1e2019-01-06 22:40:00 +0000519 ARMC5_CC="$ARMC5_BIN_DIR/armcc"
520 ARMC5_AR="$ARMC5_BIN_DIR/armar"
521 ARMC6_CC="$ARMC6_BIN_DIR/armclang"
522 ARMC6_AR="$ARMC6_BIN_DIR/armar"
Gilles Peskine53084872019-01-09 23:13:54 +0100523 check_tools "$ARMC5_CC" "$ARMC5_AR" "$ARMC6_CC" "$ARMC6_AR";;
524 esac
Gilles Peskine57db6ff2019-01-08 22:04:31 +0100525
526 msg "info: output_env.sh"
Gilles Peskine53084872019-01-09 23:13:54 +0100527 case $RUN_COMPONENTS in
528 *_armcc*|*_yotta*)
529 set "$@" ARMC5_CC="$ARMC5_CC" ARMC6_CC="$ARMC6_CC" RUN_ARMCC=1;;
530 *) set "$@" RUN_ARMCC=0;;
531 esac
532 "$@" scripts/output_env.sh
Gilles Peskine57db6ff2019-01-08 22:04:31 +0100533}
Andres AGd9eba4b2016-08-26 14:42:14 +0100534
Gilles Peskine192c72f2017-12-21 15:59:21 +0100535
536
537################################################################
538#### Basic checks
539################################################################
SimonB2e23c822016-04-16 21:54:39 +0100540
541#
542# Test Suites to be executed
543#
Manuel Pégourié-Gonnard57255b12014-06-09 11:21:49 +0200544# The test ordering tries to optimize for the following criteria:
Manuel Pégourié-Gonnard89d69b32014-11-20 13:48:53 +0100545# 1. Catch possible problems early, by running first tests that run quickly
Manuel Pégourié-Gonnard61bc57a2014-08-14 11:29:06 +0200546# and/or are more likely to fail than others (eg I use Clang most of the
547# time, so start with a GCC build).
Manuel Pégourié-Gonnard57255b12014-06-09 11:21:49 +0200548# 2. Minimize total running time, by avoiding useless rebuilds
549#
550# Indicative running times are given for reference.
Manuel Pégourié-Gonnard80955ee2014-03-19 18:29:01 +0100551
Gilles Peskine1a2ca722019-01-08 22:35:16 +0100552component_check_recursion () {
Gilles Peskine57db6ff2019-01-08 22:04:31 +0100553 msg "test: recursion.pl" # < 1s
554 record_status tests/scripts/recursion.pl library/*.c
Gilles Peskine1a2ca722019-01-08 22:35:16 +0100555}
Manuel Pégourié-Gonnardea29d152014-11-20 17:32:33 +0100556
Gilles Peskine1a2ca722019-01-08 22:35:16 +0100557component_check_generated_files () {
Gilles Peskine57db6ff2019-01-08 22:04:31 +0100558 msg "test: freshness of generated source files" # < 1s
559 record_status tests/scripts/check-generated-files.sh
Gilles Peskine1a2ca722019-01-08 22:35:16 +0100560}
Manuel Pégourié-Gonnardb3b8e432015-02-13 14:52:19 +0000561
Gilles Peskine1a2ca722019-01-08 22:35:16 +0100562component_check_doxy_blocks () {
Gilles Peskine57db6ff2019-01-08 22:04:31 +0100563 msg "test: doxygen markup outside doxygen blocks" # < 1s
564 record_status tests/scripts/check-doxy-blocks.pl
Gilles Peskine1a2ca722019-01-08 22:35:16 +0100565}
Manuel Pégourié-Gonnardd09a6b52015-04-09 17:19:23 +0200566
Gilles Peskine1a2ca722019-01-08 22:35:16 +0100567component_check_files () {
Gilles Peskine57db6ff2019-01-08 22:04:31 +0100568 msg "test: check-files.py" # < 1s
Gilles Peskine57db6ff2019-01-08 22:04:31 +0100569 record_status tests/scripts/check-files.py
Gilles Peskine1a2ca722019-01-08 22:35:16 +0100570}
Manuel Pégourié-Gonnard77d56bb2015-07-28 15:00:37 +0200571
Gilles Peskine1a2ca722019-01-08 22:35:16 +0100572component_check_names () {
Gilles Peskine57db6ff2019-01-08 22:04:31 +0100573 msg "test/build: declared and exported names" # < 3s
Gilles Peskine57db6ff2019-01-08 22:04:31 +0100574 record_status tests/scripts/check-names.sh
Gilles Peskine1a2ca722019-01-08 22:35:16 +0100575}
Manuel Pégourié-Gonnard9b06abe2015-06-25 09:56:07 +0200576
Gilles Peskine1a2ca722019-01-08 22:35:16 +0100577component_check_doxygen_warnings () {
Gilles Peskine57db6ff2019-01-08 22:04:31 +0100578 msg "test: doxygen warnings" # ~ 3s
Gilles Peskine57db6ff2019-01-08 22:04:31 +0100579 record_status tests/scripts/doxygen.sh
Gilles Peskine1a2ca722019-01-08 22:35:16 +0100580}
Andres Amaya Garciadd29c2f2017-05-04 11:35:51 +0100581
Simon Butcher948f2642018-07-20 21:27:33 +0100582
Gilles Peskine1a2ca722019-01-08 22:35:16 +0100583################################################################
584#### Build and test many configurations and targets
585################################################################
Gilles Peskine57db6ff2019-01-08 22:04:31 +0100586
Gilles Peskine1a2ca722019-01-08 22:35:16 +0100587component_build_yotta () {
Gilles Peskine53084872019-01-09 23:13:54 +0100588 # Note - use of yotta is deprecated, and yotta also requires armcc to be on the
589 # path, and uses whatever version of armcc it finds there.
590 msg "build: create and build yotta module" # ~ 30s
591 record_status tests/scripts/yotta-build.sh
592}
593support_build_yotta () {
594 [ $YOTTA -ne 0 ]
Gilles Peskine1a2ca722019-01-08 22:35:16 +0100595}
Gilles Peskine57db6ff2019-01-08 22:04:31 +0100596
Gilles Peskine1a2ca722019-01-08 22:35:16 +0100597component_test_default_cmake_gcc_asan () {
Gilles Peskine57db6ff2019-01-08 22:04:31 +0100598 msg "build: cmake, gcc, ASan" # ~ 1 min 50s
Gilles Peskine57db6ff2019-01-08 22:04:31 +0100599 CC=gcc cmake -D CMAKE_BUILD_TYPE:String=Asan .
Gilles Peskine7ad603e2017-12-10 23:22:20 +0100600 make
Manuel Pégourié-Gonnard4a9dc2a2014-05-09 13:46:59 +0200601
Gilles Peskine57db6ff2019-01-08 22:04:31 +0100602 msg "test: main suites (inc. selftests) (ASan build)" # ~ 50s
Gilles Peskine7ad603e2017-12-10 23:22:20 +0100603 make test
Manuel Pégourié-Gonnard9bda9b32014-11-20 13:10:22 +0100604
Gilles Peskine57db6ff2019-01-08 22:04:31 +0100605 msg "test: ssl-opt.sh (ASan build)" # ~ 1 min
Gilles Peskine7c652162017-12-11 00:01:40 +0100606 if_build_succeeded tests/ssl-opt.sh
Manuel Pégourié-Gonnard9bda9b32014-11-20 13:10:22 +0100607
Gilles Peskine57db6ff2019-01-08 22:04:31 +0100608 msg "test: compat.sh (ASan build)" # ~ 6 min
609 if_build_succeeded tests/compat.sh
Gilles Peskine1a2ca722019-01-08 22:35:16 +0100610}
Manuel Pégourié-Gonnard392d3dd2015-01-26 14:03:56 +0000611
Gilles Peskine3484ed82019-01-08 22:51:19 +0100612component_test_ref_configs () {
613 msg "test/build: ref-configs (ASan build)" # ~ 6 min 20s
614 CC=gcc cmake -D CMAKE_BUILD_TYPE:String=Asan .
615 record_status tests/scripts/test-ref-configs.pl
616}
617
Gilles Peskine1a2ca722019-01-08 22:35:16 +0100618component_test_sslv3 () {
Gilles Peskine57db6ff2019-01-08 22:04:31 +0100619 msg "build: Default + SSLv3 (ASan build)" # ~ 6 min
Gilles Peskine57db6ff2019-01-08 22:04:31 +0100620 scripts/config.pl set MBEDTLS_SSL_PROTO_SSL3
621 CC=gcc cmake -D CMAKE_BUILD_TYPE:String=Asan .
622 make
Manuel Pégourié-Gonnard392d3dd2015-01-26 14:03:56 +0000623
Gilles Peskine57db6ff2019-01-08 22:04:31 +0100624 msg "test: SSLv3 - main suites (inc. selftests) (ASan build)" # ~ 50s
625 make test
626
627 msg "build: SSLv3 - compat.sh (ASan build)" # ~ 6 min
628 if_build_succeeded tests/compat.sh -m 'tls1 tls1_1 tls1_2 dtls1 dtls1_2'
629 if_build_succeeded env OPENSSL_CMD="$OPENSSL_LEGACY" tests/compat.sh -m 'ssl3'
630
631 msg "build: SSLv3 - ssl-opt.sh (ASan build)" # ~ 6 min
632 if_build_succeeded tests/ssl-opt.sh
Gilles Peskine1a2ca722019-01-08 22:35:16 +0100633}
Gilles Peskine57db6ff2019-01-08 22:04:31 +0100634
Gilles Peskine1a2ca722019-01-08 22:35:16 +0100635component_test_no_renegotiation () {
Gilles Peskine57db6ff2019-01-08 22:04:31 +0100636 msg "build: Default + !MBEDTLS_SSL_RENEGOTIATION (ASan build)" # ~ 6 min
Gilles Peskine57db6ff2019-01-08 22:04:31 +0100637 scripts/config.pl unset MBEDTLS_SSL_RENEGOTIATION
638 CC=gcc cmake -D CMAKE_BUILD_TYPE:String=Asan .
639 make
640
641 msg "test: !MBEDTLS_SSL_RENEGOTIATION - main suites (inc. selftests) (ASan build)" # ~ 50s
642 make test
643
644 msg "test: !MBEDTLS_SSL_RENEGOTIATION - ssl-opt.sh (ASan build)" # ~ 6 min
645 if_build_succeeded tests/ssl-opt.sh
Gilles Peskine1a2ca722019-01-08 22:35:16 +0100646}
Gilles Peskine57db6ff2019-01-08 22:04:31 +0100647
Gilles Peskine1a2ca722019-01-08 22:35:16 +0100648component_test_rsa_no_crt () {
Gilles Peskine57db6ff2019-01-08 22:04:31 +0100649 msg "build: Default + RSA_NO_CRT (ASan build)" # ~ 6 min
Gilles Peskine57db6ff2019-01-08 22:04:31 +0100650 scripts/config.pl set MBEDTLS_RSA_NO_CRT
651 CC=gcc cmake -D CMAKE_BUILD_TYPE:String=Asan .
652 make
653
654 msg "test: RSA_NO_CRT - main suites (inc. selftests) (ASan build)" # ~ 50s
655 make test
656
657 msg "test: RSA_NO_CRT - RSA-related part of ssl-opt.sh (ASan build)" # ~ 5s
658 if_build_succeeded tests/ssl-opt.sh -f RSA
659
660 msg "test: RSA_NO_CRT - RSA-related part of compat.sh (ASan build)" # ~ 3 min
661 if_build_succeeded tests/compat.sh -t RSA
Gilles Peskine1a2ca722019-01-08 22:35:16 +0100662}
Gilles Peskine57db6ff2019-01-08 22:04:31 +0100663
Gilles Peskine1a2ca722019-01-08 22:35:16 +0100664component_test_full_cmake_clang () {
Gilles Peskine57db6ff2019-01-08 22:04:31 +0100665 msg "build: cmake, full config, clang" # ~ 50s
Gilles Peskine57db6ff2019-01-08 22:04:31 +0100666 scripts/config.pl full
667 scripts/config.pl unset MBEDTLS_MEMORY_BACKTRACE # too slow for tests
668 CC=clang cmake -D CMAKE_BUILD_TYPE:String=Check -D ENABLE_TESTING=On .
669 make
670
671 msg "test: main suites (full config)" # ~ 5s
672 make test
673
674 msg "test: ssl-opt.sh default (full config)" # ~ 1s
675 if_build_succeeded tests/ssl-opt.sh -f Default
676
677 msg "test: compat.sh RC4, DES & NULL (full config)" # ~ 2 min
678 if_build_succeeded env OPENSSL_CMD="$OPENSSL_LEGACY" GNUTLS_CLI="$GNUTLS_LEGACY_CLI" GNUTLS_SERV="$GNUTLS_LEGACY_SERV" tests/compat.sh -e '3DES\|DES-CBC3' -f 'NULL\|DES\|RC4\|ARCFOUR'
Gilles Peskine1a2ca722019-01-08 22:35:16 +0100679}
Gilles Peskine57db6ff2019-01-08 22:04:31 +0100680
Gilles Peskine1a2ca722019-01-08 22:35:16 +0100681component_build_deprecated () {
Gilles Peskine57db6ff2019-01-08 22:04:31 +0100682 msg "build: make, full config + DEPRECATED_WARNING, gcc -O" # ~ 30s
Gilles Peskine57db6ff2019-01-08 22:04:31 +0100683 scripts/config.pl full
684 scripts/config.pl set MBEDTLS_DEPRECATED_WARNING
685 # Build with -O -Wextra to catch a maximum of issues.
686 make CC=gcc CFLAGS='-O -Werror -Wall -Wextra' lib programs
687 make CC=gcc CFLAGS='-O -Werror -Wall -Wextra -Wno-unused-function' tests
688
689 msg "build: make, full config + DEPRECATED_REMOVED, clang -O" # ~ 30s
690 # No cleanup, just tweak the configuration and rebuild
691 make clean
692 scripts/config.pl unset MBEDTLS_DEPRECATED_WARNING
693 scripts/config.pl set MBEDTLS_DEPRECATED_REMOVED
694 # Build with -O -Wextra to catch a maximum of issues.
695 make CC=clang CFLAGS='-O -Werror -Wall -Wextra' lib programs
696 make CC=clang CFLAGS='-O -Werror -Wall -Wextra -Wno-unused-function' tests
Gilles Peskine1a2ca722019-01-08 22:35:16 +0100697}
Gilles Peskine57db6ff2019-01-08 22:04:31 +0100698
Gilles Peskine1a2ca722019-01-08 22:35:16 +0100699component_test_depends_curves () {
Gilles Peskine57db6ff2019-01-08 22:04:31 +0100700 msg "test/build: curves.pl (gcc)" # ~ 4 min
Gilles Peskine57db6ff2019-01-08 22:04:31 +0100701 record_status tests/scripts/curves.pl
Gilles Peskine1a2ca722019-01-08 22:35:16 +0100702}
Gilles Peskine57db6ff2019-01-08 22:04:31 +0100703
Gilles Peskine1a2ca722019-01-08 22:35:16 +0100704component_test_depends_hashes () {
Gilles Peskine57db6ff2019-01-08 22:04:31 +0100705 msg "test/build: depends-hashes.pl (gcc)" # ~ 2 min
Gilles Peskine57db6ff2019-01-08 22:04:31 +0100706 record_status tests/scripts/depends-hashes.pl
Gilles Peskine1a2ca722019-01-08 22:35:16 +0100707}
Gilles Peskine57db6ff2019-01-08 22:04:31 +0100708
Gilles Peskine1a2ca722019-01-08 22:35:16 +0100709component_test_depends_pkalgs () {
Gilles Peskine57db6ff2019-01-08 22:04:31 +0100710 msg "test/build: depends-pkalgs.pl (gcc)" # ~ 2 min
Gilles Peskine57db6ff2019-01-08 22:04:31 +0100711 record_status tests/scripts/depends-pkalgs.pl
Gilles Peskine1a2ca722019-01-08 22:35:16 +0100712}
Gilles Peskine57db6ff2019-01-08 22:04:31 +0100713
Gilles Peskine1a2ca722019-01-08 22:35:16 +0100714component_build_key_exchanges () {
Gilles Peskine57db6ff2019-01-08 22:04:31 +0100715 msg "test/build: key-exchanges (gcc)" # ~ 1 min
Gilles Peskine57db6ff2019-01-08 22:04:31 +0100716 record_status tests/scripts/key-exchanges.pl
Gilles Peskine1a2ca722019-01-08 22:35:16 +0100717}
Gilles Peskine57db6ff2019-01-08 22:04:31 +0100718
Gilles Peskine1a2ca722019-01-08 22:35:16 +0100719component_build_default_make_gcc () {
Gilles Peskine57db6ff2019-01-08 22:04:31 +0100720 msg "build: Unix make, -Os (gcc)" # ~ 30s
Gilles Peskine57db6ff2019-01-08 22:04:31 +0100721 make CC=gcc CFLAGS='-Werror -Wall -Wextra -Os'
Gilles Peskine1a2ca722019-01-08 22:35:16 +0100722}
Gilles Peskine57db6ff2019-01-08 22:04:31 +0100723
Gilles Peskine1a2ca722019-01-08 22:35:16 +0100724component_test_no_platform () {
Gilles Peskine57db6ff2019-01-08 22:04:31 +0100725 # Full configuration build, without platform support, file IO and net sockets.
726 # This should catch missing mbedtls_printf definitions, and by disabling file
727 # IO, it should catch missing '#include <stdio.h>'
728 msg "build: full config except platform/fsio/net, make, gcc, C99" # ~ 30s
Gilles Peskine57db6ff2019-01-08 22:04:31 +0100729 scripts/config.pl full
730 scripts/config.pl unset MBEDTLS_PLATFORM_C
731 scripts/config.pl unset MBEDTLS_NET_C
732 scripts/config.pl unset MBEDTLS_PLATFORM_MEMORY
733 scripts/config.pl unset MBEDTLS_PLATFORM_PRINTF_ALT
734 scripts/config.pl unset MBEDTLS_PLATFORM_FPRINTF_ALT
735 scripts/config.pl unset MBEDTLS_PLATFORM_SNPRINTF_ALT
736 scripts/config.pl unset MBEDTLS_PLATFORM_TIME_ALT
737 scripts/config.pl unset MBEDTLS_PLATFORM_EXIT_ALT
738 scripts/config.pl unset MBEDTLS_ENTROPY_NV_SEED
739 scripts/config.pl unset MBEDTLS_MEMORY_BUFFER_ALLOC_C
740 scripts/config.pl unset MBEDTLS_FS_IO
741 # Note, _DEFAULT_SOURCE needs to be defined for platforms using glibc version >2.19,
742 # to re-enable platform integration features otherwise disabled in C99 builds
743 make CC=gcc CFLAGS='-Werror -Wall -Wextra -std=c99 -pedantic -O0 -D_DEFAULT_SOURCE' lib programs
744 make CC=gcc CFLAGS='-Werror -Wall -Wextra -O0' test
Gilles Peskine1a2ca722019-01-08 22:35:16 +0100745}
Gilles Peskine57db6ff2019-01-08 22:04:31 +0100746
Gilles Peskine1a2ca722019-01-08 22:35:16 +0100747component_build_no_std_function () {
Gilles Peskine57db6ff2019-01-08 22:04:31 +0100748 # catch compile bugs in _uninit functions
749 msg "build: full config with NO_STD_FUNCTION, make, gcc" # ~ 30s
Gilles Peskine57db6ff2019-01-08 22:04:31 +0100750 scripts/config.pl full
751 scripts/config.pl set MBEDTLS_PLATFORM_NO_STD_FUNCTIONS
752 scripts/config.pl unset MBEDTLS_ENTROPY_NV_SEED
753 make CC=gcc CFLAGS='-Werror -Wall -Wextra -O0'
Gilles Peskine1a2ca722019-01-08 22:35:16 +0100754}
Gilles Peskine57db6ff2019-01-08 22:04:31 +0100755
Gilles Peskine1a2ca722019-01-08 22:35:16 +0100756component_build_no_ssl_srv () {
Gilles Peskine57db6ff2019-01-08 22:04:31 +0100757 msg "build: full config except ssl_srv.c, make, gcc" # ~ 30s
Gilles Peskine57db6ff2019-01-08 22:04:31 +0100758 scripts/config.pl full
759 scripts/config.pl unset MBEDTLS_SSL_SRV_C
760 make CC=gcc CFLAGS='-Werror -Wall -Wextra -O0'
Gilles Peskine1a2ca722019-01-08 22:35:16 +0100761}
Gilles Peskine57db6ff2019-01-08 22:04:31 +0100762
Gilles Peskine1a2ca722019-01-08 22:35:16 +0100763component_build_no_ssl_cli () {
Gilles Peskine57db6ff2019-01-08 22:04:31 +0100764 msg "build: full config except ssl_cli.c, make, gcc" # ~ 30s
Gilles Peskine57db6ff2019-01-08 22:04:31 +0100765 scripts/config.pl full
766 scripts/config.pl unset MBEDTLS_SSL_CLI_C
767 make CC=gcc CFLAGS='-Werror -Wall -Wextra -O0'
Gilles Peskine1a2ca722019-01-08 22:35:16 +0100768}
Gilles Peskine57db6ff2019-01-08 22:04:31 +0100769
Gilles Peskine1a2ca722019-01-08 22:35:16 +0100770component_build_no_sockets () {
Gilles Peskine57db6ff2019-01-08 22:04:31 +0100771 # Note, C99 compliance can also be tested with the sockets support disabled,
772 # as that requires a POSIX platform (which isn't the same as C99).
773 msg "build: full config except net_sockets.c, make, gcc -std=c99 -pedantic" # ~ 30s
Gilles Peskine57db6ff2019-01-08 22:04:31 +0100774 scripts/config.pl full
775 scripts/config.pl unset MBEDTLS_NET_C # getaddrinfo() undeclared, etc.
776 scripts/config.pl set MBEDTLS_NO_PLATFORM_ENTROPY # uses syscall() on GNU/Linux
777 make CC=gcc CFLAGS='-Werror -Wall -Wextra -O0 -std=c99 -pedantic' lib
Gilles Peskine1a2ca722019-01-08 22:35:16 +0100778}
Gilles Peskine57db6ff2019-01-08 22:04:31 +0100779
Gilles Peskine1a2ca722019-01-08 22:35:16 +0100780component_test_no_max_fragment_length () {
Gilles Peskine57db6ff2019-01-08 22:04:31 +0100781 msg "build: default config except MFL extension (ASan build)" # ~ 30s
Gilles Peskine57db6ff2019-01-08 22:04:31 +0100782 scripts/config.pl unset MBEDTLS_SSL_MAX_FRAGMENT_LENGTH
783 CC=gcc cmake -D CMAKE_BUILD_TYPE:String=Asan .
784 make
785
786 msg "test: ssl-opt.sh, MFL-related tests"
787 if_build_succeeded tests/ssl-opt.sh -f "Max fragment length"
Gilles Peskine1a2ca722019-01-08 22:35:16 +0100788}
Gilles Peskine57db6ff2019-01-08 22:04:31 +0100789
Gilles Peskine1a2ca722019-01-08 22:35:16 +0100790component_test_null_entropy () {
Gilles Peskine57db6ff2019-01-08 22:04:31 +0100791 msg "build: default config with MBEDTLS_TEST_NULL_ENTROPY (ASan build)"
Gilles Peskine57db6ff2019-01-08 22:04:31 +0100792 scripts/config.pl set MBEDTLS_TEST_NULL_ENTROPY
793 scripts/config.pl set MBEDTLS_NO_DEFAULT_ENTROPY_SOURCES
794 scripts/config.pl set MBEDTLS_ENTROPY_C
795 scripts/config.pl unset MBEDTLS_ENTROPY_NV_SEED
796 scripts/config.pl unset MBEDTLS_ENTROPY_HARDWARE_ALT
797 scripts/config.pl unset MBEDTLS_HAVEGE_C
Gilles Peskine4e7b3232019-01-06 19:48:30 +0000798 CC=gcc cmake -D CMAKE_BUILD_TYPE:String=Asan -D UNSAFE_BUILD=ON .
Gilles Peskine57db6ff2019-01-08 22:04:31 +0100799 make
800
801 msg "test: MBEDTLS_TEST_NULL_ENTROPY - main suites (inc. selftests) (ASan build)"
802 make test
Gilles Peskine1a2ca722019-01-08 22:35:16 +0100803}
Gilles Peskine57db6ff2019-01-08 22:04:31 +0100804
Gilles Peskine1a2ca722019-01-08 22:35:16 +0100805component_test_platform_calloc_macro () {
Gilles Peskine57db6ff2019-01-08 22:04:31 +0100806 msg "build: MBEDTLS_PLATFORM_{CALLOC/FREE}_MACRO enabled (ASan build)"
Gilles Peskine57db6ff2019-01-08 22:04:31 +0100807 scripts/config.pl set MBEDTLS_PLATFORM_MEMORY
808 scripts/config.pl set MBEDTLS_PLATFORM_CALLOC_MACRO calloc
809 scripts/config.pl set MBEDTLS_PLATFORM_FREE_MACRO free
810 CC=gcc cmake -D CMAKE_BUILD_TYPE:String=Asan .
811 make
812
813 msg "test: MBEDTLS_PLATFORM_{CALLOC/FREE}_MACRO enabled (ASan build)"
814 make test
Gilles Peskine1a2ca722019-01-08 22:35:16 +0100815}
Gilles Peskine57db6ff2019-01-08 22:04:31 +0100816
Gilles Peskine1a2ca722019-01-08 22:35:16 +0100817component_test_make_shared () {
Gilles Peskine770ad7e2019-01-08 23:19:08 +0100818 msg "build/test: make shared" # ~ 40s
819 make SHARED=1 all check
Gilles Peskine1a2ca722019-01-08 22:35:16 +0100820}
821
Gilles Peskine3fbdd212019-01-08 23:33:45 +0100822component_test_m32_o0 () {
823 # Build once with -O0, to compile out the i386 specific inline assembly
824 msg "build: i386, make, gcc -O0 (ASan build)" # ~ 30s
825 scripts/config.pl full
826 make CC=gcc CFLAGS='-O0 -Werror -Wall -Wextra -m32 -fsanitize=address'
Gilles Peskine57db6ff2019-01-08 22:04:31 +0100827
Gilles Peskine3fbdd212019-01-08 23:33:45 +0100828 msg "test: i386, make, gcc -O0 (ASan build)"
829 make test
830}
831support_test_m32_o0 () {
832 case $(uname -m) in
833 *64*) true;;
834 *) false;;
835 esac
836}
Gilles Peskine57db6ff2019-01-08 22:04:31 +0100837
Gilles Peskine3fbdd212019-01-08 23:33:45 +0100838component_test_m32_o1 () {
839 # Build again with -O1, to compile in the i386 specific inline assembly
840 msg "build: i386, make, gcc -O1 (ASan build)" # ~ 30s
841 scripts/config.pl full
842 make CC=gcc CFLAGS='-O1 -Werror -Wall -Wextra -m32 -fsanitize=address'
Gilles Peskine57db6ff2019-01-08 22:04:31 +0100843
Gilles Peskine3fbdd212019-01-08 23:33:45 +0100844 msg "test: i386, make, gcc -O1 (ASan build)"
845 make test
846}
847support_test_m32_o1 () {
848 support_test_m32_o0 "$@"
849}
Gilles Peskine57db6ff2019-01-08 22:04:31 +0100850
Gilles Peskine3fbdd212019-01-08 23:33:45 +0100851component_test_mx32 () {
852 msg "build: 64-bit ILP32, make, gcc" # ~ 30s
853 scripts/config.pl full
854 make CC=gcc CFLAGS='-Werror -Wall -Wextra -mx32'
Gilles Peskine57db6ff2019-01-08 22:04:31 +0100855
Gilles Peskine3fbdd212019-01-08 23:33:45 +0100856 msg "test: 64-bit ILP32, make, gcc"
857 make test
858}
859support_test_mx32 () {
860 case $(uname -m) in
861 amd64|x86_64) true;;
862 *) false;;
863 esac
864}
Gilles Peskine57db6ff2019-01-08 22:04:31 +0100865
Gilles Peskine1a2ca722019-01-08 22:35:16 +0100866component_test_have_int32 () {
Gilles Peskine57db6ff2019-01-08 22:04:31 +0100867 msg "build: gcc, force 32-bit bignum limbs"
Gilles Peskine57db6ff2019-01-08 22:04:31 +0100868 scripts/config.pl unset MBEDTLS_HAVE_ASM
869 scripts/config.pl unset MBEDTLS_AESNI_C
870 scripts/config.pl unset MBEDTLS_PADLOCK_C
871 make CC=gcc CFLAGS='-Werror -Wall -Wextra -DMBEDTLS_HAVE_INT32'
872
873 msg "test: gcc, force 32-bit bignum limbs"
874 make test
Gilles Peskine1a2ca722019-01-08 22:35:16 +0100875}
Gilles Peskine57db6ff2019-01-08 22:04:31 +0100876
Gilles Peskine1a2ca722019-01-08 22:35:16 +0100877component_test_have_int64 () {
Gilles Peskine57db6ff2019-01-08 22:04:31 +0100878 msg "build: gcc, force 64-bit bignum limbs"
Gilles Peskine57db6ff2019-01-08 22:04:31 +0100879 scripts/config.pl unset MBEDTLS_HAVE_ASM
880 scripts/config.pl unset MBEDTLS_AESNI_C
881 scripts/config.pl unset MBEDTLS_PADLOCK_C
882 make CC=gcc CFLAGS='-Werror -Wall -Wextra -DMBEDTLS_HAVE_INT64'
883
884 msg "test: gcc, force 64-bit bignum limbs"
885 make test
Gilles Peskine1a2ca722019-01-08 22:35:16 +0100886}
Gilles Peskine57db6ff2019-01-08 22:04:31 +0100887
Gilles Peskine1a2ca722019-01-08 22:35:16 +0100888component_build_arm_none_eabi_gcc () {
Gilles Peskine57db6ff2019-01-08 22:04:31 +0100889 msg "build: arm-none-eabi-gcc, make" # ~ 10s
Gilles Peskine57db6ff2019-01-08 22:04:31 +0100890 scripts/config.pl full
891 scripts/config.pl unset MBEDTLS_NET_C
892 scripts/config.pl unset MBEDTLS_TIMING_C
893 scripts/config.pl unset MBEDTLS_FS_IO
894 scripts/config.pl unset MBEDTLS_ENTROPY_NV_SEED
895 scripts/config.pl set MBEDTLS_NO_PLATFORM_ENTROPY
896 # following things are not in the default config
897 scripts/config.pl unset MBEDTLS_HAVEGE_C # depends on timing.c
898 scripts/config.pl unset MBEDTLS_THREADING_PTHREAD
899 scripts/config.pl unset MBEDTLS_THREADING_C
900 scripts/config.pl unset MBEDTLS_MEMORY_BACKTRACE # execinfo.h
901 scripts/config.pl unset MBEDTLS_MEMORY_BUFFER_ALLOC_C # calls exit
902 make CC=arm-none-eabi-gcc AR=arm-none-eabi-ar LD=arm-none-eabi-ld CFLAGS='-Werror -Wall -Wextra' lib
Gilles Peskine1a2ca722019-01-08 22:35:16 +0100903}
Gilles Peskine57db6ff2019-01-08 22:04:31 +0100904
Gilles Peskine1a2ca722019-01-08 22:35:16 +0100905component_build_arm_none_eabi_gcc_no_udbl_division () {
Gilles Peskine57db6ff2019-01-08 22:04:31 +0100906 msg "build: arm-none-eabi-gcc -DMBEDTLS_NO_UDBL_DIVISION, make" # ~ 10s
Gilles Peskine57db6ff2019-01-08 22:04:31 +0100907 scripts/config.pl full
908 scripts/config.pl unset MBEDTLS_NET_C
909 scripts/config.pl unset MBEDTLS_TIMING_C
910 scripts/config.pl unset MBEDTLS_FS_IO
911 scripts/config.pl unset MBEDTLS_ENTROPY_NV_SEED
912 scripts/config.pl set MBEDTLS_NO_PLATFORM_ENTROPY
913 # following things are not in the default config
914 scripts/config.pl unset MBEDTLS_HAVEGE_C # depends on timing.c
915 scripts/config.pl unset MBEDTLS_THREADING_PTHREAD
916 scripts/config.pl unset MBEDTLS_THREADING_C
917 scripts/config.pl unset MBEDTLS_MEMORY_BACKTRACE # execinfo.h
918 scripts/config.pl unset MBEDTLS_MEMORY_BUFFER_ALLOC_C # calls exit
919 scripts/config.pl set MBEDTLS_NO_UDBL_DIVISION
920 make CC=arm-none-eabi-gcc AR=arm-none-eabi-ar LD=arm-none-eabi-ld CFLAGS='-Werror -Wall -Wextra' lib
921 echo "Checking that software 64-bit division is not required"
922 ! grep __aeabi_uldiv library/*.o
Gilles Peskine1a2ca722019-01-08 22:35:16 +0100923}
Gilles Peskine57db6ff2019-01-08 22:04:31 +0100924
Gilles Peskine1a2ca722019-01-08 22:35:16 +0100925component_build_armcc () {
Gilles Peskine57db6ff2019-01-08 22:04:31 +0100926 msg "build: ARM Compiler 5, make"
Gilles Peskine57db6ff2019-01-08 22:04:31 +0100927 scripts/config.pl full
928 scripts/config.pl unset MBEDTLS_NET_C
929 scripts/config.pl unset MBEDTLS_TIMING_C
930 scripts/config.pl unset MBEDTLS_FS_IO
931 scripts/config.pl unset MBEDTLS_ENTROPY_NV_SEED
932 scripts/config.pl unset MBEDTLS_HAVE_TIME
933 scripts/config.pl unset MBEDTLS_HAVE_TIME_DATE
934 scripts/config.pl set MBEDTLS_NO_PLATFORM_ENTROPY
935 # following things are not in the default config
936 scripts/config.pl unset MBEDTLS_DEPRECATED_WARNING
937 scripts/config.pl unset MBEDTLS_HAVEGE_C # depends on timing.c
938 scripts/config.pl unset MBEDTLS_THREADING_PTHREAD
939 scripts/config.pl unset MBEDTLS_THREADING_C
940 scripts/config.pl unset MBEDTLS_MEMORY_BACKTRACE # execinfo.h
941 scripts/config.pl unset MBEDTLS_MEMORY_BUFFER_ALLOC_C # calls exit
942 scripts/config.pl unset MBEDTLS_PLATFORM_TIME_ALT # depends on MBEDTLS_HAVE_TIME
943
Gilles Peskine53084872019-01-09 23:13:54 +0100944 make CC="$ARMC5_CC" AR="$ARMC5_AR" WARNING_CFLAGS='--strict --c99' lib
945 make clean
Gilles Peskine57db6ff2019-01-08 22:04:31 +0100946
Gilles Peskine53084872019-01-09 23:13:54 +0100947 # ARM Compiler 6 - Target ARMv7-A
948 armc6_build_test "--target=arm-arm-none-eabi -march=armv7-a"
Gilles Peskine57db6ff2019-01-08 22:04:31 +0100949
Gilles Peskine53084872019-01-09 23:13:54 +0100950 # ARM Compiler 6 - Target ARMv7-M
951 armc6_build_test "--target=arm-arm-none-eabi -march=armv7-m"
Gilles Peskine57db6ff2019-01-08 22:04:31 +0100952
Gilles Peskine53084872019-01-09 23:13:54 +0100953 # ARM Compiler 6 - Target ARMv8-A - AArch32
954 armc6_build_test "--target=arm-arm-none-eabi -march=armv8.2-a"
Gilles Peskine57db6ff2019-01-08 22:04:31 +0100955
Gilles Peskine53084872019-01-09 23:13:54 +0100956 # ARM Compiler 6 - Target ARMv8-M
957 armc6_build_test "--target=arm-arm-none-eabi -march=armv8-m.main"
Gilles Peskine57db6ff2019-01-08 22:04:31 +0100958
Gilles Peskine53084872019-01-09 23:13:54 +0100959 # ARM Compiler 6 - Target ARMv8-A - AArch64
960 armc6_build_test "--target=aarch64-arm-none-eabi -march=armv8.2-a"
Gilles Peskine1a2ca722019-01-08 22:35:16 +0100961}
Manuel Pégourié-Gonnard392d3dd2015-01-26 14:03:56 +0000962
Gilles Peskine1a2ca722019-01-08 22:35:16 +0100963component_test_allow_sha1 () {
Gilles Peskine57db6ff2019-01-08 22:04:31 +0100964 msg "build: allow SHA1 in certificates by default"
Gilles Peskine57db6ff2019-01-08 22:04:31 +0100965 scripts/config.pl set MBEDTLS_TLS_DEFAULT_ALLOW_SHA1_IN_CERTIFICATES
966 make CFLAGS='-Werror -Wall -Wextra'
967 msg "test: allow SHA1 in certificates by default"
968 make test
969 if_build_succeeded tests/ssl-opt.sh -f SHA-1
Gilles Peskine1a2ca722019-01-08 22:35:16 +0100970}
Manuel Pégourié-Gonnard392d3dd2015-01-26 14:03:56 +0000971
Gilles Peskine1a2ca722019-01-08 22:35:16 +0100972component_build_mingw () {
Gilles Peskine57db6ff2019-01-08 22:04:31 +0100973 msg "build: Windows cross build - mingw64, make (Link Library)" # ~ 30s
Gilles Peskine57db6ff2019-01-08 22:04:31 +0100974 make CC=i686-w64-mingw32-gcc AR=i686-w64-mingw32-ar LD=i686-w64-minggw32-ld CFLAGS='-Werror -Wall -Wextra' WINDOWS_BUILD=1 lib programs
975
976 # note Make tests only builds the tests, but doesn't run them
977 make CC=i686-w64-mingw32-gcc AR=i686-w64-mingw32-ar LD=i686-w64-minggw32-ld CFLAGS='-Werror' WINDOWS_BUILD=1 tests
978 make WINDOWS_BUILD=1 clean
979
980 msg "build: Windows cross build - mingw64, make (DLL)" # ~ 30s
981 make CC=i686-w64-mingw32-gcc AR=i686-w64-mingw32-ar LD=i686-w64-minggw32-ld CFLAGS='-Werror -Wall -Wextra' WINDOWS_BUILD=1 SHARED=1 lib programs
982 make CC=i686-w64-mingw32-gcc AR=i686-w64-mingw32-ar LD=i686-w64-minggw32-ld CFLAGS='-Werror -Wall -Wextra' WINDOWS_BUILD=1 SHARED=1 tests
983 make WINDOWS_BUILD=1 clean
Gilles Peskine1a2ca722019-01-08 22:35:16 +0100984}
Gilles Peskine57db6ff2019-01-08 22:04:31 +0100985
Gilles Peskine1a2ca722019-01-08 22:35:16 +0100986component_test_memsan () {
Gilles Peskine770ad7e2019-01-08 23:19:08 +0100987 msg "build: MSan (clang)" # ~ 1 min 20s
988 scripts/config.pl unset MBEDTLS_AESNI_C # memsan doesn't grok asm
989 CC=clang cmake -D CMAKE_BUILD_TYPE:String=MemSan .
990 make
Gilles Peskine57db6ff2019-01-08 22:04:31 +0100991
Gilles Peskine770ad7e2019-01-08 23:19:08 +0100992 msg "test: main suites (MSan)" # ~ 10s
993 make test
Gilles Peskine57db6ff2019-01-08 22:04:31 +0100994
Gilles Peskine770ad7e2019-01-08 23:19:08 +0100995 msg "test: ssl-opt.sh (MSan)" # ~ 1 min
996 if_build_succeeded tests/ssl-opt.sh
Gilles Peskine57db6ff2019-01-08 22:04:31 +0100997
Gilles Peskine770ad7e2019-01-08 23:19:08 +0100998 # Optional part(s)
Gilles Peskine57db6ff2019-01-08 22:04:31 +0100999
Gilles Peskine770ad7e2019-01-08 23:19:08 +01001000 if [ "$MEMORY" -gt 0 ]; then
1001 msg "test: compat.sh (MSan)" # ~ 6 min 20s
1002 if_build_succeeded tests/compat.sh
Gilles Peskine1a2ca722019-01-08 22:35:16 +01001003 fi
1004}
Gilles Peskine57db6ff2019-01-08 22:04:31 +01001005
Gilles Peskine1a2ca722019-01-08 22:35:16 +01001006component_test_memcheck () {
Gilles Peskine770ad7e2019-01-08 23:19:08 +01001007 msg "build: Release (clang)"
1008 CC=clang cmake -D CMAKE_BUILD_TYPE:String=Release .
1009 make
Gilles Peskine57db6ff2019-01-08 22:04:31 +01001010
Gilles Peskine770ad7e2019-01-08 23:19:08 +01001011 msg "test: main suites valgrind (Release)"
1012 make memcheck
Gilles Peskine57db6ff2019-01-08 22:04:31 +01001013
Gilles Peskine770ad7e2019-01-08 23:19:08 +01001014 # Optional part(s)
1015 # Currently broken, programs don't seem to receive signals
1016 # under valgrind on OS X
Gilles Peskine57db6ff2019-01-08 22:04:31 +01001017
Gilles Peskine770ad7e2019-01-08 23:19:08 +01001018 if [ "$MEMORY" -gt 0 ]; then
1019 msg "test: ssl-opt.sh --memcheck (Release)"
1020 if_build_succeeded tests/ssl-opt.sh --memcheck
1021 fi
Gilles Peskine57db6ff2019-01-08 22:04:31 +01001022
Gilles Peskine770ad7e2019-01-08 23:19:08 +01001023 if [ "$MEMORY" -gt 1 ]; then
1024 msg "test: compat.sh --memcheck (Release)"
1025 if_build_succeeded tests/compat.sh --memcheck
1026 fi
Gilles Peskine1a2ca722019-01-08 22:35:16 +01001027}
Gilles Peskine57db6ff2019-01-08 22:04:31 +01001028
Gilles Peskine1a2ca722019-01-08 22:35:16 +01001029component_test_cmake_out_of_source () {
Gilles Peskine57db6ff2019-01-08 22:04:31 +01001030 msg "build: cmake 'out-of-source' build"
Gilles Peskine57db6ff2019-01-08 22:04:31 +01001031 MBEDTLS_ROOT_DIR="$PWD"
1032 mkdir "$OUT_OF_SOURCE_DIR"
1033 cd "$OUT_OF_SOURCE_DIR"
1034 cmake "$MBEDTLS_ROOT_DIR"
1035 make
1036
1037 msg "test: cmake 'out-of-source' build"
1038 make test
1039 # Test an SSL option that requires an auxiliary script in test/scripts/.
1040 # Also ensure that there are no error messages such as
1041 # "No such file or directory", which would indicate that some required
1042 # file is missing (ssl-opt.sh tolerates the absence of some files so
1043 # may exit with status 0 but emit errors).
1044 if_build_succeeded ./tests/ssl-opt.sh -f 'Fallback SCSV: beginning of list' 2>ssl-opt.err
1045 if [ -s ssl-opt.err ]; then
1046 cat ssl-opt.err >&2
1047 record_status [ ! -s ssl-opt.err ]
1048 rm ssl-opt.err
1049 fi
1050 cd "$MBEDTLS_ROOT_DIR"
1051 rm -rf "$OUT_OF_SOURCE_DIR"
1052 unset MBEDTLS_ROOT_DIR
1053}
Andres AGdc192212016-08-31 17:33:13 +01001054
Gilles Peskine192c72f2017-12-21 15:59:21 +01001055
1056
1057################################################################
1058#### Termination
1059################################################################
1060
Gilles Peskine57db6ff2019-01-08 22:04:31 +01001061post_report () {
1062 msg "Done, cleaning up"
1063 cleanup
1064
1065 final_report
1066}
1067
1068
1069
1070################################################################
1071#### Run all the things
1072################################################################
1073
Gilles Peskine1a2ca722019-01-08 22:35:16 +01001074# Run one component and clean up afterwards.
1075run_component () {
Gilles Peskine72adb432019-01-02 18:57:02 +01001076 # Back up the configuration in case the component modifies it.
1077 # The cleanup function will restore it.
1078 cp -p "$CONFIG_H" "$CONFIG_BAK"
Gilles Peskine11ddca62018-12-04 12:49:28 +01001079 current_component="$1"
Gilles Peskine1a2ca722019-01-08 22:35:16 +01001080 "$@"
1081 cleanup
1082}
1083
Gilles Peskine57db6ff2019-01-08 22:04:31 +01001084# Preliminary setup
1085pre_check_environment
1086pre_initialize_variables
1087pre_parse_command_line "$@"
1088
1089pre_check_git
1090build_status=0
1091if [ $KEEP_GOING -eq 1 ]; then
1092 pre_setup_keep_going
1093else
1094 record_status () {
1095 "$@"
1096 }
1097fi
1098pre_print_configuration
1099pre_check_tools
Manuel Pégourié-Gonnard80955ee2014-03-19 18:29:01 +01001100cleanup
Gilles Peskine7c652162017-12-11 00:01:40 +01001101
Gilles Peskineeb39b9b2019-01-08 23:41:00 +01001102# Run the requested tests.
Gilles Peskine6e984232018-11-27 21:37:53 +01001103for component in $RUN_COMPONENTS; do
Gilles Peskine1a2ca722019-01-08 22:35:16 +01001104 run_component "component_$component"
1105done
Gilles Peskine57db6ff2019-01-08 22:04:31 +01001106
1107# We're done.
1108post_report