Skip to content

Commit

Permalink
Only publish necessary ports for emulator container
Browse files Browse the repository at this point in the history
also make sure to randomize host port so that tests don't clobber each
other when ran in parallel
  • Loading branch information
elizabethengelman committed Jul 30, 2024
1 parent e1e69ae commit 61f56f4
Showing 1 changed file with 29 additions and 2 deletions.
31 changes: 29 additions & 2 deletions cmd/crates/stellar-ledger/tests/test/emulator_tests.rs
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@ use soroban_env_host::xdr::{self, Operation, OperationBody, Uint256};
use soroban_env_host::xdr::{Hash, Transaction};
use std::vec;

use std::net::TcpListener;
use stellar_ledger::hd_path::HdPath;
use stellar_ledger::{Blob, Error, LedgerSigner};

Expand All @@ -14,7 +15,7 @@ use stellar_xdr::curr::{
Memo, MuxedAccount, PaymentOp, Preconditions, SequenceNumber, TransactionExt,
};

use testcontainers::clients;
use testcontainers::{clients, core::Port, RunnableImage};
use tokio::time::sleep;

pub const TEST_NETWORK_PASSPHRASE: &[u8] = b"Test SDF Network ; September 2015";
Expand Down Expand Up @@ -73,6 +74,18 @@ async fn test_get_public_key(ledger_device_model: String) {
node.stop();
}

fn get_available_ports() -> (u16, u16) {
let listener1 = TcpListener::bind("127.0.0.1:0").unwrap();
let listener2 = TcpListener::bind("127.0.0.1:0").unwrap();
println!("listener1: {:?}", listener1);
let port_1 = listener1.local_addr().unwrap().port();
let port_2 = listener2.local_addr().unwrap().port();
drop(listener1);
drop(listener2);

(port_1, port_2)
}

#[test_case("nanos".to_string() ; "when the device is NanoS")]
#[test_case("nanox".to_string() ; "when the device is NanoX")]
#[test_case("nanosp".to_string() ; "when the device is NanoS Plus")]
Expand All @@ -82,7 +95,21 @@ async fn test_get_app_configuration(ledger_device_model: String) {
ledger_device_model,
};
let docker = clients::Cli::default();
let node = docker.run((Speculos::new(), args));
let runnable_image: RunnableImage<Speculos> = (Speculos::new(), args.clone()).into();

// doing this to randomize the ports on the host so that parallel tests don't clobber each other
let (tcp_port_1, tcp_port_2) = get_available_ports();
let runnable_image = runnable_image
.with_mapped_port(Port {
local: tcp_port_1,
internal: 9998,
})
.with_mapped_port(Port {
local: tcp_port_2,
internal: 5000,
});

let node = docker.run(runnable_image);
let host_port = node.get_host_port_ipv4(9998);
let ui_host_port: u16 = node.get_host_port_ipv4(5000);
wait_for_emulator_start_text(ui_host_port).await;
Expand Down

0 comments on commit 61f56f4

Please sign in to comment.