mirror of
https://github.com/Mbed-TLS/mbedtls.git
synced 2025-02-09 12:40:57 +00:00
Add test generation support for the ecp module
Signed-off-by: Gabor Mezei <gabor.mezei@arm.com>
This commit is contained in:
parent
51ec06aa51
commit
95ecaaf56d
25
scripts/mbedtls_dev/ecp.py
Normal file
25
scripts/mbedtls_dev/ecp.py
Normal file
@ -0,0 +1,25 @@
|
|||||||
|
"""Framework classes for generation of ecp test cases."""
|
||||||
|
# Copyright The Mbed TLS Contributors
|
||||||
|
# SPDX-License-Identifier: Apache-2.0
|
||||||
|
#
|
||||||
|
# Licensed under the Apache License, Version 2.0 (the "License"); you may
|
||||||
|
# not use this file except in compliance with the License.
|
||||||
|
# You may obtain a copy of the License at
|
||||||
|
#
|
||||||
|
# http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
#
|
||||||
|
# Unless required by applicable law or agreed to in writing, software
|
||||||
|
# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
|
||||||
|
# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
# See the License for the specific language governing permissions and
|
||||||
|
# limitations under the License.
|
||||||
|
|
||||||
|
from typing import List
|
||||||
|
|
||||||
|
from . import test_case
|
||||||
|
from . import test_data_generation
|
||||||
|
|
||||||
|
class EcpTarget(test_data_generation.BaseTarget):
|
||||||
|
#pylint: disable=abstract-method, too-few-public-methods
|
||||||
|
"""Target for ecp test case generation."""
|
||||||
|
target_basename = 'test_suite_ecp.generated'
|
@ -29,6 +29,18 @@ execute_process(
|
|||||||
string(REGEX REPLACE "[^;]*/" ""
|
string(REGEX REPLACE "[^;]*/" ""
|
||||||
base_bignum_generated_data_files "${base_bignum_generated_data_files}")
|
base_bignum_generated_data_files "${base_bignum_generated_data_files}")
|
||||||
|
|
||||||
|
execute_process(
|
||||||
|
COMMAND
|
||||||
|
${MBEDTLS_PYTHON_EXECUTABLE}
|
||||||
|
${CMAKE_CURRENT_SOURCE_DIR}/../tests/scripts/generate_ecp_tests.py
|
||||||
|
--list-for-cmake
|
||||||
|
WORKING_DIRECTORY
|
||||||
|
${CMAKE_CURRENT_SOURCE_DIR}/..
|
||||||
|
OUTPUT_VARIABLE
|
||||||
|
base_ecp_generated_data_files)
|
||||||
|
string(REGEX REPLACE "[^;]*/" ""
|
||||||
|
base_ecp_generated_data_files "${base_ecp_generated_data_files}")
|
||||||
|
|
||||||
execute_process(
|
execute_process(
|
||||||
COMMAND
|
COMMAND
|
||||||
${MBEDTLS_PYTHON_EXECUTABLE}
|
${MBEDTLS_PYTHON_EXECUTABLE}
|
||||||
@ -44,14 +56,18 @@ string(REGEX REPLACE "[^;]*/" ""
|
|||||||
# Derive generated file paths in the build directory. The generated data
|
# Derive generated file paths in the build directory. The generated data
|
||||||
# files go into the suites/ subdirectory.
|
# files go into the suites/ subdirectory.
|
||||||
set(base_generated_data_files
|
set(base_generated_data_files
|
||||||
${base_bignum_generated_data_files} ${base_psa_generated_data_files})
|
${base_bignum_generated_data_files} ${base_ecp_generated_data_files} ${base_psa_generated_data_files})
|
||||||
string(REGEX REPLACE "([^;]+)" "suites/\\1"
|
string(REGEX REPLACE "([^;]+)" "suites/\\1"
|
||||||
all_generated_data_files "${base_generated_data_files}")
|
all_generated_data_files "${base_generated_data_files}")
|
||||||
set(bignum_generated_data_files "")
|
set(bignum_generated_data_files "")
|
||||||
|
set(ecp_generated_data_files "")
|
||||||
set(psa_generated_data_files "")
|
set(psa_generated_data_files "")
|
||||||
foreach(file ${base_bignum_generated_data_files})
|
foreach(file ${base_bignum_generated_data_files})
|
||||||
list(APPEND bignum_generated_data_files ${CMAKE_CURRENT_BINARY_DIR}/suites/${file})
|
list(APPEND bignum_generated_data_files ${CMAKE_CURRENT_BINARY_DIR}/suites/${file})
|
||||||
endforeach()
|
endforeach()
|
||||||
|
foreach(file ${base_ecp_generated_data_files})
|
||||||
|
list(APPEND ecp_generated_data_files ${CMAKE_CURRENT_BINARY_DIR}/suites/${file})
|
||||||
|
endforeach()
|
||||||
foreach(file ${base_psa_generated_data_files})
|
foreach(file ${base_psa_generated_data_files})
|
||||||
list(APPEND psa_generated_data_files ${CMAKE_CURRENT_BINARY_DIR}/suites/${file})
|
list(APPEND psa_generated_data_files ${CMAKE_CURRENT_BINARY_DIR}/suites/${file})
|
||||||
endforeach()
|
endforeach()
|
||||||
@ -75,6 +91,22 @@ if(GEN_FILES)
|
|||||||
${CMAKE_CURRENT_SOURCE_DIR}/../scripts/mbedtls_dev/test_case.py
|
${CMAKE_CURRENT_SOURCE_DIR}/../scripts/mbedtls_dev/test_case.py
|
||||||
${CMAKE_CURRENT_SOURCE_DIR}/../scripts/mbedtls_dev/test_data_generation.py
|
${CMAKE_CURRENT_SOURCE_DIR}/../scripts/mbedtls_dev/test_data_generation.py
|
||||||
)
|
)
|
||||||
|
add_custom_command(
|
||||||
|
OUTPUT
|
||||||
|
${ecp_generated_data_files}
|
||||||
|
WORKING_DIRECTORY
|
||||||
|
${CMAKE_CURRENT_SOURCE_DIR}/..
|
||||||
|
COMMAND
|
||||||
|
${MBEDTLS_PYTHON_EXECUTABLE}
|
||||||
|
${CMAKE_CURRENT_SOURCE_DIR}/../tests/scripts/generate_ecp_tests.py
|
||||||
|
--directory ${CMAKE_CURRENT_BINARY_DIR}/suites
|
||||||
|
DEPENDS
|
||||||
|
${CMAKE_CURRENT_SOURCE_DIR}/../tests/scripts/generate_ecp_tests.py
|
||||||
|
${CMAKE_CURRENT_SOURCE_DIR}/../scripts/mbedtls_dev/bignum_common.py
|
||||||
|
${CMAKE_CURRENT_SOURCE_DIR}/../scripts/mbedtls_dev/ecp.py
|
||||||
|
${CMAKE_CURRENT_SOURCE_DIR}/../scripts/mbedtls_dev/test_case.py
|
||||||
|
${CMAKE_CURRENT_SOURCE_DIR}/../scripts/mbedtls_dev/test_data_generation.py
|
||||||
|
)
|
||||||
add_custom_command(
|
add_custom_command(
|
||||||
OUTPUT
|
OUTPUT
|
||||||
${psa_generated_data_files}
|
${psa_generated_data_files}
|
||||||
@ -107,6 +139,7 @@ endif()
|
|||||||
# With this line, only 4 sub-makefiles include the above command, that reduces
|
# With this line, only 4 sub-makefiles include the above command, that reduces
|
||||||
# the risk of a race.
|
# the risk of a race.
|
||||||
add_custom_target(test_suite_bignum_generated_data DEPENDS ${bignum_generated_data_files})
|
add_custom_target(test_suite_bignum_generated_data DEPENDS ${bignum_generated_data_files})
|
||||||
|
add_custom_target(test_suite_ecp_generated_data DEPENDS ${ecp_generated_data_files})
|
||||||
add_custom_target(test_suite_psa_generated_data DEPENDS ${psa_generated_data_files})
|
add_custom_target(test_suite_psa_generated_data DEPENDS ${psa_generated_data_files})
|
||||||
# If SKIP_TEST_SUITES is not defined with -D, get it from the environment.
|
# If SKIP_TEST_SUITES is not defined with -D, get it from the environment.
|
||||||
if((NOT DEFINED SKIP_TEST_SUITES) AND (DEFINED ENV{SKIP_TEST_SUITES}))
|
if((NOT DEFINED SKIP_TEST_SUITES) AND (DEFINED ENV{SKIP_TEST_SUITES}))
|
||||||
@ -129,6 +162,7 @@ function(add_test_suite suite_name)
|
|||||||
# Get the test names of the tests with generated .data files
|
# Get the test names of the tests with generated .data files
|
||||||
# from the generated_data_files list in parent scope.
|
# from the generated_data_files list in parent scope.
|
||||||
set(bignum_generated_data_names "")
|
set(bignum_generated_data_names "")
|
||||||
|
set(ecp_generated_data_names "")
|
||||||
set(psa_generated_data_names "")
|
set(psa_generated_data_names "")
|
||||||
foreach(generated_data_file ${bignum_generated_data_files})
|
foreach(generated_data_file ${bignum_generated_data_files})
|
||||||
# Get the plain filename
|
# Get the plain filename
|
||||||
@ -139,6 +173,15 @@ function(add_test_suite suite_name)
|
|||||||
string(SUBSTRING ${generated_data_name} 11 -1 generated_data_name)
|
string(SUBSTRING ${generated_data_name} 11 -1 generated_data_name)
|
||||||
list(APPEND bignum_generated_data_names ${generated_data_name})
|
list(APPEND bignum_generated_data_names ${generated_data_name})
|
||||||
endforeach()
|
endforeach()
|
||||||
|
foreach(generated_data_file ${ecp_generated_data_files})
|
||||||
|
# Get the plain filename
|
||||||
|
get_filename_component(generated_data_name ${generated_data_file} NAME)
|
||||||
|
# Remove the ".data" extension
|
||||||
|
get_name_without_last_ext(generated_data_name ${generated_data_name})
|
||||||
|
# Remove leading "test_suite_"
|
||||||
|
string(SUBSTRING ${generated_data_name} 11 -1 generated_data_name)
|
||||||
|
list(APPEND ecp_generated_data_names ${generated_data_name})
|
||||||
|
endforeach()
|
||||||
foreach(generated_data_file ${psa_generated_data_files})
|
foreach(generated_data_file ${psa_generated_data_files})
|
||||||
# Get the plain filename
|
# Get the plain filename
|
||||||
get_filename_component(generated_data_name ${generated_data_file} NAME)
|
get_filename_component(generated_data_name ${generated_data_file} NAME)
|
||||||
@ -153,6 +196,10 @@ function(add_test_suite suite_name)
|
|||||||
set(data_file
|
set(data_file
|
||||||
${CMAKE_CURRENT_BINARY_DIR}/suites/test_suite_${data_name}.data)
|
${CMAKE_CURRENT_BINARY_DIR}/suites/test_suite_${data_name}.data)
|
||||||
set(dependency test_suite_bignum_generated_data)
|
set(dependency test_suite_bignum_generated_data)
|
||||||
|
elseif(";${ecp_generated_data_names};" MATCHES ";${data_name};")
|
||||||
|
set(data_file
|
||||||
|
${CMAKE_CURRENT_BINARY_DIR}/suites/test_suite_${data_name}.data)
|
||||||
|
set(dependency test_suite_ecp_generated_data)
|
||||||
elseif(";${psa_generated_data_names};" MATCHES ";${data_name};")
|
elseif(";${psa_generated_data_names};" MATCHES ";${data_name};")
|
||||||
set(data_file
|
set(data_file
|
||||||
${CMAKE_CURRENT_BINARY_DIR}/suites/test_suite_${data_name}.data)
|
${CMAKE_CURRENT_BINARY_DIR}/suites/test_suite_${data_name}.data)
|
||||||
@ -160,7 +207,7 @@ function(add_test_suite suite_name)
|
|||||||
else()
|
else()
|
||||||
set(data_file
|
set(data_file
|
||||||
${CMAKE_CURRENT_SOURCE_DIR}/suites/test_suite_${data_name}.data)
|
${CMAKE_CURRENT_SOURCE_DIR}/suites/test_suite_${data_name}.data)
|
||||||
set(dependency test_suite_bignum_generated_data test_suite_psa_generated_data)
|
set(dependency test_suite_bignum_generated_data test_suite_ecp_generated_data test_suite_psa_generated_data)
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
add_custom_command(
|
add_custom_command(
|
||||||
|
@ -73,6 +73,13 @@ GENERATED_BIGNUM_DATA_FILES := $(patsubst tests/%,%,$(shell \
|
|||||||
ifeq ($(GENERATED_BIGNUM_DATA_FILES),FAILED)
|
ifeq ($(GENERATED_BIGNUM_DATA_FILES),FAILED)
|
||||||
$(error "$(PYTHON) scripts/generate_bignum_tests.py --list" failed)
|
$(error "$(PYTHON) scripts/generate_bignum_tests.py --list" failed)
|
||||||
endif
|
endif
|
||||||
|
GENERATED_ECP_DATA_FILES := $(patsubst tests/%,%,$(shell \
|
||||||
|
$(PYTHON) scripts/generate_ecp_tests.py --list || \
|
||||||
|
echo FAILED \
|
||||||
|
))
|
||||||
|
ifeq ($(GENERATED_ECP_DATA_FILES),FAILED)
|
||||||
|
$(error "$(PYTHON) scripts/generate_ecp_tests.py --list" failed)
|
||||||
|
endif
|
||||||
GENERATED_PSA_DATA_FILES := $(patsubst tests/%,%,$(shell \
|
GENERATED_PSA_DATA_FILES := $(patsubst tests/%,%,$(shell \
|
||||||
$(PYTHON) scripts/generate_psa_tests.py --list || \
|
$(PYTHON) scripts/generate_psa_tests.py --list || \
|
||||||
echo FAILED \
|
echo FAILED \
|
||||||
@ -80,7 +87,7 @@ GENERATED_PSA_DATA_FILES := $(patsubst tests/%,%,$(shell \
|
|||||||
ifeq ($(GENERATED_PSA_DATA_FILES),FAILED)
|
ifeq ($(GENERATED_PSA_DATA_FILES),FAILED)
|
||||||
$(error "$(PYTHON) scripts/generate_psa_tests.py --list" failed)
|
$(error "$(PYTHON) scripts/generate_psa_tests.py --list" failed)
|
||||||
endif
|
endif
|
||||||
GENERATED_FILES := $(GENERATED_PSA_DATA_FILES) $(GENERATED_BIGNUM_DATA_FILES)
|
GENERATED_FILES := $(GENERATED_PSA_DATA_FILES) $(GENERATED_ECP_DATA_FILES) $(GENERATED_BIGNUM_DATA_FILES)
|
||||||
generated_files: $(GENERATED_FILES)
|
generated_files: $(GENERATED_FILES)
|
||||||
|
|
||||||
# generate_bignum_tests.py and generate_psa_tests.py spend more time analyzing
|
# generate_bignum_tests.py and generate_psa_tests.py spend more time analyzing
|
||||||
@ -89,7 +96,7 @@ generated_files: $(GENERATED_FILES)
|
|||||||
# It's rare not to want all the outputs. So always generate all of its outputs.
|
# It's rare not to want all the outputs. So always generate all of its outputs.
|
||||||
# Use an intermediate phony dependency so that parallel builds don't run
|
# Use an intermediate phony dependency so that parallel builds don't run
|
||||||
# a separate instance of the recipe for each output file.
|
# a separate instance of the recipe for each output file.
|
||||||
.SECONDARY: generated_bignum_test_data generated_psa_test_data
|
.SECONDARY: generated_bignum_test_data generated_ecp_test_data generated_psa_test_data
|
||||||
$(GENERATED_BIGNUM_DATA_FILES): generated_bignum_test_data
|
$(GENERATED_BIGNUM_DATA_FILES): generated_bignum_test_data
|
||||||
generated_bignum_test_data: scripts/generate_bignum_tests.py
|
generated_bignum_test_data: scripts/generate_bignum_tests.py
|
||||||
generated_bignum_test_data: ../scripts/mbedtls_dev/bignum_common.py
|
generated_bignum_test_data: ../scripts/mbedtls_dev/bignum_common.py
|
||||||
@ -102,6 +109,16 @@ generated_bignum_test_data:
|
|||||||
echo " Gen $(GENERATED_BIGNUM_DATA_FILES)"
|
echo " Gen $(GENERATED_BIGNUM_DATA_FILES)"
|
||||||
$(PYTHON) scripts/generate_bignum_tests.py
|
$(PYTHON) scripts/generate_bignum_tests.py
|
||||||
|
|
||||||
|
$(GENERATED_ECP_DATA_FILES): generated_ecp_test_data
|
||||||
|
generated_ecp_test_data: scripts/generate_ecp_tests.py
|
||||||
|
generated_ecp_test_data: ../scripts/mbedtls_dev/bignum_common.py
|
||||||
|
generated_ecp_test_data: ../scripts/mbedtls_dev/ecp.py
|
||||||
|
generated_ecp_test_data: ../scripts/mbedtls_dev/test_case.py
|
||||||
|
generated_ecp_test_data: ../scripts/mbedtls_dev/test_data_generation.py
|
||||||
|
generated_ecp_test_data:
|
||||||
|
echo " Gen $(GENERATED_ECP_DATA_FILES)"
|
||||||
|
$(PYTHON) scripts/generate_ecp_tests.py
|
||||||
|
|
||||||
$(GENERATED_PSA_DATA_FILES): generated_psa_test_data
|
$(GENERATED_PSA_DATA_FILES): generated_psa_test_data
|
||||||
generated_psa_test_data: scripts/generate_psa_tests.py
|
generated_psa_test_data: scripts/generate_psa_tests.py
|
||||||
generated_psa_test_data: ../scripts/mbedtls_dev/crypto_knowledge.py
|
generated_psa_test_data: ../scripts/mbedtls_dev/crypto_knowledge.py
|
||||||
|
@ -137,4 +137,5 @@ check scripts/generate_ssl_debug_helpers.py library/ssl_debug_helpers_generated.
|
|||||||
check scripts/generate_visualc_files.pl visualc/VS2013
|
check scripts/generate_visualc_files.pl visualc/VS2013
|
||||||
check scripts/generate_psa_constants.py programs/psa/psa_constant_names_generated.c
|
check scripts/generate_psa_constants.py programs/psa/psa_constant_names_generated.c
|
||||||
check tests/scripts/generate_bignum_tests.py $(tests/scripts/generate_bignum_tests.py --list)
|
check tests/scripts/generate_bignum_tests.py $(tests/scripts/generate_bignum_tests.py --list)
|
||||||
|
check tests/scripts/generate_ecp_tests.py $(tests/scripts/generate_ecp_tests.py --list)
|
||||||
check tests/scripts/generate_psa_tests.py $(tests/scripts/generate_psa_tests.py --list)
|
check tests/scripts/generate_psa_tests.py $(tests/scripts/generate_psa_tests.py --list)
|
||||||
|
67
tests/scripts/generate_ecp_tests.py
Executable file
67
tests/scripts/generate_ecp_tests.py
Executable file
@ -0,0 +1,67 @@
|
|||||||
|
#!/usr/bin/env python3
|
||||||
|
"""Generate test data for ecp functions.
|
||||||
|
|
||||||
|
With no arguments, generate all test data. With non-option arguments,
|
||||||
|
generate only the specified files.
|
||||||
|
|
||||||
|
Class structure:
|
||||||
|
|
||||||
|
Child classes of test_data_generation.BaseTarget (file targets) represent an output
|
||||||
|
file. These indicate where test cases will be written to, for all subclasses of
|
||||||
|
this target. Multiple file targets should not reuse a `target_basename`.
|
||||||
|
|
||||||
|
Each subclass derived from a file target can either be:
|
||||||
|
- A concrete class, representing a test function, which generates test cases.
|
||||||
|
- An abstract class containing shared methods and attributes, not associated
|
||||||
|
with a test function.
|
||||||
|
|
||||||
|
Both concrete and abstract subclasses can be derived from, to implement
|
||||||
|
additional test cases (see BignumCmp and BignumCmpAbs for examples of deriving
|
||||||
|
from abstract and concrete classes).
|
||||||
|
|
||||||
|
|
||||||
|
Adding test case generation for a function:
|
||||||
|
|
||||||
|
A subclass representing the test function should be added, deriving from a
|
||||||
|
file target such as BignumTarget. This test class must set/implement the
|
||||||
|
following:
|
||||||
|
- test_function: the function name from the associated .function file.
|
||||||
|
- test_name: a descriptive name or brief summary to refer to the test
|
||||||
|
function.
|
||||||
|
- arguments(): a method to generate the list of arguments required for the
|
||||||
|
test_function.
|
||||||
|
- generate_function_tests(): a method to generate TestCases for the function.
|
||||||
|
This should create instances of the class with required input data, and
|
||||||
|
call `.create_test_case()` to yield the TestCase.
|
||||||
|
|
||||||
|
Additional details and other attributes/methods are given in the documentation
|
||||||
|
of BaseTarget in test_data_generation.py.
|
||||||
|
"""
|
||||||
|
|
||||||
|
# Copyright The Mbed TLS Contributors
|
||||||
|
# SPDX-License-Identifier: Apache-2.0
|
||||||
|
#
|
||||||
|
# Licensed under the Apache License, Version 2.0 (the "License"); you may
|
||||||
|
# not use this file except in compliance with the License.
|
||||||
|
# You may obtain a copy of the License at
|
||||||
|
#
|
||||||
|
# http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
#
|
||||||
|
# Unless required by applicable law or agreed to in writing, software
|
||||||
|
# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
|
||||||
|
# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
# See the License for the specific language governing permissions and
|
||||||
|
# limitations under the License.
|
||||||
|
|
||||||
|
import sys
|
||||||
|
|
||||||
|
import scripts_path # pylint: disable=unused-import
|
||||||
|
from mbedtls_dev import test_data_generation
|
||||||
|
# Import modules containing additional test classes
|
||||||
|
# Test function classes in these modules will be registered by
|
||||||
|
# the framework
|
||||||
|
from mbedtls_dev import ecp # pylint: disable=unused-import
|
||||||
|
|
||||||
|
if __name__ == '__main__':
|
||||||
|
# Use the section of the docstring relevant to the CLI as description
|
||||||
|
test_data_generation.main(sys.argv[1:], "\n".join(__doc__.splitlines()[:4]))
|
Loading…
x
Reference in New Issue
Block a user