use ibc_relayer_types::applications::transfer::amount::Amount;
use rand::Rng;
use std::net::{Ipv4Addr, SocketAddrV4, TcpListener};
pub fn random_u32() -> u32 {
let mut rng = rand::thread_rng();
rng.gen()
}
pub fn random_u64() -> u64 {
let mut rng = rand::thread_rng();
rng.gen()
}
pub fn random_u128() -> u128 {
let mut rng = rand::thread_rng();
rng.gen()
}
pub fn random_u64_range(min: u64, max: u64) -> u64 {
let mut rng = rand::thread_rng();
rng.gen_range(min..max)
}
pub fn random_u128_range(min: u128, max: u128) -> u128 {
let mut rng = rand::thread_rng();
rng.gen_range(min..max)
}
pub fn random_amount_range(min: u128, max: u128) -> Amount {
let mut rng = rand::thread_rng();
rng.gen_range(min..max).into()
}
pub fn random_string() -> String {
format!("{:x}", random_u64())
}
fn random_port() -> u16 {
let mut rng = rand::thread_rng();
rng.gen::<u16>()
.checked_add(1024)
.unwrap_or_else(random_port)
}
pub fn random_unused_tcp_port() -> u16 {
let port = random_port();
let loopback = Ipv4Addr::new(127, 0, 0, 1);
let address = SocketAddrV4::new(loopback, port);
match TcpListener::bind(address) {
Ok(_) => port,
Err(_) => random_unused_tcp_port(),
}
}