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