blob: 8bc8ce1c1da15214b019656056cc24a0eb774bdf [file] [log] [blame]
#![cfg(all(feature = "buffer", feature = "limit", feature = "retry"))]
mod support;
use futures_util::{future::Ready, pin_mut};
use std::time::Duration;
use tower::builder::ServiceBuilder;
use tower::retry::Policy;
use tower::util::ServiceExt;
use tower_service::*;
use tower_test::{assert_request_eq, mock};
#[tokio::test(flavor = "current_thread")]
async fn builder_service() {
let _t = support::trace_init();
let (service, handle) = mock::pair();
pin_mut!(handle);
let policy = MockPolicy::<&'static str, bool>::default();
let mut client = ServiceBuilder::new()
.buffer(5)
.concurrency_limit(5)
.rate_limit(5, Duration::from_secs(5))
.retry(policy)
.map_response(|r: &'static str| r == "world")
.map_request(|r: &'static str| r == "hello")
.service(service);
// allow a request through
handle.allow(1);
let fut = client.ready().await.unwrap().call("hello");
assert_request_eq!(handle, true).send_response("world");
assert!(fut.await.unwrap());
}
#[derive(Debug, Clone, Default)]
struct MockPolicy<Req, Res> {
_pd: std::marker::PhantomData<(Req, Res)>,
}
impl<Req, Res, E> Policy<Req, Res, E> for MockPolicy<Req, Res>
where
Req: Clone,
E: Into<Box<dyn std::error::Error + Send + Sync + 'static>>,
{
type Future = Ready<Self>;
fn retry(&self, _req: &Req, _result: Result<&Res, &E>) -> Option<Self::Future> {
None
}
fn clone_request(&self, req: &Req) -> Option<Req> {
Some(req.clone())
}
}