fedimint-portalloc 0.13.0-beta.1

Port allocation utility for Fedimint
Documentation
use super::{LOW, RootData, port_range};

#[test]
fn root_data_sanity() {
    let mut data = RootData::default();

    data.insert(2..4);
    data.insert(6..8);
    data.insert(100..108);
    assert_eq!(data.contains(0..2), None);
    assert_eq!(data.contains(0..3), Some(4));
    assert_eq!(data.contains(2..4), Some(4));
    assert_eq!(data.contains(3..4), Some(4));
    assert_eq!(data.contains(3..5), Some(4));
    assert_eq!(data.contains(4..6), None);
    assert_eq!(data.contains(0..10), Some(8));
    assert_eq!(data.contains(6..10), Some(8));
    assert_eq!(data.contains(7..8), Some(8));
    assert_eq!(data.contains(8..10), None);
}

#[test]
fn port_range_rejects_unrepresentable_endpoints() {
    assert!(port_range(LOW, u16::MAX).is_err());
}

#[test]
fn port_range_accepts_representable_endpoints() {
    assert_eq!(port_range(LOW, 3).expect("range should fit"), LOW..10003);
    assert_eq!(
        port_range(LOW, u16::MAX - LOW).expect("range endpoint should fit exactly"),
        LOW..u16::MAX
    );
}

#[test]
fn failed_range_allocation_does_not_reserve_ports() {
    let mut data = RootData::default();

    assert!(data.get_free_port_range(u16::MAX).is_err());
    assert!(data.keys.is_empty());
    assert_eq!(data.next, LOW);
}

#[test]
fn range_allocation_checks_each_candidate_endpoint() {
    let mut data = RootData::default();
    data.insert(LOW..LOW + 1);
    data.next = LOW;

    assert!(data.get_free_port_range(u16::MAX - LOW).is_err());
    assert_eq!(data.keys.len(), 1);
    assert!(data.keys.contains_key(&LOW));
}