1 #![allow(unused_imports)]
2 
3 use crate::*;
4 use std::net::SocketAddr;
5 use tokio::net::TcpListener;
6 use tonic::transport::Server;
7 
8 #[cfg(test)]
echo_requests_iter() -> impl Stream<Item = ()>9 fn echo_requests_iter() -> impl Stream<Item = ()> {
10     tokio_stream::iter(1..usize::MAX).map(|_| ())
11 }
12 
13 #[tokio::test()]
test_default_stubs()14 async fn test_default_stubs() {
15     use tonic::Code;
16 
17     let addrs = run_services_in_background().await;
18 
19     // First validate pre-existing functionality (trait has no default implementation, we explicitly return PermissionDenied in lib.rs).
20     let mut client = test_client::TestClient::connect(format!("http://{}", addrs.0))
21         .await
22         .unwrap();
23     assert_eq!(
24         client.unary(()).await.unwrap_err().code(),
25         Code::PermissionDenied
26     );
27     assert_eq!(
28         client.server_stream(()).await.unwrap_err().code(),
29         Code::PermissionDenied
30     );
31     assert_eq!(
32         client
33             .client_stream(echo_requests_iter().take(5))
34             .await
35             .unwrap_err()
36             .code(),
37         Code::PermissionDenied
38     );
39     assert_eq!(
40         client
41             .bidirectional_stream(echo_requests_iter().take(5))
42             .await
43             .unwrap_err()
44             .code(),
45         Code::PermissionDenied
46     );
47 
48     // Then validate opt-in new functionality (trait has default implementation of returning Unimplemented).
49     let mut client_default_stubs = test_client::TestClient::connect(format!("http://{}", addrs.1))
50         .await
51         .unwrap();
52     assert_eq!(
53         client_default_stubs.unary(()).await.unwrap_err().code(),
54         Code::Unimplemented
55     );
56     assert_eq!(
57         client_default_stubs
58             .server_stream(())
59             .await
60             .unwrap_err()
61             .code(),
62         Code::Unimplemented
63     );
64     assert_eq!(
65         client_default_stubs
66             .client_stream(echo_requests_iter().take(5))
67             .await
68             .unwrap_err()
69             .code(),
70         Code::Unimplemented
71     );
72     assert_eq!(
73         client_default_stubs
74             .bidirectional_stream(echo_requests_iter().take(5))
75             .await
76             .unwrap_err()
77             .code(),
78         Code::Unimplemented
79     );
80 }
81 
82 #[cfg(test)]
run_services_in_background() -> (SocketAddr, SocketAddr)83 async fn run_services_in_background() -> (SocketAddr, SocketAddr) {
84     let svc = test_server::TestServer::new(Svc {});
85     let svc_default_stubs = test_default_server::TestDefaultServer::new(Svc {});
86 
87     let listener = TcpListener::bind("127.0.0.1:0").await.unwrap();
88     let addr = listener.local_addr().unwrap();
89 
90     let listener_default_stubs = TcpListener::bind("127.0.0.1:0").await.unwrap();
91     let addr_default_stubs = listener_default_stubs.local_addr().unwrap();
92 
93     tokio::spawn(async move {
94         Server::builder()
95             .add_service(svc)
96             .serve_with_incoming(tokio_stream::wrappers::TcpListenerStream::new(listener))
97             .await
98             .unwrap();
99     });
100 
101     tokio::spawn(async move {
102         Server::builder()
103             .add_service(svc_default_stubs)
104             .serve_with_incoming(tokio_stream::wrappers::TcpListenerStream::new(
105                 listener_default_stubs,
106             ))
107             .await
108             .unwrap();
109     });
110 
111     (addr, addr_default_stubs)
112 }
113