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