feat: add UX improvements on e2e testing (#7804)

This commit is contained in:
joshieDo
2024-04-23 15:30:38 +01:00
committed by GitHub
parent 9fd35f948c
commit b3db4cf56d
16 changed files with 343 additions and 221 deletions

View File

@ -1,80 +1,28 @@
use crate::utils::{advance_chain, setup};
use std::sync::Arc;
use crate::utils::optimism_payload_attributes;
use reth::{
args::{DiscoveryArgs, NetworkArgs, RpcServerArgs},
builder::{NodeBuilder, NodeConfig, NodeHandle},
tasks::TaskManager,
};
use reth_e2e_test_utils::{node::NodeHelper, wallet::Wallet};
use reth_node_optimism::node::OptimismNode;
use reth_primitives::{hex, Bytes, ChainSpecBuilder, Genesis, BASE_MAINNET};
use tokio::sync::Mutex;
#[tokio::test]
async fn can_sync() -> eyre::Result<()> {
reth_tracing::init_test_tracing();
let tasks = TaskManager::current();
let exec = tasks.executor();
let (mut nodes, _tasks, wallet) = setup(2).await?;
let wallet = Arc::new(Mutex::new(wallet));
let genesis: Genesis = serde_json::from_str(include_str!("../assets/genesis.json")).unwrap();
let chain_spec = Arc::new(
ChainSpecBuilder::default()
.chain(BASE_MAINNET.chain)
.genesis(genesis)
.ecotone_activated()
.build(),
);
let mut wallet = Wallet::default().with_chain_id(chain_spec.chain.into());
let second_node = nodes.pop().unwrap();
let mut first_node = nodes.pop().unwrap();
let network_config = NetworkArgs {
discovery: DiscoveryArgs { disable_discovery: true, ..DiscoveryArgs::default() },
..NetworkArgs::default()
};
let tip: usize = 300;
let tip_index: usize = tip - 1;
let node_config = NodeConfig::test()
.with_chain(chain_spec)
.with_network(network_config)
.with_unused_ports()
.with_rpc(RpcServerArgs::default().with_unused_ports().with_http());
// On first node, create a chain up to block number 300a
let canonical_payload_chain = advance_chain(tip, &mut first_node, wallet.clone()).await?;
let canonical_chain =
canonical_payload_chain.iter().map(|p| p.0.block().hash()).collect::<Vec<_>>();
let NodeHandle { node, node_exit_future: _ } = NodeBuilder::new(node_config.clone())
.testing_node(exec.clone())
.node(OptimismNode::default())
.launch()
.await?;
let mut first_node = NodeHelper::new(node.clone()).await?;
let NodeHandle { node, node_exit_future: _ } = NodeBuilder::new(node_config)
.testing_node(exec)
.node(OptimismNode::default())
.launch()
.await?;
let mut second_node = NodeHelper::new(node).await?;
// Make them peer
first_node.network.add_peer(second_node.network.record()).await;
second_node.network.add_peer(first_node.network.record()).await;
// Make sure they establish a new session
first_node.network.expect_session().await;
second_node.network.expect_session().await;
// Taken from optimism tests
let l1_block_info = Bytes::from_static(&hex!("7ef9015aa044bae9d41b8380d781187b426c6fe43df5fb2fb57bd4466ef6a701e1f01e015694deaddeaddeaddeaddeaddeaddeaddeaddead000194420000000000000000000000000000000000001580808408f0d18001b90104015d8eb900000000000000000000000000000000000000000000000000000000008057650000000000000000000000000000000000000000000000000000000063d96d10000000000000000000000000000000000000000000000000000000000009f35273d89754a1e0387b89520d989d3be9c37c1f32495a88faf1ea05c61121ab0d1900000000000000000000000000000000000000000000000000000000000000010000000000000000000000002d679b567db6187c0c8323fa982cfb88b74dbcc7000000000000000000000000000000000000000000000000000000000000083400000000000000000000000000000000000000000000000000000000000f4240"));
// Make the first node advance
let raw_tx = wallet.tx(Some(l1_block_info)).await;
let (block_hash, tx_hash) =
first_node.advance(raw_tx.clone(), optimism_payload_attributes).await?;
// only send forkchoice update to second node
second_node.engine_api.update_forkchoice(block_hash).await?;
// expect second node advanced via p2p gossip
second_node.assert_new_block(tx_hash, block_hash, 1).await?;
// On second node, sync up to block number 300a
second_node.engine_api.update_forkchoice(canonical_chain[tip_index]).await?;
second_node.wait_block(tip as u64, canonical_chain[tip_index], true).await?;
Ok(())
}

View File

@ -1,7 +1,45 @@
use reth::rpc::types::engine::PayloadAttributes;
use reth_node_optimism::OptimismPayloadBuilderAttributes;
use reth::{rpc::types::engine::PayloadAttributes, tasks::TaskManager};
use reth_e2e_test_utils::{wallet::Wallet, NodeHelperType};
use reth_node_optimism::{OptimismBuiltPayload, OptimismNode, OptimismPayloadBuilderAttributes};
use reth_payload_builder::EthPayloadBuilderAttributes;
use reth_primitives::{Address, B256};
use reth_primitives::{Address, ChainSpecBuilder, Genesis, B256, BASE_MAINNET};
use std::sync::Arc;
use tokio::sync::Mutex;
/// Optimism Node Helper type
pub(crate) type OpNode = NodeHelperType<OptimismNode>;
pub(crate) async fn setup(num_nodes: usize) -> eyre::Result<(Vec<OpNode>, TaskManager, Wallet)> {
let genesis: Genesis = serde_json::from_str(include_str!("../assets/genesis.json")).unwrap();
reth_e2e_test_utils::setup(
num_nodes,
Arc::new(
ChainSpecBuilder::default()
.chain(BASE_MAINNET.chain)
.genesis(genesis)
.ecotone_activated()
.build(),
),
false,
)
.await
}
pub(crate) async fn advance_chain(
length: usize,
node: &mut OpNode,
wallet: Arc<Mutex<Wallet>>,
) -> eyre::Result<Vec<(OptimismBuiltPayload, OptimismPayloadBuilderAttributes)>> {
node.advance(
length as u64,
|| {
let wallet = wallet.clone();
Box::pin(async move { wallet.lock().await.optimism_l1_block_info_tx().await })
},
optimism_payload_attributes,
)
.await
}
/// Helper function to create a new eth payload attributes
pub(crate) fn optimism_payload_attributes(timestamp: u64) -> OptimismPayloadBuilderAttributes {