diff --git a/rust/Cargo.toml b/rust/Cargo.toml
index b0a77c4..076e0b5 100644
--- a/rust/Cargo.toml
+++ b/rust/Cargo.toml
@@ -29,6 +29,7 @@
 bitfield = "0.19.4"
 bitflags = "2.11.1"
 futures = "=0.3.31"
+futures-channel = "=0.3.31"
 futures-test = "=0.3.31"
 log = { version = "0.4.29", features = ["kv", "std"] }
 num = { version = "0.4.3", features = ["rand"] }
diff --git a/rust/bt-mcs/Cargo.toml b/rust/bt-mcs/Cargo.toml
index 3ada3f7..70e351c 100644
--- a/rust/bt-mcs/Cargo.toml
+++ b/rust/bt-mcs/Cargo.toml
@@ -16,3 +16,4 @@
 [dev-dependencies]
 assert_matches.workspace = true
 bt-gatt = { workspace = true, features = ["test-utils"] }
+futures-channel.workspace = true
diff --git a/rust/bt-mcs/src/server.rs b/rust/bt-mcs/src/server.rs
index 25e336c..3f49055 100644
--- a/rust/bt-mcs/src/server.rs
+++ b/rust/bt-mcs/src/server.rs
@@ -1236,6 +1236,25 @@
         assert_matches!(poll_result, Poll::Ready(None));
     }
 
+    #[track_caller]
+    fn expect_service_event(
+        events: &mut futures::channel::mpsc::UnboundedReceiver<FakeServerEvent>,
+    ) -> FakeServerEvent {
+        let mut cx = Context::from_waker(futures::task::noop_waker_ref());
+        match events.poll_next_unpin(&mut cx) {
+            Poll::Ready(Some(event)) => event,
+            x => panic!("Expected fake server event, got {x:?}"),
+        }
+    }
+
+    #[track_caller]
+    fn expect_no_service_event(
+        events: &mut futures::channel::mpsc::UnboundedReceiver<FakeServerEvent>,
+    ) {
+        let mut cx = Context::from_waker(futures::task::noop_waker_ref());
+        assert_matches!(events.poll_next_unpin(&mut cx), Poll::Pending);
+    }
+
     fn setup_test_server(
         builder: McsServerBuilder,
     ) -> (
@@ -1248,7 +1267,10 @@
         let mut server: McsServer<FakeTypes> = builder.build().expect("server builds successfully");
         server.publish(fake_gatt_server.clone()).expect("publish succeeds");
         let _ = server.next().poll_unpin(&mut noop_cx);
-        assert!(matches!(event_receiver.try_recv().unwrap(), FakeServerEvent::Published { .. }));
+        assert!(matches!(
+            expect_service_event(&mut event_receiver),
+            FakeServerEvent::Published { .. }
+        ));
         (server, fake_gatt_server, event_receiver)
     }
 
@@ -1272,7 +1294,7 @@
             bt_gatt::server::NotificationType::Notify,
         );
         let _ = server.next().poll_unpin(&mut noop_cx);
-        let _ = event_receiver.try_recv();
+        expect_no_service_event(&mut event_receiver);
         (server, fake_gatt_server, event_receiver, noop_cx)
     }
 
@@ -1289,7 +1311,7 @@
         fake_gatt_server.incoming_read(peer, service_id, handle, 0);
         let _ = server.next().poll_unpin(&mut noop_cx);
         let bt_gatt::test_utils::FakeServerEvent::ReadResponded { value, .. } =
-            event_receiver.try_recv().unwrap()
+            expect_service_event(event_receiver)
         else {
             panic!("expected ReadResponded");
         };
@@ -1448,7 +1470,7 @@
             fake_gatt_server.incoming_read(peer, service_id, handle, 0);
             let _ = server.next().poll_unpin(&mut noop_cx);
             let bt_gatt::test_utils::FakeServerEvent::ReadResponded { value, .. } =
-                event_receiver.try_recv().unwrap()
+                expect_service_event(&mut event_receiver)
             else {
                 panic!("expected ReadResponded for handle {:?}", handle);
             };
