1 use super::*;
2 use std::future::{pending, ready};
3 use tower::{timeout::TimeoutLayer, ServiceBuilder};
4
unit()5 async fn unit() {}
6
forever()7 async fn forever() {
8 pending().await
9 }
10
timeout() -> TimeoutLayer11 fn timeout() -> TimeoutLayer {
12 TimeoutLayer::new(Duration::from_millis(10))
13 }
14
15 #[derive(Clone)]
16 struct Svc;
17
18 impl<R> Service<R> for Svc {
19 type Response = Response<Body>;
20 type Error = hyper::Error;
21 type Future = Ready<Result<Self::Response, Self::Error>>;
22
poll_ready(&mut self, _cx: &mut Context<'_>) -> Poll<Result<(), Self::Error>>23 fn poll_ready(&mut self, _cx: &mut Context<'_>) -> Poll<Result<(), Self::Error>> {
24 Poll::Ready(Ok(()))
25 }
26
call(&mut self, _req: R) -> Self::Future27 fn call(&mut self, _req: R) -> Self::Future {
28 ready(Ok(Response::new(Body::empty())))
29 }
30 }
31
32 #[crate::test]
handler()33 async fn handler() {
34 let app = Router::new().route(
35 "/",
36 get(forever.layer(
37 ServiceBuilder::new()
38 .layer(HandleErrorLayer::new(|_: BoxError| async {
39 StatusCode::REQUEST_TIMEOUT
40 }))
41 .layer(timeout()),
42 )),
43 );
44
45 let client = TestClient::new(app);
46
47 let res = client.get("/").send().await;
48 assert_eq!(res.status(), StatusCode::REQUEST_TIMEOUT);
49 }
50
51 #[crate::test]
handler_multiple_methods_first()52 async fn handler_multiple_methods_first() {
53 let app = Router::new().route(
54 "/",
55 get(forever.layer(
56 ServiceBuilder::new()
57 .layer(HandleErrorLayer::new(|_: BoxError| async {
58 StatusCode::REQUEST_TIMEOUT
59 }))
60 .layer(timeout()),
61 ))
62 .post(unit),
63 );
64
65 let client = TestClient::new(app);
66
67 let res = client.get("/").send().await;
68 assert_eq!(res.status(), StatusCode::REQUEST_TIMEOUT);
69 }
70
71 #[crate::test]
handler_multiple_methods_middle()72 async fn handler_multiple_methods_middle() {
73 let app = Router::new().route(
74 "/",
75 delete(unit)
76 .get(
77 forever.layer(
78 ServiceBuilder::new()
79 .layer(HandleErrorLayer::new(|_: BoxError| async {
80 StatusCode::REQUEST_TIMEOUT
81 }))
82 .layer(timeout()),
83 ),
84 )
85 .post(unit),
86 );
87
88 let client = TestClient::new(app);
89
90 let res = client.get("/").send().await;
91 assert_eq!(res.status(), StatusCode::REQUEST_TIMEOUT);
92 }
93
94 #[crate::test]
handler_multiple_methods_last()95 async fn handler_multiple_methods_last() {
96 let app = Router::new().route(
97 "/",
98 delete(unit).get(
99 forever.layer(
100 ServiceBuilder::new()
101 .layer(HandleErrorLayer::new(|_: BoxError| async {
102 StatusCode::REQUEST_TIMEOUT
103 }))
104 .layer(timeout()),
105 ),
106 ),
107 );
108
109 let client = TestClient::new(app);
110
111 let res = client.get("/").send().await;
112 assert_eq!(res.status(), StatusCode::REQUEST_TIMEOUT);
113 }
114