rust/bt-mcs: Migrate off try_recv and pin futures-channel

Pin futures-channel = "=0.3.31" to match the version vendored and
pinned by Fuchsia.

`UnboundedReceiver::try_recv` does not exist in 0.3.31.

Because Cargo.lock is gitignored in this
repository, local and CI builds resolved newer versions (0.3.34) from
crates.io, masking the compilation failure that occurs when vendored
in Fuchsia.

Bug: 540400364
Test: cargo test -p bt-mcs, ./presubmit.sh
Change-Id: Ibf55456fcbd991c98c9729053d7cccaf8cf63c17
Reviewed-on: https://bluetooth-review.googlesource.com/c/bluetooth/+/3920
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");
         };