use crate::{process::PeerProcess, remote::PeerLocation, Result};
use std::net::UdpSocket;
use std::path::{Path, PathBuf};
pub struct TestPeer {
pub(crate) id: String,
pub(crate) is_gateway: bool,
pub(crate) ws_port: u16,
pub(crate) network_port: u16,
pub(crate) network_address: String,
pub(crate) data_dir: PathBuf,
pub(crate) process: Box<dyn PeerProcess + Send>,
pub(crate) public_key_path: Option<PathBuf>,
pub(crate) location: PeerLocation,
}
impl TestPeer {
pub fn ws_url(&self) -> String {
format!("ws://127.0.0.1:{}/v1/contract/command", self.ws_port)
}
pub fn id(&self) -> &str {
&self.id
}
pub fn is_gateway(&self) -> bool {
self.is_gateway
}
pub fn network_address(&self) -> &str {
&self.network_address
}
pub fn network_port(&self) -> u16 {
self.network_port
}
pub fn socket_address(&self) -> std::net::SocketAddr {
format!("{}:{}", self.network_address, self.network_port)
.parse()
.expect("valid socket address")
}
pub fn data_dir_path(&self) -> &Path {
&self.data_dir
}
pub fn log_path(&self) -> PathBuf {
self.process.log_path()
}
pub fn read_logs(&self) -> Result<Vec<crate::logs::LogEntry>> {
self.process.read_logs()
}
pub fn is_running(&self) -> bool {
self.process.is_running()
}
pub fn kill(&mut self) -> Result<()> {
self.process.kill()
}
pub fn location(&self) -> &PeerLocation {
&self.location
}
}
pub(crate) fn get_free_port() -> Result<u16> {
let socket = UdpSocket::bind("127.0.0.1:0")?;
Ok(socket.local_addr()?.port())
}