msrt 0.1.5

Portable MSRT protocol implementation.
Documentation
//! Integration tests for the no_std MSRT protocol facade.

const TX_BUF_BYTES: usize = 128;

use msrt::{
    Engine,
    core::{DataHeader, Flags, MessageId, Packet, PacketIndex},
    engine::EnginePoll,
    reliability::{FragmentRange, MessageFragment, MessageKey},
    wire::{EnvelopeHeader, EnvelopeMagic, WireEnvelope},
};

#[test]
fn facade_exposes_core_packet_and_wire_envelope() {
    let payload = [0x01, 0x02, 0x03];
    let header = DataHeader::new(
        Flags::ACK_ELICITING,
        MessageId::new(7),
        PacketIndex::new(0),
        payload.len(),
        0,
    );
    let packet = Packet::data_parts(header, &payload);

    let envelope_header = EnvelopeHeader::new(packet.payload_len() as u8);
    let envelope = WireEnvelope::new(envelope_header, packet.payload_bytes());

    assert_eq!(EnvelopeMagic::MSRT.bytes(), [0xA5]);
    assert_eq!(envelope.packet_bytes, &payload);
    assert!(envelope.has_valid_len());
    assert!(envelope.header.has_valid_header_crc());
    assert_eq!(envelope.header.packet_len, 3);
}

#[test]
fn facade_exposes_reliability_fragment_view() {
    let header = DataHeader::new(
        Flags::ACK_ELICITING,
        MessageId::new(9),
        PacketIndex::new(0),
        8,
        2,
    );

    let fragment = MessageFragment::try_from_data_header(header, 4).unwrap();

    assert_eq!(fragment.key, MessageKey::new(MessageId::new(9)));
    assert_eq!(fragment.range, FragmentRange::new(2, 4));
}

#[test]
fn facade_exposes_concrete_engine_api() {
    let mut engine = Engine::default();
    let mut tx_buf = [0; TX_BUF_BYTES];
    let message_id = engine.send(b"hello").unwrap();

    assert_eq!(message_id, MessageId::ZERO);

    let EnginePoll::Transmit { bytes, .. } = engine.poll(0, &mut tx_buf).unwrap() else {
        panic!("engine should produce transmit bytes");
    };

    assert_eq!(
        u16::from_le_bytes(
            bytes[msrt::wire::WIRE_HEADER_LEN + 6..msrt::wire::WIRE_HEADER_LEN + 8]
                .try_into()
                .unwrap()
        ),
        PacketIndex::ZERO.get()
    );
    assert!(!bytes.is_empty());
}