821537186e
- Reorganized import statements in adapter tests for better readability - Replaced or_insert_with(Vec::new) with or_default() in test closures - Updated Cargo.lock with new dependency versions and checksums - Added TLS features to tonic dependency configuration - Included sqlx, chrono, and uuid dependencies with specific features - Added jsonwebtoken and arc-swap as project dependencies - Reformatted assertion statements to comply with line length limits - Adjusted base64 import order in engine codec module - Updated protobuf include statement formatting
133 lines
3.7 KiB
Rust
133 lines
3.7 KiB
Rust
use imks::engine::session::{SessionState, SessionStore, TransportType, generate_sid};
|
|
|
|
#[test]
|
|
fn test_session_store_create_and_get() {
|
|
let store = SessionStore::new();
|
|
let sid = generate_sid();
|
|
|
|
let _rx = store.create(sid.clone(), TransportType::Polling);
|
|
|
|
assert!(store.exists(&sid));
|
|
assert!(store.get(&sid).is_some());
|
|
assert_eq!(store.len(), 1);
|
|
}
|
|
|
|
#[test]
|
|
fn test_session_store_remove() {
|
|
let store = SessionStore::new();
|
|
let sid = generate_sid();
|
|
|
|
let _rx = store.create(sid.clone(), TransportType::Polling);
|
|
assert!(store.exists(&sid));
|
|
|
|
store.remove(&sid);
|
|
assert!(!store.exists(&sid));
|
|
assert!(store.get(&sid).is_none());
|
|
}
|
|
|
|
#[test]
|
|
fn test_session_store_multiple_sessions() {
|
|
let store = SessionStore::new();
|
|
|
|
let sid1 = generate_sid();
|
|
let sid2 = generate_sid();
|
|
let sid3 = generate_sid();
|
|
|
|
let _rx1 = store.create(sid1.clone(), TransportType::Polling);
|
|
let _rx2 = store.create(sid2.clone(), TransportType::WebSocket);
|
|
let _rx3 = store.create(sid3.clone(), TransportType::WebTransport);
|
|
|
|
assert_eq!(store.len(), 3);
|
|
assert!(store.exists(&sid1));
|
|
assert!(store.exists(&sid2));
|
|
assert!(store.exists(&sid3));
|
|
}
|
|
|
|
#[test]
|
|
fn test_generate_sid_uniqueness() {
|
|
let sids: Vec<String> = (0..100).map(|_| generate_sid()).collect();
|
|
|
|
let unique_sids: std::collections::HashSet<String> = sids.into_iter().collect();
|
|
assert_eq!(unique_sids.len(), 100);
|
|
}
|
|
|
|
#[test]
|
|
fn test_generate_sid_format() {
|
|
let sid = generate_sid();
|
|
|
|
assert_eq!(sid.len(), 20);
|
|
assert!(
|
|
sid.chars()
|
|
.all(|c| c.is_ascii_alphanumeric() || c == '_' || c == '-')
|
|
);
|
|
}
|
|
|
|
#[tokio::test]
|
|
async fn test_session_state_transitions() {
|
|
let store = SessionStore::new();
|
|
let sid = generate_sid();
|
|
|
|
let _rx = store.create(sid.clone(), TransportType::Polling);
|
|
|
|
if let Some(session) = store.get(&sid) {
|
|
let mut session = session.write().await;
|
|
assert_eq!(session.state, SessionState::Connecting);
|
|
|
|
session.set_state(SessionState::Open);
|
|
assert_eq!(session.state, SessionState::Open);
|
|
|
|
session.set_state(SessionState::Upgrading);
|
|
assert_eq!(session.state, SessionState::Upgrading);
|
|
|
|
session.set_state(SessionState::Open);
|
|
assert_eq!(session.state, SessionState::Open);
|
|
|
|
session.set_state(SessionState::Closing);
|
|
assert_eq!(session.state, SessionState::Closing);
|
|
|
|
session.set_state(SessionState::Closed);
|
|
assert_eq!(session.state, SessionState::Closed);
|
|
}
|
|
}
|
|
|
|
#[tokio::test]
|
|
async fn test_session_transport_change() {
|
|
let store = SessionStore::new();
|
|
let sid = generate_sid();
|
|
|
|
let _rx = store.create(sid.clone(), TransportType::Polling);
|
|
|
|
if let Some(session) = store.get(&sid) {
|
|
let mut session = session.write().await;
|
|
assert_eq!(session.transport, TransportType::Polling);
|
|
|
|
session.set_transport(TransportType::WebSocket);
|
|
assert_eq!(session.transport, TransportType::WebSocket);
|
|
}
|
|
}
|
|
|
|
#[tokio::test]
|
|
async fn test_session_ping_update() {
|
|
let store = SessionStore::new();
|
|
let sid = generate_sid();
|
|
|
|
let _rx = store.create(sid.clone(), TransportType::Polling);
|
|
|
|
if let Some(session) = store.get(&sid) {
|
|
let mut session = session.write().await;
|
|
let initial_ping = session.last_ping;
|
|
|
|
std::thread::sleep(std::time::Duration::from_millis(10));
|
|
session.update_ping();
|
|
|
|
assert!(session.last_ping > initial_ping);
|
|
}
|
|
}
|
|
|
|
#[test]
|
|
fn test_transport_type_as_str() {
|
|
assert_eq!(TransportType::Polling.as_str(), "polling");
|
|
assert_eq!(TransportType::WebSocket.as_str(), "websocket");
|
|
assert_eq!(TransportType::WebTransport.as_str(), "webtransport");
|
|
}
|