diff --git a/crates/irtt-client/src/managed/blocking_tests.rs b/crates/irtt-client/src/managed/blocking_tests.rs index d3df883..743eae8 100644 --- a/crates/irtt-client/src/managed/blocking_tests.rs +++ b/crates/irtt-client/src/managed/blocking_tests.rs @@ -250,15 +250,11 @@ fn dynamic_update_reaches_background_worker() { .unwrap(); let handle = owner.handle(); - let acknowledgement = test_runtime().block_on(async { - timeout( - Duration::from_secs(2), - handle.update_targets(vec![target(&server)]).unwrap(), - ) - .await + let acknowledgement = handle + .update_targets(vec![target(&server)]) .unwrap() - .unwrap() - }); + .blocking_wait() + .unwrap(); assert_eq!(acknowledgement.sequence, 1); server.wait_probe(); test_runtime().block_on(async { diff --git a/crates/irtt-client/src/managed/task.rs b/crates/irtt-client/src/managed/task.rs index 3f190ae..98c8bbe 100644 --- a/crates/irtt-client/src/managed/task.rs +++ b/crates/irtt-client/src/managed/task.rs @@ -301,6 +301,19 @@ pub struct ManagedCommandReceipt { receiver: oneshot::Receiver>, } +impl ManagedCommandReceipt { + /// Block until the target-set transaction is applied or rejected. + /// + /// This is for synchronous callers such as [`BlockingManagedClient`]. It + /// must not be called from an asynchronous runtime; use the [`Future`] + /// implementation there instead. + pub fn blocking_wait(self) -> Result { + self.receiver + .blocking_recv() + .unwrap_or(Err(ManagedCommandApplyError::AcknowledgementDisconnected)) + } +} + impl Future for ManagedCommandReceipt { type Output = Result; fn poll(mut self: Pin<&mut Self>, cx: &mut Context<'_>) -> Poll {