#![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, RpcRequest, RpcResponse, RpcServer};
use std::time::Duration;
#[test]
fn test_rpc_request_creation() {
let request = RpcRequest::new(12345, "test_method".to_string(), vec![1, 2, 3, 4]);
let id = request.id();
assert_eq!(id, 12345);
let method = request.method();
assert_eq!(method, "test_method");
let params = request.params();
assert_eq!(params, &vec![1, 2, 3, 4]);
}
#[test]
fn test_rpc_response_creation() {
let success = RpcResponse::from_result(123, Ok(vec![5, 6, 7]));
assert_eq!(success.id(), 123);
assert_eq!(success.result(), Some(&vec![5, 6, 7]));
assert_eq!(success.error(), None);
let error = RpcResponse::from_result(456, Err(RpcError::StreamError("test error".to_string())));
assert_eq!(error.id(), 456);
assert_eq!(error.result(), None);
assert!(error.error().is_some());
let direct = RpcResponse::new(789, Some(vec![8, 9]), None);
assert_eq!(direct.id(), 789);
assert_eq!(direct.result(), Some(&vec![8, 9]));
assert_eq!(direct.error(), None);
}
#[test]
fn test_rpc_config_creation() {
let config = RpcConfig::new("test_cert.pem", "localhost:8080");
let config_with_options = config
.with_key_path("test_key.pem")
.with_server_name("test-server")
.with_keep_alive_interval(Duration::from_secs(30));
drop(config_with_options);
}
#[tokio::test]
async fn test_rpc_server_creation() {
let config = RpcConfig::new("cert.pem", "127.0.0.1:0");
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);
drop(streaming_handlers);
}
#[tokio::test]
async fn test_register_handler() {
let config = RpcConfig::new("cert.pem", "127.0.0.1:0");
let server = RpcServer::new(config);
server
.register("echo", |params| async move {
Ok(params) })
.await;
let handlers = server.handlers.read().await;
assert_eq!(handlers.len(), 1);
assert!(handlers.contains_key("echo"));
}
#[tokio::test]
async fn test_register_streaming_handler() {
let config = RpcConfig::new("cert.pem", "127.0.0.1:0");
let server = RpcServer::new(config);
server
.register_streaming("stream_echo", |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_echo"));
}
#[tokio::test]
async fn test_multiple_handlers() {
let config = RpcConfig::new("cert.pem", "127.0.0.1:0");
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);
drop(handlers);
let streaming_handlers = server.streaming_handlers.read().await;
assert_eq!(streaming_handlers.len(), 2);
drop(streaming_handlers);
}
#[test]
fn test_error_types() {
let stream_error = RpcError::StreamError("connection failed".to_string());
let ser_error = RpcError::SerializationError(bincode::Error::new(
bincode::ErrorKind::InvalidBoolEncoding(101),
));
let _stream_debug = format!("{:?}", stream_error);
let _stream_display = format!("{}", stream_error);
let _ser_debug = format!("{:?}", ser_error);
let _ser_display = format!("{}", ser_error);
match stream_error {
RpcError::StreamError(msg) => assert_eq!(msg, "connection failed"),
_ => panic!("Wrong error type"),
}
match ser_error {
RpcError::SerializationError(_) => {} _ => panic!("Wrong error type"),
}
}
#[test]
fn test_request_with_different_data() {
let empty_req = RpcRequest::new(1, "empty".to_string(), vec![]);
assert_eq!(empty_req.params().len(), 0);
let small_req = RpcRequest::new(2, "small".to_string(), vec![1, 2, 3]);
assert_eq!(small_req.params().len(), 3);
let large_data = vec![0u8; 1000];
let large_req = RpcRequest::new(3, "large".to_string(), large_data.clone());
assert_eq!(large_req.params().len(), 1000);
let binary_data = vec![0x00, 0xFF, 0x55, 0xAA];
let binary_req = RpcRequest::new(4, "binary".to_string(), binary_data.clone());
assert_eq!(binary_req.params(), &binary_data);
}
#[test]
fn test_response_with_different_data() {
let empty_resp = RpcResponse::from_result(1, Ok(vec![]));
assert_eq!(empty_resp.result().unwrap().len(), 0);
let small_resp = RpcResponse::from_result(2, Ok(vec![1, 2, 3]));
assert_eq!(small_resp.result().unwrap().len(), 3);
let large_data = vec![1u8; 1000];
let large_resp = RpcResponse::from_result(3, Ok(large_data.clone()));
assert_eq!(large_resp.result().unwrap().len(), 1000);
let stream_err_resp =
RpcResponse::from_result(4, Err(RpcError::StreamError("stream error".to_string())));
assert!(stream_err_resp.error().is_some());
let ser_err_resp = RpcResponse::from_result(
5,
Err(RpcError::SerializationError(bincode::Error::new(
bincode::ErrorKind::InvalidBoolEncoding(101),
))),
);
assert!(ser_err_resp.error().is_some());
}