@@ -1482,7 +1504,7 @@
             // Must NOT emit any McsServerEvent.
             assert_matches!(poll_result, Poll::Pending);
             let bt_gatt::test_utils::FakeServerEvent::WriteResponded { value, .. } =
-                event_receiver.try_recv().unwrap()
+                expect_service_event(&mut event_receiver)
             else {
                 panic!("expected WriteResponded for handle {:?}", handle);
             };
@@ -1510,7 +1532,7 @@
         fake_gatt_server.incoming_read(peer, service_id, MEDIA_PLAYER_NAME_HANDLE, 5);
         let _ = server.next().poll_unpin(&mut noop_cx);
         let bt_gatt::test_utils::FakeServerEvent::ReadResponded { value, .. } =
-            event_receiver.try_recv().unwrap()
+            expect_service_event(&mut event_receiver)
         else {
             panic!("expected ReadResponded");
         };
@@ -1520,7 +1542,7 @@
         fake_gatt_server.incoming_read(peer, service_id, MEDIA_PLAYER_ICON_URL_HANDLE, 8);
         let _ = server.next().poll_unpin(&mut noop_cx);
         let bt_gatt::test_utils::FakeServerEvent::ReadResponded { value, .. } =
-            event_receiver.try_recv().unwrap()
+            expect_service_event(&mut event_receiver)
         else {
             panic!("expected ReadResponded");
         };
@@ -1535,7 +1557,7 @@
         );
         let _ = server.next().poll_unpin(&mut noop_cx);
         let bt_gatt::test_utils::FakeServerEvent::ReadResponded { value, .. } =
-            event_receiver.try_recv().unwrap()
+            expect_service_event(&mut event_receiver)
         else {
             panic!("expected ReadResponded");
         };
@@ -1545,7 +1567,7 @@
         fake_gatt_server.incoming_read(peer, service_id, MEDIA_PLAYER_NAME_HANDLE, 100);
         let _ = server.next().poll_unpin(&mut noop_cx);
         let bt_gatt::test_utils::FakeServerEvent::ReadResponded { value, .. } =
-            event_receiver.try_recv().unwrap()
+            expect_service_event(&mut event_receiver)
         else {
             panic!("expected ReadResponded");
         };
@@ -1555,7 +1577,7 @@
         fake_gatt_server.incoming_read(peer, service_id, MEDIA_PLAYER_ICON_URL_HANDLE, 100);
         let _ = server.next().poll_unpin(&mut noop_cx);
         let bt_gatt::test_utils::FakeServerEvent::ReadResponded { value, .. } =
-            event_receiver.try_recv().unwrap()
+            expect_service_event(&mut event_receiver)
         else {
             panic!("expected ReadResponded");
         };
@@ -1577,7 +1599,7 @@
         fake_gatt_server.incoming_read(peer, service_id, TRACK_CHANGED_HANDLE, 0);
         let _ = server.next().poll_unpin(&mut noop_cx);
         let bt_gatt::test_utils::FakeServerEvent::ReadResponded { value, .. } =
-            event_receiver.try_recv().unwrap()
+            expect_service_event(&mut event_receiver)
         else {
             panic!("expected ReadResponded");
         };
@@ -1590,7 +1612,7 @@
         fake_gatt_server.incoming_read(peer, service_id, MEDIA_CONTROL_POINT_HANDLE, 0);
         let _ = server.next().poll_unpin(&mut noop_cx);
         let bt_gatt::test_utils::FakeServerEvent::ReadResponded { value, .. } =
-            event_receiver.try_recv().unwrap()
+            expect_service_event(&mut event_receiver)
         else {
             panic!("expected ReadResponded");
         };
@@ -1603,7 +1625,7 @@
         fake_gatt_server.incoming_read(peer, service_id, Handle(999), 0);
         let _ = server.next().poll_unpin(&mut noop_cx);
         let bt_gatt::test_utils::FakeServerEvent::ReadResponded { value, .. } =
