in bindings/rust/extended/s2n-tls/src/callbacks/pkey.rs [224:279]
fn async_offload_success() -> Result<(), Error> {
const POLL_COUNT: usize = 10;
struct TestPkeyFuture {
counter: usize,
op: Option<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 if let Some(op) = self.op.take() {
Poll::Ready(ecdsa_sign(op, conn, KEY))
} else {
Poll::Ready(Err(error::Error::application(
"missing pkey operation".into(),
)))
}
}
}
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: Some(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);
pair.handshake()?;
assert_eq!(counter.count(), 1);
assert_eq!(wake_count, POLL_COUNT);
Ok(())
}