mobius 0.9.10

A small, modular Rust framework for building coding agents
Documentation
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())
        );
    }
}