antenna-protocol 0.1.0

SansIO core driving the antenna P2P mesh protocol.
Documentation
#[cfg(test)]
mod test {
    use std::collections::HashMap;

    use crate::{
        MeshNodeFSM, PeerID,
        test::{assert_full_mesh_connectivity, drive_bootstrap_handshake, join_mesh},
    };

    #[test]
    fn three_peer_mesh() {
        let mut alice = MeshNodeFSM::new();
        let alice_id = alice.id().clone();
        let mut bob = MeshNodeFSM::new();
        let bob_id = bob.id().clone();

        let mut peers: HashMap<PeerID, MeshNodeFSM> = HashMap::new();

        drive_bootstrap_handshake::<()>(&mut alice, &mut bob);

        peers.insert(alice_id.clone(), alice);
        peers.insert(bob_id.clone(), bob);

        assert_full_mesh_connectivity(&peers);
        assert_eq!(peers.len(), 2);

        let charlie = MeshNodeFSM::new();
        let charlie_id = charlie.id().clone();
        peers.insert(charlie_id.clone(), charlie);

        join_mesh(&charlie_id, &bob_id, &mut peers);

        assert_full_mesh_connectivity(&peers);
        assert_eq!(peers.len(), 3);

        for mesh in peers.values() {
            assert_eq!(mesh.connected_number(), 2);
        }
    }

    #[test]
    fn incremental() {
        let mut alice = MeshNodeFSM::new();
        let alice_id = alice.id().clone();
        let mut bob = MeshNodeFSM::new();
        let bob_id = bob.id().clone();

        let mut peers: HashMap<PeerID, MeshNodeFSM> = HashMap::new();

        drive_bootstrap_handshake::<()>(&mut alice, &mut bob);

        peers.insert(alice_id.clone(), alice);
        peers.insert(bob_id.clone(), bob);

        assert_full_mesh_connectivity(&peers);
        assert_eq!(peers.len(), 2);

        let charlie = MeshNodeFSM::new();
        let charlie_id = charlie.id().clone();
        peers.insert(charlie_id.clone(), charlie);

        join_mesh(&charlie_id, &bob_id, &mut peers);

        assert_full_mesh_connectivity(&peers);
        assert_eq!(peers.len(), 3);

        let dave = MeshNodeFSM::new();
        let dave_id = dave.id().clone();
        peers.insert(dave_id.clone(), dave);

        join_mesh(&dave_id, &alice_id, &mut peers);

        assert_full_mesh_connectivity(&peers);
        assert_eq!(peers.len(), 4);

        let eve = MeshNodeFSM::new();
        let eve_id = eve.id().clone();
        peers.insert(eve_id.clone(), eve);

        join_mesh(&eve_id, &charlie_id, &mut peers);

        assert_full_mesh_connectivity(&peers);
        assert_eq!(peers.len(), 5);

        for mesh in peers.values() {
            assert_eq!(mesh.connected_number(), 4);
        }
    }
}