mod test_utils;
use tokio::task;
use envoy::Endpoint;
use std::time::Duration;
use envoy::Body;
use serde::{Deserialize, Serialize};
#[tokio::test]
async fn hello_world() -> envoy::Result {
struct PortEndpoint(u16);
#[async_trait::async_trait]
impl Endpoint for PortEndpoint {
async fn call(&self, ctx: &mut envoy::Context) -> envoy::Result {
assert_eq!(ctx.body_string().await.unwrap(), "nori".to_string());
assert!(ctx.local_addr().unwrap().contains(&self.0.to_string()));
assert!(ctx.peer_addr().is_some());
Ok(ctx.set_body("says hello"))
}
}
let port = test_utils::find_port().await;
let server = task::spawn(async move {
let mut app = envoy::new();
app.at("/").get(PortEndpoint(port));
app.listen(("localhost", port)).await?;
Result::<(), hyper::Error>::Ok(())
});
let client = task::spawn(async move {
tokio::time::sleep(Duration::from_millis(100)).await;
let string = surf::get(format!("http://localhost:{}", port))
.body(Body::from_string("nori".to_string()))
.recv_string()
.await
.unwrap();
assert_eq!(string, "says hello");
Ok(())
});
server.race(client).await
}
#[tokio::test]
async fn echo_server() -> envoy::Result {
async fn echo(ctx: &mut envoy::Context) -> envoy::Result {
Ok(ctx.res.set_body(ctx.req.body_string().await?))
}
let port = test_utils::find_port().await;
let server = task::spawn(async move {
let mut app = envoy::new();
app.at("/").get(echo);
app.listen(("localhost", port)).await?;
Result::<(), hyper::Error>::Ok(())
});
let client = task::spawn(async move {
tokio::time::sleep(Duration::from_millis(100)).await;
let string = surf::get(format!("http://localhost:{}", port))
.body(Body::from_string("chashu".to_string()))
.recv_string()
.await
.unwrap();
assert_eq!(string, "chashu".to_string());
Ok(())
});
server.race(client).await
}
#[tokio::test]
async fn json() -> envoy::Result {
#[derive(Deserialize, Serialize)]
struct Counter {
count: usize,
}
async fn increment_counter(ctx: &mut envoy::Context) -> envoy::Result {
let mut counter: Counter = ctx.body_json().await.unwrap();
assert_eq!(counter.count, 0);
counter.count = 1;
Ok(ctx.res.set_body(Body::from_json(&counter)?))
}
let port = test_utils::find_port().await;
let server = task::spawn(async move {
let mut app = envoy::new();
app.at("/").get(increment_counter);
app.listen(("localhost", port)).await?;
Result::<(), hyper::Error>::Ok(())
});
let client = task::spawn(async move {
tokio::time::sleep(Duration::from_millis(100)).await;
let counter: Counter = surf::get(format!("http://localhost:{}", &port))
.body(Body::from_json(&Counter { count: 0 })?)
.recv_json()
.await
.unwrap();
assert_eq!(counter.count, 1);
Ok(())
});
server.race(client).await
}