use super::*;
#[tokio::test]
async fn test_request_forwarding_two_node() {
let edges = vec![(0, 1)];
let mut nodes = run_tree_test(2, &edges, false).await;
let node0_addr = *nodes[0].node.node_addr();
let target = *nodes[1].node.node_addr(); let root = make_node_addr(0);
let coords = TreeCoordinate::from_addrs(vec![node0_addr, root]).unwrap();
let request = LookupRequest::new(42, target, node0_addr, coords, 5, 0);
let payload = &request.encode()[1..];
nodes[0]
.node
.handle_lookup_request(&node0_addr, payload)
.await;
tokio::time::sleep(Duration::from_millis(50)).await;
let count = process_available_packets(&mut nodes).await;
assert!(
count > 0,
"Expected forwarded LookupRequest to arrive at node 1"
);
assert!(
nodes[1].node.recent_requests.contains_key(&42),
"Node 1 should have recorded the forwarded request"
);
cleanup_nodes(&mut nodes).await;
}
#[tokio::test]
async fn test_request_target_found_generates_response() {
let edges = vec![(0, 1)];
let mut nodes = run_tree_test(2, &edges, false).await;
let node1_addr = *nodes[1].node.node_addr();
nodes[0].node.initiate_lookup(&node1_addr, 5).await;
for _ in 0..4 {
tokio::time::sleep(Duration::from_millis(50)).await;
process_available_packets(&mut nodes).await;
}
let now_ms = std::time::SystemTime::now()
.duration_since(std::time::UNIX_EPOCH)
.map(|d| d.as_millis() as u64)
.unwrap_or(0);
assert!(
nodes[0].node.coord_cache().contains(&node1_addr, now_ms),
"Node 0 should have cached node 1's route from LookupResponse"
);
cleanup_nodes(&mut nodes).await;
}
#[tokio::test]
async fn test_request_three_node_chain() {
let edges = vec![(0, 1), (1, 2)];
let mut nodes = run_tree_test(3, &edges, false).await;
let node2_addr = *nodes[2].node.node_addr();
let node2_pubkey = nodes[2].node.identity().pubkey_full();
nodes[0].node.register_identity(node2_addr, node2_pubkey);
nodes[0].node.initiate_lookup(&node2_addr, 8).await;
for _ in 0..10 {
tokio::time::sleep(Duration::from_millis(100)).await;
process_available_packets(&mut nodes).await;
}
assert!(
!nodes[1].node.recent_requests.is_empty(),
"Node 1 should have recorded the forwarded request"
);
assert!(
!nodes[2].node.recent_requests.is_empty(),
"Node 2 should have received the request"
);
let now_ms = std::time::SystemTime::now()
.duration_since(std::time::UNIX_EPOCH)
.map(|d| d.as_millis() as u64)
.unwrap_or(0);
assert!(
nodes[0].node.coord_cache().contains(&node2_addr, now_ms),
"Node 0 should have cached node 2's route through 3-node chain"
);
cleanup_nodes(&mut nodes).await;
}