zombienet_orchestrator/generators/
port.rs

1use std::net::TcpListener;
2
3use configuration::shared::types::Port;
4use support::constants::THIS_IS_A_BUG;
5
6use super::errors::GeneratorError;
7use crate::shared::types::ParkedPort;
8
9// TODO: (team), we want to continue support ws_port? No
10enum PortTypes {
11    Rpc,
12    P2P,
13    Prometheus,
14}
15
16pub fn generate(port: Option<Port>) -> Result<ParkedPort, GeneratorError> {
17    let port = port.unwrap_or(0);
18    let listener = TcpListener::bind(format!("0.0.0.0:{port}"))
19        .map_err(|_e| GeneratorError::PortGeneration(port, "Can't bind".into()))?;
20    let port = listener
21        .local_addr()
22        .expect(&format!(
23            "We should always get the local_addr from the listener {THIS_IS_A_BUG}"
24        ))
25        .port();
26    Ok(ParkedPort::new(port, listener))
27}
28
29#[cfg(test)]
30mod tests {
31    use super::*;
32    #[test]
33    fn generate_random() {
34        let port = generate(None).unwrap();
35        let listener = port.1.write().unwrap();
36
37        assert!(listener.is_some());
38    }
39
40    #[test]
41    fn generate_fixed_port() {
42        let port = generate(Some(33056)).unwrap();
43        let listener = port.1.write().unwrap();
44
45        assert!(listener.is_some());
46        assert_eq!(port.0, 33056);
47    }
48}