zombienet_orchestrator/generators/
bootnode_addr.rs1use std::{fmt::Display, net::IpAddr};
2
3use super::errors::GeneratorError;
4
5pub fn generate<T: AsRef<str> + Display>(
6 peer_id: &str,
7 ip: &IpAddr,
8 port: u16,
9 args: &[T],
10 p2p_cert: &Option<String>,
11) -> Result<String, GeneratorError> {
12 let addr = if let Some(index) = args.iter().position(|arg| arg.as_ref().eq("--listen-addr")) {
13 let listen_value = args
14 .as_ref()
15 .get(index + 1)
16 .ok_or(GeneratorError::BootnodeAddrGeneration(
17 "can not generate bootnode address from args".into(),
18 ))?
19 .to_string();
20
21 let ip_str = ip.to_string();
22 let port_str = port.to_string();
23 let mut parts = listen_value.split('/').collect::<Vec<&str>>();
24 parts[2] = &ip_str;
25 parts[4] = port_str.as_str();
26 parts.join("/")
27 } else {
28 format!("/ip4/{ip}/tcp/{port}/ws")
29 };
30
31 let mut addr_with_peer = format!("{addr}/p2p/{peer_id}");
32 if let Some(p2p_cert) = p2p_cert {
33 addr_with_peer.push_str("/certhash/");
34 addr_with_peer.push_str(p2p_cert)
35 }
36 Ok(addr_with_peer)
37}
38
39#[cfg(test)]
40mod tests {
41
42 use provider::constants::LOCALHOST;
43
44 use super::*;
45 #[test]
46 fn generate_for_alice_without_args() {
47 let peer_id = "12D3KooWQCkBm1BYtkHpocxCwMgR8yjitEeHGx8spzcDLGt2gkBm"; let args: Vec<&str> = vec![];
49 let bootnode_addr = generate(peer_id, &LOCALHOST, 5678, &args, &None).unwrap();
50 assert_eq!(
51 &bootnode_addr,
52 "/ip4/127.0.0.1/tcp/5678/ws/p2p/12D3KooWQCkBm1BYtkHpocxCwMgR8yjitEeHGx8spzcDLGt2gkBm"
53 );
54 }
55
56 #[test]
57 fn generate_for_alice_with_listen_addr() {
58 let peer_id = "12D3KooWQCkBm1BYtkHpocxCwMgR8yjitEeHGx8spzcDLGt2gkBm"; let args: Vec<String> = [
61 "--some",
62 "other",
63 "--listen-addr",
64 "/ip4/192.168.100.1/tcp/30333/ws",
65 ]
66 .iter()
67 .map(|x| x.to_string())
68 .collect();
69 let bootnode_addr =
70 generate(peer_id, &LOCALHOST, 5678, args.iter().as_ref(), &None).unwrap();
71 assert_eq!(
72 &bootnode_addr,
73 "/ip4/127.0.0.1/tcp/5678/ws/p2p/12D3KooWQCkBm1BYtkHpocxCwMgR8yjitEeHGx8spzcDLGt2gkBm"
74 );
75 }
76
77 #[test]
78 fn generate_for_alice_with_listen_addr_without_value_must_fail() {
79 let peer_id = "12D3KooWQCkBm1BYtkHpocxCwMgR8yjitEeHGx8spzcDLGt2gkBm"; let args: Vec<String> = ["--some", "other", "--listen-addr"]
82 .iter()
83 .map(|x| x.to_string())
84 .collect();
85 let bootnode_addr = generate(peer_id, &LOCALHOST, 5678, args.iter().as_ref(), &None);
86
87 assert!(bootnode_addr.is_err());
88 assert!(matches!(
89 bootnode_addr,
90 Err(GeneratorError::BootnodeAddrGeneration(_))
91 ));
92 }
93
94 #[test]
95 fn generate_for_alice_withcert() {
96 let peer_id = "12D3KooWQCkBm1BYtkHpocxCwMgR8yjitEeHGx8spzcDLGt2gkBm"; let args: Vec<&str> = vec![];
98 let bootnode_addr = generate(
99 peer_id,
100 &LOCALHOST,
101 5678,
102 &args,
103 &Some(String::from("data")),
104 )
105 .unwrap();
106 assert_eq!(
107 &bootnode_addr,
108 "/ip4/127.0.0.1/tcp/5678/ws/p2p/12D3KooWQCkBm1BYtkHpocxCwMgR8yjitEeHGx8spzcDLGt2gkBm/certhash/data"
109 );
110 }
111}