use std::time::Duration;
use crate::LoadTestConfig;
pub fn small_deployment() -> LoadTestConfig {
LoadTestConfig {
num_nodes: 10,
num_connections_per_node: 5,
message_rate_per_second: 100,
test_duration: Duration::from_secs(60),
ramp_up_duration: Duration::from_secs(10),
}
}
pub fn medium_deployment() -> LoadTestConfig {
LoadTestConfig {
num_nodes: 100,
num_connections_per_node: 10,
message_rate_per_second: 1000,
test_duration: Duration::from_secs(300),
ramp_up_duration: Duration::from_secs(30),
}
}
pub fn large_deployment() -> LoadTestConfig {
LoadTestConfig {
num_nodes: 1000,
num_connections_per_node: 20,
message_rate_per_second: 10000,
test_duration: Duration::from_secs(600),
ramp_up_duration: Duration::from_secs(60),
}
}
pub struct ScenarioBuilder {
config: LoadTestConfig,
}
impl ScenarioBuilder {
pub fn new() -> Self {
Self {
config: small_deployment(),
}
}
pub fn with_nodes(mut self, num_nodes: usize) -> Self {
self.config.num_nodes = num_nodes;
self
}
pub fn with_connections_per_node(mut self, num_connections: usize) -> Self {
self.config.num_connections_per_node = num_connections;
self
}
pub fn with_message_rate(mut self, rate: usize) -> Self {
self.config.message_rate_per_second = rate;
self
}
pub fn with_duration(mut self, duration: Duration) -> Self {
self.config.test_duration = duration;
self
}
pub fn with_ramp_up(mut self, duration: Duration) -> Self {
self.config.ramp_up_duration = duration;
self
}
pub fn build(self) -> LoadTestConfig {
self.config
}
}
impl Default for ScenarioBuilder {
fn default() -> Self {
Self::new()
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_small_deployment_config() {
let config = small_deployment();
assert_eq!(config.num_nodes, 10);
assert_eq!(config.num_connections_per_node, 5);
assert_eq!(config.message_rate_per_second, 100);
assert!(config.validate().is_ok());
}
#[test]
fn test_medium_deployment_config() {
let config = medium_deployment();
assert_eq!(config.num_nodes, 100);
assert_eq!(config.num_connections_per_node, 10);
assert_eq!(config.message_rate_per_second, 1000);
assert!(config.validate().is_ok());
}
#[test]
fn test_large_deployment_config() {
let config = large_deployment();
assert_eq!(config.num_nodes, 1000);
assert_eq!(config.num_connections_per_node, 20);
assert_eq!(config.message_rate_per_second, 10000);
assert!(config.validate().is_ok());
}
#[test]
fn test_scenario_builder() {
let config = ScenarioBuilder::new()
.with_nodes(50)
.with_connections_per_node(8)
.with_message_rate(500)
.with_duration(Duration::from_secs(120))
.with_ramp_up(Duration::from_secs(20))
.build();
assert_eq!(config.num_nodes, 50);
assert_eq!(config.num_connections_per_node, 8);
assert_eq!(config.message_rate_per_second, 500);
assert_eq!(config.test_duration, Duration::from_secs(120));
assert_eq!(config.ramp_up_duration, Duration::from_secs(20));
assert!(config.validate().is_ok());
}
}