|  | #!/bin/sh | 
|  |  | 
|  | help () { | 
|  | cat <<EOF | 
|  | Usage: $0 [OPTION] [PLATFORM]... | 
|  | Run all the metatests whose platform matches any of the given PLATFORM. | 
|  | A PLATFORM can contain shell wildcards. | 
|  |  | 
|  | Expected output: a lot of scary-looking error messages, since each | 
|  | metatest is expected to report a failure. The final line should be | 
|  | "Ran N metatests, all good." | 
|  |  | 
|  | If something goes wrong: the final line should be | 
|  | "Ran N metatests, X unexpected successes". Look for "Unexpected success" | 
|  | in the logs above. | 
|  |  | 
|  | -l  List the available metatests, don't run them. | 
|  | EOF | 
|  | } | 
|  |  | 
|  | # Copyright The Mbed TLS Contributors | 
|  | # SPDX-License-Identifier: Apache-2.0 OR GPL-2.0-or-later | 
|  |  | 
|  | set -e -u | 
|  |  | 
|  | if [ -d programs ]; then | 
|  | METATEST_PROGRAM=programs/test/metatest | 
|  | elif [ -d ../programs ]; then | 
|  | METATEST_PROGRAM=../programs/test/metatest | 
|  | elif [ -d ../../programs ]; then | 
|  | METATEST_PROGRAM=../../programs/test/metatest | 
|  | else | 
|  | echo >&2 "$0: FATAL: programs/test/metatest not found" | 
|  | exit 120 | 
|  | fi | 
|  |  | 
|  | LIST_ONLY= | 
|  | while getopts hl OPTLET; do | 
|  | case $OPTLET in | 
|  | h) help; exit;; | 
|  | l) LIST_ONLY=1;; | 
|  | \?) help >&2; exit 120;; | 
|  | esac | 
|  | done | 
|  | shift $((OPTIND - 1)) | 
|  |  | 
|  | list_matches () { | 
|  | while read name platform junk; do | 
|  | for pattern in "$@"; do | 
|  | case $platform in | 
|  | $pattern) echo "$name"; break;; | 
|  | esac | 
|  | done | 
|  | done | 
|  | } | 
|  |  | 
|  | count=0 | 
|  | errors=0 | 
|  | run_metatest () { | 
|  | ret=0 | 
|  | "$METATEST_PROGRAM" "$1" || ret=$? | 
|  | if [ $ret -eq 0 ]; then | 
|  | echo >&2 "$0: Unexpected success: $1" | 
|  | errors=$((errors + 1)) | 
|  | fi | 
|  | count=$((count + 1)) | 
|  | } | 
|  |  | 
|  | # Don't pipe the output of metatest so that if it fails, this script exits | 
|  | # immediately with a failure status. | 
|  | full_list=$("$METATEST_PROGRAM" list) | 
|  | matching_list=$(printf '%s\n' "$full_list" | list_matches "$@") | 
|  |  | 
|  | if [ -n "$LIST_ONLY" ]; then | 
|  | printf '%s\n' $matching_list | 
|  | exit | 
|  | fi | 
|  |  | 
|  | for name in $matching_list; do | 
|  | run_metatest "$name" | 
|  | done | 
|  |  | 
|  | if [ $errors -eq 0 ]; then | 
|  | echo "Ran $count metatests, all good." | 
|  | exit 0 | 
|  | else | 
|  | echo "Ran $count metatests, $errors unexpected successes." | 
|  | exit 1 | 
|  | fi |