-            event_receiver.try_recv().unwrap()
+            expect_service_event(&mut event_receiver)
         else {
             panic!("expected ReadResponded");
         };
@@ -1627,7 +1649,7 @@
             bt_gatt::server::NotificationType::Notify,
         );
         let _ = server.next().poll_unpin(&mut noop_cx);
-        let _ = event_receiver.try_recv();
+        expect_no_service_event(&mut event_receiver);
 
         fake_gatt_server.incoming_write(
             peer,
@@ -1649,7 +1671,8 @@
         assert_eq!(peer_id, peer);
         assert_eq!(position, TrackPosition::from_raw_10ms(4200));
 
-        let FakeServerEvent::WriteResponded { value, .. } = event_receiver.try_recv().unwrap()
+        let FakeServerEvent::WriteResponded { value, .. } =
+            expect_service_event(&mut event_receiver)
         else {
             panic!("expected WriteResponded");
         };
@@ -1662,7 +1685,7 @@
         let _ = server.next().poll_unpin(&mut noop_cx);
 
         let FakeServerEvent::Notified { handle, value, peers, .. } =
-            event_receiver.try_recv().unwrap()
+            expect_service_event(&mut event_receiver)
         else {
             panic!("expected Notified");
         };
@@ -1673,7 +1696,8 @@
         // Subsequent read reflects the updated track position
         fake_gatt_server.incoming_read(peer, service_id, TRACK_POSITION_HANDLE, 0);
         let _ = server.next().poll_unpin(&mut noop_cx);
-        let FakeServerEvent::ReadResponded { value, .. } = event_receiver.try_recv().unwrap()
+        let FakeServerEvent::ReadResponded { value, .. } =
+            expect_service_event(&mut event_receiver)
         else {
             panic!("expected ReadResponded");
         };
@@ -1699,7 +1723,8 @@
         );
         let poll_result = server.next().poll_unpin(&mut noop_cx);
         assert_matches!(poll_result, Poll::Pending);
-        let FakeServerEvent::WriteResponded { value, .. } = event_receiver.try_recv().unwrap()
+        let FakeServerEvent::WriteResponded { value, .. } =
+            expect_service_event(&mut event_receiver)
         else {
             panic!("expected WriteResponded");
         };
@@ -1715,7 +1740,8 @@
         );
         let poll_result = server.next().poll_unpin(&mut noop_cx);
         assert_matches!(poll_result, Poll::Pending);
-        let FakeServerEvent::WriteResponded { value, .. } = event_receiver.try_recv().unwrap()
+        let FakeServerEvent::WriteResponded { value, .. } =
+            expect_service_event(&mut event_receiver)
         else {
             panic!("expected WriteResponded");
         };
@@ -1741,7 +1767,7 @@
             bt_gatt::server::NotificationType::Notify,
         );
         let _ = server.next().poll_unpin(&mut noop_cx);
-        let _ = event_receiver.try_recv();
+        expect_no_service_event(&mut event_receiver);
 
         fake_gatt_server.incoming_write(
             peer,
@@ -1760,7 +1786,8 @@
         assert_eq!(peer_id, peer);
         assert_eq!(speed, PlaybackSpeed::HALF);
 
-        let FakeServerEvent::WriteResponded { value, .. } = event_receiver.try_recv().unwrap()
+        let FakeServerEvent::WriteResponded { value, .. } =
+            expect_service_event(&mut event_receiver)
         else {
             panic!("expected WriteResponded");
         };
@@ -1771,7 +1798,7 @@
         let _ = server.next().poll_unpin(&mut noop_cx);
 
         let FakeServerEvent::Notified { handle, value, peers, .. } =
-            event_receiver.try_recv().unwrap()
+            expect_service_event(&mut event_receiver)
         else {
             panic!("expected Notified");
         };
@@ -1782,7 +1809,8 @@
         // Subsequent read reflects the updated playback speed
         fake_gatt_server.incoming_read(peer, service_id, PLAYBACK_SPEED_HANDLE, 0);
         let _ = server.next().poll_unpin(&mut noop_cx);
-        let FakeServerEvent::ReadResponded { value, .. } = event_receiver.try_recv().unwrap()
+        let FakeServerEvent::ReadResponded { value, .. } =
+            expect_service_event(&mut event_receiver)
         else {
             panic!("expected ReadResponded");
         };
@@ -1802,7 +1830,8 @@
         fake_gatt_server.incoming_write(peer, service_id, PLAYBACK_SPEED_HANDLE, 1, vec![0x00]);
         let poll_result = server.next().poll_unpin(&mut noop_cx);
         assert_matches!(poll_result, Poll::Pending);
-        let FakeServerEvent::WriteResponded { value, .. } = event_receiver.try_recv().unwrap()
+        let FakeServerEvent::WriteResponded { value, .. } =
+            expect_service_event(&mut event_receiver)
         else {
             panic!("expected WriteResponded");
         };
@@ -1818,7 +1847,8 @@
         );
         let poll_result = server.next().poll_unpin(&mut noop_cx);
         assert_matches!(poll_result, Poll::Pending);
