use std::collections::HashMap;
use std::time::Duration;
#[derive(Debug, Clone)]
pub struct IntegrationTestConfig {
pub execution_timeout: Duration,
pub max_concurrent_tests: usize,
pub storage_config: TestStorageConfig,
pub benchmark_config: BenchmarkConfig,
pub stress_config: StressTestConfig,
pub fault_injection_config: FaultInjectionConfig,
pub monitoring_config: MonitoringConfig,
pub environment_config: TestEnvironmentConfig,
}
impl Default for IntegrationTestConfig {
fn default() -> Self {
Self {
execution_timeout: Duration::from_secs(300),
max_concurrent_tests: 4,
storage_config: TestStorageConfig::default(),
benchmark_config: BenchmarkConfig::default(),
stress_config: StressTestConfig::default(),
fault_injection_config: FaultInjectionConfig::default(),
monitoring_config: MonitoringConfig::default(),
environment_config: TestEnvironmentConfig::default(),
}
}
}
#[derive(Debug, Clone)]
pub struct TestStorageConfig {
pub enable_persistent_storage: bool,
pub storage_format: StorageFormat,
pub retention_policy: RetentionPolicy,
pub compression: CompressionConfig,
}
impl Default for TestStorageConfig {
fn default() -> Self {
Self {
enable_persistent_storage: true,
storage_format: StorageFormat::JSON,
retention_policy: RetentionPolicy::KeepLast(1000),
compression: CompressionConfig::default(),
}
}
}
#[derive(Debug, Clone, PartialEq, Eq)]
pub enum StorageFormat {
JSON,
Binary,
Database,
CSV,
}
#[derive(Debug, Clone)]
pub enum RetentionPolicy {
KeepLast(usize),
KeepForDuration(Duration),
KeepAll,
Custom(String),
}
#[derive(Debug, Clone)]
pub struct CompressionConfig {
pub enable_compression: bool,
pub algorithm: CompressionAlgorithm,
pub level: u8,
}
impl Default for CompressionConfig {
fn default() -> Self {
Self {
enable_compression: true,
algorithm: CompressionAlgorithm::Gzip,
level: 6,
}
}
}
#[derive(Debug, Clone, PartialEq, Eq)]
pub enum CompressionAlgorithm {
Gzip,
Zstd,
Lz4,
None,
}
#[derive(Debug, Clone)]
pub struct BenchmarkConfig {
pub enable_benchmarking: bool,
pub benchmark_suites: Vec<BenchmarkSuite>,
pub baseline_config: BaselineConfig,
pub statistical_config: StatisticalConfig,
}
impl Default for BenchmarkConfig {
fn default() -> Self {
Self {
enable_benchmarking: true,
benchmark_suites: vec![
BenchmarkSuite::Performance,
BenchmarkSuite::Scalability,
BenchmarkSuite::Accuracy,
],
baseline_config: BaselineConfig::default(),
statistical_config: StatisticalConfig::default(),
}
}
}
#[derive(Debug, Clone, PartialEq, Eq)]
pub enum BenchmarkSuite {
Performance,
Scalability,
Accuracy,
ResourceUtilization,
IntegrationComplexity,
Custom(String),
}
#[derive(Debug, Clone)]
pub struct BaselineConfig {
pub use_historical: bool,
pub update_strategy: BaselineUpdateStrategy,
pub performance_thresholds: PerformanceThresholds,
}
impl Default for BaselineConfig {
fn default() -> Self {
Self {
use_historical: true,
update_strategy: BaselineUpdateStrategy::Automatic,
performance_thresholds: PerformanceThresholds::default(),
}
}
}
#[derive(Debug, Clone, PartialEq, Eq)]
pub enum BaselineUpdateStrategy {
Automatic,
Manual,
TimeBased(Duration),
Never,
}
#[derive(Debug, Clone)]
pub struct PerformanceThresholds {
pub max_execution_time: Duration,
pub min_solution_quality: f64,
pub max_resource_usage: f64,
pub max_error_rate: f64,
}
impl Default for PerformanceThresholds {
fn default() -> Self {
Self {
max_execution_time: Duration::from_secs(60),
min_solution_quality: 0.8,
max_resource_usage: 0.9,
max_error_rate: 0.05,
}
}
}
#[derive(Debug, Clone)]
pub struct StatisticalConfig {
pub confidence_level: f64,
pub num_runs: usize,
pub statistical_tests: Vec<StatisticalTest>,
pub outlier_detection: OutlierDetection,
}
impl Default for StatisticalConfig {
fn default() -> Self {
Self {
confidence_level: 0.95,
num_runs: 10,
statistical_tests: vec![
StatisticalTest::TTest,
StatisticalTest::KolmogorovSmirnov,
StatisticalTest::MannWhitney,
],
outlier_detection: OutlierDetection::IQR,
}
}
}
#[derive(Debug, Clone, PartialEq, Eq)]
pub enum StatisticalTest {
TTest,
KolmogorovSmirnov,
MannWhitney,
Wilcoxon,
ChiSquared,
}
#[derive(Debug, Clone, PartialEq, Eq)]
pub enum OutlierDetection {
IQR,
ZScore,
ModifiedZScore,
IsolationForest,
None,
}
#[derive(Debug, Clone)]
pub struct StressTestConfig {
pub enable_stress_testing: bool,
pub stress_scenarios: Vec<StressScenario>,
pub max_stress_level: f64,
pub ramp_up_strategy: RampUpStrategy,
pub failure_criteria: FailureCriteria,
}
impl Default for StressTestConfig {
fn default() -> Self {
Self {
enable_stress_testing: true,
stress_scenarios: vec![
StressScenario::HighLoad,
StressScenario::ResourceContention,
StressScenario::NetworkLatency,
],
max_stress_level: 0.95,
ramp_up_strategy: RampUpStrategy::Linear,
failure_criteria: FailureCriteria::default(),
}
}
}
#[derive(Debug, Clone, PartialEq, Eq)]
pub enum StressScenario {
HighLoad,
ResourceContention,
NetworkLatency,
MemoryPressure,
ConcurrentAccess,
Custom(String),
}
#[derive(Debug, Clone, PartialEq, Eq)]
pub enum RampUpStrategy {
Linear,
Exponential,
StepWise,
Random,
}
#[derive(Debug, Clone)]
pub struct FailureCriteria {
pub max_failures: usize,
pub failure_rate_threshold: f64,
pub response_time_threshold: Duration,
pub resource_exhaustion_threshold: f64,
}
impl Default for FailureCriteria {
fn default() -> Self {
Self {
max_failures: 5,
failure_rate_threshold: 0.1,
response_time_threshold: Duration::from_secs(10),
resource_exhaustion_threshold: 0.95,
}
}
}
#[derive(Debug, Clone)]
pub struct FaultInjectionConfig {
pub enable_fault_injection: bool,
pub fault_types: Vec<FaultType>,
pub timing_strategy: InjectionTiming,
pub test_recovery: bool,
pub chaos_config: ChaosConfig,
}
impl Default for FaultInjectionConfig {
fn default() -> Self {
Self {
enable_fault_injection: true,
fault_types: vec![
FaultType::NetworkFailure,
FaultType::ComponentFailure,
FaultType::ResourceExhaustion,
],
timing_strategy: InjectionTiming::Random,
test_recovery: true,
chaos_config: ChaosConfig::default(),
}
}
}
#[derive(Debug, Clone, PartialEq, Eq)]
pub enum FaultType {
NetworkFailure,
ComponentFailure,
ResourceExhaustion,
DataCorruption,
TimingIssues,
ConfigurationErrors,
Custom(String),
}
#[derive(Debug, Clone, PartialEq, Eq)]
pub enum InjectionTiming {
Random,
Scheduled(Vec<Duration>),
TriggerBased(Vec<String>),
Continuous,
}
#[derive(Debug, Clone)]
pub struct ChaosConfig {
pub enable_chaos: bool,
pub experiments: Vec<ChaosExperiment>,
pub blast_radius: BlastRadius,
pub safety_measures: SafetyMeasures,
}
impl Default for ChaosConfig {
fn default() -> Self {
Self {
enable_chaos: false, experiments: vec![],
blast_radius: BlastRadius::Limited,
safety_measures: SafetyMeasures::default(),
}
}
}
#[derive(Debug, Clone)]
pub struct ChaosExperiment {
pub name: String,
pub experiment_type: ChaosType,
pub targets: Vec<String>,
pub duration: Duration,
pub success_criteria: Vec<String>,
}
#[derive(Debug, Clone, PartialEq, Eq)]
pub enum ChaosType {
ServiceDegradation,
ResourceStarvation,
NetworkPartitioning,
DependencyFailure,
Custom(String),
}
#[derive(Debug, Clone, PartialEq, Eq)]
pub enum BlastRadius {
Limited,
Controlled,
SystemWide,
}
#[derive(Debug, Clone)]
pub struct SafetyMeasures {
pub auto_rollback_triggers: Vec<String>,
pub max_impact_duration: Duration,
pub emergency_stop: Vec<String>,
pub health_checks: Vec<String>,
}
impl Default for SafetyMeasures {
fn default() -> Self {
Self {
auto_rollback_triggers: vec![
"cpu_usage_critical".to_string(),
"memory_exhausted".to_string(),
],
max_impact_duration: Duration::from_secs(300),
emergency_stop: vec!["system_failure".to_string(), "data_corruption".to_string()],
health_checks: vec!["system_health".to_string(), "component_status".to_string()],
}
}
}
#[derive(Debug, Clone)]
pub struct MonitoringConfig {
pub enable_monitoring: bool,
pub monitoring_interval: Duration,
pub monitored_metrics: Vec<MonitoredMetric>,
pub alert_config: AlertConfig,
pub reporting_config: ReportingConfig,
}
impl Default for MonitoringConfig {
fn default() -> Self {
Self {
enable_monitoring: true,
monitoring_interval: Duration::from_secs(1),
monitored_metrics: vec![
MonitoredMetric::CpuUtilization,
MonitoredMetric::MemoryUsage,
MonitoredMetric::ErrorRate,
MonitoredMetric::ResponseTime,
],
alert_config: AlertConfig::default(),
reporting_config: ReportingConfig::default(),
}
}
}
#[derive(Debug, Clone, PartialEq, Eq, Hash)]
pub enum MonitoredMetric {
CpuUtilization,
MemoryUsage,
NetworkIO,
DiskIO,
ErrorRate,
ResponseTime,
Throughput,
ActiveConnections,
Custom(String),
}
#[derive(Debug, Clone)]
pub struct AlertConfig {
pub enable_alerts: bool,
pub thresholds: HashMap<MonitoredMetric, f64>,
pub channels: Vec<AlertChannel>,
pub frequency_limits: FrequencyLimits,
}
impl Default for AlertConfig {
fn default() -> Self {
let mut thresholds = HashMap::new();
thresholds.insert(MonitoredMetric::ErrorRate, 0.1);
thresholds.insert(MonitoredMetric::MemoryUsage, 0.9);
thresholds.insert(MonitoredMetric::CpuUtilization, 0.95);
Self {
enable_alerts: true,
thresholds,
channels: vec![AlertChannel::Console],
frequency_limits: FrequencyLimits::default(),
}
}
}
#[derive(Debug, Clone, PartialEq, Eq)]
pub enum AlertChannel {
Console,
Log,
Email(String),
Webhook(String),
Custom(String),
}
#[derive(Debug, Clone)]
pub struct FrequencyLimits {
pub max_per_minute: usize,
pub cooldown_period: Duration,
pub enable_aggregation: bool,
}
impl Default for FrequencyLimits {
fn default() -> Self {
Self {
max_per_minute: 10,
cooldown_period: Duration::from_secs(60),
enable_aggregation: true,
}
}
}
#[derive(Debug, Clone)]
pub struct ReportingConfig {
pub enable_automated_reporting: bool,
pub report_formats: Vec<ReportFormat>,
pub generation_frequency: ReportFrequency,
pub distribution: ReportDistribution,
}
impl Default for ReportingConfig {
fn default() -> Self {
Self {
enable_automated_reporting: true,
report_formats: vec![ReportFormat::HTML, ReportFormat::JSON],
generation_frequency: ReportFrequency::AfterTestSuite,
distribution: ReportDistribution::default(),
}
}
}
#[derive(Debug, Clone, PartialEq, Eq)]
pub enum ReportFormat {
HTML,
JSON,
PDF,
CSV,
XML,
}
#[derive(Debug, Clone, PartialEq, Eq)]
pub enum ReportFrequency {
AfterEachTest,
AfterTestSuite,
Scheduled(Duration),
Manual,
}
#[derive(Debug, Clone)]
pub struct ReportDistribution {
pub email_recipients: Vec<String>,
pub file_paths: Vec<String>,
pub http_endpoints: Vec<String>,
pub custom_targets: Vec<String>,
}
impl Default for ReportDistribution {
fn default() -> Self {
Self {
email_recipients: vec![],
file_paths: vec!["./test_reports/".to_string()],
http_endpoints: vec![],
custom_targets: vec![],
}
}
}
#[derive(Debug, Clone)]
pub struct TestEnvironmentConfig {
pub environment_name: String,
pub environment_variables: HashMap<String, String>,
pub resource_allocation: ResourceAllocationConfig,
pub cleanup_config: CleanupConfig,
}
impl Default for TestEnvironmentConfig {
fn default() -> Self {
Self {
environment_name: "default".to_string(),
environment_variables: HashMap::new(),
resource_allocation: ResourceAllocationConfig::default(),
cleanup_config: CleanupConfig::default(),
}
}
}
#[derive(Debug, Clone)]
pub struct ResourceAllocationConfig {
pub max_cpu_cores: usize,
pub max_memory: usize,
pub max_disk_space: usize,
pub network_bandwidth_limit: Option<usize>,
}
impl Default for ResourceAllocationConfig {
fn default() -> Self {
Self {
max_cpu_cores: num_cpus::get(),
max_memory: 8 * 1024 * 1024 * 1024, max_disk_space: 100 * 1024 * 1024 * 1024, network_bandwidth_limit: None,
}
}
}
#[derive(Debug, Clone)]
pub struct CleanupConfig {
pub auto_cleanup: bool,
pub cleanup_timeout: Duration,
pub preserve_on_failure: bool,
pub custom_scripts: Vec<String>,
}
impl Default for CleanupConfig {
fn default() -> Self {
Self {
auto_cleanup: true,
cleanup_timeout: Duration::from_secs(30),
preserve_on_failure: true,
custom_scripts: vec![],
}
}
}