diff --git a/test_generators/epoch_processing/main.py b/test_generators/epoch_processing/main.py index 9a6f46ae8..f0505ee94 100644 --- a/test_generators/epoch_processing/main.py +++ b/test_generators/epoch_processing/main.py @@ -1,4 +1,4 @@ -from typing import Callable, Iterable +from typing import Iterable from eth2spec.phase0 import spec as spec_phase0 from eth2spec.phase1 import spec as spec_phase1 diff --git a/test_generators/operations/main.py b/test_generators/operations/main.py index b61e98526..995a626b4 100644 --- a/test_generators/operations/main.py +++ b/test_generators/operations/main.py @@ -1,4 +1,4 @@ -from typing import Callable, Iterable +from typing import Iterable from eth2spec.test.phase_0.block_processing import ( test_process_attestation, @@ -10,48 +10,48 @@ from eth2spec.test.phase_0.block_processing import ( test_process_voluntary_exit, ) -from gen_base import gen_runner, gen_suite, gen_typing +from gen_base import gen_runner, gen_typing from gen_from_tests.gen import generate_from_tests from preset_loader import loader from eth2spec.phase0 import spec as spec_phase0 from eth2spec.phase1 import spec as spec_phase1 -def create_suite(operation_name: str, config_name: str, get_cases: Callable[[], Iterable[gen_typing.TestCase]]) \ - -> Callable[[str], gen_typing.TestSuiteOutput]: - def suite_definition(configs_path: str) -> gen_typing.TestSuiteOutput: +def create_provider(handler_name: str, tests_src, config_name: str) -> gen_typing.TestProvider: + + def prepare_fn(configs_path: str) -> str: presets = loader.load_presets(configs_path, config_name) spec_phase0.apply_constants_preset(presets) spec_phase1.apply_constants_preset(presets) + return config_name - return ("%s_%s" % (operation_name, config_name), operation_name, gen_suite.render_suite( - title="%s operation" % operation_name, - summary="Test suite for %s type operation processing" % operation_name, - forks_timeline="testing", - forks=["phase0"], - config=config_name, - runner="operations", - handler=operation_name, - test_cases=get_cases())) - return suite_definition + def cases_fn() -> Iterable[gen_typing.TestCase]: + return generate_from_tests( + runner_name='operations', + handler_name=handler_name, + src=tests_src, + fork_name='phase0' + ) + + return gen_typing.TestProvider(prepare=prepare_fn, make_cases=cases_fn) if __name__ == "__main__": gen_runner.run_generator("operations", [ - create_suite('attestation', 'minimal', lambda: generate_from_tests(test_process_attestation, 'phase0')), - create_suite('attestation', 'mainnet', lambda: generate_from_tests(test_process_attestation, 'phase0')), - create_suite('attester_slashing', 'minimal', lambda: generate_from_tests(test_process_attester_slashing, 'phase0')), - create_suite('attester_slashing', 'mainnet', lambda: generate_from_tests(test_process_attester_slashing, 'phase0')), - create_suite('block_header', 'minimal', lambda: generate_from_tests(test_process_block_header, 'phase0')), - create_suite('block_header', 'mainnet', lambda: generate_from_tests(test_process_block_header, 'phase0')), - create_suite('deposit', 'minimal', lambda: generate_from_tests(test_process_deposit, 'phase0')), - create_suite('deposit', 'mainnet', lambda: generate_from_tests(test_process_deposit, 'phase0')), - create_suite('proposer_slashing', 'minimal', lambda: generate_from_tests(test_process_proposer_slashing, 'phase0')), - create_suite('proposer_slashing', 'mainnet', lambda: generate_from_tests(test_process_proposer_slashing, 'phase0')), - create_suite('transfer', 'minimal', lambda: generate_from_tests(test_process_transfer, 'phase0')), + create_provider('attestation', test_process_attestation, 'minimal'), + create_provider('attestation', test_process_attestation, 'mainnet'), + create_provider('attester_slashing', test_process_attester_slashing, 'minimal'), + create_provider('attester_slashing', test_process_attester_slashing, 'mainnet'), + create_provider('block_header', test_process_block_header, 'minimal'), + create_provider('block_header', test_process_block_header, 'mainnet'), + create_provider('deposit', test_process_deposit, 'minimal'), + create_provider('deposit', test_process_deposit, 'mainnet'), + create_provider('proposer_slashing', test_process_proposer_slashing, 'minimal'), + create_provider('proposer_slashing', test_process_proposer_slashing, 'mainnet'), + create_provider('transfer', test_process_transfer, 'minimal'), # Disabled, due to the high amount of different transfer tests, this produces a shocking size of tests. # Unnecessarily, as transfer are disabled currently, so not a priority. - # create_suite('transfer', 'mainnet', lambda: generate_from_tests(test_process_transfer, 'phase0')), - create_suite('voluntary_exit', 'minimal', lambda: generate_from_tests(test_process_voluntary_exit, 'phase0')), - create_suite('voluntary_exit', 'mainnet', lambda: generate_from_tests(test_process_voluntary_exit, 'phase0')), + # create_provider('transfer', test_process_transfer, 'mainnet'), + create_provider('voluntary_exit', test_process_voluntary_exit, 'minimal'), + create_provider('voluntary_exit', test_process_voluntary_exit, 'mainnet'), ]) diff --git a/test_libs/pyspec/eth2spec/debug/encode.py b/test_libs/pyspec/eth2spec/debug/encode.py index ac4bd9df2..d59f15640 100644 --- a/test_libs/pyspec/eth2spec/debug/encode.py +++ b/test_libs/pyspec/eth2spec/debug/encode.py @@ -29,4 +29,4 @@ def encode(value, include_hash_tree_roots=False): ret["hash_tree_root"] = '0x' + hash_tree_root(value).hex() return ret else: - raise Exception(f"Type not recognized: value={value}, typ={value.type()}") + raise Exception(f"Type not recognized: value={value}, typ={type(value)}") diff --git a/test_libs/pyspec/eth2spec/test/utils.py b/test_libs/pyspec/eth2spec/test/utils.py index 59289db59..e15c5efeb 100644 --- a/test_libs/pyspec/eth2spec/test/utils.py +++ b/test_libs/pyspec/eth2spec/test/utils.py @@ -28,30 +28,26 @@ def vector_test(description: str = None): # transform the yielded data, and add type annotations for data in fn(*args, **kw): - # If there is a type argument, encode it as that type. - if len(data) == 3: - (key, value, typ) = data - yield key, 'data', encode(value, typ) + # if not 2 items, then it is assumed to be already formatted with a type: + # e.g. ("bls_setting", "meta", 1) + if len(data) != 2: + yield data + continue + # Try to infer the type, but keep it as-is if it's not a SSZ type or bytes. + (key, value) = data + if isinstance(value, (SSZValue, bytes)): + yield key, 'data', encode(value) # TODO: add SSZ bytes as second output - else: - # Otherwise, try to infer the type, but keep it as-is if it's not a SSZ type or bytes. - (key, value) = data - if isinstance(value, (SSZValue, bytes)): - yield key, 'data', encode(value) + elif isinstance(value, list) and all([isinstance(el, (SSZValue, bytes)) for el in value]): + for i, el in enumerate(value): + yield f'{key}_{i}', 'data', encode(el) # TODO: add SSZ bytes as second output - elif isinstance(value, list) and all([isinstance(el, (SSZValue, bytes)) for el in value]): - for i, el in enumerate(value): - yield f'{key}_{i}', 'data', encode(el) - # TODO: add SSZ bytes as second output - yield f'{key}_count', 'meta', len(value) - else: - # not a ssz value. - # It could be vector or bytes still, but it is a rare case, - # and lists can't be inferred fully (generics lose element type). - # In such cases, explicitly state the type of the yielded value as a third yielded object. - # The data will now just be yielded as any python data, - # something that should be encodeable by the generator runner. - yield key, 'data', value + yield f'{key}_count', 'meta', len(value) + else: + # Not a ssz value. + # The data will now just be yielded as any python data, + # something that should be encodeable by the generator runner. + yield key, 'data', value # check generator mode, may be None/else. # "pop" removes it, so it is not passed to the inner function.