use super::*;
#[test]
#[should_panic(expected = "watch channel version counter overflowed")]
fn send_panics_on_version_overflow() {
let (tx, _rx) = channel(0);
tx.shared.state.lock().version = u64::MAX;
tx.send(1).unwrap();
}
#[test]
#[should_panic(expected = "watch channel version counter overflowed")]
fn send_replace_panics_on_version_overflow() {
let (tx, _rx) = channel(0);
tx.shared.state.lock().version = u64::MAX;
tx.send_replace(1);
}
#[test]
fn concurrent_senders_commit_every_version() {
const SENDERS: usize = 4;
const SENDS_PER_THREAD: usize = 1_000;
let (tx, rx) = channel(0);
let workers = (0..SENDERS)
.map(|sender_index| {
let tx = tx.clone();
std::thread::spawn(move || {
for offset in 0..SENDS_PER_THREAD {
tx.send(sender_index * SENDS_PER_THREAD + offset).unwrap();
}
})
})
.collect::<Vec<_>>();
for worker in workers {
worker.join().unwrap();
}
assert_eq!(
tx.shared.state.lock().version,
(SENDERS * SENDS_PER_THREAD) as u64
);
assert!(rx.get() < SENDERS * SENDS_PER_THREAD);
}