use super::match_metrics::*;
use std::sync::atomic::Ordering;
use std::time::Duration;
#[test]
fn test_metrics_record_success() {
let metrics = MatchMetrics::new();
metrics.record_success(Duration::from_millis(10), 5, 3);
assert_eq!(metrics.total_queries.load(Ordering::Relaxed), 1);
assert_eq!(metrics.successful_queries.load(Ordering::Relaxed), 1);
assert_eq!(metrics.total_results.load(Ordering::Relaxed), 5);
}
#[test]
fn test_metrics_record_failure() {
let metrics = MatchMetrics::new();
metrics.record_failure(Duration::from_millis(100));
assert_eq!(metrics.total_queries.load(Ordering::Relaxed), 1);
assert_eq!(metrics.failed_queries.load(Ordering::Relaxed), 1);
}
#[test]
fn test_metrics_success_rate() {
let metrics = MatchMetrics::new();
metrics.record_success(Duration::from_millis(10), 5, 3);
metrics.record_success(Duration::from_millis(10), 5, 3);
metrics.record_failure(Duration::from_millis(10));
let rate = metrics.success_rate();
assert!((rate - 0.6666).abs() < 0.01);
}
#[test]
fn test_metrics_latency_buckets() {
let metrics = MatchMetrics::new();
metrics.record_success(Duration::from_micros(500), 1, 1);
metrics.record_success(Duration::from_millis(3), 1, 1);
metrics.record_success(Duration::from_millis(50), 1, 1);
assert_eq!(
metrics.latency_buckets[0].load(Ordering::Relaxed),
1,
"500us -> bucket 0 (<1ms)"
);
assert_eq!(
metrics.latency_buckets[1].load(Ordering::Relaxed),
1,
"3ms -> bucket 1 (<5ms)"
);
assert_eq!(
metrics.latency_buckets[5].load(Ordering::Relaxed),
1,
"50ms -> bucket 5 (<100ms; strict < skips the le=50 bound at idx 4)"
);
for (i, b) in metrics.latency_buckets.iter().enumerate() {
if i != 0 && i != 1 && i != 5 {
assert_eq!(b.load(Ordering::Relaxed), 0, "bucket {i} should be empty");
}
}
}
#[test]
fn test_prometheus_output() {
let metrics = MatchMetrics::new();
metrics.record_success(Duration::from_millis(10), 5, 3);
let output = metrics.to_prometheus();
assert!(output.contains("velesdb_match_queries_total 1"));
assert!(output.contains("velesdb_match_queries_success_total 1"));
assert!(output.contains("velesdb_match_results_total 5"));
}
#[test]
fn test_query_timer_success() {
let metrics = MatchMetrics::new();
{
let timer = QueryTimer::new(&metrics);
std::thread::sleep(Duration::from_millis(1));
timer.success(10, 2);
}
assert_eq!(metrics.successful_queries.load(Ordering::Relaxed), 1);
}
#[test]
fn test_query_timer_drop_counts_as_failure() {
let metrics = MatchMetrics::new();
{
let _timer = QueryTimer::new(&metrics);
}
assert_eq!(metrics.failed_queries.load(Ordering::Relaxed), 1);
}