-        let FakeServerEvent::WriteResponded { value, .. } = event_receiver.try_recv().unwrap()
+        let FakeServerEvent::WriteResponded { value, .. } =
+            expect_service_event(&mut event_receiver)
         else {
             panic!("expected WriteResponded");
         };
@@ -1846,7 +1876,7 @@
             bt_gatt::server::NotificationType::Notify,
         );
         let _ = server.next().poll_unpin(&mut noop_cx);
-        let _ = event_receiver.try_recv();
+        expect_no_service_event(&mut event_receiver);
 
         fake_gatt_server.incoming_write(
             peer,
@@ -1865,7 +1895,8 @@
         assert_eq!(peer_id, peer);
         assert_eq!(order, PlayingOrder::ShuffleOnce);
 
-        let FakeServerEvent::WriteResponded { value, .. } = event_receiver.try_recv().unwrap()
+        let FakeServerEvent::WriteResponded { value, .. } =
+            expect_service_event(&mut event_receiver)
         else {
             panic!("expected WriteResponded");
         };
@@ -1876,7 +1907,7 @@
         let _ = server.next().poll_unpin(&mut noop_cx);
 
         let FakeServerEvent::Notified { handle, value, peers, .. } =
-            event_receiver.try_recv().unwrap()
+            expect_service_event(&mut event_receiver)
         else {
             panic!("expected Notified");
         };
@@ -1887,7 +1918,8 @@
         // Subsequent read reflects the updated playing order
         fake_gatt_server.incoming_read(peer, service_id, PLAYING_ORDER_HANDLE, 0);
         let _ = server.next().poll_unpin(&mut noop_cx);
-        let FakeServerEvent::ReadResponded { value, .. } = event_receiver.try_recv().unwrap()
+        let FakeServerEvent::ReadResponded { value, .. } =
+            expect_service_event(&mut event_receiver)
         else {
             panic!("expected ReadResponded");
         };
@@ -1918,7 +1950,8 @@
         let poll_result = server.next().poll_unpin(&mut noop_cx);
         assert_matches!(poll_result, Poll::Pending);
 
-        let FakeServerEvent::WriteResponded { value, .. } = event_receiver.try_recv().unwrap()
+        let FakeServerEvent::WriteResponded { value, .. } =
+            expect_service_event(&mut event_receiver)
         else {
             panic!("expected WriteResponded");
         };
@@ -1927,7 +1960,8 @@
         // Value remains unchanged (InOrderOnce)
         fake_gatt_server.incoming_read(peer, service_id, PLAYING_ORDER_HANDLE, 0);
         let _ = server.next().poll_unpin(&mut noop_cx);
-        let FakeServerEvent::ReadResponded { value, .. } = event_receiver.try_recv().unwrap()
+        let FakeServerEvent::ReadResponded { value, .. } =
+            expect_service_event(&mut event_receiver)
         else {
             panic!("expected ReadResponded");
         };
@@ -1960,7 +1994,8 @@
             fake_gatt_server.incoming_write(peer, service_id, handle, 0, value);
             let poll_result = server.next().poll_unpin(&mut noop_cx);
             assert_matches!(poll_result, Poll::Pending);
-            let FakeServerEvent::WriteResponded { value, .. } = event_receiver.try_recv().unwrap()
+            let FakeServerEvent::WriteResponded { value, .. } =
+                expect_service_event(&mut event_receiver)
             else {
                 panic!("expected WriteResponded for handle {:?}", handle);
             };
@@ -1993,7 +2028,8 @@
         assert_matches!(poll_result, Poll::Pending);
 
         // ATT write is acknowledged
-        let FakeServerEvent::WriteResponded { value, .. } = event_receiver.try_recv().unwrap()
+        let FakeServerEvent::WriteResponded { value, .. } =
+            expect_service_event(&mut event_receiver)
         else {
             panic!("expected WriteResponded");
         };
@@ -2002,7 +2038,7 @@
         // Immediate Media Control Point Notification sent with OPCODE_NOT_SUPPORTED
         // (0x02)
         let FakeServerEvent::Notified { handle, value, peers, .. } =
-            event_receiver.try_recv().unwrap()
+            expect_service_event(&mut event_receiver)
         else {
             panic!("expected Notified");
         };
@@ -2031,7 +2067,8 @@
         assert_matches!(poll_result, Poll::Pending);
 
         // ATT write is acknowledged
-        let FakeServerEvent::WriteResponded { value, .. } = event_receiver.try_recv().unwrap()
+        let FakeServerEvent::WriteResponded { value, .. } =
+            expect_service_event(&mut event_receiver)
         else {
             panic!("expected WriteResponded");
         };
@@ -2040,7 +2077,7 @@
         // Immediate Media Control Point Notification sent with MEDIA_PLAYER_INACTIVE
         // (0x03)
         let FakeServerEvent::Notified { handle, value, peers, .. } =
-            event_receiver.try_recv().unwrap()
+            expect_service_event(&mut event_receiver)
         else {
             panic!("expected Notified");
         };
@@ -2075,7 +2112,8 @@
         assert_eq!(opcode, MediaControlOpcode::Pause);
 
         // ATT write is acknowledged
-        let FakeServerEvent::WriteResponded { value, .. } = event_receiver.try_recv().unwrap()
+        let FakeServerEvent::WriteResponded { value, .. } =
+            expect_service_event(&mut event_receiver)
         else {
             panic!("expected WriteResponded");
         };
@@ -2088,7 +2126,7 @@
         let _ = server.next().poll_unpin(&mut noop_cx);
 
         let FakeServerEvent::Notified { handle, value, peers, .. } =
-            event_receiver.try_recv().unwrap()
+            expect_service_event(&mut event_receiver)
         else {
             panic!("expected Notified");
         };
@@ -2122,7 +2160,8 @@
         };
         assert_eq!(rx_opcode, opcode);
 
