Merge pull request #2765 from ralexstokes/fix-spec-config-concurrency-issue
Update per-test config to be unique per-test in `spec_configured_state_test`
This commit is contained in:
commit
c3c24fb13a
|
@ -1,6 +1,6 @@
|
||||||
import pytest
|
import pytest
|
||||||
from copy import deepcopy
|
|
||||||
from dataclasses import dataclass
|
from dataclasses import dataclass
|
||||||
|
import importlib
|
||||||
from eth_utils import encode_hex
|
from eth_utils import encode_hex
|
||||||
|
|
||||||
from eth2spec.phase0 import mainnet as spec_phase0_mainnet, minimal as spec_phase0_minimal
|
from eth2spec.phase0 import mainnet as spec_phase0_mainnet, minimal as spec_phase0_minimal
|
||||||
|
@ -86,10 +86,9 @@ class SpecForks(TypedDict, total=False):
|
||||||
|
|
||||||
def _prepare_state(balances_fn: Callable[[Any], Sequence[int]], threshold_fn: Callable[[Any], int],
|
def _prepare_state(balances_fn: Callable[[Any], Sequence[int]], threshold_fn: Callable[[Any], int],
|
||||||
spec: Spec, phases: SpecForks):
|
spec: Spec, phases: SpecForks):
|
||||||
phase = phases[spec.fork]
|
balances = balances_fn(spec)
|
||||||
balances = balances_fn(phase)
|
activation_threshold = threshold_fn(spec)
|
||||||
activation_threshold = threshold_fn(phase)
|
state = create_genesis_state(spec=spec, validator_balances=balances,
|
||||||
state = create_genesis_state(spec=phase, validator_balances=balances,
|
|
||||||
activation_threshold=activation_threshold)
|
activation_threshold=activation_threshold)
|
||||||
return state
|
return state
|
||||||
|
|
||||||
|
@ -481,6 +480,16 @@ def _get_basic_dict(ssz_dict: Dict[str, Any]) -> Dict[str, Any]:
|
||||||
return result
|
return result
|
||||||
|
|
||||||
|
|
||||||
|
def _get_copy_of_spec(spec):
|
||||||
|
fork = spec.fork
|
||||||
|
preset = spec.config.PRESET_BASE
|
||||||
|
module_path = f"eth2spec.{fork}.{preset}"
|
||||||
|
module_spec = importlib.util.find_spec(module_path)
|
||||||
|
module = importlib.util.module_from_spec(module_spec)
|
||||||
|
module_spec.loader.exec_module(module)
|
||||||
|
return module
|
||||||
|
|
||||||
|
|
||||||
def with_config_overrides(config_overrides):
|
def with_config_overrides(config_overrides):
|
||||||
"""
|
"""
|
||||||
WARNING: the spec_test decorator must wrap this, to ensure the decorated test actually runs.
|
WARNING: the spec_test decorator must wrap this, to ensure the decorated test actually runs.
|
||||||
|
@ -491,22 +500,20 @@ def with_config_overrides(config_overrides):
|
||||||
"""
|
"""
|
||||||
def decorator(fn):
|
def decorator(fn):
|
||||||
def wrapper(*args, spec: Spec, **kw):
|
def wrapper(*args, spec: Spec, **kw):
|
||||||
# remember the old config
|
spec = _get_copy_of_spec(spec)
|
||||||
old_config = spec.config
|
|
||||||
|
|
||||||
# apply our overrides to a copy of it, and apply it to the spec
|
# apply our overrides to a copy of it, and apply it to the spec
|
||||||
tmp_config = deepcopy(old_config._asdict()) # not a private method, there are multiple
|
config = spec.config._asdict()
|
||||||
tmp_config.update(config_overrides)
|
config.update(config_overrides)
|
||||||
config_types = spec.Configuration.__annotations__
|
config_types = spec.Configuration.__annotations__
|
||||||
# Retain types of all config values
|
modified_config = {k: config_types[k](v) for k, v in config.items()}
|
||||||
test_config = {k: config_types[k](v) for k, v in tmp_config.items()}
|
|
||||||
|
|
||||||
# To output the changed config to could be serialized with yaml test vectors,
|
# To output the changed config to could be serialized with yaml test vectors,
|
||||||
# the dict SSZ objects have to be converted into Python built-in types.
|
# the dict SSZ objects have to be converted into Python built-in types.
|
||||||
output_config = _get_basic_dict(test_config)
|
output_config = _get_basic_dict(modified_config)
|
||||||
yield 'config', 'data', output_config
|
yield 'config', 'data', output_config
|
||||||
|
|
||||||
spec.config = spec.Configuration(**test_config)
|
spec.config = spec.Configuration(**modified_config)
|
||||||
|
|
||||||
# Run the function
|
# Run the function
|
||||||
out = fn(*args, spec=spec, **kw)
|
out = fn(*args, spec=spec, **kw)
|
||||||
|
@ -514,10 +521,6 @@ def with_config_overrides(config_overrides):
|
||||||
# it's generating things, and we need to complete it before setting back the config.
|
# it's generating things, and we need to complete it before setting back the config.
|
||||||
if out is not None:
|
if out is not None:
|
||||||
yield from out
|
yield from out
|
||||||
|
|
||||||
# Restore the old config and apply it
|
|
||||||
spec.config = old_config
|
|
||||||
|
|
||||||
return wrapper
|
return wrapper
|
||||||
return decorator
|
return decorator
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue