-
Notifications
You must be signed in to change notification settings - Fork 2.6k
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Merge pull request #7983 from gilles-peskine-arm/sample-program-demos…
…-2.28 Backport 2.28: Run sample program demo scripts in all.sh
- Loading branch information
Showing
6 changed files
with
237 additions
and
74 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,137 @@ | ||
## Common shell functions used by demo scripts programs/*/*.sh. | ||
|
||
## How to write a demo script | ||
## ========================== | ||
## | ||
## Include this file near the top of each demo script: | ||
## . "${0%/*}/../demo_common.sh" | ||
## | ||
## Start with a "msg" call that explains the purpose of the script. | ||
## Then call the "depends_on" function to ensure that all config | ||
## dependencies are met. | ||
## | ||
## As the last thing in the script, call the cleanup function. | ||
## | ||
## You can use the functions and variables described below. | ||
|
||
set -e -u | ||
|
||
## $root_dir is the root directory of the Mbed TLS source tree. | ||
root_dir="${0%/*}" | ||
# Find a nice path to the root directory, avoiding unnecessary "../". | ||
# The code supports demo scripts nested up to 4 levels deep. | ||
# The code works no matter where the demo script is relative to the current | ||
# directory, even if it is called with a relative path. | ||
n=4 # limit the search depth | ||
while ! [ -d "$root_dir/programs" ] || ! [ -d "$root_dir/library" ]; do | ||
if [ $n -eq 0 ]; then | ||
echo >&2 "This doesn't seem to be an Mbed TLS source tree." | ||
exit 125 | ||
fi | ||
n=$((n - 1)) | ||
case $root_dir in | ||
.) root_dir="..";; | ||
..|?*/..) root_dir="$root_dir/..";; | ||
?*/*) root_dir="${root_dir%/*}";; | ||
/*) root_dir="/";; | ||
*) root_dir=".";; | ||
esac | ||
done | ||
|
||
## $programs_dir is the directory containing the sample programs. | ||
# Assume an in-tree build. | ||
programs_dir="$root_dir/programs" | ||
|
||
## msg LINE... | ||
## msg <TEXT_ORIGIN | ||
## Display an informational message. | ||
msg () { | ||
if [ $# -eq 0 ]; then | ||
sed 's/^/# /' | ||
else | ||
for x in "$@"; do | ||
echo "# $x" | ||
done | ||
fi | ||
} | ||
|
||
## run "Message" COMMAND ARGUMENT... | ||
## Display the message, then run COMMAND with the specified arguments. | ||
run () { | ||
echo | ||
echo "# $1" | ||
shift | ||
echo "+ $*" | ||
"$@" | ||
} | ||
|
||
## Like '!', but stop on failure with 'set -e' | ||
not () { | ||
if "$@"; then false; fi | ||
} | ||
|
||
## run_bad "Message" COMMAND ARGUMENT... | ||
## Like run, but the command is expected to fail. | ||
run_bad () { | ||
echo | ||
echo "$1 This must fail." | ||
shift | ||
echo "+ ! $*" | ||
not "$@" | ||
} | ||
|
||
## config_has SYMBOL... | ||
## Succeeds if the library configuration has all SYMBOLs set. | ||
config_has () { | ||
for x in "$@"; do | ||
"$programs_dir/test/query_compile_time_config" "$x" | ||
done | ||
} | ||
|
||
## depends_on SYMBOL... | ||
## Exit if the library configuration does not have all SYMBOLs set. | ||
depends_on () { | ||
m= | ||
for x in "$@"; do | ||
if ! config_has "$x"; then | ||
m="$m $x" | ||
fi | ||
done | ||
if [ -n "$m" ]; then | ||
cat >&2 <<EOF | ||
$0: this demo requires the following | ||
configuration options to be enabled at compile time: | ||
$m | ||
EOF | ||
# Exit with a success status so that this counts as a pass for run_demos.py. | ||
exit | ||
fi | ||
} | ||
|
||
## Add the names of files to clean up to this whitespace-separated variable. | ||
## The file names must not contain whitespace characters. | ||
files_to_clean= | ||
|
||
## Call this function at the end of each script. | ||
## It is called automatically if the script is killed by a signal. | ||
cleanup () { | ||
rm -f -- $files_to_clean | ||
} | ||
|
||
|
||
|
||
################################################################ | ||
## End of the public interfaces. Code beyond this point is not | ||
## meant to be called directly from a demo script. | ||
|
||
trap 'cleanup; trap - HUP; kill -HUP $$' HUP | ||
trap 'cleanup; trap - INT; kill -INT $$' INT | ||
trap 'cleanup; trap - TERM; kill -TERM $$' TERM | ||
|
||
if config_has MBEDTLS_ENTROPY_NV_SEED; then | ||
# Create a seedfile that's sufficiently long in all library configurations. | ||
# This is necessary for programs that use randomness. | ||
# Assume that the name of the seedfile is the default name. | ||
files_to_clean="$files_to_clean seedfile" | ||
dd if=/dev/urandom of=seedfile ibs=64 obs=64 count=1 | ||
fi |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,63 @@ | ||
#!/usr/bin/env python3 | ||
"""Run the Mbed TLS demo scripts. | ||
""" | ||
import argparse | ||
import glob | ||
import subprocess | ||
import sys | ||
|
||
def run_demo(demo, quiet=False): | ||
"""Run the specified demo script. Return True if it succeeds.""" | ||
args = {} | ||
if quiet: | ||
args['stdout'] = subprocess.DEVNULL | ||
args['stderr'] = subprocess.DEVNULL | ||
returncode = subprocess.call([demo], **args) | ||
return returncode == 0 | ||
|
||
def run_demos(demos, quiet=False): | ||
"""Run the specified demos and print summary information about failures. | ||
Return True if all demos passed and False if a demo fails. | ||
""" | ||
failures = [] | ||
for demo in demos: | ||
if not quiet: | ||
print('#### {} ####'.format(demo)) | ||
success = run_demo(demo, quiet=quiet) | ||
if not success: | ||
failures.append(demo) | ||
if not quiet: | ||
print('{}: FAIL'.format(demo)) | ||
if quiet: | ||
print('{}: {}'.format(demo, 'PASS' if success else 'FAIL')) | ||
else: | ||
print('') | ||
successes = len(demos) - len(failures) | ||
print('{}/{} demos passed'.format(successes, len(demos))) | ||
if failures and not quiet: | ||
print('Failures:', *failures) | ||
return not failures | ||
|
||
def run_all_demos(quiet=False): | ||
"""Run all the available demos. | ||
Return True if all demos passed and False if a demo fails. | ||
""" | ||
all_demos = glob.glob('programs/*/*_demo.sh') | ||
if not all_demos: | ||
# Keep the message on one line. pylint: disable=line-too-long | ||
raise Exception('No demos found. run_demos needs to operate from the Mbed TLS toplevel directory.') | ||
return run_demos(all_demos, quiet=quiet) | ||
|
||
def main(): | ||
parser = argparse.ArgumentParser(description=__doc__) | ||
parser.add_argument('--quiet', '-q', | ||
action='store_true', | ||
help="suppress the output of demos") | ||
options = parser.parse_args() | ||
success = run_all_demos(quiet=options.quiet) | ||
sys.exit(0 if success else 1) | ||
|
||
if __name__ == '__main__': | ||
main() |