#![allow(clippy::all)]
#![allow(warnings)]
#![allow(unused_imports)]
#![allow(unused_variables)]
#![allow(clippy::needless_borrows_for_generic_args)]
#![allow(clippy::assertions_on_constants)]
use rpcnet::{RpcClient, RpcConfig, RpcError, RpcServer};
use std::time::Duration;
use tokio::time::sleep;
fn create_test_config(port: u16) -> RpcConfig {
RpcConfig::new("certs/test_cert.pem", format!("127.0.0.1:{}", port))
.with_key_path("certs/test_key.pem")
.with_server_name("localhost")
.with_keep_alive_interval(Duration::from_millis(100))
}
fn create_invalid_config() -> RpcConfig {
RpcConfig::new("invalid/cert/path.pem", "127.0.0.1:0")
.with_key_path("invalid/key/path.pem")
.with_server_name("localhost")
}
#[tokio::test]
async fn test_server_bind_errors() {
println!("📍 Testing server bind error scenarios");
println!("📍 Test 1: Invalid certificate path");
let mut server1 = RpcServer::new(create_invalid_config());
let bind_result1 = server1.bind();
match bind_result1 {
Err(e) => {
println!("✅ Expected error for invalid certificate: {:?}", e);
println!(" 🎯 Covered error path in RpcServer::bind");
}
Ok(_) => {
println!("⚠️ Unexpected success with invalid certificate");
}
}
println!("📍 Test 2: Invalid address binding");
let invalid_addr_config = RpcConfig::new("certs/test_cert.pem", "999.999.999.999:99999")
.with_key_path("certs/test_key.pem")
.with_server_name("localhost");
let mut server2 = RpcServer::new(invalid_addr_config);
let bind_result2 = server2.bind();
match bind_result2 {
Err(e) => {
println!("✅ Expected error for invalid address: {:?}", e);
println!(" 🎯 Covered another error path in RpcServer::bind");
}
Ok(_) => {
println!("⚠️ Unexpected success with invalid address");
}
}
println!("📍 Test 3: Port already in use");
let config1 = create_test_config(0);
let config2 = create_test_config(0);
let mut server3 = RpcServer::new(config1);
let mut server4 = RpcServer::new(config2);
if let Ok(quic_server1) = server3.bind() {
let addr = quic_server1.local_addr().unwrap();
println!("First server bound to: {}", addr);
let _handle1 = tokio::spawn(async move {
let _ = server3.start(quic_server1).await;
});
sleep(Duration::from_millis(100)).await;
let bind_result4 = server4.bind();
match bind_result4 {
Ok(_) => {
println!("⚠️ Both servers bound successfully (different ports assigned)");
}
Err(e) => {
println!("✅ Second bind failed as expected: {:?}", e);
println!(" 🎯 Covered port conflict error path");
}
}
}
}
#[tokio::test]
async fn test_client_connection_errors() {
println!("📍 Testing client connection error scenarios");
println!("📍 Test 1: Connect to non-existent server");
let config = create_test_config(0);
let nonexistent_addr = "127.0.0.1:65001".parse().unwrap();
let connect_result1 = tokio::time::timeout(
Duration::from_secs(2),
RpcClient::connect(nonexistent_addr, config),
)
.await;
match connect_result1 {
Ok(Err(e)) => {
println!("✅ Expected connection error: {:?}", e);
println!(" 🎯 Covered connection error path in RpcClient::connect");
}
Ok(Ok(_)) => {
println!("⚠️ Unexpected successful connection to non-existent server");
}
Err(_) => {
println!("✅ Connection timed out as expected");
println!(" 🎯 Covered timeout error path");
}
}
println!("📍 Test 2: Invalid certificate configuration");
let invalid_config = create_invalid_config();
let dummy_addr = "127.0.0.1:65002".parse().unwrap();
let connect_result2 = tokio::time::timeout(
Duration::from_secs(1),
RpcClient::connect(dummy_addr, invalid_config),
)
.await;
match connect_result2 {
Ok(Err(e)) => {
println!("✅ Expected certificate error: {:?}", e);
println!(" 🎯 Covered certificate error path in RpcClient::connect");
}
Ok(Ok(_)) => {
println!("⚠️ Unexpected successful connection with invalid certificate");
}
Err(_) => {
println!("✅ Certificate connection timed out as expected");
}
}
println!("📍 Test 3: Invalid server name configuration");
let bad_name_config = RpcConfig::new("certs/test_cert.pem", "127.0.0.1:0")
.with_key_path("certs/test_key.pem")
.with_server_name("wrong-server-name");
let connect_result3 = tokio::time::timeout(
Duration::from_secs(1),
RpcClient::connect(dummy_addr, bad_name_config),
)
.await;
match connect_result3 {
Ok(Err(e)) => {
println!("✅ Expected server name error: {:?}", e);
println!(" 🎯 Covered server name verification error path");
}
Ok(Ok(_)) => {
println!("⚠️ Unexpected successful connection with wrong server name");
}
Err(_) => {
println!("✅ Server name verification timed out as expected");
}
}
}
#[tokio::test]
async fn test_client_call_errors() {
println!("📍 Testing client call error scenarios");
let mut server = RpcServer::new(create_test_config(0));
server
.register("error_test", |params| async move {
let input = String::from_utf8_lossy(¶ms);
if input == "trigger_error" {
Err(RpcError::StreamError("Intentional test error".to_string()))
} else if input == "malformed_response" {
Ok(vec![0xFF, 0xFE, 0xFD]) } else {
Ok(b"success".to_vec())
}
})
.await;
let quic_server = server.bind();
if let Ok(quic_server) = quic_server {
let addr = quic_server.local_addr().unwrap();
let server_handle = tokio::spawn(async move {
let _ = server.start(quic_server).await;
});
sleep(Duration::from_millis(50)).await;
let config = create_test_config(0);
let client_result = RpcClient::connect(addr, config).await;
if let Ok(client) = client_result {
println!("📍 Test 1: Call non-existent method");
let result1 = client.call("nonexistent_method", vec![]).await;
match result1 {
Err(e) => {
println!("✅ Expected error for non-existent method: {:?}", e);
println!(" 🎯 Covered unknown method error path");
}
Ok(_) => {
println!("⚠️ Unexpected success for non-existent method");
}
}
println!("📍 Test 2: Server-side error");
let result2 = client.call("error_test", b"trigger_error".to_vec()).await;
match result2 {
Err(e) => {
println!("✅ Expected server error: {:?}", e);
println!(" 🎯 Covered server error response path");
}
Ok(_) => {
println!("⚠️ Unexpected success for error trigger");
}
}
println!("📍 Test 3: Large request data");
let large_data = vec![0xAB; 100000]; let result3 = tokio::time::timeout(
Duration::from_secs(2),
client.call("error_test", large_data),
)
.await;
match result3 {
Ok(Ok(_)) => {
println!("✅ Large data handled successfully");
}
Ok(Err(e)) => {
println!("✅ Large data error: {:?}", e);
println!(" 🎯 Covered large data error path");
}
Err(_) => {
println!("✅ Large data call timed out");
println!(" 🎯 Covered timeout error path");
}
}
println!("📍 Test 4: Multiple concurrent calls");
let mut tasks = Vec::new();
for i in 0..10 {
let client_ref = &client;
let task = async move {
let data = format!("request_{}", i);
client_ref.call("error_test", data.into_bytes()).await
};
tasks.push(task);
}
let results = futures::future::join_all(tasks).await;
let success_count = results.iter().filter(|r| r.is_ok()).count();
let error_count = results.iter().filter(|r| r.is_err()).count();
println!(
"✅ Concurrent calls: {} successes, {} errors",
success_count, error_count
);
if error_count > 0 {
println!(" 🎯 Covered concurrent call error paths");
}
}
server_handle.abort();
}
}
#[tokio::test]
async fn test_malformed_data_scenarios() {
println!("📍 Testing malformed data scenarios");
let mut server = RpcServer::new(create_test_config(0));
server
.register("expect_string", |params| async move {
let _text: String =
bincode::deserialize(¶ms).map_err(RpcError::SerializationError)?;
Ok(b"string parsed successfully".to_vec())
})
.await;
server
.register("expect_number", |params| async move {
let _num: i32 = bincode::deserialize(¶ms).map_err(RpcError::SerializationError)?;
Ok(b"number parsed successfully".to_vec())
})
.await;
let quic_server = server.bind();
if let Ok(quic_server) = quic_server {
let addr = quic_server.local_addr().unwrap();
let server_handle = tokio::spawn(async move {
let _ = server.start(quic_server).await;
});
sleep(Duration::from_millis(50)).await;
let config = create_test_config(0);
if let Ok(client) = RpcClient::connect(addr, config).await {
println!("📍 Test 1: Malformed data to string handler");
let malformed_data = vec![0xFF, 0xFE, 0xFD, 0xFC];
let result1 = client.call("expect_string", malformed_data).await;
match result1 {
Err(e) => {
println!("✅ Expected deserialization error: {:?}", e);
println!(" 🎯 Covered malformed data error path");
}
Ok(_) => {
println!("⚠️ Unexpected success with malformed data");
}
}
println!("📍 Test 2: Wrong data type to number handler");
let string_data = bincode::serialize("not a number").unwrap();
let result2 = client.call("expect_number", string_data).await;
match result2 {
Err(e) => {
println!("✅ Expected type error: {:?}", e);
println!(" 🎯 Covered type mismatch error path");
}
Ok(_) => {
println!("⚠️ Unexpected success with wrong data type");
}
}
println!("📍 Test 3: Empty data");
let result3 = client.call("expect_string", vec![]).await;
match result3 {
Err(e) => {
println!("✅ Expected empty data error: {:?}", e);
println!(" 🎯 Covered empty data error path");
}
Ok(_) => {
println!("⚠️ Unexpected success with empty data");
}
}
}
server_handle.abort();
}
}