diff --git a/actix-rt/tests/wait_spawned.rs b/actix-rt/tests/wait_spawned.rs new file mode 100644 index 00000000..e3296e89 --- /dev/null +++ b/actix-rt/tests/wait_spawned.rs @@ -0,0 +1,63 @@ +use std::time::{Duration, Instant}; + +#[test] +fn await_for_timer() { + let time = Duration::from_secs(2); + let instant = Instant::now(); + actix_rt::System::new("test_wait_timer").block_on(async move { + tokio::time::delay_for(time).await; + }); + assert!( + instant.elapsed() >= time, + "Block on should poll awaited future to completion" + ); +} + +#[test] +fn join_another_arbiter() { + let time = Duration::from_secs(2); + let instant = Instant::now(); + actix_rt::System::new("test_join_another_arbiter").block_on(async move { + let mut arbiter = actix_rt::Arbiter::new(); + arbiter.send(Box::pin(async move { + tokio::time::delay_for(time).await; + actix_rt::Arbiter::current().stop(); + })); + arbiter.join().unwrap(); + }); + assert!( + instant.elapsed() >= time, + "Join on another arbiter should complete only when it calls stop" + ); + + let instant = Instant::now(); + actix_rt::System::new("test_join_another_arbiter").block_on(async move { + let mut arbiter = actix_rt::Arbiter::new(); + arbiter.exec_fn(move || { + actix_rt::spawn(async move { + tokio::time::delay_for(time).await; + actix_rt::Arbiter::current().stop(); + }); + }); + arbiter.join().unwrap(); + }); + assert!( + instant.elapsed() >= time, + "Join on a arbiter that has used actix_rt::spawn should wait for said future" + ); + + let instant = Instant::now(); + actix_rt::System::new("test_join_another_arbiter").block_on(async move { + let mut arbiter = actix_rt::Arbiter::new(); + arbiter.send(Box::pin(async move { + tokio::time::delay_for(time).await; + actix_rt::Arbiter::current().stop(); + })); + arbiter.stop(); + arbiter.join().unwrap(); + }); + assert!( + instant.elapsed() < time, + "Premature stop of arbiter should conclude regardless of it's current state" + ); +}