diff --git a/Cargo.lock b/Cargo.lock index e4ea12990a34..2bf7a63ad790 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -18169,6 +18169,7 @@ dependencies = [ "ic-vetkd-utils", "k256 0.13.4", "lazy_static", + "once_cell", "reqwest 0.12.12", "schemars", "serde", @@ -18185,6 +18186,7 @@ dependencies = [ "tracing", "tracing-appender", "tracing-subscriber", + "uuid", "wat", "wslpath", ] @@ -18284,6 +18286,7 @@ dependencies = [ "tracing", "tracing-appender", "tracing-subscriber", + "uuid", "wat", ] diff --git a/packages/pocket-ic/BUILD.bazel b/packages/pocket-ic/BUILD.bazel index f7e60bd9680f..171f6186dc63 100644 --- a/packages/pocket-ic/BUILD.bazel +++ b/packages/pocket-ic/BUILD.bazel @@ -12,6 +12,7 @@ DEPENDENCIES = [ "@crate_index//:ic-certification", "@crate_index//:ic-management-canister-types", "@crate_index//:ic-transport-types", + "@crate_index//:once_cell", "@crate_index//:reqwest", "@crate_index//:schemars", "@crate_index//:serde", @@ -27,6 +28,7 @@ DEPENDENCIES = [ "@crate_index//:tracing", "@crate_index//:tracing-appender", "@crate_index//:tracing-subscriber", + "@crate_index//:uuid", ] MACRO_DEPENDENCIES = [ diff --git a/packages/pocket-ic/Cargo.toml b/packages/pocket-ic/Cargo.toml index 425e6badb8c1..874fca225437 100644 --- a/packages/pocket-ic/Cargo.toml +++ b/packages/pocket-ic/Cargo.toml @@ -28,6 +28,7 @@ hex = { workspace = true } ic-certification = { workspace = true } ic-management-canister-types = { workspace = true } ic-transport-types = { workspace = true } +once_cell = "1.18.0" reqwest = { workspace = true } schemars = "0.8.16" serde = { workspace = true } @@ -44,6 +45,7 @@ tokio = { workspace = true } tracing = { workspace = true } tracing-appender = { workspace = true } tracing-subscriber = { workspace = true } +uuid = { workspace = true } [target.'cfg(windows)'.dependencies] wslpath = "0.0.2" diff --git a/packages/pocket-ic/src/lib.rs b/packages/pocket-ic/src/lib.rs index 23c3dc97378d..840a46c5577c 100644 --- a/packages/pocket-ic/src/lib.rs +++ b/packages/pocket-ic/src/lib.rs @@ -71,6 +71,7 @@ use ic_management_canister_types::{ Snapshot, }; use ic_transport_types::SubnetMetrics; +use once_cell::sync::Lazy; use reqwest::Url; use schemars::JsonSchema; use serde::{Deserialize, Serialize}; @@ -92,6 +93,7 @@ use tempfile::TempDir; use thiserror::Error; use tokio::runtime::Runtime; use tracing::{instrument, warn}; +use uuid::Uuid; #[cfg(windows)] use wslpath::windows_to_wsl; @@ -150,6 +152,8 @@ impl PocketIcState { } } +pub static TEST_DRIVER_UUID: Lazy = Lazy::new(Uuid::new_v4); + pub struct PocketIcBuilder { config: Option, server_binary: Option, @@ -1796,10 +1800,10 @@ pub(crate) async fn start_or_reuse_server(server_binary: Option) -> Url } } - // We use the test driver's process ID to share the PocketIC server between multiple tests + // We use the TEST_DRIVER_UUID to share the PocketIC server between multiple tests // launched by the same test driver. - let test_driver_pid = std::process::id(); - let port_file_path = std::env::temp_dir().join(format!("pocket_ic_{}.port", test_driver_pid)); + let port_file_path = + std::env::temp_dir().join(format!("pocket_ic_{}.port", &*TEST_DRIVER_UUID)); let mut cmd = pocket_ic_server_cmd(&bin_path); cmd.arg("--port-file"); #[cfg(windows)] diff --git a/packages/pocket-ic/src/nonblocking.rs b/packages/pocket-ic/src/nonblocking.rs index a6fdd7c2b869..e47a547f513f 100644 --- a/packages/pocket-ic/src/nonblocking.rs +++ b/packages/pocket-ic/src/nonblocking.rs @@ -10,7 +10,7 @@ use crate::common::rest::{ pub use crate::DefaultEffectiveCanisterIdError; use crate::{ copy_dir, start_or_reuse_server, IngressStatusResult, PocketIcBuilder, PocketIcState, - RejectResponse, + RejectResponse, TEST_DRIVER_UUID, }; use backoff::backoff::Backoff; use backoff::{ExponentialBackoff, ExponentialBackoffBuilder}; @@ -44,6 +44,7 @@ use std::time::{Duration, SystemTime}; use tracing::{debug, instrument, warn}; use tracing_appender::non_blocking::WorkerGuard; use tracing_subscriber::EnvFilter; +use uuid::Uuid; // wait time between polling requests const POLLING_PERIOD_MS: u64 = 10; @@ -109,8 +110,7 @@ impl PocketIc { instance_id: InstanceId, max_request_time_ms: Option, ) -> Self { - let test_driver_pid = std::process::id(); - let log_guard = setup_tracing(test_driver_pid); + let log_guard = setup_tracing(&TEST_DRIVER_UUID); let reqwest_client = reqwest::Client::new(); debug!("instance_id={} Reusing existing instance.", instance_id); @@ -190,8 +190,7 @@ impl PocketIc { bitcoind_addr, }; - let test_driver_pid = std::process::id(); - let log_guard = setup_tracing(test_driver_pid); + let log_guard = setup_tracing(&TEST_DRIVER_UUID); let reqwest_client = reqwest::Client::new(); let instance_id = match reqwest_client @@ -1804,13 +1803,13 @@ where }) } -fn setup_tracing(pid: u32) -> Option { +fn setup_tracing(uuid: &Uuid) -> Option { use tracing_subscriber::prelude::*; match std::env::var(LOG_DIR_PATH_ENV_NAME).map(std::path::PathBuf::from) { Ok(p) => { std::fs::create_dir_all(&p).expect("Could not create directory"); - let file_name = format!("pocket_ic_client_{pid}.log"); + let file_name = format!("pocket_ic_client_{uuid}.log"); let appender = tracing_appender::rolling::never(&p, file_name); let (non_blocking_appender, guard) = tracing_appender::non_blocking(appender); let log_dir_filter: EnvFilter = diff --git a/packages/pocket-ic/tests/tests.rs b/packages/pocket-ic/tests/tests.rs index d8319fb43748..3bc7b61d85e4 100644 --- a/packages/pocket-ic/tests/tests.rs +++ b/packages/pocket-ic/tests/tests.rs @@ -16,7 +16,7 @@ use pocket_ic::{ RawEffectivePrincipal, RawMessageId, SubnetKind, }, query_candid, update_candid, DefaultEffectiveCanisterIdError, ErrorCode, IngressStatusResult, - PocketIc, PocketIcBuilder, PocketIcState, RejectCode, + PocketIc, PocketIcBuilder, PocketIcState, RejectCode, TEST_DRIVER_UUID, }; use reqwest::blocking::Client; use reqwest::header::CONTENT_LENGTH; @@ -1808,8 +1808,8 @@ fn test_get_default_effective_canister_id_invalid_url() { .with_application_subnet() .build(); - let test_driver_pid = std::process::id(); - let port_file_path = std::env::temp_dir().join(format!("pocket_ic_{}.port", test_driver_pid)); + let port_file_path = + std::env::temp_dir().join(format!("pocket_ic_{}.port", &*TEST_DRIVER_UUID)); let port = std::fs::read_to_string(port_file_path).unwrap(); let server_url = format!("http://localhost:{}", port); diff --git a/rs/pocket_ic_server/BUILD.bazel b/rs/pocket_ic_server/BUILD.bazel index 33e761df7c35..2095783cd922 100644 --- a/rs/pocket_ic_server/BUILD.bazel +++ b/rs/pocket_ic_server/BUILD.bazel @@ -117,6 +117,7 @@ TEST_DEPENDENCIES = [ "@crate_index//:slog", "@crate_index//:tempfile", "@crate_index//:tokio", + "@crate_index//:uuid", "@crate_index//:wat", ] diff --git a/rs/pocket_ic_server/Cargo.toml b/rs/pocket_ic_server/Cargo.toml index 6d0282065229..782448b55b77 100644 --- a/rs/pocket_ic_server/Cargo.toml +++ b/rs/pocket_ic_server/Cargo.toml @@ -83,6 +83,7 @@ tower-http = { workspace = true } tracing = { workspace = true } tracing-appender = { workspace = true } tracing-subscriber = { workspace = true } +uuid = { workspace = true } wat = { workspace = true } [dev-dependencies] diff --git a/rs/pocket_ic_server/tests/test.rs b/rs/pocket_ic_server/tests/test.rs index 133426ca0bcb..089459d09348 100644 --- a/rs/pocket_ic_server/tests/test.rs +++ b/rs/pocket_ic_server/tests/test.rs @@ -16,7 +16,7 @@ use pocket_ic::common::rest::{ CreateHttpGatewayResponse, HttpGatewayBackend, HttpGatewayConfig, HttpGatewayDetails, HttpsConfig, InstanceConfig, SubnetConfigSet, SubnetKind, Topology, }; -use pocket_ic::{update_candid, PocketIc, PocketIcBuilder, PocketIcState}; +use pocket_ic::{update_candid, PocketIc, PocketIcBuilder, PocketIcState, TEST_DRIVER_UUID}; use rcgen::{CertificateParams, KeyPair}; use registry_canister::init::RegistryCanisterInitPayload; use reqwest::blocking::Client; @@ -30,18 +30,19 @@ use std::path::PathBuf; use std::process::{Child, Command}; use std::time::Duration; use tempfile::{NamedTempFile, TempDir}; +use uuid::Uuid; pub const LOCALHOST: &str = "127.0.0.1"; fn start_server_helper( - test_driver_pid: Option, + test_driver_uuid: Option<&Uuid>, log_levels: Option, capture_stdout: bool, capture_stderr: bool, ) -> (Url, Child) { let bin_path = std::env::var_os("POCKET_IC_BIN").expect("Missing PocketIC binary"); - let port_file_path = if let Some(test_driver_pid) = test_driver_pid { - std::env::temp_dir().join(format!("pocket_ic_{}.port", test_driver_pid)) + let port_file_path = if let Some(test_driver_uuid) = test_driver_uuid { + std::env::temp_dir().join(format!("pocket_ic_{}.port", test_driver_uuid)) } else { NamedTempFile::new().unwrap().into_temp_path().to_path_buf() }; @@ -77,8 +78,7 @@ fn start_server_helper( } pub fn start_server() -> Url { - let test_driver_pid = std::process::id(); - start_server_helper(Some(test_driver_pid), None, false, false).0 + start_server_helper(Some(&TEST_DRIVER_UUID), None, false, false).0 } const COUNTER_WAT: &str = r#"