Skip to content

Commit 609968c

Browse files
committed
apollo_integration_tests: make sure each integration test uses a different port for Anvil
1 parent 213e80b commit 609968c

File tree

10 files changed

+73
-10
lines changed

10 files changed

+73
-10
lines changed

Cargo.lock

Lines changed: 2 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

crates/apollo_base_layer_tests/Cargo.toml

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,8 @@ colored.workspace = true
1919
papyrus_base_layer = { workspace = true, features = ["testing"] }
2020
starknet_api.workspace = true
2121
tokio.workspace = true
22+
tracing.workspace = true
2223
url.workspace = true
2324

2425
[dev-dependencies]
26+
apollo_infra_utils.workspace = true

crates/apollo_base_layer_tests/src/anvil_base_layer.rs

Lines changed: 18 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
use std::ops::RangeInclusive;
22
use std::process::Command;
3+
use std::time::Duration;
34

45
use alloy::node_bindings::NodeError as AnvilError;
56
use alloy::primitives::{I256, U256};
@@ -29,6 +30,7 @@ use starknet_api::block::BlockHashAndNumber;
2930
use starknet_api::hash::StarkHash;
3031
use starknet_api::transaction::L1HandlerTransaction;
3132
use url::Url;
33+
use tracing::info;
3234

3335
/// Initialize an anvil instance under the default port and deploy the Starknet contract.
3436
///
@@ -96,8 +98,22 @@ curl -L \
9698
_ => panic!("Failed to spawn Anvil: {}", error.to_string().red()),
9799
});
98100

99-
Starknet::deploy(anvil_client.clone()).await.unwrap();
100-
101+
info!("Deploying Starknet contract to Anvil with port: {}", port);
102+
let mut retries = 0;
103+
for _ in 0..100 {
104+
let result = Starknet::deploy(anvil_client.clone()).await;
105+
if result.is_ok() {
106+
break;
107+
}
108+
retries += 1;
109+
tokio::time::sleep(Duration::from_millis(10)).await;
110+
}
111+
Starknet::deploy(anvil_client.clone()).await.unwrap_or_else(|error| {
112+
panic!(
113+
"Failed to deploy Starknet contract to Anvil on port {port} after {retries} \
114+
retries: {error:?}"
115+
);
116+
});
101117
let config = Self::config(Self::url_static(port));
102118
let url_iterator = CircularUrlIterator::new(config.ordered_l1_endpoint_urls.clone());
103119
let root_client = anvil_client.root().clone();

crates/apollo_base_layer_tests/tests/anvil_starts_with_no_contract.rs

