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