use std::net::SocketAddr;
use std::time::Duration;
use serde_derive::Deserialize;
#[derive(Debug, Clone, Deserialize)]
pub struct Config {
pub target: SocketAddr,
pub connections: u32,
pub rate: Option<u32>,
pub duration: Option<Duration>,
pub threads: Option<u32>,
pub connect_timeout: Option<u32>,
pub read_timeout: Option<u32>,
pub limit: Option<u32>,
pub repeat: u32,
pub fuzz_path: Option<String>,
}
impl Config {
pub fn new(target: SocketAddr) -> Config {
let connections = 100; Config {
target,
connections,
rate: None,
limit: None,
repeat: 1,
duration: None,
threads: None,
read_timeout: None,
connect_timeout: None,
fuzz_path: None,
}
}
pub fn num_threads(&self) -> u32 {
match self.threads {
None => num_cpus::get() as u32,
Some(n) => n,
}
}
pub fn connections_per_thread(&self) -> u32 {
match self.connections / self.num_threads() as u32 {
0 => 1,
n => n,
}
}
pub fn connection_delay(&self) -> Duration {
match self.rate {
Some(rate) => {
Duration::from_secs(1) / rate * self.connections_per_thread() * self.num_threads()
}
None => Duration::default(),
}
}
pub fn limit_per_connection(&self) -> Option<u32> {
match self.limit {
None => None,
Some(n) => Some(n / self.connections),
}
}
}
pub struct ConfigBuilder {
config: Config,
}
impl ConfigBuilder {
pub fn new(target: SocketAddr) -> ConfigBuilder {
ConfigBuilder {
config: Config::new(target),
}
}
pub fn build(self) -> Config {
self.config
}
pub fn connections(mut self, connections: u32) -> ConfigBuilder {
self.config.connections = connections;
self
}
pub fn rate(mut self, rate: Option<u32>) -> ConfigBuilder {
self.config.rate = rate;
self
}
pub fn duration(mut self, duration: Option<Duration>) -> ConfigBuilder {
self.config.duration = duration;
self
}
pub fn threads(mut self, threads: Option<u32>) -> ConfigBuilder {
self.config.threads = threads;
self
}
pub fn connect_timeout(mut self, connect_timeout: Option<u32>) -> ConfigBuilder {
self.config.connect_timeout = connect_timeout;
self
}
pub fn read_timeout(mut self, read_timeout: Option<u32>) -> ConfigBuilder {
self.config.read_timeout = read_timeout;
self
}
pub fn limit(mut self, limit: Option<u32>) -> ConfigBuilder {
self.config.limit = limit;
self
}
pub fn repeat(mut self, repeat: u32) -> ConfigBuilder {
self.config.repeat = repeat;
self
}
pub fn fuzz_path(mut self, path: Option<String>) -> ConfigBuilder {
self.config.fuzz_path = path;
self
}
}