#![cfg(not(feature = "local"))]
mod common;
use std::time::Duration;
use common::handlers::{TestClientHandler, TestServer};
use rmcp::{ServiceExt, service::QuitReason};
#[tokio::test]
async fn test_close_method() -> anyhow::Result<()> {
let (server_transport, client_transport) = tokio::io::duplex(4096);
let server_handle = tokio::spawn(async move {
let server = TestServer::new().serve(server_transport).await?;
server.waiting().await?;
anyhow::Ok(())
});
let handler = TestClientHandler::new(true, true);
let mut client = handler.serve(client_transport).await?;
assert!(!client.is_closed());
let result = client.close().await?;
assert!(matches!(result, QuitReason::Cancelled));
assert!(client.is_closed());
let result = client.close().await?;
assert!(matches!(result, QuitReason::Closed));
server_handle.await??;
Ok(())
}
#[tokio::test]
async fn test_close_with_timeout() -> anyhow::Result<()> {
let (server_transport, client_transport) = tokio::io::duplex(4096);
let server_handle = tokio::spawn(async move {
let server = TestServer::new().serve(server_transport).await?;
server.waiting().await?;
anyhow::Ok(())
});
let handler = TestClientHandler::new(true, true);
let mut client = handler.serve(client_transport).await?;
let result = client.close_with_timeout(Duration::from_secs(5)).await?;
assert!(result.is_some());
assert!(matches!(result.unwrap(), QuitReason::Cancelled));
assert!(client.is_closed());
server_handle.await??;
Ok(())
}
#[tokio::test]
async fn test_cancel_method() -> anyhow::Result<()> {
let (server_transport, client_transport) = tokio::io::duplex(4096);
let server_handle = tokio::spawn(async move {
let server = TestServer::new().serve(server_transport).await?;
server.waiting().await?;
anyhow::Ok(())
});
let handler = TestClientHandler::new(true, true);
let client = handler.serve(client_transport).await?;
let result = client.cancel().await?;
assert!(matches!(result, QuitReason::Cancelled));
server_handle.await??;
Ok(())
}
#[tokio::test]
async fn test_drop_without_close() -> anyhow::Result<()> {
let (server_transport, client_transport) = tokio::io::duplex(4096);
let server_handle = tokio::spawn(async move {
let server = TestServer::new().serve(server_transport).await?;
let result = server.waiting().await?;
assert!(matches!(result, QuitReason::Closed | QuitReason::Cancelled));
anyhow::Ok(())
});
{
let handler = TestClientHandler::new(true, true);
let _client = handler.serve(client_transport).await?;
}
tokio::time::sleep(Duration::from_millis(100)).await;
server_handle.await??;
Ok(())
}