//! Tests for channel readiness using the `Select` struct.
use std::any::Any; use std::cell::Cell; use std::thread; use std::time::{Duration, Instant};
use crossbeam_channel::{after, bounded, tick, unbounded}; use crossbeam_channel::{Receiver, Select, TryRecvError, TrySendError}; use crossbeam_utils::thread::scope;
letmut sel = Select::new();
assert!(sel.ready_timeout(ms(1000)).is_err());
letmut sel = Select::new();
sel.recv(&r); match sel.try_ready() {
Ok(0) => assert_eq!(r.try_recv(), Err(TryRecvError::Disconnected)),
_ => panic!(),
}
})
.unwrap();
}
#[test] fn default_when_disconnected() { let (_, r) = unbounded::<i32>();
letmut sel = Select::new();
sel.recv(&r); match sel.try_ready() {
Ok(0) => assert_eq!(r.try_recv(), Err(TryRecvError::Disconnected)),
_ => panic!(),
}
let (_, r) = unbounded::<i32>();
letmut sel = Select::new();
sel.recv(&r); match sel.ready_timeout(ms(1000)) {
Ok(0) => assert_eq!(r.try_recv(), Err(TryRecvError::Disconnected)),
_ => panic!(),
}
let (s, _) = bounded::<i32>(0);
letmut sel = Select::new();
sel.send(&s); match sel.try_ready() {
Ok(0) => assert_eq!(s.try_send(0), Err(TrySendError::Disconnected(0))),
_ => panic!(),
}
let (s, _) = bounded::<i32>(0);
letmut sel = Select::new();
sel.send(&s); match sel.ready_timeout(ms(1000)) {
Ok(0) => assert_eq!(s.try_send(0), Err(TrySendError::Disconnected(0))),
_ => panic!(),
}
}
#[test] #[cfg_attr(miri, ignore)] // this test makes timing assumptions, but Miri is so slow it violates them fn default_only() { let start = Instant::now();
letmut sel = Select::new();
assert!(sel.try_ready().is_err()); let now = Instant::now();
assert!(now - start <= ms(50));
let start = Instant::now(); letmut sel = Select::new();
assert!(sel.ready_timeout(ms(500)).is_err()); let now = Instant::now();
assert!(now - start >= ms(450));
assert!(now - start <= ms(550));
}
#[test] fn unblocks() { let (s1, r1) = bounded::<i32>(0); let (s2, r2) = bounded::<i32>(0);
letmut sel = Select::new(); let oper1 = sel.send(&s1); let oper2 = sel.send(&s2); let oper = sel.select_timeout(ms(1000)); match oper {
Err(_) => panic!(),
Ok(oper) => match oper.index() {
i if i == oper1 => oper.send(&s1, 1).unwrap(),
i if i == oper2 => panic!(),
_ => unreachable!(),
},
}
})
.unwrap();
}
#[test] fn both_ready() { let (s1, r1) = bounded(0); let (s2, r2) = bounded(0);
let (s1, r1) = unbounded::<()>(); let (s2, r2) = bounded::<()>(1); let (s3, r3) = bounded::<()>(0);
scope(|scope| {
scope.spawn(|_| { for _ in0..COUNT { letmut sel = Select::new(); letmut oper1 = None; letmut oper2 = None; if s1.is_empty() {
oper1 = Some(sel.send(&s1));
} if s2.is_empty() {
oper2 = Some(sel.send(&s2));
} let oper3 = sel.send(&s3); let oper = sel.select(); match oper.index() {
i if Some(i) == oper1 => assert!(oper.send(&s1, ()).is_ok()),
i if Some(i) == oper2 => assert!(oper.send(&s2, ()).is_ok()),
i if i == oper3 => assert!(oper.send(&s3, ()).is_ok()),
_ => unreachable!(),
}
}
});
let hits = vec![Cell::new(0usize); 3]; for _ in0..COUNT { letmut sel = Select::new();
sel.recv(&r1);
sel.recv(&r2);
sel.recv(&r3); loop { match sel.ready() { 0 => { if r1.try_recv().is_ok() {
hits[0].set(hits[0].get() + 1); break;
}
} 1 => { if r2.try_recv().is_ok() {
hits[1].set(hits[1].get() + 1); break;
}
} 2 => { if r3.try_recv().is_ok() {
hits[2].set(hits[2].get() + 1); break;
}
}
_ => unreachable!(),
}
}
}
assert!(hits.iter().all(|x| x.get() > 0));
})
.unwrap();
}
Messung V0.5 in Prozent
¤ Diese beiden folgenden Angebotsgruppen bietet das Unternehmen0.3Angebot
(Wie Sie bei der Firma Beratungs- und Dienstleistungen beauftragen können 2026-09-29)
¤
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.