use mockforge_core::performance::PerformanceMetrics;
use std::time::Duration;
#[tokio::test]
async fn test_performance_metrics_new() {
let metrics = PerformanceMetrics::new();
let summary = metrics.get_summary().await;
assert_eq!(summary.total_requests, 0);
assert_eq!(summary.active_requests, 0);
assert_eq!(summary.cache_hits, 0);
assert_eq!(summary.cache_misses, 0);
assert_eq!(summary.memory_usage_bytes, 0);
assert_eq!(summary.error_count, 0);
}
#[tokio::test]
async fn test_performance_metrics_default() {
let metrics = PerformanceMetrics::default();
let summary = metrics.get_summary().await;
assert_eq!(summary.total_requests, 0);
}
#[tokio::test]
async fn test_performance_metrics_increment_active_requests() {
let metrics = PerformanceMetrics::new();
assert_eq!(metrics.increment_active_requests(), 0);
let summary = metrics.get_summary().await;
assert_eq!(summary.active_requests, 1);
assert_eq!(metrics.increment_active_requests(), 1);
let summary2 = metrics.get_summary().await;
assert_eq!(summary2.active_requests, 2);
}
#[tokio::test]
async fn test_performance_metrics_decrement_active_requests() {
let metrics = PerformanceMetrics::new();
metrics.increment_active_requests();
metrics.increment_active_requests();
assert_eq!(metrics.decrement_active_requests(), 2);
let summary = metrics.get_summary().await;
assert_eq!(summary.active_requests, 1);
assert_eq!(metrics.decrement_active_requests(), 1);
let summary2 = metrics.get_summary().await;
assert_eq!(summary2.active_requests, 0);
}
#[tokio::test]
async fn test_performance_metrics_record_cache_hit() {
let metrics = PerformanceMetrics::new();
metrics.record_cache_hit();
metrics.record_cache_hit();
let summary = metrics.get_summary().await;
assert_eq!(summary.cache_hits, 2);
}
#[tokio::test]
async fn test_performance_metrics_record_cache_miss() {
let metrics = PerformanceMetrics::new();
metrics.record_cache_miss();
metrics.record_cache_miss();
let summary = metrics.get_summary().await;
assert_eq!(summary.cache_misses, 2);
}
#[tokio::test]
async fn test_performance_metrics_record_error() {
let metrics = PerformanceMetrics::new();
metrics.record_error();
metrics.record_error();
let summary = metrics.get_summary().await;
assert_eq!(summary.error_count, 2);
}
#[tokio::test]
async fn test_performance_metrics_update_memory_usage() {
let metrics = PerformanceMetrics::new();
metrics.update_memory_usage(1024);
let summary = metrics.get_summary().await;
assert_eq!(summary.memory_usage_bytes, 1024);
metrics.update_memory_usage(2048);
let summary2 = metrics.get_summary().await;
assert_eq!(summary2.memory_usage_bytes, 2048);
}
#[tokio::test]
async fn test_performance_metrics_update_memory_usage_zero() {
let metrics = PerformanceMetrics::new();
metrics.update_memory_usage(0);
let summary = metrics.get_summary().await;
assert_eq!(summary.memory_usage_bytes, 0);
}
#[tokio::test]
async fn test_performance_metrics_update_memory_usage_large() {
let metrics = PerformanceMetrics::new();
metrics.update_memory_usage(u64::MAX);
let summary = metrics.get_summary().await;
assert_eq!(summary.memory_usage_bytes, u64::MAX);
}
#[tokio::test]
async fn test_performance_metrics_record_request_duration_empty() {
let metrics = PerformanceMetrics::new();
metrics.record_request_duration(Duration::from_millis(100)).await;
let summary = metrics.get_summary().await;
assert_eq!(summary.total_requests, 1);
}
#[tokio::test]
async fn test_performance_metrics_record_request_duration_multiple() {
let metrics = PerformanceMetrics::new();
for i in 0..10 {
metrics.record_request_duration(Duration::from_millis(i * 10)).await;
}
let summary = metrics.get_summary().await;
assert_eq!(summary.total_requests, 10);
}
#[tokio::test]
async fn test_performance_metrics_record_request_duration_zero() {
let metrics = PerformanceMetrics::new();
metrics.record_request_duration(Duration::from_secs(0)).await;
let summary = metrics.get_summary().await;
assert_eq!(summary.total_requests, 1);
}
#[tokio::test]
async fn test_performance_metrics_record_request_duration_long() {
let metrics = PerformanceMetrics::new();
metrics.record_request_duration(Duration::from_secs(3600)).await;
let summary = metrics.get_summary().await;
assert_eq!(summary.total_requests, 1);
}
#[tokio::test]
async fn test_performance_metrics_get_summary_empty() {
let metrics = PerformanceMetrics::new();
let summary = metrics.get_summary().await;
assert_eq!(summary.total_requests, 0);
assert_eq!(summary.active_requests, 0);
assert_eq!(summary.cache_hit_rate, 0.0);
assert_eq!(summary.error_rate, 0.0);
assert!(summary.p50_duration.is_none());
assert!(summary.p95_duration.is_none());
assert!(summary.p99_duration.is_none());
assert!(summary.avg_duration.is_none());
}
#[tokio::test]
async fn test_performance_metrics_get_summary_with_data() {
let metrics = PerformanceMetrics::new();
metrics.record_request_duration(Duration::from_millis(100)).await;
metrics.record_request_duration(Duration::from_millis(200)).await;
metrics.record_request_duration(Duration::from_millis(300)).await;
metrics.record_cache_hit();
metrics.record_cache_miss();
metrics.record_error();
let summary = metrics.get_summary().await;
assert_eq!(summary.total_requests, 3);
assert_eq!(summary.cache_hit_rate, 0.5);
assert!((summary.error_rate - 0.333).abs() < 0.01);
assert!(summary.p50_duration.is_some());
assert!(summary.p95_duration.is_some());
assert!(summary.p99_duration.is_some());
assert!(summary.avg_duration.is_some());
}
#[tokio::test]
async fn test_performance_metrics_get_summary_cache_hit_rate() {
let metrics = PerformanceMetrics::new();
metrics.record_cache_hit();
metrics.record_cache_hit();
metrics.record_cache_hit();
metrics.record_cache_miss();
let summary = metrics.get_summary().await;
assert!((summary.cache_hit_rate - 0.75).abs() < 0.01);
}
#[tokio::test]
async fn test_performance_metrics_get_summary_error_rate() {
let metrics = PerformanceMetrics::new();
for _ in 0..5 {
metrics.record_request_duration(Duration::from_millis(100)).await;
}
metrics.record_error();
metrics.record_error();
let summary = metrics.get_summary().await;
assert!((summary.error_rate - 0.4).abs() < 0.01);
}
#[tokio::test]
async fn test_performance_metrics_increment_custom_counter() {
let metrics = PerformanceMetrics::new();
metrics.increment_custom_counter("test_counter").await;
metrics.increment_custom_counter("test_counter").await;
metrics.increment_custom_counter("other_counter").await;
let summary = metrics.get_summary().await;
assert_eq!(summary.total_requests, 0); }
#[tokio::test]
async fn test_performance_metrics_increment_custom_counter_empty_name() {
let metrics = PerformanceMetrics::new();
metrics.increment_custom_counter("").await;
let summary = metrics.get_summary().await;
assert_eq!(summary.total_requests, 0);
}
#[tokio::test]
async fn test_performance_metrics_record_request_duration_limit() {
let metrics = PerformanceMetrics::new();
for i in 0..1500 {
metrics.record_request_duration(Duration::from_millis(i as u64)).await;
}
let summary = metrics.get_summary().await;
assert_eq!(summary.total_requests, 1500);
}
#[tokio::test]
async fn test_performance_metrics_active_requests_negative() {
let metrics = PerformanceMetrics::new();
metrics.decrement_active_requests();
let summary = metrics.get_summary().await;
let _ = summary.active_requests;
}
#[tokio::test]
async fn test_performance_metrics_percentiles_single() {
let metrics = PerformanceMetrics::new();
metrics.record_request_duration(Duration::from_millis(100)).await;
let summary = metrics.get_summary().await;
assert_eq!(summary.p50_duration, Some(Duration::from_millis(100)));
assert_eq!(summary.p95_duration, Some(Duration::from_millis(100)));
assert_eq!(summary.p99_duration, Some(Duration::from_millis(100)));
}
#[tokio::test]
async fn test_performance_metrics_percentiles_multiple() {
let metrics = PerformanceMetrics::new();
for i in 1..=100 {
metrics.record_request_duration(Duration::from_millis(i)).await;
}
let summary = metrics.get_summary().await;
assert!(summary.p50_duration.is_some());
assert!(summary.p95_duration.is_some());
assert!(summary.p99_duration.is_some());
if let Some(p50) = summary.p50_duration {
assert!(p50.as_millis() >= 45 && p50.as_millis() <= 55);
}
}
#[tokio::test]
async fn test_performance_metrics_average_duration() {
let metrics = PerformanceMetrics::new();
metrics.record_request_duration(Duration::from_millis(100)).await;
metrics.record_request_duration(Duration::from_millis(200)).await;
metrics.record_request_duration(Duration::from_millis(300)).await;
let summary = metrics.get_summary().await;
assert_eq!(summary.avg_duration, Some(Duration::from_millis(200)));
}