Skip to content

Commit

Permalink
Merge pull request #6536 from davidhorstmann-arm/2.28-change-test-tem…
Browse files Browse the repository at this point in the history
…plating-syntax

[Backport 2.28] Change test templating syntax to be valid C
  • Loading branch information
gilles-peskine-arm authored Nov 10, 2022
2 parents 2478b34 + 8eff06f commit d7d5e9a
Show file tree
Hide file tree
Showing 2 changed files with 72 additions and 50 deletions.
78 changes: 50 additions & 28 deletions tests/scripts/generate_test_code.py
Original file line number Diff line number Diff line change
Expand Up @@ -126,33 +126,39 @@
This script replaces following fields in the template and generates
the test source file:
$test_common_helpers <-- All common code from helpers.function
is substituted here.
$functions_code <-- Test functions are substituted here
from the input test_suit_xyz.function
file. C preprocessor checks are generated
for the build dependencies specified
in the input file. This script also
generates wrappers for the test
functions with code to expand the
string parameters read from the data
file.
$expression_code <-- This script enumerates the
expressions in the .data file and
generates code to handle enumerated
expression Ids and return the values.
$dep_check_code <-- This script enumerates all
build dependencies and generate
code to handle enumerated build
dependency Id and return status: if
the dependency is defined or not.
$dispatch_code <-- This script enumerates the functions
specified in the input test data file
and generates the initializer for the
function table in the template
file.
$platform_code <-- Platform specific setup and test
dispatch code.
__MBEDTLS_TEST_TEMPLATE__TEST_COMMON_HELPERS
All common code from helpers.function
is substituted here.
__MBEDTLS_TEST_TEMPLATE__FUNCTIONS_CODE
Test functions are substituted here
from the input test_suit_xyz.function
file. C preprocessor checks are generated
for the build dependencies specified
in the input file. This script also
generates wrappers for the test
functions with code to expand the
string parameters read from the data
file.
__MBEDTLS_TEST_TEMPLATE__EXPRESSION_CODE
This script enumerates the
expressions in the .data file and
generates code to handle enumerated
expression Ids and return the values.
__MBEDTLS_TEST_TEMPLATE__DEP_CHECK_CODE
This script enumerates all
build dependencies and generate
code to handle enumerated build
dependency Id and return status: if
the dependency is defined or not.
__MBEDTLS_TEST_TEMPLATE__DISPATCH_CODE
This script enumerates the functions
specified in the input test data file
and generates the initializer for the
function table in the template
file.
__MBEDTLS_TEST_TEMPLATE__PLATFORM_CODE
Platform specific setup and test
dispatch code.
"""

Expand Down Expand Up @@ -974,11 +980,27 @@ def write_test_source_file(template_file, c_file, snippets):
:param snippets: Generated and code snippets
:return:
"""

# Create a placeholder pattern with the correct named capture groups
# to override the default provided with Template.
# Match nothing (no way of escaping placeholders).
escaped = "(?P<escaped>(?!))"
# Match the "__MBEDTLS_TEST_TEMPLATE__PLACEHOLDER_NAME" pattern.
named = "__MBEDTLS_TEST_TEMPLATE__(?P<named>[A-Z][_A-Z0-9]*)"
# Match nothing (no braced placeholder syntax).
braced = "(?P<braced>(?!))"
# If not already matched, a "__MBEDTLS_TEST_TEMPLATE__" prefix is invalid.
invalid = "(?P<invalid>__MBEDTLS_TEST_TEMPLATE__)"
placeholder_pattern = re.compile("|".join([escaped, named, braced, invalid]))

with open(template_file, 'r') as template_f, open(c_file, 'w') as c_f:
for line_no, line in enumerate(template_f.readlines(), 1):
# Update line number. +1 as #line directive sets next line number
snippets['line_no'] = line_no + 1
code = string.Template(line).substitute(**snippets)
template = string.Template(line)
template.pattern = placeholder_pattern
snippets = {k.upper():v for (k, v) in snippets.items()}
code = template.substitute(**snippets)
c_f.write(code)


