#[test]
fn test_imp_137a_dispatch_metrics_has_reset_method() {
use crate::gguf::DispatchMetrics;
use std::time::Duration;
let metrics = DispatchMetrics::new();
metrics.record_cpu_dispatch();
metrics.record_gpu_dispatch();
metrics.record_cpu_latency(Duration::from_micros(100));
metrics.reset();
assert_eq!(
metrics.cpu_dispatches(),
0,
"IMP-137a: CPU dispatches should be 0 after reset"
);
assert_eq!(
metrics.gpu_dispatches(),
0,
"IMP-137a: GPU dispatches should be 0 after reset"
);
}
#[test]
fn test_imp_137b_reset_clears_all_counters() {
use crate::gguf::DispatchMetrics;
use std::time::Duration;
let metrics = DispatchMetrics::new();
for _ in 0..10 {
metrics.record_cpu_dispatch();
metrics.record_cpu_latency(Duration::from_micros(100));
}
for _ in 0..5 {
metrics.record_gpu_dispatch();
metrics.record_gpu_latency(Duration::from_micros(500));
}
assert_eq!(
metrics.cpu_dispatches(),
10,
"IMP-137b: Pre-reset CPU count"
);
assert_eq!(metrics.gpu_dispatches(), 5, "IMP-137b: Pre-reset GPU count");
metrics.reset();
assert_eq!(
metrics.cpu_dispatches(),
0,
"IMP-137b: Post-reset CPU dispatches"
);
assert_eq!(
metrics.gpu_dispatches(),
0,
"IMP-137b: Post-reset GPU dispatches"
);
assert_eq!(
metrics.total_dispatches(),
0,
"IMP-137b: Post-reset total dispatches"
);
assert_eq!(
metrics.cpu_latency_count(),
0,
"IMP-137b: Post-reset CPU latency count"
);
assert_eq!(
metrics.gpu_latency_count(),
0,
"IMP-137b: Post-reset GPU latency count"
);
}
#[test]
fn test_imp_137c_reset_clears_latency_tracking() {
use crate::gguf::DispatchMetrics;
use std::time::Duration;
let metrics = DispatchMetrics::new();
metrics.record_cpu_latency(Duration::from_micros(100));
metrics.record_cpu_latency(Duration::from_micros(500));
metrics.record_cpu_latency(Duration::from_micros(1000));
assert!(
metrics.cpu_latency_mean_us() > 0.0,
"IMP-137c: Pre-reset mean should be > 0"
);
metrics.reset();
assert_eq!(
metrics.cpu_latency_mean_us(),
0.0,
"IMP-137c: Post-reset CPU mean"
);
assert_eq!(
metrics.cpu_latency_min_us(),
0,
"IMP-137c: Post-reset CPU min"
);
assert_eq!(
metrics.cpu_latency_max_us(),
0,
"IMP-137c: Post-reset CPU max"
);
assert_eq!(
metrics.cpu_latency_variance_us(),
0.0,
"IMP-137c: Post-reset CPU variance"
);
assert_eq!(
metrics.cpu_latency_stddev_us(),
0.0,
"IMP-137c: Post-reset CPU stddev"
);
}
#[test]
fn test_imp_137d_reset_clears_bucket_counts() {
use crate::gguf::DispatchMetrics;
use std::time::Duration;
let metrics = DispatchMetrics::new();
metrics.record_cpu_latency(Duration::from_micros(50)); metrics.record_cpu_latency(Duration::from_micros(200)); metrics.record_cpu_latency(Duration::from_micros(750)); metrics.record_cpu_latency(Duration::from_micros(2000)); metrics.record_cpu_latency(Duration::from_micros(10000));
let buckets_before = metrics.cpu_latency_buckets();
assert_eq!(
buckets_before.iter().sum::<usize>(),
5,
"IMP-137d: Pre-reset bucket total"
);
metrics.reset();
let buckets_after = metrics.cpu_latency_buckets();
assert_eq!(
buckets_after,
[0, 0, 0, 0, 0],
"IMP-137d: Post-reset buckets should all be 0"
);
}
#[test]
fn test_imp_138a_dispatch_reset_handler_exists() {
fn _assert_handler_exists<F, Fut>(f: F)
where
F: Fn(axum::extract::State<AppState>) -> Fut,
Fut: std::future::Future<Output = axum::response::Response>,
{
let _ = f;
}
_assert_handler_exists(dispatch_reset_handler);
}
#[tokio::test]
async fn test_imp_138b_reset_returns_success_response() {
use crate::gguf::DispatchMetrics;
use std::sync::Arc;
let metrics = Arc::new(DispatchMetrics::new());
metrics.record_cpu_dispatch();
metrics.record_gpu_dispatch();
let response = DispatchResetResponse {
success: true,
message: "Metrics reset successfully".to_string(),
};
let json = serde_json::to_string(&response).expect("IMP-138b: Should serialize");
assert!(
json.contains("\"success\":true"),
"IMP-138b: Should have success: true"
);
assert!(
json.contains("reset successfully"),
"IMP-138b: Should have success message"
);
}
#[tokio::test]
async fn test_imp_138c_reset_endpoint_clears_metrics() {
use crate::gguf::DispatchMetrics;
use std::sync::Arc;
use std::time::Duration;
let metrics = Arc::new(DispatchMetrics::new());
for _ in 0..10 {
metrics.record_cpu_dispatch();
metrics.record_cpu_latency(Duration::from_micros(100));
}
assert_eq!(metrics.cpu_dispatches(), 10, "IMP-138c: Pre-reset count");
metrics.reset();
assert_eq!(
metrics.cpu_dispatches(),
0,
"IMP-138c: Post-reset CPU dispatches"
);
assert_eq!(
metrics.gpu_dispatches(),
0,
"IMP-138c: Post-reset GPU dispatches"
);
assert_eq!(
metrics.cpu_latency_count(),
0,
"IMP-138c: Post-reset latency count"
);
}
#[test]
fn test_imp_138d_reset_response_deserialization() {
let json = r#"{"success":true,"message":"Metrics reset successfully"}"#;
let response: DispatchResetResponse =
serde_json::from_str(json).expect("IMP-138d: Should deserialize");
assert!(response.success, "IMP-138d: success should be true");
assert_eq!(
response.message, "Metrics reset successfully",
"IMP-138d: message should match"
);
}
#[test]
fn test_imp_139a_router_includes_reset_route() {
let state = AppState::with_cache(10);
let router = create_router(state);
let _ = router;
}
#[test]
fn test_imp_139b_reset_route_path() {
const EXPECTED_PATH: &str = "/metrics/dispatch/reset";
assert!(
EXPECTED_PATH.starts_with("/metrics/dispatch"),
"IMP-139b: Reset route should be under /metrics/dispatch"
);
assert!(
EXPECTED_PATH.ends_with("/reset"),
"IMP-139b: Reset route should end with /reset"
);
}
#[tokio::test]
async fn test_imp_139c_router_has_reset_handler() {
use axum::body::Body;
use hyper::Request;
use tower::ServiceExt;
let state = AppState::with_cache(10);
let router = create_router(state);
let req = Request::builder()
.method("POST")
.uri("/metrics/dispatch/reset")
.body(Body::empty())
.expect("IMP-139c: Should build request");
let response = router
.oneshot(req)
.await
.expect("IMP-139c: Should get response");
assert_ne!(
response.status().as_u16(),
404,
"IMP-139c: Reset route should exist (not 404)"
);
}
#[tokio::test]
async fn test_imp_139d_reset_route_rejects_get() {
use axum::body::Body;
use hyper::Request;
use tower::ServiceExt;
let state = AppState::with_cache(10);
let router = create_router(state);
let req = Request::builder()
.method("GET")
.uri("/metrics/dispatch/reset")
.body(Body::empty())
.expect("IMP-139d: Should build request");
let response = router
.oneshot(req)
.await
.expect("IMP-139d: Should get response");
assert_eq!(
response.status().as_u16(),
405,
"IMP-139d: GET on reset route should return 405"
);
}
#[test]
fn test_imp_140a_dispatch_metrics_tracks_start_time() {
use crate::gguf::DispatchMetrics;
let metrics = DispatchMetrics::new();
let start_time = metrics.start_time_ms();
assert!(start_time > 0, "IMP-140a: Start time should be > 0");
let now = std::time::SystemTime::now()
.duration_since(std::time::UNIX_EPOCH)
.expect("IMP-140a: Should get time")
.as_millis() as u64;
assert!(
now - start_time < 60_000,
"IMP-140a: Start time should be within last minute"
);
}
#[test]
fn test_imp_140b_elapsed_seconds() {
use crate::gguf::DispatchMetrics;
let metrics = DispatchMetrics::new();
let elapsed = metrics.elapsed_seconds();
assert!(elapsed >= 0.0, "IMP-140b: Elapsed should be >= 0");
assert!(elapsed < 10.0, "IMP-140b: Elapsed should be small (< 10s)");
}