use rustfs_audit::observability::*;
use std::time::Duration;
#[tokio::test]
async fn test_metrics_collection() {
let metrics = AuditMetrics::new();
let report = metrics.generate_report().await;
assert_eq!(report.total_events_processed, 0);
assert_eq!(report.total_events_failed, 0);
assert_eq!(report.events_per_second, 0.0);
metrics.record_event_success(Duration::from_millis(10));
metrics.record_event_success(Duration::from_millis(20));
metrics.record_event_failure(Duration::from_millis(30));
let report = metrics.generate_report().await;
assert_eq!(report.total_events_processed, 2);
assert_eq!(report.total_events_failed, 1);
assert_eq!(report.error_rate_percent, 33.33333333333333); assert_eq!(report.average_latency_ms, 20.0); }
#[tokio::test]
async fn test_target_metrics() {
let metrics = AuditMetrics::new();
metrics.record_target_success();
metrics.record_target_success();
metrics.record_target_failure();
let success_rate = metrics.get_target_success_rate();
assert_eq!(success_rate, 66.66666666666666); }
#[tokio::test]
async fn test_performance_validation_pass() {
let metrics = AuditMetrics::new();
for _ in 0..5000 {
metrics.record_event_success(Duration::from_millis(5));
}
tokio::time::sleep(Duration::from_millis(1)).await;
let validation = metrics.validate_performance_requirements().await;
assert!(validation.meets_latency_requirement, "Latency requirement should be met");
assert!(validation.current_latency_ms <= 30.0);
assert!(validation.meets_error_rate_requirement, "Error rate requirement should be met");
assert_eq!(validation.current_error_rate, 0.0);
}
#[tokio::test]
async fn test_performance_validation_fail() {
let metrics = AuditMetrics::new();
metrics.record_event_success(Duration::from_millis(50)); metrics.record_event_failure(Duration::from_millis(60));
let validation = metrics.validate_performance_requirements().await;
assert!(!validation.meets_latency_requirement, "Latency requirement should fail");
assert!(validation.current_latency_ms > 30.0);
assert!(!validation.meets_error_rate_requirement, "Error rate requirement should fail");
assert!(validation.current_error_rate > 1.0);
assert!(!validation.recommendations.is_empty());
}
#[tokio::test]
async fn test_global_metrics() {
record_audit_success(Duration::from_millis(10));
record_audit_failure(Duration::from_millis(20));
record_target_success();
record_target_failure();
record_config_reload();
record_system_start();
let report = get_metrics_report().await;
assert!(report.total_events_processed > 0);
assert!(report.total_events_failed > 0);
assert!(report.config_reload_count > 0);
assert!(report.system_start_count > 0);
reset_metrics().await;
let report_after_reset = get_metrics_report().await;
assert_eq!(report_after_reset.total_events_processed, 0);
assert_eq!(report_after_reset.total_events_failed, 0);
}
#[test]
fn test_metrics_report_formatting() {
let report = AuditMetricsReport {
events_per_second: 1500.5,
average_latency_ms: 25.75,
error_rate_percent: 0.5,
target_success_rate_percent: 99.5,
total_events_processed: 10000,
total_events_failed: 50,
config_reload_count: 3,
system_start_count: 1,
};
let formatted = report.format();
assert!(formatted.contains("1500.50")); assert!(formatted.contains("25.75")); assert!(formatted.contains("0.50")); assert!(formatted.contains("99.50")); assert!(formatted.contains("10000")); assert!(formatted.contains("50")); }
#[test]
fn test_performance_validation_formatting() {
let validation = PerformanceValidation {
meets_eps_requirement: false,
meets_latency_requirement: true,
meets_error_rate_requirement: true,
current_eps: 2500.0,
current_latency_ms: 15.0,
current_error_rate: 0.1,
recommendations: vec![
"EPS too low, consider optimization".to_string(),
"Latency is good".to_string(),
],
};
let formatted = validation.format();
assert!(formatted.contains("❌ FAIL")); assert!(formatted.contains("2500.00")); assert!(formatted.contains("15.00")); assert!(formatted.contains("0.10")); assert!(formatted.contains("EPS too low")); assert!(formatted.contains("Latency is good")); }
#[test]
fn test_performance_validation_all_pass() {
let validation = PerformanceValidation {
meets_eps_requirement: true,
meets_latency_requirement: true,
meets_error_rate_requirement: true,
current_eps: 5000.0,
current_latency_ms: 10.0,
current_error_rate: 0.01,
recommendations: vec!["All requirements met".to_string()],
};
assert!(validation.all_requirements_met());
let formatted = validation.format();
assert!(formatted.contains("✅ PASS")); assert!(formatted.contains("All requirements met"));
}
#[tokio::test]
async fn test_eps_calculation() {
let metrics = AuditMetrics::new();
for _ in 0..100 {
metrics.record_event_success(Duration::from_millis(1));
}
tokio::time::sleep(Duration::from_millis(10)).await;
let eps = metrics.get_events_per_second().await;
assert!(eps > 0.0, "EPS should be greater than 0");
assert!(eps > 1000.0, "EPS should be high for short time period");
}
#[test]
fn test_error_rate_calculation() {
let metrics = AuditMetrics::new();
assert_eq!(metrics.get_error_rate(), 0.0);
for _ in 0..7 {
metrics.record_event_success(Duration::from_millis(1));
}
for _ in 0..3 {
metrics.record_event_failure(Duration::from_millis(1));
}
let error_rate = metrics.get_error_rate();
assert_eq!(error_rate, 30.0);
}
#[test]
fn test_target_success_rate_calculation() {
let metrics = AuditMetrics::new();
assert_eq!(metrics.get_target_success_rate(), 100.0);
for _ in 0..8 {
metrics.record_target_success();
}
for _ in 0..2 {
metrics.record_target_failure();
}
let success_rate = metrics.get_target_success_rate();
assert_eq!(success_rate, 80.0);
}
#[tokio::test]
async fn test_metrics_reset() {
let metrics = AuditMetrics::new();
metrics.record_event_success(Duration::from_millis(10));
metrics.record_target_success();
metrics.record_config_reload();
metrics.record_system_start();
let report_before = metrics.generate_report().await;
assert!(report_before.total_events_processed > 0);
assert!(report_before.config_reload_count > 0);
assert!(report_before.system_start_count > 0);
metrics.reset().await;
let report_after = metrics.generate_report().await;
assert_eq!(report_after.total_events_processed, 0);
assert_eq!(report_after.total_events_failed, 0);
assert_eq!(report_after.config_reload_count, 0);
assert_eq!(report_after.system_start_count, 0);
}