blob: 09a6f8a4f927100ac10870c31015d07d1b7d5206 [file] [log] [blame]
Gilles Peskinef1096642023-11-02 19:23:41 +01001#!/bin/sh
2
3help () {
4 cat <<EOF
5Usage: $0 [OPTION] [PLATFORM]...
6Run all the metatests whose platform matches any of the given PLATFORM.
7A PLATFORM can contain shell wildcards.
8
Gilles Peskinecce00122023-11-10 15:36:15 +01009Expected output: a lot of scary-looking error messages, since each
10metatest is expected to report a failure. The final line should be
11"Ran N metatests, all good."
12
13If something goes wrong: the final line should be
14"Ran N metatests, X unexpected successes". Look for "Unexpected success"
15in the logs above.
16
Gilles Peskinef1096642023-11-02 19:23:41 +010017 -l List the available metatests, don't run them.
18EOF
19}
20
21# Copyright The Mbed TLS Contributors
22# SPDX-License-Identifier: Apache-2.0 OR GPL-2.0-or-later
23
24set -e -u
25
26if [ -d programs ]; then
27 METATEST_PROGRAM=programs/test/metatest
28elif [ -d ../programs ]; then
29 METATEST_PROGRAM=../programs/test/metatest
30elif [ -d ../../programs ]; then
31 METATEST_PROGRAM=../../programs/test/metatest
32else
33 echo >&2 "$0: FATAL: programs/test/metatest not found"
34 exit 120
35fi
36
37LIST_ONLY=
38while getopts hl OPTLET; do
39 case $OPTLET in
40 h) help; exit;;
41 l) LIST_ONLY=1;;
42 \?) help >&2; exit 120;;
43 esac
44done
45shift $((OPTIND - 1))
46
47list_matches () {
48 while read name platform junk; do
49 for pattern; do
50 case $platform in
51 $pattern) echo "$name"; break;;
52 esac
53 done
54 done
55}
56
57count=0
58errors=0
59run_metatest () {
60 ret=0
61 "$METATEST_PROGRAM" "$1" || ret=$?
62 if [ $ret -eq 0 ]; then
63 echo >&2 "$0: Unexpected success: $1"
64 errors=$((errors + 1))
65 fi
66 count=$((count + 1))
67}
68
69# Don't pipe the output of metatest so that if it fails, this script exits
70# immediately with a failure status.
71full_list=$("$METATEST_PROGRAM" list)
72matching_list=$(printf '%s\n' "$full_list" | list_matches "$@")
73
74if [ -n "$LIST_ONLY" ]; then
75 printf '%s\n' $matching_list
76 exit
77fi
78
79for name in $matching_list; do
80 run_metatest "$name"
81done
82
83if [ $errors -eq 0 ]; then
84 echo "Ran $count metatests, all good."
85 exit 0
86else
87 echo "Ran $count metatests, $errors unexpected successes."
88 exit 1
89fi