atm0s_sdn_transport_vnet/
lib.rs1mod connection;
2mod connector;
3mod earth;
4mod listener;
5mod transport;
6
7pub const VNET_PROTOCOL_ID: u8 = 1;
8pub use earth::VnetEarth;
9pub use transport::VnetTransport;
10
11#[cfg(test)]
12mod tests {
13 use crate::{VnetEarth, VnetTransport};
14 use atm0s_sdn_identity::{ConnDirection, NodeAddr, NodeId};
15 use atm0s_sdn_network::{
16 msg::TransportMsg,
17 transport::{ConnectionEvent, ConnectionStats, OutgoingConnectionError, Transport, TransportEvent},
18 };
19 use atm0s_sdn_router::RouteRule;
20 use serde::{Deserialize, Serialize};
21 use std::sync::Arc;
22
23 #[derive(PartialEq, Debug, Serialize, Deserialize)]
24 enum Msg {
25 Ping,
26 Pong,
27 }
28
29 fn build_msg(to_node: NodeId, msg: Msg) -> TransportMsg {
30 TransportMsg::build(0, 0, RouteRule::ToNode(to_node), 0, 0, &bincode::serialize(&msg).unwrap())
31 }
32
33 #[async_std::test]
34 async fn simple_network() {
35 let vnet = Arc::new(VnetEarth::default());
36
37 let mut tran1 = VnetTransport::new(vnet.clone(), NodeAddr::empty(1));
38 let mut tran2 = VnetTransport::new(vnet.clone(), NodeAddr::empty(2));
39
40 let connector1 = tran1.connector();
41 for conn in connector1.create_pending_outgoing(NodeAddr::empty(2)) {
42 connector1.continue_pending_outgoing(conn);
43 }
44
45 match tran2.recv().await.unwrap() {
46 TransportEvent::IncomingRequest(node, conn, acceptor) => {
47 assert_eq!(node, 1);
48 assert_eq!(conn.direction(), ConnDirection::Incoming);
49 acceptor.accept();
50 }
51 _ => {
52 panic!("Need IncomingRequest")
53 }
54 }
55
56 let (tran2_sender, mut tran2_recv) = match tran2.recv().await.unwrap() {
57 TransportEvent::Incoming(sender, recv) => {
58 assert_eq!(sender.remote_node_id(), 1);
59 assert_eq!(sender.remote_addr(), NodeAddr::empty(1));
60 assert_eq!(sender.conn_id().direction(), ConnDirection::Incoming);
61 (sender, recv)
62 }
63 _ => {
64 panic!("Need incoming")
65 }
66 };
67
68 let (tran1_sender, mut tran1_recv) = match tran1.recv().await.unwrap() {
69 TransportEvent::Outgoing(sender, recv, ..) => {
70 assert_eq!(sender.remote_node_id(), 2);
71 assert_eq!(sender.remote_addr(), NodeAddr::empty(2));
72 (sender, recv)
73 }
74 _ => {
75 panic!("Need outgoing")
76 }
77 };
78
79 let received_event = tran2_recv.poll().await.unwrap();
80 assert_eq!(
81 received_event,
82 ConnectionEvent::Stats(ConnectionStats {
83 rtt_ms: 1,
84 sending_kbps: 0,
85 send_est_kbps: 100000,
86 loss_percent: 0,
87 over_use: false,
88 })
89 );
90
91 let received_event = tran1_recv.poll().await.unwrap();
92 assert_eq!(
93 received_event,
94 ConnectionEvent::Stats(ConnectionStats {
95 rtt_ms: 1,
96 sending_kbps: 0,
97 send_est_kbps: 100000,
98 loss_percent: 0,
99 over_use: false,
100 })
101 );
102
103 tran1_sender.send(build_msg(1, Msg::Ping));
104 let received_event = tran2_recv.poll().await.unwrap();
105 assert_eq!(received_event, ConnectionEvent::Msg(build_msg(1, Msg::Ping)));
106
107 tran2_sender.send(build_msg(1, Msg::Ping));
108 let received_event = tran1_recv.poll().await.unwrap();
109 assert_eq!(received_event, ConnectionEvent::Msg(build_msg(1, Msg::Ping)));
110
111 tran1_sender.close();
112 assert_eq!(tran1_recv.poll().await, Err(()));
113 assert_eq!(tran2_recv.poll().await, Err(()));
114 assert_eq!(vnet.connections.read().len(), 0);
115 }
116
117 #[async_std::test]
118 async fn simple_network_connect_addr_not_found() {
119 let vnet = Arc::new(VnetEarth::default());
120
121 let mut tran1 = VnetTransport::new(vnet.clone(), NodeAddr::empty(1));
122 let connector1 = tran1.connector();
123 for conn in connector1.create_pending_outgoing(NodeAddr::empty(2)) {
124 connector1.continue_pending_outgoing(conn);
125 }
126
127 match tran1.recv().await.unwrap() {
128 TransportEvent::OutgoingError { err, node_id, .. } => {
129 assert_eq!(err, OutgoingConnectionError::DestinationNotFound);
130 assert_eq!(node_id, 2);
131 }
132 _ => {
133 panic!("Need OutgoingError")
134 }
135 };
136 }
137}