#![cfg(not(loom))]
use std::net::SocketAddr;
use rstest::{fixture, rstest};
use wireframe::{
extractor::{ConnectionInfo, FromMessageRequest, Message, MessageRequest, Payload},
message::Message as MessageTrait,
};
#[fixture]
fn request() -> MessageRequest {
MessageRequest::default()
}
#[fixture]
fn empty_payload() -> Payload<'static> {
Payload::default()
}
#[derive(bincode::Encode, bincode::BorrowDecode, PartialEq, Debug)]
struct TestMsg(u8);
#[rstest]
fn message_extractor_parses_and_advances(request: MessageRequest) {
let msg = TestMsg(42);
let bytes = msg.to_bytes().expect("failed to serialise message");
let mut payload = Payload::new(bytes.as_slice());
let extracted = Message::<TestMsg>::from_message_request(&request, &mut payload)
.expect("failed to extract TestMsg from payload");
assert_eq!(*extracted, msg);
assert_eq!(payload.remaining(), 0);
}
#[rstest]
fn connection_info_reports_peer(mut request: MessageRequest, mut empty_payload: Payload<'static>) {
let addr: SocketAddr = "127.0.0.1:12345"
.parse()
.expect("hard-coded socket address must be valid");
request.peer_addr = Some(addr);
let info = ConnectionInfo::from_message_request(&request, &mut empty_payload)
.expect("failed to build ConnectionInfo");
assert_eq!(info.peer_addr(), Some(addr));
}
#[rstest]
fn shared_state_extractor(request: MessageRequest, mut empty_payload: Payload<'static>) {
request.insert_state(42u8);
let state =
wireframe::extractor::SharedState::<u8>::from_message_request(&request, &mut empty_payload)
.expect("failed to extract shared state");
assert_eq!(*state, 42);
}
#[rstest]
fn shared_state_missing_error(request: MessageRequest, mut empty_payload: Payload<'static>) {
let Err(err) =
wireframe::extractor::SharedState::<u8>::from_message_request(&request, &mut empty_payload)
else {
panic!("expected error");
};
match err {
wireframe::extractor::ExtractError::MissingState(name) => {
assert!(name.contains("u8"));
}
_ => panic!("unexpected error"),
}
}