use datacake_rpc::{ Channel, Handler, Request, RpcClient, RpcService, Server, ServiceRegistry, Status, }; use rkyv::{Archive, Deserialize, Serialize}; #[repr(C)] #[derive(Serialize, Deserialize, Archive, Debug)] #[archive(check_bytes)] #[archive_attr(derive(Debug))] pub struct MyMessage { name: String, age: u32, buffer: Vec, } pub struct MyService; impl RpcService for MyService { fn register_handlers(registry: &mut ServiceRegistry) { registry.add_handler::(); } } #[datacake_rpc::async_trait] impl Handler for MyService { type Reply = String; async fn on_message(&self, _msg: Request) -> Result { Err(Status::internal("Oops! Something went wrong!")) } } #[tokio::test] async fn test_service_error() { let addr = test_helper::get_unused_addr(); let server = Server::listen(addr).await.unwrap(); server.add_service(MyService); println!("Listening to address {}!", addr); let client = Channel::connect(addr); println!("Connected to address {}!", addr); let rpc_client = RpcClient::::new(client); let msg1 = MyMessage { name: "Bobby".to_string(), age: 12, buffer: vec![0u8; 32 << 10], }; let resp = rpc_client.send(&msg1).await; assert_eq!( resp, Err(Status::internal("Oops! Something went wrong!")), "Results should match." ); server.shutdown(); }