diff --git a/ethers-core/src/utils/ganache.rs b/ethers-core/src/utils/ganache.rs index dfea1017..45ef5b8d 100644 --- a/ethers-core/src/utils/ganache.rs +++ b/ethers-core/src/utils/ganache.rs @@ -9,7 +9,7 @@ use std::{ time::{Duration, Instant}, }; -/// How long we will wait for ganache to indicate that it is ready. +/// Default amount of time we will wait for ganache to indicate that it is ready. const GANACHE_STARTUP_TIMEOUT_MILLIS: u64 = 10_000; /// A ganache CLI instance. Will close the instance when dropped. @@ -83,6 +83,7 @@ pub struct Ganache { mnemonic: Option, fork: Option, args: Vec, + startup_timeout: Option, } impl Ganache { @@ -92,6 +93,13 @@ impl Ganache { Self::default() } + /// Sets the startup timeout which will be used when the `ganache-cli` instance is launched in + /// miliseconds. 10_000 miliseconds by default). + pub fn startup_timeout_millis>(mut self, timeout: T) -> Self { + self.startup_timeout = Some(timeout.into()); + self + } + /// Sets the port which will be used when the `ganache-cli` instance is launched. #[must_use] pub fn port>(mut self, port: T) -> Self { @@ -176,8 +184,11 @@ impl Ganache { let mut private_keys = Vec::new(); let mut addresses = Vec::new(); let mut is_private_key = false; + + let startup_timeout = + Duration::from_millis(self.startup_timeout.unwrap_or(GANACHE_STARTUP_TIMEOUT_MILLIS)); loop { - if start + Duration::from_millis(GANACHE_STARTUP_TIMEOUT_MILLIS) <= Instant::now() { + if start + startup_timeout <= Instant::now() { panic!("Timed out waiting for ganache to start. Is ganache-cli installed?") } @@ -205,3 +216,18 @@ impl Ganache { GanacheInstance { pid: child, private_keys, addresses, port } } } + +#[cfg(test)] +mod tests { + use super::*; + + #[test] + fn configurable_startup_timeout() { + Ganache::new().startup_timeout_millis(100000_u64).spawn(); + } + + #[test] + fn default_startup_works() { + Ganache::new().spawn(); + } +}