-        let FakeServerEvent::WriteResponded { value, .. } = event_receiver.try_recv().unwrap()
+        let FakeServerEvent::WriteResponded { value, .. } =
+            expect_service_event(&mut event_receiver)
         else {
             panic!("expected WriteResponded");
         };
@@ -2132,7 +2171,7 @@
         let _ = server.next().poll_unpin(&mut noop_cx);
 
         let FakeServerEvent::Notified { handle, value, peers, .. } =
-            event_receiver.try_recv().unwrap()
+            expect_service_event(&mut event_receiver)
         else {
             panic!("expected Notified");
         };
@@ -2162,14 +2201,15 @@
         let poll_result = server.next().poll_unpin(&mut noop_cx);
         assert_matches!(poll_result, Poll::Pending);
 
-        let FakeServerEvent::WriteResponded { value, .. } = event_receiver.try_recv().unwrap()
+        let FakeServerEvent::WriteResponded { value, .. } =
+            expect_service_event(&mut event_receiver)
         else {
             panic!("expected WriteResponded");
         };
         assert!(value.is_ok());
 
         let FakeServerEvent::Notified { handle, value, peers, .. } =
-            event_receiver.try_recv().unwrap()
+            expect_service_event(&mut event_receiver)
         else {
             panic!("expected Notified");
         };
