use serde::{Deserialize, Serialize};
use std::time::Duration;
pub const DEFAULT_SOCKET_READ_TIMEOUT_MS: u64 = 50;
pub const DEFAULT_UDP_RETRY_DELAY_MS: u64 = 5;
pub const DEFAULT_RECEIVER_POLL_INTERVAL_MS: u64 = 1;
pub const DEFAULT_MAIN_LOOP_POLL_INTERVAL_MS: u64 = 5;
pub const DEFAULT_ENRICHMENT_WAIT_TIME_MS: u64 = 200;
pub const WINDOWS_MIN_SOCKET_READ_TIMEOUT_MS: u32 = 100;
pub const WINDOWS_ICMP_MIN_TIMEOUT_MS: u32 = 100;
pub const WINDOWS_ICMP_MIN_TOTAL_TIMEOUT_MS: u32 = 100;
pub const WINDOWS_ICMP_TIMEOUT_BUFFER_MS: u32 = 50;
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct TimingConfig {
pub socket_read_timeout: Duration,
pub udp_retry_delay: Duration,
pub receiver_poll_interval: Duration,
pub main_loop_poll_interval: Duration,
pub enrichment_wait_time: Duration,
}
impl Default for TimingConfig {
fn default() -> Self {
Self {
socket_read_timeout: Duration::from_millis(DEFAULT_SOCKET_READ_TIMEOUT_MS),
udp_retry_delay: Duration::from_millis(DEFAULT_UDP_RETRY_DELAY_MS),
receiver_poll_interval: Duration::from_millis(DEFAULT_RECEIVER_POLL_INTERVAL_MS),
main_loop_poll_interval: Duration::from_millis(DEFAULT_MAIN_LOOP_POLL_INTERVAL_MS),
enrichment_wait_time: Duration::from_millis(DEFAULT_ENRICHMENT_WAIT_TIME_MS),
}
}
}
impl TimingConfig {
pub fn uniform(duration: Duration) -> Self {
Self {
socket_read_timeout: duration,
udp_retry_delay: duration,
receiver_poll_interval: duration,
main_loop_poll_interval: duration,
enrichment_wait_time: duration,
}
}
pub fn fast() -> Self {
Self {
socket_read_timeout: Duration::from_millis(10),
udp_retry_delay: Duration::from_millis(1),
receiver_poll_interval: Duration::from_millis(1),
main_loop_poll_interval: Duration::from_millis(1),
enrichment_wait_time: Duration::from_millis(50),
}
}
pub fn slow() -> Self {
Self {
socket_read_timeout: Duration::from_millis(200),
udp_retry_delay: Duration::from_millis(20),
receiver_poll_interval: Duration::from_millis(5),
main_loop_poll_interval: Duration::from_millis(10),
enrichment_wait_time: Duration::from_millis(500),
}
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_default_values() {
let config = TimingConfig::default();
assert_eq!(
config.socket_read_timeout,
Duration::from_millis(DEFAULT_SOCKET_READ_TIMEOUT_MS)
);
assert_eq!(
config.udp_retry_delay,
Duration::from_millis(DEFAULT_UDP_RETRY_DELAY_MS)
);
assert_eq!(
config.receiver_poll_interval,
Duration::from_millis(DEFAULT_RECEIVER_POLL_INTERVAL_MS)
);
assert_eq!(
config.main_loop_poll_interval,
Duration::from_millis(DEFAULT_MAIN_LOOP_POLL_INTERVAL_MS)
);
assert_eq!(
config.enrichment_wait_time,
Duration::from_millis(DEFAULT_ENRICHMENT_WAIT_TIME_MS)
);
}
#[test]
fn test_uniform_config() {
let duration = Duration::from_millis(42);
let config = TimingConfig::uniform(duration);
assert_eq!(config.socket_read_timeout, duration);
assert_eq!(config.udp_retry_delay, duration);
assert_eq!(config.receiver_poll_interval, duration);
assert_eq!(config.main_loop_poll_interval, duration);
assert_eq!(config.enrichment_wait_time, duration);
}
#[test]
fn test_fast_config() {
let config = TimingConfig::fast();
assert!(config.socket_read_timeout < Duration::from_millis(50));
assert!(config.udp_retry_delay < Duration::from_millis(5));
assert!(config.receiver_poll_interval < Duration::from_millis(5));
assert!(config.main_loop_poll_interval < Duration::from_millis(5));
assert!(config.enrichment_wait_time < Duration::from_millis(100));
}
#[test]
fn test_slow_config() {
let config = TimingConfig::slow();
assert!(config.socket_read_timeout > Duration::from_millis(100));
assert!(config.udp_retry_delay > Duration::from_millis(10));
assert!(config.receiver_poll_interval > Duration::from_millis(2));
assert!(config.main_loop_poll_interval > Duration::from_millis(5));
assert!(config.enrichment_wait_time > Duration::from_millis(300));
}
}