#[test] fn smoke_oneshot() {
assert_done(
|| { let (c, p) = oneshot::channel();
c.send(1).unwrap();
p
},
Ok(1),
);
assert_done(
|| { let (c, p) = oneshot::channel::<i32>();
drop(c);
p
},
Err(Canceled),
); letmut completes = Vec::new();
assert_empty(|| { let (a, b) = oneshot::channel::<i32>();
completes.push(a);
b
});
let (c, mut p) = oneshot::channel::<i32>();
drop(c); let res = panic_waker_lw(|lw| p.poll(lw));
assert!(res.is_err()); let (c, p) = oneshot::channel::<i32>();
drop(c); let (tx, rx) = channel();
p.then(move |_| tx.send(())).forget();
rx.recv().unwrap();
}
#[test] fn select_cancels() { let ((a, b), (c, d)) = (oneshot::channel::<i32>(), oneshot::channel::<i32>()); let ((btx, brx), (dtx, drx)) = (channel(), channel()); let b = b.map(move |b| {
btx.send(b).unwrap();
b
}); let d = d.map(move |d| {
dtx.send(d).unwrap();
d
});
letmut f = b.select(d).then(unselect); // assert!(f.poll(&mut Task::new()).is_pending());
assert!(brx.try_recv().is_err());
assert!(drx.try_recv().is_err());
a.send(1).unwrap();
noop_waker_lw(|lw| { let res = f.poll(lw);
assert!(res.ok().unwrap().is_ready());
assert_eq!(brx.recv().unwrap(), 1);
drop(c);
assert!(drx.recv().is_err());
let ((a, b), (c, d)) = (oneshot::channel::<i32>(), oneshot::channel::<i32>()); let ((btx, _brx), (dtx, drx)) = (channel(), channel()); let b = b.map(move |b| {
btx.send(b).unwrap();
b
}); let d = d.map(move |d| {
dtx.send(d).unwrap();
d
});
#[test] fn join_cancels() { let ((a, b), (c, d)) = (oneshot::channel::<i32>(), oneshot::channel::<i32>()); let ((btx, _brx), (dtx, drx)) = (channel(), channel()); let b = b.map(move |b| {
btx.send(b).unwrap();
b
}); let d = d.map(move |d| {
dtx.send(d).unwrap();
d
});
letmut f = b.join(d);
drop(a); let res = panic_waker_lw(|lw| f.poll(lw));
assert!(res.is_err());
drop(c);
assert!(drx.recv().is_err());
let ((a, b), (c, d)) = (oneshot::channel::<i32>(), oneshot::channel::<i32>()); let ((btx, _brx), (dtx, drx)) = (channel(), channel()); let b = b.map(move |b| {
btx.send(b).unwrap();
b
}); let d = d.map(move |d| {
dtx.send(d).unwrap();
d
});
let (tx, rx) = channel(); let f = b.join(d);
f.then(move |_| {
tx.send(()).unwrap(); let res: Result<(), ()> = Ok(());
res
})
.forget();
assert!(rx.try_recv().is_err());
drop(a);
rx.recv().unwrap();
drop(c);
assert!(drx.recv().is_err());
}
#[test] fn join_incomplete() { let (a, b) = oneshot::channel::<i32>(); let (tx, rx) = channel();
noop_waker_lw(|lw| { letmut f = ok(1).join(b).map(move |r| tx.send(r).unwrap());
assert!(f.poll(lw).ok().unwrap().is_pending());
assert!(rx.try_recv().is_err());
a.send(2).unwrap();
assert!(f.poll(lw).ok().unwrap().is_ready());
assert_eq!(rx.recv().unwrap(), (1, 2));
let (a, b) = oneshot::channel::<i32>(); let (tx, rx) = channel(); letmut f = b.join(Ok(2)).map(move |r| tx.send(r).unwrap());
assert!(f.poll(lw).ok().unwrap().is_pending());
assert!(rx.try_recv().is_err());
a.send(1).unwrap();
assert!(f.poll(lw).ok().unwrap().is_ready());
assert_eq!(rx.recv().unwrap(), (1, 2));
let (a, b) = oneshot::channel::<i32>(); let (tx, rx) = channel(); letmut f = ok(1).join(b).map_err(move |_r| tx.send(2).unwrap());
assert!(f.poll(lw).ok().unwrap().is_pending());
assert!(rx.try_recv().is_err());
drop(a);
assert!(f.poll(lw).is_err());
assert_eq!(rx.recv().unwrap(), 2);
let (a, b) = oneshot::channel::<i32>(); let (tx, rx) = channel(); letmut f = b.join(Ok(2)).map_err(move |_r| tx.send(1).unwrap());
assert!(f.poll(lw).ok().unwrap().is_pending());
assert!(rx.try_recv().is_err());
drop(a);
assert!(f.poll(lw).is_err());
assert_eq!(rx.recv().unwrap(), 1);
})
}
assert_done(
|| {
f_ok(1).select(f_ok(2)).map_err(|_| 0).and_then(|either_tup| { let (a, b) = either_tup.into_inner();
b.map(move |b| a + b)
})
},
Ok(3),
);
// Finish one half of a select and then fail the second, ensuring that we // get the notification of the second one.
{ let ((a, b), (c, d)) = (oneshot::channel::<i32>(), oneshot::channel::<i32>()); let f = b.select(d); let (tx, rx) = channel();
f.map(move |r| tx.send(r).unwrap()).forget();
a.send(1).unwrap(); let (val, next) = rx.recv().unwrap().into_inner();
assert_eq!(val, 1); let (tx, rx) = channel();
next.map_err(move |_r| tx.send(2).unwrap()).forget();
assert_eq!(rx.try_recv().err().unwrap(), TryRecvError::Empty);
drop(c);
assert_eq!(rx.recv().unwrap(), 2);
}
// Fail the second half and ensure that we see the first one finish
{ let ((a, b), (c, d)) = (oneshot::channel::<i32>(), oneshot::channel::<i32>()); let f = b.select(d); let (tx, rx) = channel();
f.map_err(move |r| tx.send((1, r.into_inner().1)).unwrap()).forget();
drop(c); let (val, next) = rx.recv().unwrap();
assert_eq!(val, 1); let (tx, rx) = channel();
next.map(move |r| tx.send(r).unwrap()).forget();
assert_eq!(rx.try_recv().err().unwrap(), TryRecvError::Empty);
a.send(2).unwrap();
assert_eq!(rx.recv().unwrap(), 2);
}
// Cancelling the first half should cancel the second
{ let ((_a, b), (_c, d)) = (oneshot::channel::<i32>(), oneshot::channel::<i32>()); let ((btx, brx), (dtx, drx)) = (channel(), channel()); let b = b.map(move |v| {
btx.send(v).unwrap();
v
}); let d = d.map(move |v| {
dtx.send(v).unwrap();
v
}); let f = b.select(d);
drop(f);
assert!(drx.recv().is_err());
assert!(brx.recv().is_err());
}
// Cancel after a schedule
{ let ((_a, b), (_c, d)) = (oneshot::channel::<i32>(), oneshot::channel::<i32>()); let ((btx, brx), (dtx, drx)) = (channel(), channel()); let b = b.map(move |v| {
btx.send(v).unwrap();
v
}); let d = d.map(move |v| {
dtx.send(v).unwrap();
v
}); letmut f = b.select(d); let _res = noop_waker_lw(|lw| f.poll(lw));
drop(f);
assert!(drx.recv().is_err());
assert!(brx.recv().is_err());
}
// Cancel propagates
{ let ((a, b), (_c, d)) = (oneshot::channel::<i32>(), oneshot::channel::<i32>()); let ((btx, brx), (dtx, drx)) = (channel(), channel()); let b = b.map(move |v| {
btx.send(v).unwrap();
v
}); let d = d.map(move |v| {
dtx.send(v).unwrap();
v
}); let (tx, rx) = channel();
b.select(d).map(move |_| tx.send(()).unwrap()).forget();
drop(a);
assert!(drx.recv().is_err());
assert!(brx.recv().is_err());
assert!(rx.recv().is_err());
}
// Cancel on early drop
{ let (tx, rx) = channel(); let f = f_ok(1).select(empty::<_, ()>().map(move |()| {
tx.send(()).unwrap(); 1
}));
drop(f);
assert!(rx.recv().is_err());
}
}
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.