in bindings/rust/extended/s2n-tls/src/callbacks/pkey.rs [313:363]
fn async_failure() -> Result<(), Error> {
const POLL_COUNT: usize = 10;
const ERROR: &str = "async_failure error";
struct TestPkeyFuture {
counter: usize,
_op: PrivateKeyOperation,
}
impl ConnectionFuture for TestPkeyFuture {
fn poll(
mut self: Pin<&mut Self>,
_conn: &mut connection::Connection,
ctx: &mut core::task::Context,
) -> Poll<Result<(), error::Error>> {
ctx.waker().wake_by_ref();
self.counter += 1;
if self.counter < POLL_COUNT {
Poll::Pending
} else {
Poll::Ready(Err(testing::test_error(ERROR)))
}
}
}
struct TestPkeyCallback(Counter);
impl PrivateKeyCallback for TestPkeyCallback {
fn handle_operation(
&self,
_conn: &mut connection::Connection,
_op: PrivateKeyOperation,
) -> Result<Option<Pin<Box<dyn ConnectionFuture>>>, error::Error> {
self.0.increment();
let future = TestPkeyFuture { counter: 0, _op };
Ok(Some(Box::pin(future)))
}
}
let (waker, wake_count) = new_count_waker();
let counter = testing::Counter::default();
let callback = TestPkeyCallback(counter.clone());
let mut pair = new_pair(callback, waker)?;
assert_eq!(counter.count(), 0);
assert_eq!(wake_count, 0);
let err = pair.handshake().unwrap_err();
assert_eq!(counter.count(), 1);
assert_eq!(wake_count, POLL_COUNT);
assert_test_error(err, ERROR);
Ok(())
}