Gilles Peskine | 2fcf04f | 2019-06-14 18:23:03 +0200 | [diff] [blame] | 1 | #!/usr/bin/env python3 |
| 2 | """Run the Mbed TLS demo scripts. |
| 3 | """ |
Gilles Peskine | 9fdc657 | 2020-04-26 22:51:05 +0200 | [diff] [blame] | 4 | import argparse |
Gilles Peskine | 2fcf04f | 2019-06-14 18:23:03 +0200 | [diff] [blame] | 5 | import glob |
| 6 | import subprocess |
| 7 | import sys |
| 8 | |
Gilles Peskine | 9fdc657 | 2020-04-26 22:51:05 +0200 | [diff] [blame] | 9 | def run_demo(demo, quiet=False): |
Gilles Peskine | 2fcf04f | 2019-06-14 18:23:03 +0200 | [diff] [blame] | 10 | """Run the specified demo script. Return True if it succeeds.""" |
Gilles Peskine | 9fdc657 | 2020-04-26 22:51:05 +0200 | [diff] [blame] | 11 | args = {} |
| 12 | if quiet: |
| 13 | args['stdout'] = subprocess.DEVNULL |
| 14 | args['stderr'] = subprocess.DEVNULL |
| 15 | returncode = subprocess.call([demo], **args) |
Gilles Peskine | 2fcf04f | 2019-06-14 18:23:03 +0200 | [diff] [blame] | 16 | return returncode == 0 |
| 17 | |
Gilles Peskine | 9fdc657 | 2020-04-26 22:51:05 +0200 | [diff] [blame] | 18 | def run_demos(demos, quiet=False): |
Gilles Peskine | 2fcf04f | 2019-06-14 18:23:03 +0200 | [diff] [blame] | 19 | """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 Peskine | 9fdc657 | 2020-04-26 22:51:05 +0200 | [diff] [blame] | 25 | if not quiet: |
| 26 | print('#### {} ####'.format(demo)) |
| 27 | success = run_demo(demo, quiet=quiet) |
Gilles Peskine | 198d87a | 2020-04-26 22:33:48 +0200 | [diff] [blame] | 28 | if not success: |
Gilles Peskine | 2fcf04f | 2019-06-14 18:23:03 +0200 | [diff] [blame] | 29 | failures.append(demo) |
Gilles Peskine | 9fdc657 | 2020-04-26 22:51:05 +0200 | [diff] [blame] | 30 | if not quiet: |
| 31 | print('{}: FAIL'.format(demo)) |
Gilles Peskine | 2f8c545 | 2020-04-27 11:00:59 +0200 | [diff] [blame] | 32 | if quiet: |
| 33 | print('{}: {}'.format(demo, 'PASS' if success else 'FAIL')) |
| 34 | else: |
Gilles Peskine | 9fdc657 | 2020-04-26 22:51:05 +0200 | [diff] [blame] | 35 | print('') |
Gilles Peskine | 2fcf04f | 2019-06-14 18:23:03 +0200 | [diff] [blame] | 36 | successes = len(demos) - len(failures) |
| 37 | print('{}/{} demos passed'.format(successes, len(demos))) |
Gilles Peskine | 2f8c545 | 2020-04-27 11:00:59 +0200 | [diff] [blame] | 38 | if failures and not quiet: |
Gilles Peskine | 2fcf04f | 2019-06-14 18:23:03 +0200 | [diff] [blame] | 39 | print('Failures:', *failures) |
| 40 | return not failures |
| 41 | |
Gilles Peskine | 9fdc657 | 2020-04-26 22:51:05 +0200 | [diff] [blame] | 42 | def run_all_demos(quiet=False): |
Gilles Peskine | 2fcf04f | 2019-06-14 18:23:03 +0200 | [diff] [blame] | 43 | """Run all the available demos. |
| 44 | |
| 45 | Return True if all demos passed and False if a demo fails. |
| 46 | """ |
| 47 | all_demos = glob.glob('programs/*/*_demo.sh') |
Gilles Peskine | 1b01559 | 2020-04-27 10:39:20 +0200 | [diff] [blame] | 48 | if not all_demos: |
Gilles Peskine | 63c3534 | 2020-04-27 14:34:38 +0200 | [diff] [blame] | 49 | # Keep the message on one line. pylint: disable=line-too-long |
Gilles Peskine | 1b01559 | 2020-04-27 10:39:20 +0200 | [diff] [blame] | 50 | raise Exception('No demos found. run_demos needs to operate from the Mbed TLS toplevel directory.') |
Gilles Peskine | 9fdc657 | 2020-04-26 22:51:05 +0200 | [diff] [blame] | 51 | return run_demos(all_demos, quiet=quiet) |
Gilles Peskine | 2fcf04f | 2019-06-14 18:23:03 +0200 | [diff] [blame] | 52 | |
Gilles Peskine | 198d87a | 2020-04-26 22:33:48 +0200 | [diff] [blame] | 53 | def main(): |
Gilles Peskine | 9fdc657 | 2020-04-26 22:51:05 +0200 | [diff] [blame] | 54 | parser = argparse.ArgumentParser(description=__doc__) |
| 55 | parser.add_argument('--quiet', '-q', |
| 56 | action='store_true', |
| 57 | help="suppress the output of demos") |
| 58 | options = parser.parse_args() |
| 59 | success = run_all_demos(quiet=options.quiet) |
Gilles Peskine | 198d87a | 2020-04-26 22:33:48 +0200 | [diff] [blame] | 60 | sys.exit(0 if success else 1) |
| 61 | |
Gilles Peskine | 2fcf04f | 2019-06-14 18:23:03 +0200 | [diff] [blame] | 62 | if __name__ == '__main__': |
Gilles Peskine | 198d87a | 2020-04-26 22:33:48 +0200 | [diff] [blame] | 63 | main() |