Bence Szépkúti | 80b31c5 | 2021-10-19 15:05:36 +0200 | [diff] [blame] | 1 | #!/usr/bin/env python3 |
Shaun Case | 8b0ecbc | 2021-12-20 21:14:10 -0800 | [diff] [blame] | 2 | """Run the PSA Crypto API compliance test suite. |
Bence Szépkúti | 449781f | 2021-11-02 13:41:14 +0100 | [diff] [blame] | 3 | Clone the repo and check out the commit specified by PSA_ARCH_TEST_REPO and PSA_ARCH_TEST_REF, |
David Horstmann | 3b8984a | 2023-08-29 10:32:26 +0100 | [diff] [blame] | 4 | then compile and run the test suite. The clone is stored at <repository root>/psa-arch-tests. |
Ronald Cron | 070e865 | 2023-10-09 10:25:45 +0200 | [diff] [blame] | 5 | Known defects in either the test suite or mbedtls / TF-PSA-Crypto - identified by their test |
David Horstmann | 3b8984a | 2023-08-29 10:32:26 +0100 | [diff] [blame] | 6 | number - are ignored, while unexpected failures AND successes are reported as errors, to help |
| 7 | keep the list of known defects as up to date as possible. |
Bence Szépkúti | 449781f | 2021-11-02 13:41:14 +0100 | [diff] [blame] | 8 | """ |
Bence Szépkúti | 67fb314 | 2021-11-02 14:01:08 +0100 | [diff] [blame] | 9 | |
| 10 | # Copyright The Mbed TLS Contributors |
Dave Rodgman | 16799db | 2023-11-02 19:47:20 +0000 | [diff] [blame] | 11 | # SPDX-License-Identifier: Apache-2.0 OR GPL-2.0-or-later |
Bence Szépkúti | 67fb314 | 2021-11-02 14:01:08 +0100 | [diff] [blame] | 12 | |
David Horstmann | 4dcddcf | 2023-08-17 18:08:24 +0100 | [diff] [blame] | 13 | import argparse |
Bence Szépkúti | 80b31c5 | 2021-10-19 15:05:36 +0200 | [diff] [blame] | 14 | import os |
| 15 | import re |
| 16 | import shutil |
| 17 | import subprocess |
| 18 | import sys |
David Horstmann | 9cc6b2f | 2023-08-29 17:36:35 +0100 | [diff] [blame] | 19 | from typing import List |
Bence Szépkúti | 80b31c5 | 2021-10-19 15:05:36 +0200 | [diff] [blame] | 20 | |
David Horstmann | e31014a | 2023-07-19 11:43:27 +0100 | [diff] [blame] | 21 | #pylint: disable=unused-import |
David Horstmann | 1d09184 | 2023-07-18 17:39:35 +0100 | [diff] [blame] | 22 | import scripts_path |
David Horstmann | 9638ca3 | 2024-05-03 14:36:12 +0100 | [diff] [blame] | 23 | from mbedtls_framework import build_tree |
David Horstmann | 1d09184 | 2023-07-18 17:39:35 +0100 | [diff] [blame] | 24 | |
Ronald Cron | 070e865 | 2023-10-09 10:25:45 +0200 | [diff] [blame] | 25 | # PSA Compliance tests we expect to fail due to known defects in Mbed TLS / |
| 26 | # TF-PSA-Crypto (or the test suite). |
Bence Szépkúti | cb28871 | 2021-11-09 21:30:43 +0100 | [diff] [blame] | 27 | # The test numbers correspond to the numbers used by the console output of the test suite. |
| 28 | # Test number 2xx corresponds to the files in the folder |
| 29 | # psa-arch-tests/api-tests/dev_apis/crypto/test_c0xx |
Valerio Setti | 307ce2c | 2024-01-30 08:05:20 +0100 | [diff] [blame] | 30 | EXPECTED_FAILURES = {} # type: dict |
Bence Szépkúti | e2855c3 | 2021-11-09 17:33:57 +0100 | [diff] [blame] | 31 | |
Valerio Setti | 307ce2c | 2024-01-30 08:05:20 +0100 | [diff] [blame] | 32 | PSA_ARCH_TESTS_REPO = 'https://github.com/ARM-software/psa-arch-tests.git' |
| 33 | PSA_ARCH_TESTS_REF = 'v23.06_API1.5_ADAC_EAC' |
Bence Szépkúti | 80b31c5 | 2021-10-19 15:05:36 +0200 | [diff] [blame] | 34 | |
David Horstmann | e31014a | 2023-07-19 11:43:27 +0100 | [diff] [blame] | 35 | #pylint: disable=too-many-branches,too-many-statements,too-many-locals |
David Horstmann | 4dcddcf | 2023-08-17 18:08:24 +0100 | [diff] [blame] | 36 | def main(library_build_dir: str): |
David Horstmann | f757069 | 2023-08-29 10:27:13 +0100 | [diff] [blame] | 37 | root_dir = os.getcwd() |
Bence Szépkúti | 80b31c5 | 2021-10-19 15:05:36 +0200 | [diff] [blame] | 38 | |
Thomas Daubney | e8f3789 | 2023-11-24 11:41:23 +0000 | [diff] [blame] | 39 | in_tf_psa_crypto_repo = build_tree.looks_like_tf_psa_crypto_root(root_dir) |
| 40 | |
Thomas Daubney | 08c6dc4 | 2023-11-30 13:56:09 +0000 | [diff] [blame] | 41 | crypto_name = build_tree.crypto_library_filename(root_dir) |
Thomas Daubney | 10769bc | 2023-12-01 23:47:59 +0000 | [diff] [blame] | 42 | library_subdir = build_tree.crypto_core_directory(root_dir, relative=True) |
David Horstmann | beaee26 | 2023-08-29 13:56:17 +0100 | [diff] [blame] | 43 | |
| 44 | crypto_lib_filename = (library_build_dir + '/' + |
| 45 | library_subdir + '/' + |
| 46 | 'lib' + crypto_name + '.a') |
David Horstmann | 98af198 | 2023-08-29 10:25:26 +0100 | [diff] [blame] | 47 | |
| 48 | if not os.path.exists(crypto_lib_filename): |
David Horstmann | 2ba89be | 2023-08-29 10:37:29 +0100 | [diff] [blame] | 49 | #pylint: disable=bad-continuation |
David Horstmann | 4dcddcf | 2023-08-17 18:08:24 +0100 | [diff] [blame] | 50 | subprocess.check_call([ |
| 51 | 'cmake', '.', |
| 52 | '-GUnix Makefiles', |
David Horstmann | 41c316d | 2023-08-29 14:57:23 +0100 | [diff] [blame] | 53 | '-B' + library_build_dir |
David Horstmann | 4dcddcf | 2023-08-17 18:08:24 +0100 | [diff] [blame] | 54 | ]) |
David Horstmann | beaee26 | 2023-08-29 13:56:17 +0100 | [diff] [blame] | 55 | subprocess.check_call(['cmake', '--build', library_build_dir, |
David Horstmann | 8f3ec8e | 2023-08-30 09:46:20 +0100 | [diff] [blame] | 56 | '--target', crypto_name]) |
Bence Szépkúti | 80b31c5 | 2021-10-19 15:05:36 +0200 | [diff] [blame] | 57 | |
| 58 | psa_arch_tests_dir = 'psa-arch-tests' |
Bence Szépkúti | c63d160 | 2021-11-02 14:06:40 +0100 | [diff] [blame] | 59 | os.makedirs(psa_arch_tests_dir, exist_ok=True) |
Bence Szépkúti | 80b31c5 | 2021-10-19 15:05:36 +0200 | [diff] [blame] | 60 | try: |
Bence Szépkúti | 34b5f56 | 2021-11-02 13:48:39 +0100 | [diff] [blame] | 61 | os.chdir(psa_arch_tests_dir) |
Bence Szépkúti | 80b31c5 | 2021-10-19 15:05:36 +0200 | [diff] [blame] | 62 | |
Bence Szépkúti | b381841 | 2021-11-03 11:32:51 +0100 | [diff] [blame] | 63 | # Reuse existing local clone |
Bence Szépkúti | 34b5f56 | 2021-11-02 13:48:39 +0100 | [diff] [blame] | 64 | subprocess.check_call(['git', 'init']) |
| 65 | subprocess.check_call(['git', 'fetch', PSA_ARCH_TESTS_REPO, PSA_ARCH_TESTS_REF]) |
| 66 | subprocess.check_call(['git', 'checkout', 'FETCH_HEAD']) |
Bence Szépkúti | 80b31c5 | 2021-10-19 15:05:36 +0200 | [diff] [blame] | 67 | |
Bence Szépkúti | 34b5f56 | 2021-11-02 13:48:39 +0100 | [diff] [blame] | 68 | build_dir = 'api-tests/build' |
| 69 | try: |
| 70 | shutil.rmtree(build_dir) |
| 71 | except FileNotFoundError: |
| 72 | pass |
| 73 | os.mkdir(build_dir) |
| 74 | os.chdir(build_dir) |
Bence Szépkúti | 80b31c5 | 2021-10-19 15:05:36 +0200 | [diff] [blame] | 75 | |
David Horstmann | f757069 | 2023-08-29 10:27:13 +0100 | [diff] [blame] | 76 | extra_includes = (';{}/drivers/builtin/include'.format(root_dir) |
Ronald Cron | 070e865 | 2023-10-09 10:25:45 +0200 | [diff] [blame] | 77 | if in_tf_psa_crypto_repo else '') |
David Horstmann | 1d09184 | 2023-07-18 17:39:35 +0100 | [diff] [blame] | 78 | |
Bence Szépkúti | 34b5f56 | 2021-11-02 13:48:39 +0100 | [diff] [blame] | 79 | #pylint: disable=bad-continuation |
| 80 | subprocess.check_call([ |
| 81 | 'cmake', '..', |
| 82 | '-GUnix Makefiles', |
| 83 | '-DTARGET=tgt_dev_apis_stdc', |
| 84 | '-DTOOLCHAIN=HOST_GCC', |
| 85 | '-DSUITE=CRYPTO', |
David Horstmann | f757069 | 2023-08-29 10:27:13 +0100 | [diff] [blame] | 86 | '-DPSA_CRYPTO_LIB_FILENAME={}/{}'.format(root_dir, |
David Horstmann | 7f93d22 | 2023-08-23 16:21:40 +0100 | [diff] [blame] | 87 | crypto_lib_filename), |
David Horstmann | f757069 | 2023-08-29 10:27:13 +0100 | [diff] [blame] | 88 | ('-DPSA_INCLUDE_PATHS={}/include' + extra_includes).format(root_dir) |
Bence Szépkúti | 34b5f56 | 2021-11-02 13:48:39 +0100 | [diff] [blame] | 89 | ]) |
| 90 | subprocess.check_call(['cmake', '--build', '.']) |
Bence Szépkúti | 80b31c5 | 2021-10-19 15:05:36 +0200 | [diff] [blame] | 91 | |
Bence Szépkúti | 34b5f56 | 2021-11-02 13:48:39 +0100 | [diff] [blame] | 92 | proc = subprocess.Popen(['./psa-arch-tests-crypto'], |
| 93 | bufsize=1, stdout=subprocess.PIPE, universal_newlines=True) |
| 94 | |
| 95 | test_re = re.compile( |
| 96 | '^TEST: (?P<test_num>[0-9]*)|' |
| 97 | '^TEST RESULT: (?P<test_result>FAILED|PASSED)' |
| 98 | ) |
| 99 | test = -1 |
| 100 | unexpected_successes = set(EXPECTED_FAILURES) |
David Horstmann | fd9264e | 2023-08-29 16:21:15 +0100 | [diff] [blame] | 101 | expected_failures = [] # type: List[int] |
| 102 | unexpected_failures = [] # type: List[int] |
| 103 | if proc.stdout is None: |
| 104 | return 1 |
| 105 | |
Bence Szépkúti | 34b5f56 | 2021-11-02 13:48:39 +0100 | [diff] [blame] | 106 | for line in proc.stdout: |
| 107 | print(line, end='') |
| 108 | match = test_re.match(line) |
| 109 | if match is not None: |
| 110 | groupdict = match.groupdict() |
| 111 | test_num = groupdict['test_num'] |
| 112 | if test_num is not None: |
| 113 | test = int(test_num) |
| 114 | elif groupdict['test_result'] == 'FAILED': |
| 115 | try: |
| 116 | unexpected_successes.remove(test) |
| 117 | expected_failures.append(test) |
| 118 | print('Expected failure, ignoring') |
| 119 | except KeyError: |
| 120 | unexpected_failures.append(test) |
| 121 | print('ERROR: Unexpected failure') |
| 122 | elif test in unexpected_successes: |
| 123 | print('ERROR: Unexpected success') |
| 124 | proc.wait() |
| 125 | |
| 126 | print() |
| 127 | print('***** test_psa_compliance.py report ******') |
| 128 | print() |
| 129 | print('Expected failures:', ', '.join(str(i) for i in expected_failures)) |
| 130 | print('Unexpected failures:', ', '.join(str(i) for i in unexpected_failures)) |
| 131 | print('Unexpected successes:', ', '.join(str(i) for i in sorted(unexpected_successes))) |
| 132 | print() |
| 133 | if unexpected_successes or unexpected_failures: |
| 134 | if unexpected_successes: |
| 135 | print('Unexpected successes encountered.') |
| 136 | print('Please remove the corresponding tests from ' |
| 137 | 'EXPECTED_FAILURES in tests/scripts/compliance_test.py') |
| 138 | print() |
| 139 | print('FAILED') |
| 140 | return 1 |
| 141 | else: |
Bence Szépkúti | 34b5f56 | 2021-11-02 13:48:39 +0100 | [diff] [blame] | 142 | print('SUCCESS') |
| 143 | return 0 |
| 144 | finally: |
David Horstmann | f757069 | 2023-08-29 10:27:13 +0100 | [diff] [blame] | 145 | os.chdir(root_dir) |
Bence Szépkúti | 80b31c5 | 2021-10-19 15:05:36 +0200 | [diff] [blame] | 146 | |
| 147 | if __name__ == '__main__': |
David Horstmann | b48822c | 2023-08-29 14:12:53 +0100 | [diff] [blame] | 148 | BUILD_DIR = 'out_of_source_build' |
David Horstmann | 4dcddcf | 2023-08-17 18:08:24 +0100 | [diff] [blame] | 149 | |
David Horstmann | 3ed1871 | 2023-08-29 18:20:01 +0100 | [diff] [blame] | 150 | # pylint: disable=invalid-name |
David Horstmann | 4dcddcf | 2023-08-17 18:08:24 +0100 | [diff] [blame] | 151 | parser = argparse.ArgumentParser() |
| 152 | parser.add_argument('--build-dir', nargs=1, |
Ronald Cron | 070e865 | 2023-10-09 10:25:45 +0200 | [diff] [blame] | 153 | help='path to Mbed TLS / TF-PSA-Crypto build directory') |
David Horstmann | 4dcddcf | 2023-08-17 18:08:24 +0100 | [diff] [blame] | 154 | args = parser.parse_args() |
| 155 | |
| 156 | if args.build_dir is not None: |
David Horstmann | b48822c | 2023-08-29 14:12:53 +0100 | [diff] [blame] | 157 | BUILD_DIR = args.build_dir[0] |
David Horstmann | 4dcddcf | 2023-08-17 18:08:24 +0100 | [diff] [blame] | 158 | |
David Horstmann | b48822c | 2023-08-29 14:12:53 +0100 | [diff] [blame] | 159 | sys.exit(main(BUILD_DIR)) |