#![allow(clippy::all)]
#![allow(warnings)]
#![allow(unused_imports)]
#![allow(unused_variables)]
#![allow(clippy::needless_borrows_for_generic_args)]
#![allow(clippy::assertions_on_constants)]
use futures::StreamExt;
use rpcnet::{RpcConfig, RpcError, RpcServer};
use std::time::Duration;
fn create_basic_config() -> RpcConfig {
RpcConfig::new("test_cert.pem", "127.0.0.1:0")
.with_key_path("test_key.pem")
.with_server_name("localhost")
}
#[tokio::test]
async fn test_rpc_server_new() {
let config = create_basic_config();
let server = RpcServer::new(config);
let handlers = server.handlers.read().await;
assert_eq!(handlers.len(), 0);
drop(handlers);
let streaming_handlers = server.streaming_handlers.read().await;
assert_eq!(streaming_handlers.len(), 0);
}
#[tokio::test]
async fn test_register_basic_handler() {
let config = create_basic_config();
let server = RpcServer::new(config);
server
.register("test_method", |params| async move {
Ok(params) })
.await;
let handlers = server.handlers.read().await;
assert_eq!(handlers.len(), 1);
assert!(handlers.contains_key("test_method"));
}
#[tokio::test]
async fn test_register_streaming_handler() {
let config = create_basic_config();
let server = RpcServer::new(config);
server
.register_streaming("stream_method", |mut request_stream| async move {
Box::pin(async_stream::stream! {
while let Some(data) = request_stream.next().await {
yield Ok(data);
}
})
})
.await;
let streaming_handlers = server.streaming_handlers.read().await;
assert_eq!(streaming_handlers.len(), 1);
assert!(streaming_handlers.contains_key("stream_method"));
}
#[tokio::test]
async fn test_rpc_request_methods() {
use rpcnet::RpcRequest;
let request = RpcRequest::new(12345, "test_method".to_string(), vec![1, 2, 3]);
assert_eq!(request.id(), 12345);
assert_eq!(request.method(), "test_method");
assert_eq!(request.params(), &vec![1, 2, 3]);
}
#[tokio::test]
async fn test_rpc_response_methods() {
use rpcnet::RpcResponse;
let success_response = RpcResponse::from_result(123, Ok(vec![4, 5, 6]));
assert_eq!(success_response.id(), 123);
assert_eq!(success_response.result(), Some(&vec![4, 5, 6]));
assert_eq!(success_response.error(), None);
let error_response =
RpcResponse::from_result(456, Err(RpcError::StreamError("test error".to_string())));
assert_eq!(error_response.id(), 456);
assert_eq!(error_response.result(), None);
assert!(error_response.error().is_some());
}
#[tokio::test]
async fn test_rpc_config_builder_methods() {
let config = RpcConfig::new("cert.pem", "localhost:8080")
.with_key_path("key.pem")
.with_server_name("test-server")
.with_keep_alive_interval(Duration::from_secs(30));
drop(config);
}
#[tokio::test]
async fn test_error_variants() {
let stream_error = RpcError::StreamError("stream failed".to_string());
let serialization_error = RpcError::SerializationError(bincode::Error::new(
bincode::ErrorKind::InvalidBoolEncoding(101),
));
let _stream_debug = format!("{:?}", stream_error);
let _ser_debug = format!("{:?}", serialization_error);
let _stream_display = format!("{}", stream_error);
let _ser_display = format!("{}", serialization_error);
}
#[tokio::test]
async fn test_multiple_handler_registration() {
let config = create_basic_config();
let server = RpcServer::new(config);
server
.register("method1", |_| async move { Ok(vec![1]) })
.await;
server
.register("method2", |_| async move { Ok(vec![2]) })
.await;
server
.register("method3", |_| async move { Ok(vec![3]) })
.await;
server
.register_streaming("stream1", |mut req_stream| async move {
Box::pin(async_stream::stream! {
while let Some(data) = req_stream.next().await {
yield Ok(data);
}
})
})
.await;
server
.register_streaming("stream2", |mut req_stream| async move {
Box::pin(async_stream::stream! {
while let Some(data) = req_stream.next().await {
yield Ok(data);
}
})
})
.await;
let handlers = server.handlers.read().await;
assert_eq!(handlers.len(), 3);
assert!(handlers.contains_key("method1"));
assert!(handlers.contains_key("method2"));
assert!(handlers.contains_key("method3"));
drop(handlers);
let streaming_handlers = server.streaming_handlers.read().await;
assert_eq!(streaming_handlers.len(), 2);
assert!(streaming_handlers.contains_key("stream1"));
assert!(streaming_handlers.contains_key("stream2"));
}
#[tokio::test]
async fn test_handler_replacement() {
let config = create_basic_config();
let server = RpcServer::new(config);
server
.register("replaceable", |_| async move { Ok(vec![1]) })
.await;
{
let handlers = server.handlers.read().await;
assert_eq!(handlers.len(), 1);
}
server
.register("replaceable", |_| async move { Ok(vec![2]) })
.await;
let handlers = server.handlers.read().await;
assert_eq!(handlers.len(), 1);
assert!(handlers.contains_key("replaceable"));
}
#[tokio::test]
async fn test_empty_method_names() {
let config = create_basic_config();
let server = RpcServer::new(config);
server.register("", |_| async move { Ok(vec![]) }).await;
let handlers = server.handlers.read().await;
assert_eq!(handlers.len(), 1);
assert!(handlers.contains_key(""));
}
#[tokio::test]
async fn test_large_method_names() {
let config = create_basic_config();
let server = RpcServer::new(config);
let long_name = "a".repeat(1000);
server
.register(&long_name, |_| async move { Ok(vec![]) })
.await;
let handlers = server.handlers.read().await;
assert_eq!(handlers.len(), 1);
assert!(handlers.contains_key(&long_name));
}
#[tokio::test]
async fn test_handler_with_different_return_types() {
let config = create_basic_config();
let server = RpcServer::new(config);
server
.register("success", |_| async move { Ok(vec![1, 2, 3]) })
.await;
server
.register("error", |_| async move {
Err(RpcError::StreamError("intentional error".to_string()))
})
.await;
server
.register("empty", |_| async move { Ok(vec![]) })
.await;
server
.register("large", |_| async move { Ok(vec![0u8; 10000]) })
.await;
let handlers = server.handlers.read().await;
assert_eq!(handlers.len(), 4);
}