@@ -2195,7 +2235,8 @@
         );
         let poll_result = server.next().poll_unpin(&mut noop_cx);
         assert_matches!(poll_result, Poll::Pending);
-        let FakeServerEvent::WriteResponded { value, .. } = event_receiver.try_recv().unwrap()
+        let FakeServerEvent::WriteResponded { value, .. } =
+            expect_service_event(&mut event_receiver)
         else {
             panic!("expected WriteResponded");
         };
@@ -2205,7 +2246,8 @@
         fake_gatt_server.incoming_write(peer, service_id, MEDIA_CONTROL_POINT_HANDLE, 0, vec![]);
         let poll_result = server.next().poll_unpin(&mut noop_cx);
         assert_matches!(poll_result, Poll::Pending);
-        let FakeServerEvent::WriteResponded { value, .. } = event_receiver.try_recv().unwrap()
+        let FakeServerEvent::WriteResponded { value, .. } =
+            expect_service_event(&mut event_receiver)
         else {
             panic!("expected WriteResponded");
         };
@@ -2236,14 +2278,15 @@
         let poll_result = server.next().poll_unpin(&mut noop_cx);
         assert_matches!(poll_result, Poll::Pending);
 
-        let FakeServerEvent::WriteResponded { value, .. } = event_receiver.try_recv().unwrap()
+        let FakeServerEvent::WriteResponded { value, .. } =
+            expect_service_event(&mut event_receiver)
         else {
             panic!("expected WriteResponded");
         };
         assert!(value.is_ok());
 
         let FakeServerEvent::Notified { handle, value, peers, .. } =
-            event_receiver.try_recv().unwrap()
+            expect_service_event(&mut event_receiver)
         else {
             panic!("expected Notified");
         };
@@ -2284,7 +2327,8 @@
         assert_eq!(opcode, MediaControlOpcode::Stop);
 
         // ATT write is acknowledged
-        let FakeServerEvent::WriteResponded { value, .. } = event_receiver.try_recv().unwrap()
+        let FakeServerEvent::WriteResponded { value, .. } =
+            expect_service_event(&mut event_receiver)
         else {
             panic!("expected WriteResponded");
         };
@@ -2297,7 +2341,7 @@
         let _ = server.next().poll_unpin(&mut noop_cx);
 
         let FakeServerEvent::Notified { handle, value, peers, .. } =
-            event_receiver.try_recv().unwrap()
+            expect_service_event(&mut event_receiver)
         else {
             panic!("expected Notified");
         };
@@ -2323,7 +2367,7 @@
             bt_gatt::server::NotificationType::Notify,
         );
         let _ = server.next().poll_unpin(&mut noop_cx);
-        let _ = event_receiver.try_recv();
+        expect_no_service_event(&mut event_receiver);
 
         // Issue 1st command (Play from peer1)
         fake_gatt_server.incoming_write(
@@ -2365,14 +2409,14 @@
 
         // Drain write acknowledgements
         let FakeServerEvent::WriteResponded { value: val1, .. } =
-            event_receiver.try_recv().unwrap()
+            expect_service_event(&mut event_receiver)
         else {
             panic!("expected 1st WriteResponded");
         };
         assert!(val1.is_ok());
 
         let FakeServerEvent::WriteResponded { value: val2, .. } =
-            event_receiver.try_recv().unwrap()
+            expect_service_event(&mut event_receiver)
         else {
             panic!("expected 2nd WriteResponded");
         };
@@ -2387,8 +2431,8 @@
         let poll_result = server.next().poll_unpin(&mut noop_cx);
         assert_matches!(poll_result, Poll::Pending);
 
-        let n1 = event_receiver.try_recv().unwrap();
-        let n2 = event_receiver.try_recv().unwrap();
+        let n1 = expect_service_event(&mut event_receiver);
+        let n2 = expect_service_event(&mut event_receiver);
 
         let mut received = Vec::new();
         for event in [n1, n2] {
@@ -2412,7 +2456,7 @@
         )));
 
         // No further events pending
