pub mod disable_didcomm;
pub mod document;
pub mod drain_cancel;
pub mod enable_didcomm;
pub mod migrate_mediator;
pub mod report;
pub static PROTOCOL_LOCK: tokio::sync::Mutex<()> = tokio::sync::Mutex::const_new(());
#[cfg(test)]
mod tests {
use super::PROTOCOL_LOCK;
use std::sync::Arc;
use std::sync::atomic::{AtomicUsize, Ordering};
#[tokio::test(flavor = "multi_thread", worker_threads = 4)]
async fn protocol_lock_serializes_concurrent_mutations() {
let in_section = Arc::new(AtomicUsize::new(0));
let max_observed = Arc::new(AtomicUsize::new(0));
async fn critical(in_section: Arc<AtomicUsize>, max_observed: Arc<AtomicUsize>) {
let _guard = PROTOCOL_LOCK.lock().await;
let n = in_section.fetch_add(1, Ordering::SeqCst) + 1;
max_observed.fetch_max(n, Ordering::SeqCst);
tokio::time::sleep(std::time::Duration::from_millis(20)).await;
in_section.fetch_sub(1, Ordering::SeqCst);
}
let a = tokio::spawn(critical(Arc::clone(&in_section), Arc::clone(&max_observed)));
let b = tokio::spawn(critical(Arc::clone(&in_section), Arc::clone(&max_observed)));
let (ra, rb) = tokio::join!(a, b);
ra.unwrap();
rb.unwrap();
assert_eq!(
max_observed.load(Ordering::SeqCst),
1,
"PROTOCOL_LOCK must serialize: at most one task in the critical section at a time"
);
}
}