Skip to main content

llm_optimizer_api_tests/
common.rs

1//! Common testing utilities and shared test infrastructure
2
3use std::time::Duration;
4use tokio::time::timeout;
5
6/// Default timeout for API requests in tests
7pub const DEFAULT_TIMEOUT: Duration = Duration::from_secs(30);
8
9/// Default timeout for load tests
10pub const LOAD_TEST_TIMEOUT: Duration = Duration::from_secs(300);
11
12/// Maximum concurrent connections for load tests
13pub const MAX_CONCURRENT_CONNECTIONS: usize = 1000;
14
15/// Target requests per second for performance benchmarks
16pub const TARGET_RPS: u32 = 10000;
17
18/// Run an async test with timeout
19pub async fn with_timeout<F, T>(duration: Duration, f: F) -> Result<T, tokio::time::error::Elapsed>
20where
21    F: std::future::Future<Output = T>,
22{
23    timeout(duration, f).await
24}
25
26/// Assert response time is within acceptable limits
27pub fn assert_latency_acceptable(duration: Duration, max_ms: u64) {
28    assert!(
29        duration.as_millis() <= max_ms as u128,
30        "Latency {} ms exceeds maximum {} ms",
31        duration.as_millis(),
32        max_ms
33    );
34}
35
36/// Calculate percentile from sorted durations
37pub fn calculate_percentile(durations: &mut [Duration], percentile: f64) -> Duration {
38    durations.sort();
39    let index = ((durations.len() as f64 * percentile) as usize).min(durations.len() - 1);
40    durations[index]
41}
42
43#[cfg(test)]
44mod tests {
45    use super::*;
46
47    #[tokio::test]
48    async fn test_with_timeout_success() {
49        let result = with_timeout(Duration::from_secs(1), async { 42 }).await;
50        assert_eq!(result.unwrap(), 42);
51    }
52
53    #[tokio::test]
54    async fn test_with_timeout_failure() {
55        let result = with_timeout(Duration::from_millis(10), async {
56            tokio::time::sleep(Duration::from_secs(1)).await;
57            42
58        })
59        .await;
60        assert!(result.is_err());
61    }
62
63    #[test]
64    fn test_calculate_percentile() {
65        let mut durations = vec![
66            Duration::from_millis(10),
67            Duration::from_millis(20),
68            Duration::from_millis(30),
69            Duration::from_millis(40),
70            Duration::from_millis(50),
71        ];
72        let p50 = calculate_percentile(&mut durations, 0.5);
73        assert_eq!(p50, Duration::from_millis(30));
74    }
75}