10583cff8SDavid Pedersen use super::*;
20583cff8SDavid Pedersen use http_body::Body as _;
30583cff8SDavid Pedersen 
40583cff8SDavid Pedersen #[tokio::test(flavor = "multi_thread")]
50583cff8SDavid Pedersen async fn client_enabled_server_enabled() {
60583cff8SDavid Pedersen     let (client, server) = tokio::io::duplex(UNCOMPRESSED_MIN_BODY_SIZE * 10);
70583cff8SDavid Pedersen 
80583cff8SDavid Pedersen     let svc = test_server::TestServer::new(Svc::default()).accept_gzip();
90583cff8SDavid Pedersen 
100583cff8SDavid Pedersen     let request_bytes_counter = Arc::new(AtomicUsize::new(0));
110583cff8SDavid Pedersen 
120583cff8SDavid Pedersen     fn assert_right_encoding<B>(req: http::Request<B>) -> http::Request<B> {
130583cff8SDavid Pedersen         assert_eq!(req.headers().get("grpc-encoding").unwrap(), "gzip");
140583cff8SDavid Pedersen         req
150583cff8SDavid Pedersen     }
160583cff8SDavid Pedersen 
170583cff8SDavid Pedersen     tokio::spawn({
180583cff8SDavid Pedersen         let request_bytes_counter = request_bytes_counter.clone();
190583cff8SDavid Pedersen         async move {
200583cff8SDavid Pedersen             Server::builder()
210583cff8SDavid Pedersen                 .layer(
220583cff8SDavid Pedersen                     ServiceBuilder::new()
230583cff8SDavid Pedersen                         .map_request(assert_right_encoding)
240583cff8SDavid Pedersen                         .layer(measure_request_body_size_layer(
250583cff8SDavid Pedersen                             request_bytes_counter.clone(),
260583cff8SDavid Pedersen                         ))
270583cff8SDavid Pedersen                         .into_inner(),
280583cff8SDavid Pedersen                 )
290583cff8SDavid Pedersen                 .add_service(svc)
30*d4973642SLucio Franco                 .serve_with_incoming(futures::stream::iter(vec![Ok::<_, std::io::Error>(server)]))
310583cff8SDavid Pedersen                 .await
320583cff8SDavid Pedersen                 .unwrap();
330583cff8SDavid Pedersen         }
340583cff8SDavid Pedersen     });
350583cff8SDavid Pedersen 
360583cff8SDavid Pedersen     let mut client = test_client::TestClient::new(mock_io_channel(client).await).send_gzip();
370583cff8SDavid Pedersen 
380583cff8SDavid Pedersen     let data = [0_u8; UNCOMPRESSED_MIN_BODY_SIZE].to_vec();
390583cff8SDavid Pedersen     let stream = futures::stream::iter(vec![SomeData { data: data.clone() }, SomeData { data }]);
400583cff8SDavid Pedersen     let req = Request::new(Box::pin(stream));
410583cff8SDavid Pedersen 
420583cff8SDavid Pedersen     client.compress_input_client_stream(req).await.unwrap();
430583cff8SDavid Pedersen 
440583cff8SDavid Pedersen     let bytes_sent = request_bytes_counter.load(SeqCst);
450583cff8SDavid Pedersen     assert!(bytes_sent < UNCOMPRESSED_MIN_BODY_SIZE);
460583cff8SDavid Pedersen }
470583cff8SDavid Pedersen 
480583cff8SDavid Pedersen #[tokio::test(flavor = "multi_thread")]
490583cff8SDavid Pedersen async fn client_disabled_server_enabled() {
500583cff8SDavid Pedersen     let (client, server) = tokio::io::duplex(UNCOMPRESSED_MIN_BODY_SIZE * 10);
510583cff8SDavid Pedersen 
520583cff8SDavid Pedersen     let svc = test_server::TestServer::new(Svc::default()).accept_gzip();
530583cff8SDavid Pedersen 
540583cff8SDavid Pedersen     let request_bytes_counter = Arc::new(AtomicUsize::new(0));
550583cff8SDavid Pedersen 
560583cff8SDavid Pedersen     fn assert_right_encoding<B>(req: http::Request<B>) -> http::Request<B> {
570583cff8SDavid Pedersen         assert!(req.headers().get("grpc-encoding").is_none());
580583cff8SDavid Pedersen         req
590583cff8SDavid Pedersen     }
600583cff8SDavid Pedersen 
610583cff8SDavid Pedersen     tokio::spawn({
620583cff8SDavid Pedersen         let request_bytes_counter = request_bytes_counter.clone();
630583cff8SDavid Pedersen         async move {
640583cff8SDavid Pedersen             Server::builder()
650583cff8SDavid Pedersen                 .layer(
660583cff8SDavid Pedersen                     ServiceBuilder::new()
670583cff8SDavid Pedersen                         .map_request(assert_right_encoding)
680583cff8SDavid Pedersen                         .layer(measure_request_body_size_layer(
690583cff8SDavid Pedersen                             request_bytes_counter.clone(),
700583cff8SDavid Pedersen                         ))
710583cff8SDavid Pedersen                         .into_inner(),
720583cff8SDavid Pedersen                 )
730583cff8SDavid Pedersen                 .add_service(svc)
74*d4973642SLucio Franco                 .serve_with_incoming(futures::stream::iter(vec![Ok::<_, std::io::Error>(server)]))
750583cff8SDavid Pedersen                 .await
760583cff8SDavid Pedersen                 .unwrap();
770583cff8SDavid Pedersen         }
780583cff8SDavid Pedersen     });
790583cff8SDavid Pedersen 
800583cff8SDavid Pedersen     let mut client = test_client::TestClient::new(mock_io_channel(client).await);
810583cff8SDavid Pedersen 
820583cff8SDavid Pedersen     let data = [0_u8; UNCOMPRESSED_MIN_BODY_SIZE].to_vec();
830583cff8SDavid Pedersen     let stream = futures::stream::iter(vec![SomeData { data: data.clone() }, SomeData { data }]);
840583cff8SDavid Pedersen     let req = Request::new(Box::pin(stream));
850583cff8SDavid Pedersen 
860583cff8SDavid Pedersen     client.compress_input_client_stream(req).await.unwrap();
870583cff8SDavid Pedersen 
880583cff8SDavid Pedersen     let bytes_sent = request_bytes_counter.load(SeqCst);
890583cff8SDavid Pedersen     assert!(bytes_sent > UNCOMPRESSED_MIN_BODY_SIZE);
900583cff8SDavid Pedersen }
910583cff8SDavid Pedersen 
920583cff8SDavid Pedersen #[tokio::test(flavor = "multi_thread")]
930583cff8SDavid Pedersen async fn client_enabled_server_disabled() {
940583cff8SDavid Pedersen     let (client, server) = tokio::io::duplex(UNCOMPRESSED_MIN_BODY_SIZE * 10);
950583cff8SDavid Pedersen 
960583cff8SDavid Pedersen     let svc = test_server::TestServer::new(Svc::default());
970583cff8SDavid Pedersen 
980583cff8SDavid Pedersen     tokio::spawn(async move {
990583cff8SDavid Pedersen         Server::builder()
1000583cff8SDavid Pedersen             .add_service(svc)
101*d4973642SLucio Franco             .serve_with_incoming(futures::stream::iter(vec![Ok::<_, std::io::Error>(server)]))
1020583cff8SDavid Pedersen             .await
1030583cff8SDavid Pedersen             .unwrap();
1040583cff8SDavid Pedersen     });
1050583cff8SDavid Pedersen 
1060583cff8SDavid Pedersen     let mut client = test_client::TestClient::new(mock_io_channel(client).await).send_gzip();
1070583cff8SDavid Pedersen 
1080583cff8SDavid Pedersen     let data = [0_u8; UNCOMPRESSED_MIN_BODY_SIZE].to_vec();
1090583cff8SDavid Pedersen     let stream = futures::stream::iter(vec![SomeData { data: data.clone() }, SomeData { data }]);
1100583cff8SDavid Pedersen     let req = Request::new(Box::pin(stream));
1110583cff8SDavid Pedersen 
1120583cff8SDavid Pedersen     let status = client.compress_input_client_stream(req).await.unwrap_err();
1130583cff8SDavid Pedersen 
1140583cff8SDavid Pedersen     assert_eq!(status.code(), tonic::Code::Unimplemented);
1150583cff8SDavid Pedersen     assert_eq!(
1160583cff8SDavid Pedersen         status.message(),
1170583cff8SDavid Pedersen         "Content is compressed with `gzip` which isn't supported"
1180583cff8SDavid Pedersen     );
1190583cff8SDavid Pedersen }
1200583cff8SDavid Pedersen 
1210583cff8SDavid Pedersen #[tokio::test(flavor = "multi_thread")]
1220583cff8SDavid Pedersen async fn compressing_response_from_client_stream() {
1230583cff8SDavid Pedersen     let (client, server) = tokio::io::duplex(UNCOMPRESSED_MIN_BODY_SIZE * 10);
1240583cff8SDavid Pedersen 
1250583cff8SDavid Pedersen     let svc = test_server::TestServer::new(Svc::default()).send_gzip();
1260583cff8SDavid Pedersen 
1270583cff8SDavid Pedersen     let response_bytes_counter = Arc::new(AtomicUsize::new(0));
1280583cff8SDavid Pedersen 
1290583cff8SDavid Pedersen     tokio::spawn({
1300583cff8SDavid Pedersen         let response_bytes_counter = response_bytes_counter.clone();
1310583cff8SDavid Pedersen         async move {
1320583cff8SDavid Pedersen             Server::builder()
1330583cff8SDavid Pedersen                 .layer(
1340583cff8SDavid Pedersen                     ServiceBuilder::new()
1350583cff8SDavid Pedersen                         .layer(MapResponseBodyLayer::new(move |body| {
1360583cff8SDavid Pedersen                             util::CountBytesBody {
1370583cff8SDavid Pedersen                                 inner: body,
1380583cff8SDavid Pedersen                                 counter: response_bytes_counter.clone(),
1390583cff8SDavid Pedersen                             }
1400583cff8SDavid Pedersen                         }))
1410583cff8SDavid Pedersen                         .into_inner(),
1420583cff8SDavid Pedersen                 )
1430583cff8SDavid Pedersen                 .add_service(svc)
144*d4973642SLucio Franco                 .serve_with_incoming(futures::stream::iter(vec![Ok::<_, std::io::Error>(server)]))
1450583cff8SDavid Pedersen                 .await
1460583cff8SDavid Pedersen                 .unwrap();
1470583cff8SDavid Pedersen         }
1480583cff8SDavid Pedersen     });
1490583cff8SDavid Pedersen 
1500583cff8SDavid Pedersen     let mut client = test_client::TestClient::new(mock_io_channel(client).await).accept_gzip();
1510583cff8SDavid Pedersen 
1520583cff8SDavid Pedersen     let stream = futures::stream::iter(vec![]);
1530583cff8SDavid Pedersen     let req = Request::new(Box::pin(stream));
1540583cff8SDavid Pedersen 
1550583cff8SDavid Pedersen     let res = client.compress_output_client_stream(req).await.unwrap();
1560583cff8SDavid Pedersen     assert_eq!(res.metadata().get("grpc-encoding").unwrap(), "gzip");
1570583cff8SDavid Pedersen     let bytes_sent = response_bytes_counter.load(SeqCst);
1580583cff8SDavid Pedersen     assert!(bytes_sent < UNCOMPRESSED_MIN_BODY_SIZE);
1590583cff8SDavid Pedersen }
160