feature: tests readyness handling

Use a Tower Buffer service/layer to verify the crate handles inner
service readyness correctly as the buffer service will panic when being
called if it's not ready

Signed-off-by: Sjoerd Simons <sjoerd@collabora.com>
This commit is contained in:
Sjoerd Simons 2023-04-22 15:03:19 +02:00
parent 1cec99e522
commit 28df895754
3 changed files with 17 additions and 7 deletions

View file

@ -33,7 +33,7 @@ tonic = { version = "0.9.2", optional = true }
hyper = { version = "0.14", features = ["full"] } hyper = { version = "0.14", features = ["full"] }
lazy_static = "1.4.0" lazy_static = "1.4.0"
prost = "0.11.9" prost = "0.11.9"
tower = { version = "0.4", features = ["util"] } tower = { version = "0.4", features = ["util", "buffer"] }
wiremock = "0.5" wiremock = "0.5"
[[test]] [[test]]

View file

@ -2,17 +2,19 @@ mod common;
#[cfg(test)] #[cfg(test)]
mod tests { mod tests {
use std::convert::Infallible;
use axum::{ use axum::{
body::Body, body::Body,
http::{Request, StatusCode}, http::{Request, StatusCode},
response::Response, response::Response,
routing::get, routing::get,
Router, BoxError, Router,
}; };
use http::{header, HeaderValue}; use http::{header, HeaderValue};
use jwt_authorizer::{layer::JwtSource, validation::Validation, JwtAuthorizer, JwtClaims}; use jwt_authorizer::{layer::JwtSource, validation::Validation, JwtAuthorizer, JwtClaims};
use serde::Deserialize; use serde::Deserialize;
use tower::ServiceExt; use tower::{util::MapErrLayer, ServiceExt};
use crate::common; use crate::common;
@ -24,8 +26,15 @@ mod tests {
async fn app(jwt_auth: JwtAuthorizer<User>) -> Router { async fn app(jwt_auth: JwtAuthorizer<User>) -> Router {
Router::new().route("/public", get(|| async { "hello" })).route( Router::new().route("/public", get(|| async { "hello" })).route(
"/protected", "/protected",
get(|JwtClaims(user): JwtClaims<User>| async move { format!("hello: {}", user.sub) }) get(|JwtClaims(user): JwtClaims<User>| async move { format!("hello: {}", user.sub) }).layer(
.layer(jwt_auth.layer().await.unwrap()), tower_layer::Stack::new(
tower_layer::Stack::new(
tower::buffer::BufferLayer::new(1),
MapErrLayer::new(|e: BoxError| -> Infallible { panic!("{}", e) }),
),
jwt_auth.layer().await.unwrap(),
),
),
) )
} }

View file

@ -6,7 +6,7 @@ use http::header::AUTHORIZATION;
use jwt_authorizer::{layer::AsyncAuthorizationService, JwtAuthorizer}; use jwt_authorizer::{layer::AsyncAuthorizationService, JwtAuthorizer};
use serde::{Deserialize, Serialize}; use serde::{Deserialize, Serialize};
use tonic::{server::UnaryService, transport::NamedService, IntoRequest, Status}; use tonic::{server::UnaryService, transport::NamedService, IntoRequest, Status};
use tower::Service; use tower::{buffer::Buffer, Service};
use tracing_subscriber::{layer::SubscriberExt, util::SubscriberInitExt}; use tracing_subscriber::{layer::SubscriberExt, util::SubscriberInitExt};
@ -82,10 +82,11 @@ impl NamedService for GreeterServer {
async fn app( async fn app(
jwt_auth: JwtAuthorizer<User>, jwt_auth: JwtAuthorizer<User>,
expected_sub: String, expected_sub: String,
) -> AsyncAuthorizationService<tonic::transport::server::Routes, User> { ) -> AsyncAuthorizationService<Buffer<tonic::transport::server::Routes, http::Request<tonic::transport::Body>>, User> {
let layer = jwt_auth.layer().await.unwrap(); let layer = jwt_auth.layer().await.unwrap();
tonic::transport::Server::builder() tonic::transport::Server::builder()
.layer(layer) .layer(layer)
.layer(tower::buffer::BufferLayer::new(1))
.add_service(GreeterServer { expected_sub }) .add_service(GreeterServer { expected_sub })
.into_service() .into_service()
} }