Expand Down
44 changes: 22 additions & 22 deletions tests/suites/main_test.function
Original file line number Diff line number Diff line change
Expand Up @@ -3,17 +3,17 @@
* *** THIS FILE HAS BEEN MACHINE GENERATED ***
*
* This file has been machine generated using the script:
* $generator_script
* __MBEDTLS_TEST_TEMPLATE__GENERATOR_SCRIPT
*
* Test file : $test_file
* Test file : __MBEDTLS_TEST_TEMPLATE__TEST_FILE
*
* The following files were used to create this file.
*
* Main code file : $test_main_file
* Platform code file : $test_platform_file
* Helper file : $test_common_helper_file
* Test suite file : $test_case_file
* Test suite data : $test_case_data_file
* Main code file : __MBEDTLS_TEST_TEMPLATE__TEST_MAIN_FILE
* Platform code file : __MBEDTLS_TEST_TEMPLATE__TEST_PLATFORM_FILE
* Helper file : __MBEDTLS_TEST_TEMPLATE__TEST_COMMON_HELPER_FILE
* Test suite file : __MBEDTLS_TEST_TEMPLATE__TEST_CASE_FILE
* Test suite data : __MBEDTLS_TEST_TEMPLATE__TEST_CASE_DATA_FILE
*
*/

Expand Down Expand Up @@ -49,9 +49,9 @@
/*----------------------------------------------------------------------------*/
/* Common helper code */

$test_common_helpers
__MBEDTLS_TEST_TEMPLATE__TEST_COMMON_HELPERS

#line $line_no "suites/main_test.function"
#line __MBEDTLS_TEST_TEMPLATE__LINE_NO "suites/main_test.function"


/*----------------------------------------------------------------------------*/
Expand All @@ -60,9 +60,9 @@ $test_common_helpers

#define TEST_SUITE_ACTIVE

$functions_code
__MBEDTLS_TEST_TEMPLATE__FUNCTIONS_CODE

#line $line_no "suites/main_test.function"
#line __MBEDTLS_TEST_TEMPLATE__LINE_NO "suites/main_test.function"


/*----------------------------------------------------------------------------*/
Expand All @@ -74,7 +74,7 @@ $functions_code
* For optimizing space for embedded targets each expression/macro
* is identified by a unique identifier instead of string literals.
* Identifiers and evaluation code is generated by script:
* $generator_script
* __MBEDTLS_TEST_TEMPLATE__GENERATOR_SCRIPT
*
* \param exp_id Expression identifier.
* \param out_value Pointer to int to hold the integer.
Expand All @@ -90,8 +90,8 @@ int get_expression( int32_t exp_id, int32_t * out_value )

switch( exp_id )
{
$expression_code
#line $line_no "suites/main_test.function"
__MBEDTLS_TEST_TEMPLATE__EXPRESSION_CODE
#line __MBEDTLS_TEST_TEMPLATE__LINE_NO "suites/main_test.function"
default:
{
ret = KEY_VALUE_MAPPING_NOT_FOUND;
Expand All @@ -107,7 +107,7 @@ $expression_code
* For optimizing space for embedded targets each dependency
* is identified by a unique identifier instead of string literals.
* Identifiers and check code is generated by script:
* $generator_script
* __MBEDTLS_TEST_TEMPLATE__GENERATOR_SCRIPT
*
* \param dep_id Dependency identifier.
*
Expand All @@ -121,8 +121,8 @@ int dep_check( int dep_id )

switch( dep_id )
{
$dep_check_code
#line $line_no "suites/main_test.function"
__MBEDTLS_TEST_TEMPLATE__DEP_CHECK_CODE
#line __MBEDTLS_TEST_TEMPLATE__LINE_NO "suites/main_test.function"
default:
break;
}
Expand All @@ -149,13 +149,13 @@ typedef void (*TestWrapper_t)( void **param_array );
/**
* \brief Table of test function wrappers. Used by dispatch_test().
* This table is populated by script:
* $generator_script
* __MBEDTLS_TEST_TEMPLATE__GENERATOR_SCRIPT
*
*/
TestWrapper_t test_funcs[] =
{
$dispatch_code
#line $line_no "suites/main_test.function"
__MBEDTLS_TEST_TEMPLATE__DISPATCH_CODE
#line __MBEDTLS_TEST_TEMPLATE__LINE_NO "suites/main_test.function"
};

/**
Expand Down Expand Up @@ -265,9 +265,9 @@ int check_test( size_t func_idx )
}


$platform_code
__MBEDTLS_TEST_TEMPLATE__PLATFORM_CODE

#line $line_no "suites/main_test.function"
#line __MBEDTLS_TEST_TEMPLATE__LINE_NO "suites/main_test.function"

/*----------------------------------------------------------------------------*/
/* Main Test code */
Expand Down

0 comments on commit d7d5e9a

Please sign in to comment.