hyperlane 19.1.0

A lightweight, high-performance, and cross-platform Rust HTTP server library built on Tokio. It simplifies modern web service development by providing built-in support for middleware, WebSocket, Server-Sent Events (SSE), and raw TCP communication. With a unified and ergonomic API across Windows, Linux, and MacOS, it enables developers to build robust, scalable, and event-driven network applications with minimal overhead and maximum flexibility.
Documentation
use crate::*;

#[tokio::test]
async fn context_from_address() {
    let mut ctx: Context = Context::default();
    ctx.set_aborted(true);
    let ctx_address: usize = (&ctx).into();
    let ctx_from_addr: Context = ctx_address.into();
    assert_eq!(ctx.get_aborted(), ctx_from_addr.get_aborted());
}

#[tokio::test]
async fn context_ref_from_address() {
    let mut ctx: Context = Context::default();
    ctx.set_closed(true);
    let ctx_address: usize = (&ctx).into();
    let ctx_ref: &Context = ctx_address.into();
    assert_eq!(ctx.get_closed(), ctx_ref.get_closed());
}

#[tokio::test]
async fn context_mut_from_address() {
    let mut ctx: Context = Context::default();
    let ctx_address: usize = (&mut ctx).into();
    let ctx_mut: &mut Context = ctx_address.into();
    ctx_mut.set_aborted(true);
    assert!(ctx_mut.get_aborted());
}

#[tokio::test]
async fn context_ref_into_address() {
    let ctx: Context = Context::default();
    let ctx_address: usize = (&ctx).into();
    assert!(ctx_address > 0);
}

#[tokio::test]
async fn context_mut_into_address() {
    let mut ctx: Context = Context::default();
    let ctx_address: usize = (&mut ctx).into();
    assert!(ctx_address > 0);
}

#[tokio::test]
async fn context_aborted_and_closed() {
    let mut ctx: Context = Context::default();
    assert!(!ctx.get_aborted());
    ctx.set_aborted(true);
    assert!(ctx.get_aborted());
    ctx.set_aborted(false);
    assert!(!ctx.get_aborted());
    assert!(!ctx.get_closed());
    ctx.set_closed(true);
    assert!(ctx.get_closed());
    ctx.set_closed(false);
    assert!(!ctx.get_closed());
    assert!(!ctx.is_terminated());
    ctx.set_aborted(true);
    assert!(ctx.is_terminated());
    ctx.set_aborted(false);
    ctx.set_closed(true);
    assert!(ctx.is_terminated());
}

#[tokio::test]
async fn context_route_params() {
    let mut ctx: Context = Context::default();
    let mut params: RouteParams = RouteParams::default();
    params.insert("id".to_string(), "123".to_string());
    ctx.set_route_params(params);
    let id: Option<String> = ctx.try_get_route_param("id");
    assert_eq!(id, Some("123".to_string()));
    let name: Option<String> = ctx.try_get_route_param("name");
    assert_eq!(name, None);
}

#[tokio::test]
async fn context_request_and_response_string() {
    let mut ctx: Context = Context::default();
    let request: Request = Request::default();
    ctx.set_request(request.clone());
    let fetched_request: &Request = ctx.get_request();
    assert_eq!(request.to_string(), fetched_request.to_string());
    let response: Response = Response::default();
    ctx.set_response(response.clone());
    let fetched_response: &Response = ctx.get_response();
    assert_eq!(response.to_string(), fetched_response.to_string());
}

#[tokio::test]
async fn context_as_ref() {
    let ctx: Context = Context::default();
    let ctx_ref: &Context = ctx.as_ref();
    assert_eq!(ctx.get_aborted(), ctx_ref.get_aborted());
    assert_eq!(ctx.get_closed(), ctx_ref.get_closed());
    assert_eq!(ctx.get_request(), ctx_ref.get_request());
    assert_eq!(ctx.get_response(), ctx_ref.get_response());
}

#[tokio::test]
async fn context_as_mut() {
    let mut ctx: Context = Context::default();
    ctx.set_aborted(true);
    let ctx_mut: &mut Context = ctx.as_mut();
    assert!(ctx_mut.get_aborted());
    ctx_mut.set_closed(true);
    assert!(ctx.get_closed());
}

#[tokio::test]
async fn test_spawn_write() {
    let ctx: Context = Context::default();
    for i in 0..10000 {
        let leak_ctx: &mut Context = ctx.leak_mut();
        spawn(async move {
            leak_ctx.get_mut_response().set_body(format!("args {}", i));
        });
    }
}