-        assert_matches!(event_receiver.try_recv(), Err(_));
+        expect_no_service_event(&mut event_receiver);
     }
 
     #[test]
@@ -2441,7 +2485,8 @@
         assert_eq!(opcode, MediaControlOpcode::Pause);
 
         // ATT write is acknowledged
-        let FakeServerEvent::WriteResponded { value, .. } = event_receiver.try_recv().unwrap()
+        let FakeServerEvent::WriteResponded { value, .. } =
+            expect_service_event(&mut event_receiver)
         else {
             panic!("expected WriteResponded");
         };
@@ -2472,7 +2517,7 @@
         assert_matches!(poll_result, Poll::Ready(None));
 
         let FakeServerEvent::Notified { handle, value, peers, .. } =
-            event_receiver.try_recv().unwrap()
+            expect_service_event(&mut event_receiver)
         else {
             panic!("expected Notified");
         };
@@ -2498,7 +2543,7 @@
             bt_gatt::server::NotificationType::Notify,
         );
         let _ = server.next().poll_unpin(&mut noop_cx);
-        let _ = event_receiver.try_recv();
+        expect_no_service_event(&mut event_receiver);
 
         // Negative value represents offset from end of track per MCS v1.0.1 Section
         // 3.7.1
@@ -2522,7 +2567,8 @@
         assert_eq!(peer_id, peer);
         assert_eq!(position, TrackPosition::from_raw_10ms(-500));
 
-        let FakeServerEvent::WriteResponded { value, .. } = event_receiver.try_recv().unwrap()
+        let FakeServerEvent::WriteResponded { value, .. } =
+            expect_service_event(&mut event_receiver)
         else {
             panic!("expected WriteResponded");
         };
@@ -2533,7 +2579,7 @@
         let _ = server.next().poll_unpin(&mut noop_cx);
 
         let FakeServerEvent::Notified { handle, value, peers, .. } =
-            event_receiver.try_recv().unwrap()
+            expect_service_event(&mut event_receiver)
         else {
             panic!("expected Notified");
         };
@@ -2544,7 +2590,8 @@
         // Subsequent read reflects the updated track position
         fake_gatt_server.incoming_read(peer, service_id, TRACK_POSITION_HANDLE, 0);
         let _ = server.next().poll_unpin(&mut noop_cx);
-        let FakeServerEvent::ReadResponded { value, .. } = event_receiver.try_recv().unwrap()
+        let FakeServerEvent::ReadResponded { value, .. } =
+            expect_service_event(&mut event_receiver)
         else {
             panic!("expected ReadResponded");
         };
@@ -2571,7 +2618,8 @@
             panic!("expected SetPlaybackSpeed event, got {poll_result:?}");
         };
         // ATT write is acknowledged
-        let FakeServerEvent::WriteResponded { value, .. } = event_receiver.try_recv().unwrap()
+        let FakeServerEvent::WriteResponded { value, .. } =
+            expect_service_event(&mut event_receiver)
         else {
             panic!("expected WriteResponded");
         };
@@ -2582,12 +2630,13 @@
         let poll_result = server.next().poll_unpin(&mut noop_cx);
         assert_matches!(poll_result, Poll::Pending);
         // No notification should be emitted
-        assert_matches!(event_receiver.try_recv(), Err(_));
+        expect_no_service_event(&mut event_receiver);
 
         // Playback speed remains unchanged
         fake_gatt_server.incoming_read(peer, service_id, PLAYBACK_SPEED_HANDLE, 0);
         let _ = server.next().poll_unpin(&mut noop_cx);
-        let FakeServerEvent::ReadResponded { value, .. } = event_receiver.try_recv().unwrap()
+        let FakeServerEvent::ReadResponded { value, .. } =
+            expect_service_event(&mut event_receiver)
         else {
             panic!("expected ReadResponded");
         };