Lines changed: 10 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
use alloy::node_bindings::Anvil;
2+
use apollo_infra_utils::test_utils::{AvailablePortsGenerator, TestIdentifier};
23
use papyrus_base_layer::ethereum_base_layer_contract::{
34
EthereumBaseLayerConfig,
45
EthereumBaseLayerContract,
@@ -10,14 +11,20 @@ use papyrus_base_layer::test_utils::{
1011
OTHER_ARBITRARY_ANVIL_L1_ACCOUNT_ADDRESS,
1112
};
1213
use papyrus_base_layer::BaseLayerContract;
14+
use tracing::info;
1315

1416
#[tokio::test]
1517
async fn anvil_starts_with_no_contract() {
1618
const NUM_L1_TRANSACTIONS: usize = 10;
17-
// TODO(GuyNir/Shahak): avoid this hard-coded port number, and align port usages throughout the
18-
// anvil instances.
19+
let mut ports_gen =
20+
AvailablePortsGenerator::new(TestIdentifier::AnvilStartsWithNoContractTest.into());
21+
let mut available_ports = ports_gen
22+
.next()
23+
.expect("Failed to get an AvailablePorts instance for anvil_starts_with_no_contract");
24+
let port = available_ports.get_next_port();
25+
info!("Starting Anvil with port: {}", port);
1926
let anvil = Anvil::new()
20-
.port(9999_u16)
27+
.port(port)
2128
.try_spawn()
2229
.expect("Anvil not installed, see anvil base layer for installation instructions.");
2330
let base_layer_config = EthereumBaseLayerConfig {

crates/apollo_infra_utils/src/test_utils.rs

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,12 @@ pub enum TestIdentifier {
4444
SyncFlowIntegrationTest,
4545
StorageReaderServerUnitTests,
4646
StorageReaderTypesUnitTests,
47+
L1EventsScraperEndToEndTest,
48+
MockedStarknetStateUpdateTest,
49+
LatestProvedBlockEthereumTest,
50+
EventsFromOtherContractsTest,
51+
L1ProviderUnitTests,
52+
AnvilStartsWithNoContractTest,
4753
}
4854

4955
#[derive(Debug)]

crates/apollo_integration_tests/tests/events_from_other_contracts.rs

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
use apollo_base_layer_tests::anvil_base_layer::{send_message_to_l2, AnvilBaseLayer};
2+
use apollo_infra_utils::test_utils::{AvailablePortsGenerator, TestIdentifier};
23
use assert_matches::assert_matches;
34
use papyrus_base_layer::constants::{EventIdentifier, LOG_MESSAGE_TO_L2_EVENT_IDENTIFIER};
45
use papyrus_base_layer::ethereum_base_layer_contract::Starknet;
@@ -14,7 +15,13 @@ use starknet_api::{calldata, contract_address, felt};
1415
async fn events_from_other_contract() {
1516
const EVENT_IDENTIFIERS: &[EventIdentifier] = &[LOG_MESSAGE_TO_L2_EVENT_IDENTIFIER];
1617

17-
let mut anvil_base_layer = AnvilBaseLayer::new(None, Some(8888)).await;
18+
let mut ports_gen =
19+
AvailablePortsGenerator::new(TestIdentifier::EventsFromOtherContractsTest.into());
20+
let mut available_ports = ports_gen
21+
.next()
22+
.expect("Failed to get an AvailablePorts instance for events_from_other_contract");
23+
let mut anvil_base_layer =
24+
AnvilBaseLayer::new(None, Some(available_ports.get_next_port())).await;
1825
// Anvil base layer already auto-deployed a starknet contract.
1926
let this_contract = &anvil_base_layer.ethereum_base_layer.contract;
2027

crates/apollo_integration_tests/tests/l1_events_scraper_end_to_end.rs

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ use std::time::Duration;
33

44
use alloy::primitives::U256;
55
use apollo_base_layer_tests::anvil_base_layer::AnvilBaseLayer;
6+
use apollo_infra_utils::test_utils::{AvailablePortsGenerator, TestIdentifier};
67
use apollo_l1_provider::event_identifiers_to_track;
78
use apollo_l1_provider::l1_scraper::L1Scraper;
89
use apollo_l1_provider_types::{Event, MockL1ProviderClient};
@@ -22,7 +23,12 @@ use starknet_api::transaction::{L1HandlerTransaction, TransactionHasher, Transac
2223
#[tokio::test]
2324
async fn scraper_end_to_end() {
2425
// Setup.
25-
let mut base_layer = AnvilBaseLayer::new(None, None).await;
26+
let mut ports_gen =
27+
AvailablePortsGenerator::new(TestIdentifier::L1EventsScraperEndToEndTest.into());
28+
let mut available_ports = ports_gen
29+
.next()
30+
.expect("Failed to get an AvailablePorts instance for l1_events_scraper_end_to_end");
31+
let mut base_layer = AnvilBaseLayer::new(None, Some(available_ports.get_next_port())).await;
2632
let contract = &base_layer.ethereum_base_layer.contract;
2733
let mut l1_provider_client = MockL1ProviderClient::default();
2834

crates/apollo_integration_tests/tests/latest_proved_block_ethereum.rs

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
use alloy::providers::Provider;
22
use apollo_base_layer_tests::anvil_base_layer::{AnvilBaseLayer, MockedStateUpdate};
3+
use apollo_infra_utils::test_utils::{AvailablePortsGenerator, TestIdentifier};
34
use papyrus_base_layer::BaseLayerContract;
45
use pretty_assertions::assert_eq;
56
use starknet_api::block::{BlockHash, BlockHashAndNumber, BlockNumber};
@@ -49,7 +50,12 @@ async fn latest_proved_block_ethereum() {
4950
))),
5051
};
5152

52-
let mut base_layer = AnvilBaseLayer::new(None, None).await;
53+
let mut ports_gen =
54+
AvailablePortsGenerator::new(TestIdentifier::LatestProvedBlockEthereumTest.into());
55+
let mut available_ports = ports_gen
56+
.next()
57+
.expect("Failed to get an AvailablePorts instance for latest_proved_block_ethereum");
58+
let mut base_layer = AnvilBaseLayer::new(None, Some(available_ports.get_next_port())).await;
5359
let provider = &base_layer.anvil_provider;
5460

5561
let mut current_block = provider.get_block_number().await.expect("Failed to get block number");

crates/apollo_integration_tests/tests/mocked_starknet_state_update_test.rs

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,14 +3,20 @@ use alloy::providers::Provider;
33
use alloy::rpc::types::eth::Filter as EthEventFilter;
44
use alloy::sol_types::SolEventInterface;
55
use apollo_base_layer_tests::anvil_base_layer::{AnvilBaseLayer, MockedStateUpdate};
6+
use apollo_infra_utils::test_utils::{AvailablePortsGenerator, TestIdentifier};
67
use papyrus_base_layer::ethereum_base_layer_contract::Starknet;
78
use papyrus_base_layer::BaseLayerContract;
89
use pretty_assertions::assert_eq;
910
use starknet_api::block::{BlockHash, BlockHashAndNumber, BlockNumber};
1011

1112
#[tokio::test]
1213
async fn test_mocked_starknet_state_update() {
13-
let mut base_layer = AnvilBaseLayer::new(None, None).await;
14+
let mut ports_gen =
15+
AvailablePortsGenerator::new(TestIdentifier::MockedStarknetStateUpdateTest.into());
16+
let mut available_ports = ports_gen
17+
.next()
18+
.expect("Failed to get an AvailablePorts instance for mocked_starknet_state_update_test");
19+
let mut base_layer = AnvilBaseLayer::new(None, Some(available_ports.get_next_port())).await;
1420

1521
// Check that the contract was initialized (during the construction above).
1622
let genesis_block_number = 1;

crates/apollo_l1_provider/tests/utils/mod.rs

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@ use apollo_infra::component_server::{
1717
LocalComponentServer,
1818
LocalServerConfig,
1919
};
20+
use apollo_infra_utils::test_utils::{AvailablePortsGenerator, TestIdentifier};
2021
use apollo_l1_provider::l1_provider::L1Provider;
2122
use apollo_l1_provider::l1_scraper::L1Scraper;
2223
use apollo_l1_provider::metrics::L1_PROVIDER_INFRA_METRICS;
@@ -67,7 +68,11 @@ fn convert_call_data_to_u256(call_data: &[u8]) -> Vec<Uint<256, 4>> {
6768
// Need to allow dead code as this is only used in some of the test crates.
6869
#[allow(dead_code)]
6970
pub(crate) async fn setup_anvil_base_layer() -> AnvilBaseLayer {
70-
let mut base_layer = AnvilBaseLayer::new(None, None).await;
71+
let mut ports_gen = AvailablePortsGenerator::new(TestIdentifier::L1ProviderUnitTests.into());
72+
let mut available_ports = ports_gen
73+
.next()
74+
.expect("Failed to get an AvailablePorts instance for L1 provider unit tests");
75+
let mut base_layer = AnvilBaseLayer::new(None, Some(available_ports.get_next_port())).await;
7176
anvil_mine_blocks(base_layer.ethereum_base_layer.config.clone(), NUMBER_OF_BLOCKS_TO_MINE)
7277
.await;
7378
// We use a really long timeout because in the tests we sometimes advance the fake time by large

0 commit comments

Comments
 (0)