//! Integration test helpers, re-exported from `test_fixtures` for backwards //! compatibility. The actual fixtures live in the `test_fixtures` crate so that //! non-test consumers (e.g. `integration_bench`) can depend on them without //! pulling in the test files. use std::time::Duration; use anyhow::{Context as _, Result}; use log::info; pub use test_fixtures::*; /// Maximum time to wait for the indexer to catch up to the sequencer. pub const L2_TO_L1_TIMEOUT: Duration = Duration::from_mins(6); /// Poll the indexer until its last finalized block id reaches the sequencer's /// current last block id or until [`L2_TO_L1_TIMEOUT`] elapses. /// Returns the last indexer block id observed. pub async fn wait_for_indexer_to_catch_up(ctx: &TestContext) -> Result { use indexer_service_rpc::RpcClient as _; let block_id_to_catch_up = sequencer_service_rpc::RpcClient::get_last_block_id(ctx.sequencer_client()).await?; let mut last_ind: u64 = 1; let inner = async { loop { let ind = ctx .indexer_client() .get_last_finalized_block_id() .await? .unwrap_or(0); last_ind = ind; if ind >= block_id_to_catch_up { let last_seq = sequencer_service_rpc::RpcClient::get_last_block_id(ctx.sequencer_client()) .await?; info!( "Indexer caught up. Indexer last block id: {ind}. Current sequencer last block id: {last_seq}" ); return Ok(ind); } tokio::time::sleep(Duration::from_secs(2)).await; } }; tokio::time::timeout(L2_TO_L1_TIMEOUT, inner) .await .with_context(|| { format!( "Indexer failed to catch up within {L2_TO_L1_TIMEOUT:?}. Last indexer block id observed: {last_ind}, but needed to catch up to at least {block_id_to_catch_up}" ) })? }