bp7 0.10.6

Rust implementation of dtn Bundle Protocol Version 7 ([RFC 9171]
Documentation
use bp7::flags::*;
use bp7::*;
use std::convert::TryFrom;
use std::convert::TryInto;

#[test]
fn canonical_data_tests() {
    let data = CanonicalData::Data(b"bla".to_vec());
    let encoded_data = serde_cbor::to_vec(&data).expect("encoding error");
    let decoded_data: CanonicalData =
        serde_cbor::from_slice(&encoded_data).expect("decoding error");
    assert_eq!(data, decoded_data);

    let bundleage = dbg!(CanonicalData::BundleAge(23));
    let encoded_bundleage = serde_cbor::to_vec(&bundleage).expect("encoding error");
    let decoded_bundleage: CanonicalData =
        serde_cbor::from_slice(&encoded_bundleage).expect("decoding error");
    assert_eq!(bundleage, decoded_bundleage);

    let hopcount = CanonicalData::HopCount(23, 42);
    let encoded_hopcount = serde_cbor::to_vec(&hopcount).expect("encoding error");
    let decoded_hopcount: CanonicalData =
        serde_cbor::from_slice(&encoded_hopcount).expect("decoding error");
    assert_eq!(hopcount, decoded_hopcount);

    let previous = CanonicalData::PreviousNode("dtn://node1".try_into().unwrap());
    let encoded_previous = serde_cbor::to_vec(&previous).expect("encoding error");
    let decoded_previous: CanonicalData =
        serde_cbor::from_slice(&encoded_previous).expect("decoding error");
    assert_eq!(previous, decoded_previous);
}

fn encode_decode_test_canonical(data: CanonicalBlock) {
    let encoded_data = serde_cbor::to_vec(&data).expect("encoding error");
    let decoded_data: CanonicalBlock =
        serde_cbor::from_slice(&encoded_data).expect("decoding error");
    assert_eq!(data, decoded_data);

    println!("{:?}", decoded_data.data());
    assert_eq!(decoded_data.data(), data.data());
    if *decoded_data.data() == CanonicalData::DecodingError {
        panic!("Wrong Payload");
    }
}

#[test]
fn canonical_block_tests() {
    let data = new_payload_block(BlockControlFlags::empty(), b"ABCDEFG".to_vec());
    encode_decode_test_canonical(data);

    let data = new_hop_count_block(1, BlockControlFlags::empty(), 32);
    encode_decode_test_canonical(data);

    let data = new_bundle_age_block(1, BlockControlFlags::empty(), 0);
    encode_decode_test_canonical(data);

    let data = new_previous_node_block(
        1,
        BlockControlFlags::empty(),
        "dtn://node2".try_into().unwrap(),
    );
    encode_decode_test_canonical(data);
}

#[test]
fn hopcount_tests() {
    let mut block = new_hop_count_block(1, BlockControlFlags::empty(), 1);

    assert_eq!(block.block_type, bp7::HOP_COUNT_BLOCK);
    assert!(!block.hop_count_exceeded());

    if let CanonicalData::HopCount(hc_limit, hc_count) = block.data() {
        assert!(*hc_limit == 1);
        assert!(*hc_count == 0);
    } else {
        panic!("Not a hop count block!");
    }

    assert!(block.hop_count_increase());
    if let Some((hc_limit, hc_count)) = block.hop_count_get() {
        assert!(hc_limit == 1);
        assert!(hc_count == 1);
    } else {
        panic!("Not a hop count block!");
    }

    assert!(block.hop_count_increase());
    assert!(block.hop_count_exceeded());

    let mut wrong_block = new_bundle_age_block(1, BlockControlFlags::empty(), 0);
    assert!(!wrong_block.hop_count_increase());
    assert!(!wrong_block.hop_count_exceeded());
    assert_eq!(wrong_block.hop_count_get(), None);
}

#[test]
fn previousnode_tests() {
    let mut block = new_previous_node_block(
        1,
        BlockControlFlags::empty(),
        "dtn://node1".try_into().unwrap(),
    );

    assert_eq!(block.block_type, bp7::PREVIOUS_NODE_BLOCK);
    if let Some(eid) = block.previous_node_get() {
        assert_eq!(*eid, EndpointID::try_from("dtn://node1").unwrap());
    } else {
        panic!("Not a previous node block!");
    }

    assert!(block.previous_node_update("dtn://node2".try_into().unwrap()));

    if let Some(eid) = block.previous_node_get() {
        assert_eq!(*eid, EndpointID::try_from("dtn://node2").unwrap());
    } else {
        panic!("Not a previous node block!");
    }

    let mut wrong_block = new_bundle_age_block(1, BlockControlFlags::empty(), 0);
    assert_eq!(wrong_block.previous_node_get(), None);
    assert!(!wrong_block.previous_node_update("dtn://node2".try_into().unwrap()));
}

#[test]
fn bundleage_tests() {
    let mut block = new_bundle_age_block(1, BlockControlFlags::empty(), 0);

    assert_eq!(block.block_type, bp7::BUNDLE_AGE_BLOCK);
    if let Some(age) = block.bundle_age_get() {
        assert_eq!(age, 0);
    } else {
        panic!("Not a bundle age block!");
    }

    assert!(block.bundle_age_update(200));

    if let Some(age) = block.bundle_age_get() {
        assert_eq!(age, 200);
    } else {
        panic!("Not a bundle age block!");
    }

    let mut wrong_block = new_hop_count_block(1, BlockControlFlags::empty(), 1);
    assert_eq!(wrong_block.bundle_age_get(), None);
    assert!(!wrong_block.bundle_age_update(2342));
}