WIP: broad-spectrum randomized block tests
This commit is contained in:
parent
70d4ddf613
commit
eadefa274d
|
@ -0,0 +1,67 @@
|
|||
from eth2spec.test.helpers.state import (
|
||||
next_epoch,
|
||||
next_slot,
|
||||
)
|
||||
from eth2spec.test.context import (
|
||||
with_all_phases,
|
||||
spec_state_test,
|
||||
)
|
||||
|
||||
|
||||
def generate_randomized_scenarios():
|
||||
# TODO: WIP schema
|
||||
return {
|
||||
# ("randomize_state", "ensure all validator states present: pending/deposited, activated, exited, slashed"),
|
||||
# ("randomized balances", "ensure distribution of bals"),
|
||||
# ("transition to leak if not already, maybe", "assert is or is not leaking"),
|
||||
"setup": [],
|
||||
"epochs_to_skip": 0, # 0, 1, 2, N, EPOCHS_TO_INACTIVITY_LEAK,
|
||||
"slots_to_skip": 0, # 0, 1, 2, N, SLOTS_PER_EPOCH - 1,
|
||||
"transitions": [ # TODO: consider large numbers of blocks, load on generated data
|
||||
{
|
||||
"block_producer": lambda spec, state: spec.SignedBeaconBlock(),
|
||||
"epochs_to_skip": 0, # 0, 1, 2, N, EPOCHS_TO_INACTIVITY_LEAK,
|
||||
"slots_to_skip": 0, # 0, 1, 2, N, SLOTS_PER_EPOCH - 1,
|
||||
}
|
||||
],
|
||||
}
|
||||
|
||||
|
||||
def id_from_scenario(test_description):
|
||||
return '-'.join(':'.join((str(k),str(v))) for k,v in test_description.items())
|
||||
|
||||
|
||||
def pytest_generate_tests(metafunc):
|
||||
"""
|
||||
Pytest hook to generate test cases from dynamically computed data
|
||||
"""
|
||||
generated_name = "test_description"
|
||||
generated_values = generate_randomized_scenarios()
|
||||
metafunc.parametrize(generated_name, generated_values, ids=id_from_scenario, scope="module")
|
||||
|
||||
|
||||
def pytest_generate_tests_adapter(f):
|
||||
"""
|
||||
Adapter decorator to allow dynamic test case generation
|
||||
while leveraging existing decorators specific to spec tests.
|
||||
"""
|
||||
def wrapper(test_description, *args, **kwargs):
|
||||
kwargs["test_description"] = test_description
|
||||
f(*args, **kwargs)
|
||||
return wrapper
|
||||
|
||||
|
||||
@pytest_generate_tests_adapter
|
||||
@with_all_phases
|
||||
@spec_state_test
|
||||
def test_harness_for_randomized_blocks(spec, state, test_description):
|
||||
for mutation, validation in test_description["setup"]:
|
||||
mutation(spec, state)
|
||||
validation(spec, state)
|
||||
for _ in range(len(test_description["epochs_to_skip"])):
|
||||
next_epoch(spec, state)
|
||||
for _ in range(len(test_description["slots_to_skip"])):
|
||||
next_slot(spec, state)
|
||||
for transition in test_description["transitions"]:
|
||||
# TODO apply transition
|
||||
pass
|
Loading…
Reference in New Issue