From 0b1852534492996f99e72e754e97aabc0ca48d1f Mon Sep 17 00:00:00 2001 From: kclowes Date: Wed, 27 May 2026 11:12:14 -0600 Subject: [PATCH] feat(test-consume): Validate RPC header fields in consume rlp (#2895) * feat(test-consume): Validate RPC header fields * fix(tests-rlp): Raise nice AssertionError --- .../simulator_logic/test_via_rlp.py | 25 +++++++++++++++++++ 1 file changed, 25 insertions(+) diff --git a/packages/testing/src/execution_testing/cli/pytest_commands/plugins/consume/simulators/simulator_logic/test_via_rlp.py b/packages/testing/src/execution_testing/cli/pytest_commands/plugins/consume/simulators/simulator_logic/test_via_rlp.py index b219edf74e2..929bc64979c 100644 --- a/packages/testing/src/execution_testing/cli/pytest_commands/plugins/consume/simulators/simulator_logic/test_via_rlp.py +++ b/packages/testing/src/execution_testing/cli/pytest_commands/plugins/consume/simulators/simulator_logic/test_via_rlp.py @@ -7,12 +7,17 @@ """ import logging +from typing import Any, Dict +from pydantic import ValidationError + +from execution_testing.base_types import HexNumber from execution_testing.fixtures import BlockchainFixture from execution_testing.fixtures.blockchain import ( FixtureBlock, FixtureHeader, ) +from execution_testing.forks import Fork, TransitionFork from execution_testing.rpc import EthRPC from ..helpers.exceptions import GenesisBlockMismatchExceptionError @@ -21,6 +26,23 @@ logger = logging.getLogger(__name__) +def _validate_rpc_header_fields( + block: Dict[str, Any], + fixture_fork: Fork | TransitionFork, +) -> None: + applicable_fork = fixture_fork.fork_at( + block_number=HexNumber(block["number"]), + timestamp=HexNumber(block["timestamp"]), + ) + try: + FixtureHeader.model_validate({**block, "fork": applicable_fork}) + except ValidationError as e: + raise AssertionError( + f"Invalid or missing required header field for " + f"block {block['number']}: {e}" + ) from e + + def test_via_rlp( timing_data: TimingData, eth_rpc: EthRPC, @@ -44,6 +66,7 @@ def test_via_rlp( logger.info("Calling getBlockByNumber to get latest block...") block = eth_rpc.get_block_by_number("latest") assert block, "`getBlockByNumber` didn't return a block." + _validate_rpc_header_fields(block, fixture.fork) if block["hash"] != str(fixture.last_block_hash): try: block_header = FixtureHeader.model_validate(block).model_dump() @@ -71,6 +94,8 @@ def test_via_rlp( "blockHash mismatch in last block - field mismatches:" "\n" + "\n".join(mismatches) ) + except AssertionError: + raise except Exception: raise AssertionError( f"blockHash mismatch in last block: "