//! 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(5); let (s3, r3) = bounded(0);
scope(|scope| {
scope.spawn(|_| {
for i in 0..COUNT {
s1.send(i).unwrap();
r3.recv().unwrap();
s2.send(i).unwrap();
r3.recv().unwrap();
}
});
for i in 0..COUNT {
for _ in 0..2 { letmut sel = Select::new();
sel.recv(&r1);
sel.recv(&r2); match sel.ready() { 0 => assert_eq!(r1.try_recv(), Ok(i)), 1 => assert_eq!(r2.try_recv(), Ok(i)),
_ => panic!(),
}
let (s1, r1) = bounded(0); let (s2, r2) = bounded(0); let (s3, r3) = bounded(100);
scope(|scope| {
scope.spawn(|_| {
for i in 0..COUNT {
assert_eq!(r1.recv().unwrap(), i);
assert_eq!(r2.recv().unwrap(), i);
r3.recv().unwrap();
}
});
for i in 0..COUNT {
for _ in 0..2 { letmut sel = Select::new();
sel.send(&s1);
sel.send(&s2); match sel.ready() { 0 => assert!(s1.try_send(i).is_ok()), 1 => assert!(s2.try_send(i).is_ok()),
_ => panic!(),
}
}
s3.send(()).unwrap();
}
})
.unwrap();
}
scope(|scope| {
scope.spawn(move |_| { letmut s = s;
for _ in 0..COUNT { let (new_s, new_r) = bounded(cap); let new_r: T = Box::new(Some(new_r));
{ letmut sel = Select::new();
sel.send(&s); match sel.ready() { 0 => assert!(s.try_send(new_r).is_ok()),
_ => panic!(),
}
}
s = new_s;
}
});
scope.spawn(move |_| { letmut r = r;
for _ in 0..COUNT { let new = { letmut sel = Select::new();
sel.recv(&r); match sel.ready() { 0 => r
.try_recv()
.unwrap()
.downcast_mut::<Option<Receiver<T>>>()
.unwrap()
.take()
.unwrap(),
_ => panic!(),
}
};
r = new;
}
});
})
.unwrap();
}
}
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.