mina_node_testing/scenarios/p2p/
basic_incoming_connections.rs

1use std::{collections::BTreeSet, time::Duration};
2
3use crate::{
4    node::RustNodeTestingConfig,
5    scenarios::{
6        add_rust_nodes, peer_is_ready, wait_for_connection_established,
7        wait_for_nodes_listening_on_localhost, ClusterRunner, Driver,
8    },
9};
10
11/// Node should accept incoming connections.
12#[derive(documented::Documented, Default, Clone, Copy)]
13pub struct AcceptIncomingConnection;
14
15impl AcceptIncomingConnection {
16    pub async fn run(self, runner: ClusterRunner<'_>) {
17        let mut driver = Driver::new(runner);
18
19        let (node_ut, _) = driver.add_rust_node(RustNodeTestingConfig::devnet_default());
20        let (node2, peer_id2) = driver.add_rust_node(RustNodeTestingConfig::devnet_default());
21        assert!(
22            wait_for_nodes_listening_on_localhost(
23                &mut driver,
24                Duration::from_secs(30),
25                [node_ut, node2]
26            )
27            .await
28            .unwrap(),
29            "node should be listening"
30        );
31
32        driver
33            .exec_step(crate::scenario::ScenarioStep::ConnectNodes {
34                dialer: node2,
35                listener: crate::scenario::ListenerNode::Rust(node_ut),
36            })
37            .await
38            .expect("node should be connected");
39
40        // wait for node under test receives connection event
41        let connected = wait_for_connection_established(
42            &mut driver,
43            Duration::from_secs(30),
44            (node_ut, &peer_id2),
45        )
46        .await
47        .unwrap();
48        assert!(connected, "peer should be connected");
49
50        assert!(
51            peer_is_ready(driver.inner(), node_ut, &peer_id2),
52            "peer should be ready, but it is \n{:#?}",
53            driver
54                .inner()
55                .node(node_ut)
56                .unwrap()
57                .state()
58                .p2p
59                .get_peer(&peer_id2)
60        );
61    }
62}
63
64/// Node should accept multiple incoming connections.
65#[derive(documented::Documented, Default, Clone, Copy)]
66pub struct AcceptMultipleIncomingConnections;
67
68impl AcceptMultipleIncomingConnections {
69    pub async fn run(self, runner: ClusterRunner<'_>) {
70        const MAX: u8 = 16;
71
72        let mut driver = Driver::new(runner);
73
74        let (node_ut, _) = driver.add_rust_node(RustNodeTestingConfig::devnet_default());
75
76        let (peers, mut peer_ids): (Vec<_>, BTreeSet<_>) =
77            add_rust_nodes(&mut driver, MAX, RustNodeTestingConfig::devnet_default());
78
79        assert!(
80            wait_for_nodes_listening_on_localhost(
81                &mut driver,
82                Duration::from_secs(30),
83                peers.clone().into_iter().chain(std::iter::once(node_ut))
84            )
85            .await
86            .unwrap(),
87            "node should be listening"
88        );
89
90        // connect peers to the node under test
91        for peer in peers {
92            driver
93                .exec_step(crate::scenario::ScenarioStep::ConnectNodes {
94                    dialer: peer,
95                    listener: crate::scenario::ListenerNode::Rust(node_ut),
96                })
97                .await
98                .expect("connect event should be dispatched");
99        }
100
101        // wait for node under test receives connection event
102        let all_connected = wait_for_connection_established(
103            &mut driver,
104            Duration::from_secs(2 * 60),
105            (node_ut, &mut peer_ids),
106        )
107        .await
108        .unwrap();
109        assert!(
110            all_connected,
111            "did not accept connection from peers: {:?}",
112            peer_ids
113        );
114    }
115}