use execution_policy::BoxFuture;
#[cfg(feature = "tokio")]
use execution_policy::{CircuitBreaker, ExecutionPolicyBuilder, Jitter, Retry};
#[cfg(feature = "tokio")]
use std::time::Duration;
#[test]
fn box_future_is_send() {
fn require_send<T: Send>() {}
require_send::<BoxFuture<'static, ()>>();
}
#[cfg(feature = "tokio")]
#[tokio::test]
async fn run_future_is_send() {
let policy = ExecutionPolicyBuilder::<i32, ()>::new().build();
let outcome = tokio::spawn(async move { policy.run(async || Ok::<i32, ()>(42)).await })
.await
.expect("spawned task joins");
assert_eq!(outcome.ok(), Some(42));
}
#[cfg(feature = "tokio")]
#[tokio::test]
async fn execute_future_is_send() {
let policy = ExecutionPolicyBuilder::<i32, ()>::new().build();
let outcome =
tokio::spawn(async move { policy.execute(async |_attempt| Ok::<i32, ()>(7)).await })
.await
.expect("spawned task joins");
assert_eq!(outcome.ok(), Some(7));
}
#[cfg(feature = "tokio")]
#[tokio::test]
async fn composed_policy_run_future_is_send() {
let policy = ExecutionPolicyBuilder::<i32, ()>::new()
.retry(Retry::exponential().max_attempts(2).jitter(Jitter::Full))
.attempt_timeout(Duration::from_secs(1))
.total_timeout(Duration::from_secs(2))
.circuit_breaker(CircuitBreaker::consecutive_failures(3))
.build();
let outcome = tokio::spawn(async move { policy.run(async || Ok::<i32, ()>(9)).await })
.await
.expect("spawned task joins");
assert_eq!(outcome.ok(), Some(9));
}