blob: f9a81001419a46c515584026525e512a81d513ed [file] [log] [blame]
Gilles Peskine2fcf04f2019-06-14 18:23:03 +02001#!/usr/bin/env python3
2"""Run the Mbed TLS demo scripts.
3"""
Gilles Peskine9fdc6572020-04-26 22:51:05 +02004import argparse
Gilles Peskine2fcf04f2019-06-14 18:23:03 +02005import glob
6import subprocess
7import sys
8
Gilles Peskine9fdc6572020-04-26 22:51:05 +02009def run_demo(demo, quiet=False):
Gilles Peskine2fcf04f2019-06-14 18:23:03 +020010 """Run the specified demo script. Return True if it succeeds."""
Gilles Peskine9fdc6572020-04-26 22:51:05 +020011 args = {}
12 if quiet:
13 args['stdout'] = subprocess.DEVNULL
14 args['stderr'] = subprocess.DEVNULL
15 returncode = subprocess.call([demo], **args)
Gilles Peskine2fcf04f2019-06-14 18:23:03 +020016 return returncode == 0
17
Gilles Peskine9fdc6572020-04-26 22:51:05 +020018def run_demos(demos, quiet=False):
Gilles Peskine2fcf04f2019-06-14 18:23:03 +020019 """Run the specified demos and print summary information about failures.
20
21 Return True if all demos passed and False if a demo fails.
22 """
23 failures = []
24 for demo in demos:
Gilles Peskine9fdc6572020-04-26 22:51:05 +020025 if not quiet:
26 print('#### {} ####'.format(demo))
27 success = run_demo(demo, quiet=quiet)
Gilles Peskine198d87a2020-04-26 22:33:48 +020028 if not success:
Gilles Peskine2fcf04f2019-06-14 18:23:03 +020029 failures.append(demo)
Gilles Peskine9fdc6572020-04-26 22:51:05 +020030 if not quiet:
31 print('{}: FAIL'.format(demo))
Gilles Peskine2f8c5452020-04-27 11:00:59 +020032 if quiet:
33 print('{}: {}'.format(demo, 'PASS' if success else 'FAIL'))
34 else:
Gilles Peskine9fdc6572020-04-26 22:51:05 +020035 print('')
Gilles Peskine2fcf04f2019-06-14 18:23:03 +020036 successes = len(demos) - len(failures)
37 print('{}/{} demos passed'.format(successes, len(demos)))
Gilles Peskine2f8c5452020-04-27 11:00:59 +020038 if failures and not quiet:
Gilles Peskine2fcf04f2019-06-14 18:23:03 +020039 print('Failures:', *failures)
40 return not failures
41
Gilles Peskine9fdc6572020-04-26 22:51:05 +020042def run_all_demos(quiet=False):
Gilles Peskine2fcf04f2019-06-14 18:23:03 +020043 """Run all the available demos.
44
45 Return True if all demos passed and False if a demo fails.
46 """
Harry Ramsey7fa6cae2024-11-20 10:19:27 +000047 mbedtls_demos = glob.glob('programs/*/*_demo.sh')
48 tf_psa_crypto_demos = glob.glob('tf-psa-crypto/programs/*/*_demo.sh')
49 all_demos = mbedtls_demos + tf_psa_crypto_demos
Gilles Peskine1b015592020-04-27 10:39:20 +020050 if not all_demos:
Gilles Peskine63c35342020-04-27 14:34:38 +020051 # Keep the message on one line. pylint: disable=line-too-long
Gilles Peskine1b015592020-04-27 10:39:20 +020052 raise Exception('No demos found. run_demos needs to operate from the Mbed TLS toplevel directory.')
Gilles Peskine9fdc6572020-04-26 22:51:05 +020053 return run_demos(all_demos, quiet=quiet)
Gilles Peskine2fcf04f2019-06-14 18:23:03 +020054
Gilles Peskine198d87a2020-04-26 22:33:48 +020055def main():
Gilles Peskine9fdc6572020-04-26 22:51:05 +020056 parser = argparse.ArgumentParser(description=__doc__)
57 parser.add_argument('--quiet', '-q',
58 action='store_true',
59 help="suppress the output of demos")
60 options = parser.parse_args()
61 success = run_all_demos(quiet=options.quiet)
Gilles Peskine198d87a2020-04-26 22:33:48 +020062 sys.exit(0 if success else 1)
63
Gilles Peskine2fcf04f2019-06-14 18:23:03 +020064if __name__ == '__main__':
Gilles Peskine198d87a2020-04-26 22:33:48 +020065 main()