Add module for bignum_core test generation
Separate file is added for classes used to generate cases for tests
in bignum_core.function. Common elements of the BignumOperation class
are added to classes in a new common file, for use across files.
Signed-off-by: Werner Lewis <werner.lewis@arm.com>
diff --git a/tests/scripts/generate_bignum_tests.py b/tests/scripts/generate_bignum_tests.py
index 7f332dc..1eec27b 100755
--- a/tests/scripts/generate_bignum_tests.py
+++ b/tests/scripts/generate_bignum_tests.py
@@ -54,34 +54,19 @@
# See the License for the specific language governing permissions and
# limitations under the License.
-import itertools
import sys
-import typing
-from abc import ABCMeta, abstractmethod
-from typing import Iterator, List, Tuple, TypeVar
+from abc import ABCMeta
+from typing import Iterator
import scripts_path # pylint: disable=unused-import
from mbedtls_dev import test_case
from mbedtls_dev import test_data_generation
-
-T = TypeVar('T') #pylint: disable=invalid-name
-
-def hex_to_int(val: str) -> int:
- return int(val, 16) if val else 0
-
-def quote_str(val) -> str:
- return "\"{}\"".format(val)
-
-def combination_pairs(values: List[T]) -> List[Tuple[T, T]]:
- """Return all pair combinations from input values."""
- # The return value is cast, as older versions of mypy are unable to derive
- # the specific type returned by itertools.combinations_with_replacement.
- return typing.cast(
- List[Tuple[T, T]],
- list(itertools.combinations_with_replacement(values, 2))
- )
-
+from mbedtls_dev import bignum_common
+# Import modules containing additional test classes
+# Test function classes in these modules will be registered by
+# the framework
+from mbedtls_dev import bignum_core # pylint: disable=unused-import
class BignumTarget(test_data_generation.BaseTarget, metaclass=ABCMeta):
#pylint: disable=abstract-method
@@ -89,36 +74,14 @@
target_basename = 'test_suite_mpi.generated'
-class BignumOperation(BignumTarget, metaclass=ABCMeta):
- """Common features for bignum binary operations.
-
- This adds functionality common in binary operation tests. This includes
- generation of case descriptions, using descriptions of values and symbols
- to represent the operation or result.
-
- Attributes:
- symbol: Symbol used for the operation in case description.
- input_values: List of values to use as test case inputs. These are
- combined to produce pairs of values.
- input_cases: List of tuples containing pairs of test case inputs. This
- can be used to implement specific pairs of inputs.
- """
- symbol = ""
+class BignumOperation(bignum_common.OperationCommon, BignumTarget, metaclass=ABCMeta):
+ #pylint: disable=abstract-method
+ """Common features for bignum operations in legacy tests."""
input_values = [
"", "0", "7b", "-7b",
"0000000000000000123", "-0000000000000000123",
"1230000000000000000", "-1230000000000000000"
- ] # type: List[str]
- input_cases = [] # type: List[Tuple[str, str]]
-
- def __init__(self, val_a: str, val_b: str) -> None:
- self.arg_a = val_a
- self.arg_b = val_b
- self.int_a = hex_to_int(val_a)
- self.int_b = hex_to_int(val_b)
-
- def arguments(self) -> List[str]:
- return [quote_str(self.arg_a), quote_str(self.arg_b), self.result()]
+ ]
def description(self) -> str:
"""Generate a description for the test case.
@@ -135,15 +98,6 @@
)
return super().description()
- @abstractmethod
- def result(self) -> str:
- """Get the result of the operation.
-
- This could be calculated during initialization and stored as `_result`
- and then returned, or calculated when the method is called.
- """
- raise NotImplementedError
-
@staticmethod
def value_description(val) -> str:
"""Generate a description of the argument val.
@@ -168,20 +122,9 @@
return tmp
@classmethod
- def get_value_pairs(cls) -> Iterator[Tuple[str, str]]:
- """Generator to yield pairs of inputs.
-
- Combinations are first generated from all input values, and then
- specific cases provided.
- """
- yield from combination_pairs(cls.input_values)
- yield from cls.input_cases
-
- @classmethod
def generate_function_tests(cls) -> Iterator[test_case.TestCase]:
for a_value, b_value in cls.get_value_pairs():
- cur_op = cls(a_value, b_value)
- yield cur_op.create_test_case()
+ yield cls(a_value, b_value).create_test_case()
class BignumCmp(BignumOperation):
@@ -221,7 +164,7 @@
symbol = "+"
test_function = "mpi_add_mpi"
test_name = "MPI add"
- input_cases = combination_pairs(
+ input_cases = bignum_common.combination_pairs(
[
"1c67967269c6", "9cde3",
"-1c67967269c6", "-9cde3",
@@ -229,7 +172,8 @@
)
def result(self) -> str:
- return quote_str("{:x}".format(self.int_a + self.int_b))
+ return bignum_common.quote_str("{:x}").format(self.int_a + self.int_b)
+
if __name__ == '__main__':
# Use the section of the docstring relevant to the CLI as description