SEDSnet 4.2.7

A memory safe, no_std-capable networking stack with routing, discovery, reliability, and Rust/C/Python bindings.
Documentation
use super::*;
fn hop_node() -> (Relay, RelaySideId, crate::DataType) {
    crate::tests::ensure_common_test_schema();
    let node = Relay::new(Box::new(|| 1000u64));
    let side = node.add_side_packed_with_options(
        "CAN",
        |_| Ok(()),
        RelaySideOptions {
            reliable_enabled: true,
            ..RelaySideOptions::default()
        },
    );
    node.clear_queues();
    let ty = crate::DataType::named("GPS_DATA");
    let packet = Packet::from_f32_slice(
        ty,
        &[1.0, 2.0, 3.0],
        &[crate::DataEndpoint::named("RADIO")],
        1,
    )
    .unwrap();
    node.send_reliable_to_side(side, RelayItem::Packet(Arc::new(packet)))
        .unwrap();
    assert!(
        node.state.lock().reliable_tx[&Relay::reliable_key(side, ty)]
            .sent
            .contains_key(&1)
    );
    (node, side, ty)
}
#[test]
fn refused_relay_hop_replay_does_not_pin_queued_flag() {
    let (node, side, ty) = hop_node();
    node.state.lock().replay_queue = BoundedDeque::new(1, 1, 1.0);
    assert!(node.queue_reliable_retransmit(side, ty, 1).is_err());
    assert!(!node.state.lock().reliable_tx[&Relay::reliable_key(side, ty)].sent[&1].queued);
    node.state.lock().replay_queue = BoundedDeque::new(4096, 512, 1.25);
    node.queue_reliable_retransmit(side, ty, 1).unwrap();
    assert_eq!(node.state.lock().replay_queue.len(), 1);
}
#[test]
fn evicted_relay_hop_replay_does_not_pin_queued_flag() {
    let (node, side, ty) = hop_node();
    node.queue_reliable_retransmit(side, ty, 1).unwrap();
    {
        let mut state = node.state.lock();
        assert!(state.pop_lowest_packet_queue_item(256));
        assert!(!state.reliable_tx[&Relay::reliable_key(side, ty)].sent[&1].queued);
        assert!(
            state.reliable_tx[&Relay::reliable_key(side, ty)]
                .sent
                .contains_key(&1)
        );
    }
    node.queue_reliable_retransmit(side, ty, 1).unwrap();
    assert_eq!(node.state.lock().replay_queue.len(), 1);
}

#[test]
fn clearing_relay_replays_releases_reservations_without_losing_retained_delivery() {
    for all in [false, true] {
        let (node, side, ty) = hop_node();
        node.queue_reliable_retransmit(side, ty, 1).unwrap();
        if all {
            node.clear_queues()
        } else {
            node.clear_tx_queue()
        }
        assert!(node.state.lock().replay_queue.is_empty());
        assert!(!node.state.lock().reliable_tx[&Relay::reliable_key(side, ty)].sent[&1].queued);
        node.queue_reliable_retransmit(side, ty, 1).unwrap();
        assert_eq!(node.state.lock().replay_queue.len(), 1);
    }
}
#[test]
fn disabled_relay_egress_does_not_pin_a_removed_retry_marker() {
    let (node, side, ty) = hop_node();
    node.queue_reliable_retransmit(side, ty, 1).unwrap();
    node.set_side_egress_enabled(side, false).unwrap();
    assert!(!node.state.lock().reliable_tx[&Relay::reliable_key(side, ty)].sent[&1].queued);
    node.set_side_egress_enabled(side, true).unwrap();
    node.queue_reliable_retransmit(side, ty, 1).unwrap();
    assert_eq!(node.state.lock().replay_queue.len(), 1);
}