use std::collections::HashMap;
use std::sync::{Arc, Mutex as StdMutex};
use meerkat::session_runtime::admission::{
StagedAdmissionRestore, StagedCapacityAdmissions, discard_staged_capacity_admission,
has_staged_capacity_admission, take_staged_capacity_admission,
};
use meerkat_core::types::SessionId;
fn empty_ledger() -> StagedCapacityAdmissions {
Arc::new(StdMutex::new(HashMap::new()))
}
#[test]
fn empty_ledger_has_no_admissions() {
let ledger = empty_ledger();
let session = SessionId::new();
assert!(!has_staged_capacity_admission(&ledger, &session));
assert!(take_staged_capacity_admission(&ledger, &session).is_none());
discard_staged_capacity_admission(&ledger, &session);
assert!(!has_staged_capacity_admission(&ledger, &session));
}
#[test]
fn runtime_pre_admission_registration_calls_restore_on_drop_and_disarms() {
use std::sync::atomic::{AtomicUsize, Ordering};
use meerkat::session_runtime::admission::{
RuntimePreAdmissionRegistration, RuntimePreAdmissionRestore,
};
use meerkat_core::InputId;
struct CountingRestore {
calls: AtomicUsize,
}
impl RuntimePreAdmissionRestore for CountingRestore {
fn restore_or_release(&self, _session_id: &SessionId, _input_id: &InputId) {
self.calls.fetch_add(1, Ordering::SeqCst);
}
}
let restore = Arc::new(CountingRestore {
calls: AtomicUsize::new(0),
});
{
let _registration = RuntimePreAdmissionRegistration::new(
Arc::clone(&restore) as Arc<dyn RuntimePreAdmissionRestore>,
SessionId::new(),
InputId::new(),
);
}
assert_eq!(restore.calls.load(Ordering::SeqCst), 1);
let registration = RuntimePreAdmissionRegistration::new(
Arc::clone(&restore) as Arc<dyn RuntimePreAdmissionRestore>,
SessionId::new(),
InputId::new(),
);
registration.disarm();
assert_eq!(restore.calls.load(Ordering::SeqCst), 1);
}
#[test]
fn staged_admission_restore_holds_session_id() {
let ledger = empty_ledger();
let session = SessionId::new();
let restore = StagedAdmissionRestore {
admissions: Arc::clone(&ledger),
session_id: session.clone(),
};
assert_eq!(restore.session_id, session);
assert!(!has_staged_capacity_admission(
&restore.admissions,
&session
));
}