use super::super::*;
#[tokio::test]
async fn active_socket_sessions_are_never_evicted() {
let provider = OpenAiSocket::new("test-key", "test-model").expect("provider");
let mut active = Vec::new();
for index in 0..MAX_SOCKET_SESSIONS {
active.push(
provider
.session(&format!("session-{index:03}"))
.await
.expect("session"),
);
}
assert!(provider.session("overflow").await.is_err());
drop(active.remove(0));
provider
.session("overflow")
.await
.expect("idle session can be evicted");
let sessions = provider.sessions.lock().await;
assert_eq!(sessions.len(), MAX_SOCKET_SESSIONS);
assert!(sessions.contains_key("overflow"));
assert!(
active
.iter()
.all(|session| sessions.values().any(|cached| Arc::ptr_eq(cached, session)))
);
}
#[tokio::test]
async fn idle_socket_sessions_remain_cached_below_capacity() {
let provider = OpenAiSocket::new("test-key", "test-model").expect("provider");
let stale = provider.session("stale").await.expect("stale session");
stale.lock().await.last_used_at = Instant::now() - Duration::from_secs(60 * 60);
drop(stale);
provider.session("fresh").await.expect("fresh session");
let sessions = provider.sessions.lock().await;
assert!(sessions.contains_key("stale"));
assert!(sessions.contains_key("fresh"));
}
#[tokio::test]
async fn sticky_http_sessions_do_not_consume_websocket_capacity() {
let provider = OpenAiSocket::new("test-key", "test-model").expect("provider");
for index in 0..MAX_SOCKET_SESSIONS {
let session = provider
.session(&format!("fallback-{index:03}"))
.await
.expect("fallback session");
session.lock().await.use_http = true;
}
let overflow = provider
.session("overflow")
.await
.expect("HTTP-only sessions do not hold provider connections");
assert!(!overflow.lock().await.use_http);
drop(overflow);
let sessions = provider.sessions.lock().await;
assert_eq!(sessions.len(), MAX_SOCKET_SESSIONS + 1);
for index in 0..MAX_SOCKET_SESSIONS {
let session = sessions
.get(&format!("fallback-{index:03}"))
.expect("sticky HTTP session retained");
assert!(
session
.try_lock()
.is_ok_and(|state| state.use_http && state.connection.is_none())
);
}
}