//! Helpers for testing. use crate::execute::{ BatchExecutor, BlockExecutionInput, BlockExecutionOutput, BlockExecutorProvider, Executor, }; use parking_lot::Mutex; use reth_execution_errors::BlockExecutionError; use reth_execution_types::ExecutionOutcome; use reth_primitives::{BlockNumber, BlockWithSenders, Receipt}; use reth_prune_types::PruneModes; use reth_storage_errors::provider::ProviderError; use revm_primitives::db::Database; use std::{fmt::Display, sync::Arc}; /// A [`BlockExecutorProvider`] that returns mocked execution results. #[derive(Clone, Debug, Default)] pub struct MockExecutorProvider { exec_results: Arc>>, } impl MockExecutorProvider { /// Extend the mocked execution results pub fn extend(&self, results: impl IntoIterator>) { self.exec_results.lock().extend(results.into_iter().map(Into::into)); } } impl BlockExecutorProvider for MockExecutorProvider { type Executor + Display>> = Self; type BatchExecutor + Display>> = Self; fn executor(&self, _: DB) -> Self::Executor where DB: Database + Display>, { self.clone() } fn batch_executor(&self, _: DB) -> Self::BatchExecutor where DB: Database + Display>, { self.clone() } } impl Executor for MockExecutorProvider { type Input<'a> = BlockExecutionInput<'a, BlockWithSenders>; type Output = BlockExecutionOutput; type Error = BlockExecutionError; fn execute(self, _: Self::Input<'_>) -> Result { let ExecutionOutcome { bundle, receipts, requests, first_block: _ } = self.exec_results.lock().pop().unwrap(); Ok(BlockExecutionOutput { state: bundle, receipts: receipts.into_iter().flatten().flatten().collect(), requests: requests.into_iter().flatten().collect(), gas_used: 0, }) } } impl BatchExecutor for MockExecutorProvider { type Input<'a> = BlockExecutionInput<'a, BlockWithSenders>; type Output = ExecutionOutcome; type Error = BlockExecutionError; fn execute_and_verify_one(&mut self, _: Self::Input<'_>) -> Result<(), Self::Error> { Ok(()) } fn finalize(self) -> Self::Output { self.exec_results.lock().pop().unwrap() } fn set_tip(&mut self, _: BlockNumber) {} fn set_prune_modes(&mut self, _: PruneModes) {} fn size_hint(&self) -> Option { None } }