use crate::counter::ConnectionCounter;
use crate::error::WsError;
use loom::sync::atomic::{AtomicUsize, Ordering};
use loom::sync::Arc;
#[test]
fn loom_inc_dec_pairs_balance_to_zero() {
loom::model(|| {
let counter = ConnectionCounter::new();
let c2 = counter.clone();
let handle = loom::thread::spawn(move || {
c2.increment(None).unwrap();
c2.decrement();
});
counter.increment(None).unwrap();
counter.decrement();
handle.join().unwrap();
assert_eq!(counter.get(), 0);
});
}
#[test]
fn loom_increment_respects_limit_under_race() {
loom::model(|| {
let counter = ConnectionCounter::new();
let ok_count = Arc::new(AtomicUsize::new(0));
let mut handles = Vec::new();
for _ in 0..2 {
let counter = counter.clone();
let ok_count = Arc::clone(&ok_count);
handles.push(loom::thread::spawn(move || {
match counter.increment(Some(1)) {
Ok(_) => {
ok_count.fetch_add(1, Ordering::Relaxed);
}
Err(WsError::TooManyConnections) => {}
Err(_) => panic!("unexpected error"),
}
}));
}
for h in handles {
h.join().unwrap();
}
assert_eq!(ok_count.load(Ordering::Relaxed), 1);
assert_eq!(counter.get(), 1);
counter.decrement();
counter.decrement(); assert_eq!(counter.get(), 0);
});
}