freenet_test_network/
peer.rs1use crate::{process::PeerProcess, remote::PeerLocation, Result};
2use std::net::UdpSocket;
3use std::path::{Path, PathBuf};
4
5pub struct TestPeer {
7 pub(crate) id: String,
8 pub(crate) is_gateway: bool,
9 pub(crate) ws_port: u16,
10 pub(crate) network_port: u16,
11 pub(crate) network_address: String,
12 pub(crate) data_dir: PathBuf,
13 pub(crate) process: Box<dyn PeerProcess + Send>,
14 pub(crate) public_key_path: Option<PathBuf>,
15 pub(crate) location: PeerLocation,
16}
17
18impl TestPeer {
19 pub fn ws_url(&self) -> String {
21 format!("ws://127.0.0.1:{}/v1/contract/command", self.ws_port)
22 }
23
24 pub fn id(&self) -> &str {
26 &self.id
27 }
28
29 pub fn is_gateway(&self) -> bool {
31 self.is_gateway
32 }
33
34 pub fn network_address(&self) -> &str {
36 &self.network_address
37 }
38
39 pub fn network_port(&self) -> u16 {
41 self.network_port
42 }
43
44 pub fn socket_address(&self) -> std::net::SocketAddr {
46 format!("{}:{}", self.network_address, self.network_port)
47 .parse()
48 .expect("valid socket address")
49 }
50
51 pub fn data_dir_path(&self) -> &Path {
53 &self.data_dir
54 }
55
56 pub fn log_path(&self) -> PathBuf {
58 self.process.log_path()
59 }
60
61 pub fn read_logs(&self) -> Result<Vec<crate::logs::LogEntry>> {
63 self.process.read_logs()
64 }
65
66 pub fn is_running(&self) -> bool {
68 self.process.is_running()
69 }
70
71 pub fn kill(&mut self) -> Result<()> {
73 self.process.kill()
74 }
75
76 pub fn location(&self) -> &PeerLocation {
78 &self.location
79 }
80}
81
82pub(crate) fn get_free_port() -> Result<u16> {
84 let socket = UdpSocket::bind("127.0.0.1:0")?;
86 Ok(socket.local_addr()?.port())
87}