use super::*;
#[test]
fn test_session_3node_forwarded_handshake() {
run_large_stack_async_test("fips-forwarded-handshake", || async {
session_3node_forwarded_handshake().await;
});
}
async fn session_3node_forwarded_handshake() {
let edges = vec![(0, 1), (1, 2)];
let mut nodes = run_tree_test(3, &edges, false).await;
verify_tree_convergence(&nodes);
populate_all_coord_caches(&mut nodes);
let node0_addr = *nodes[0].node.node_addr();
let node2_addr = *nodes[2].node.node_addr();
let node2_pubkey = nodes[2].node.identity().pubkey_full();
nodes[0]
.node
.initiate_session(node2_addr, node2_pubkey)
.await
.expect("initiate_session failed");
assert!(wait_process_packets_for_node(&mut nodes, 1).await > 0);
assert!(wait_process_packets_for_node(&mut nodes, 2).await > 0);
assert!(
nodes[2].node.get_session(&node0_addr).is_some(),
"Node 2 should have a session entry for Node 0"
);
assert!(
nodes[2]
.node
.get_session(&node0_addr)
.unwrap()
.is_awaiting_msg3()
);
assert!(wait_process_packets_for_node(&mut nodes, 1).await > 0);
assert!(wait_process_packets_for_node(&mut nodes, 0).await > 0);
assert!(
nodes[0]
.node
.get_session(&node2_addr)
.unwrap()
.is_established()
);
assert!(wait_process_packets_for_node(&mut nodes, 1).await > 0);
assert!(wait_process_packets_for_node(&mut nodes, 2).await > 0);
assert!(
nodes[2]
.node
.get_session(&node0_addr)
.unwrap()
.is_established()
);
assert_eq!(
nodes[1].node.session_count(),
0,
"Transit node should have no sessions"
);
cleanup_nodes(&mut nodes).await;
}
#[tokio::test]
async fn test_session_initiate_idempotent() {
let edges = vec![(0, 1)];
let mut nodes = run_tree_test(2, &edges, false).await;
verify_tree_convergence(&nodes);
populate_all_coord_caches(&mut nodes);
let node1_addr = *nodes[1].node.node_addr();
let node1_pubkey = nodes[1].node.identity().pubkey_full();
nodes[0]
.node
.initiate_session(node1_addr, node1_pubkey)
.await
.unwrap();
assert_eq!(nodes[0].node.session_count(), 1);
nodes[0]
.node
.initiate_session(node1_addr, node1_pubkey)
.await
.unwrap();
assert_eq!(nodes[0].node.session_count(), 1);
cleanup_nodes(&mut nodes).await;
}
#[tokio::test]
async fn test_session_ack_for_unknown_session() {
let edges = vec![(0, 1)];
let mut nodes = run_tree_test(2, &edges, false).await;
verify_tree_convergence(&nodes);
let node0_addr = *nodes[0].node.node_addr();
let node1_addr = *nodes[1].node.node_addr();
let src_coords = nodes[1].node.tree_state().my_coords().clone();
let dest_coords = nodes[0].node.tree_state().my_coords().clone();
let ack = SessionAck::new(src_coords, dest_coords).with_handshake(vec![0u8; 57]);
let datagram = SessionDatagram::new(node1_addr, node0_addr, ack.encode());
let encoded = datagram.encode();
nodes[1]
.node
.send_dataplane_fmp_link_plaintext(&node0_addr, &encoded, false)
.await
.unwrap();
tokio::time::sleep(Duration::from_millis(20)).await;
process_available_packets(&mut nodes).await;
assert_eq!(nodes[0].node.session_count(), 0);
cleanup_nodes(&mut nodes).await;
}