use simple_doip::messages::{
DiagnosticMessage, Encode, Header, MessageError, Payload, PayloadType, ProtocolVersion,
};
use simple_doip::{LogicalAddress, try_frame};
#[test]
fn nested_encode_no_staging_buffer() {
let uds_response = [0x62u8, 0xF1, 0x90, 0xAA, 0xBB];
let dm = DiagnosticMessage {
source_address: LogicalAddress(0x1000),
target_address: LogicalAddress(0x0E00),
user_data: &uds_response[..],
};
let payload_len = dm.encoded_size().unwrap();
let header = Header::new(
ProtocolVersion::V2012,
PayloadType::DiagnosticMessage,
u32::try_from(payload_len).unwrap(),
);
let mut tx_buf = [0u8; 64];
let mut writer: &mut [u8] = &mut tx_buf;
let mut total = header.encode(&mut writer).unwrap();
total += dm.encode(&mut writer).unwrap();
assert_eq!(total, Header::SIZE + payload_len);
let (frame, consumed) = try_frame(&tx_buf[..total]).unwrap().unwrap();
assert_eq!(consumed, total);
let decoded = Payload::decode(frame.payload, frame.header.payload_type).unwrap();
match decoded {
Payload::DiagnosticMessage(d) => assert_eq!(d.user_data, &uds_response[..]),
other => panic!("wrong payload: {other:?}"),
}
let mut small = [0u8; 4];
let mut w: &mut [u8] = &mut small;
let err = header.encode(&mut w).unwrap_err();
assert!(matches!(
err,
MessageError::Io(embedded_io::ErrorKind::WriteZero)
));
assert!(!err.is_framing_fatal());
}