@@ -2606,7 +2655,8 @@
         else {
             panic!("expected SetTrackPosition event, got {poll_result:?}");
         };
-        let FakeServerEvent::WriteResponded { value, .. } = event_receiver.try_recv().unwrap()
+        let FakeServerEvent::WriteResponded { value, .. } =
+            expect_service_event(&mut event_receiver)
         else {
             panic!("expected WriteResponded");
         };
@@ -2615,12 +2665,13 @@
         drop(responder);
         let poll_result = server.next().poll_unpin(&mut noop_cx);
         assert_matches!(poll_result, Poll::Pending);
-        assert_matches!(event_receiver.try_recv(), Err(_));
+        expect_no_service_event(&mut event_receiver);
 
         // Track position remains unavailable
         fake_gatt_server.incoming_read(peer, service_id, TRACK_POSITION_HANDLE, 0);
         let _ = server.next().poll_unpin(&mut noop_cx);
-        let FakeServerEvent::ReadResponded { value, .. } = event_receiver.try_recv().unwrap()
+        let FakeServerEvent::ReadResponded { value, .. } =
+            expect_service_event(&mut event_receiver)
         else {
             panic!("expected ReadResponded");
         };
@@ -2639,7 +2690,8 @@
         else {
             panic!("expected SetPlayingOrder event, got {poll_result:?}");
         };
-        let FakeServerEvent::WriteResponded { value, .. } = event_receiver.try_recv().unwrap()
+        let FakeServerEvent::WriteResponded { value, .. } =
+            expect_service_event(&mut event_receiver)
         else {
             panic!("expected WriteResponded");
         };
@@ -2648,12 +2700,13 @@
         drop(responder);
         let poll_result = server.next().poll_unpin(&mut noop_cx);
         assert_matches!(poll_result, Poll::Pending);
-        assert_matches!(event_receiver.try_recv(), Err(_));
+        expect_no_service_event(&mut event_receiver);
 
         // Playing order remains default InOrderOnce
         fake_gatt_server.incoming_read(peer, service_id, PLAYING_ORDER_HANDLE, 0);
         let _ = server.next().poll_unpin(&mut noop_cx);
-        let FakeServerEvent::ReadResponded { value, .. } = event_receiver.try_recv().unwrap()
+        let FakeServerEvent::ReadResponded { value, .. } =
+            expect_service_event(&mut event_receiver)
         else {
             panic!("expected ReadResponded");
         };
@@ -2677,7 +2730,8 @@
         let poll_result = server.next().poll_unpin(&mut noop_cx);
         assert_matches!(poll_result, Poll::Pending);
 
-        let FakeServerEvent::WriteResponded { value, .. } = event_receiver.try_recv().unwrap()
+        let FakeServerEvent::WriteResponded { value, .. } =
+            expect_service_event(&mut event_receiver)
         else {
             panic!("expected WriteResponded");
         };
@@ -2686,7 +2740,8 @@
         // Value remains unchanged (default InOrderOnce)
         fake_gatt_server.incoming_read(peer, service_id, PLAYING_ORDER_HANDLE, 0);
         let _ = server.next().poll_unpin(&mut noop_cx);
-        let FakeServerEvent::ReadResponded { value, .. } = event_receiver.try_recv().unwrap()
+        let FakeServerEvent::ReadResponded { value, .. } =
+            expect_service_event(&mut event_receiver)
         else {
             panic!("expected ReadResponded");
         };
@@ -2839,7 +2894,7 @@
         fake_gatt_server.incoming_read(peer, service_id, TRACK_POSITION_HANDLE, 0);
         let _ = server.next().poll_unpin(&mut noop_cx);
         let bt_gatt::test_utils::FakeServerEvent::ReadResponded { value, .. } =
-            event_receiver.try_recv().unwrap()
+            expect_service_event(&mut event_receiver)
         else {
             panic!("expected ReadResponded");
         };
