Skip to main content

reth_network/test_utils/
transactions.rs

1//! Test helper impls for transactions
2
3#![allow(dead_code)]
4
5use crate::{
6    cache::LruCache,
7    transactions::{
8        constants::{
9            tx_fetcher::DEFAULT_MAX_COUNT_FALLBACK_PEERS,
10            tx_manager::DEFAULT_MAX_COUNT_TRANSACTIONS_SEEN_BY_PEER,
11        },
12        fetcher::{TransactionFetcher, TxFetchMetadata},
13        PeerMetadata, TransactionsManager,
14    },
15    NetworkConfigBuilder, NetworkManager,
16};
17use alloy_primitives::TxHash;
18use reth_eth_wire::EthVersion;
19use reth_eth_wire_types::EthNetworkPrimitives;
20use reth_network_api::{PeerKind, PeerRequest, PeerRequestSender};
21use reth_network_peers::PeerId;
22use reth_storage_api::noop::NoopProvider;
23use reth_tasks::Runtime;
24use reth_transaction_pool::test_utils::{testing_pool, TestPool};
25use secp256k1::SecretKey;
26use std::sync::Arc;
27use tokio::sync::mpsc;
28use tracing::trace;
29
30/// A new tx manager for testing.
31pub async fn new_tx_manager(
32) -> (TransactionsManager<TestPool, EthNetworkPrimitives>, NetworkManager<EthNetworkPrimitives>) {
33    let secret_key = SecretKey::new(&mut rand_08::thread_rng());
34    let client = NoopProvider::default();
35
36    let config = NetworkConfigBuilder::new(secret_key, Runtime::test())
37        // let OS choose port
38        .listener_port(0)
39        .disable_discovery()
40        .build(client);
41
42    let pool = testing_pool();
43
44    let transactions_manager_config = config.transactions_manager_config.clone();
45    let (_network_handle, network, transactions, _) = NetworkManager::new(config)
46        .await
47        .unwrap()
48        .into_builder()
49        .transactions(pool.clone(), transactions_manager_config)
50        .split_with_handle();
51
52    (transactions, network)
53}
54
55/// Directly buffer hash into tx fetcher for testing.
56pub fn buffer_hash_to_tx_fetcher(
57    tx_fetcher: &mut TransactionFetcher,
58    hash: TxHash,
59    peer_id: PeerId,
60    retries: u8,
61    tx_encoded_length: Option<usize>,
62) {
63    match tx_fetcher.hashes_fetch_inflight_and_pending_fetch.get_or_insert(hash, || {
64        TxFetchMetadata::new(
65            retries,
66            LruCache::new(DEFAULT_MAX_COUNT_FALLBACK_PEERS as u32),
67            tx_encoded_length,
68        )
69    }) {
70        Some(metadata) => {
71            metadata.fallback_peers_mut().insert(peer_id);
72        }
73        None => {
74            trace!(target: "net::tx",
75                    peer_id=format!("{peer_id:#}"),
76                    %hash,
77                    "failed to insert hash from peer in schnellru::LruMap, dropping hash"
78            )
79        }
80    }
81
82    tx_fetcher.hashes_pending_fetch.insert(hash);
83}
84
85/// Mock a new session, returns (peer, channel-to-send-get-pooled-tx-response-on).
86pub fn new_mock_session(
87    peer_id: PeerId,
88    version: EthVersion,
89) -> (PeerMetadata<EthNetworkPrimitives>, mpsc::Receiver<PeerRequest>) {
90    let (to_mock_session_tx, to_mock_session_rx) = mpsc::channel(1);
91
92    (
93        PeerMetadata::new(
94            PeerRequestSender::new(peer_id, to_mock_session_tx),
95            version,
96            Arc::from(""),
97            DEFAULT_MAX_COUNT_TRANSACTIONS_SEEN_BY_PEER,
98            PeerKind::Trusted,
99        ),
100        to_mock_session_rx,
101    )
102}