diff --git a/base/src/sys/unix/stream_channel.rs b/base/src/sys/unix/stream_channel.rs index 3a73294bba..7fe44f5f7c 100644 --- a/base/src/sys/unix/stream_channel.rs +++ b/base/src/sys/unix/stream_channel.rs @@ -181,7 +181,7 @@ mod test { } #[test] - fn test_non_blocking_pair() { + fn test_non_blocking_pair_byte() { let (mut sender, mut receiver) = StreamChannel::pair(BlockingMode::Nonblocking, FramingMode::Byte).unwrap(); @@ -220,6 +220,43 @@ mod test { ); } + #[test] + fn test_non_blocking_pair_message() { + let (mut sender, mut receiver) = + StreamChannel::pair(BlockingMode::Nonblocking, FramingMode::Message).unwrap(); + + sender.write_all(&[75, 77, 54, 82, 76, 65]).unwrap(); + + // Wait for the data to arrive. + let event_ctx: EventContext = + EventContext::build_with(&[(receiver.get_read_notifier(), Token::ReceivedData)]) + .unwrap(); + let events = event_ctx.wait().unwrap(); + let tokens: Vec = events + .iter() + .filter(|e| e.is_readable) + .map(|e| e.token) + .collect(); + assert_eq!(tokens, vec! {Token::ReceivedData}); + + // Unlike Byte format, Message mode panics if the buffer is smaller than the packet size; + // make the buffer the right size. + let mut recv_buffer: [u8; 6] = [0; 6]; + + let size = receiver.read(&mut recv_buffer).unwrap(); + assert_eq!(size, 6); + assert_eq!(recv_buffer, [75, 77, 54, 82, 76, 65]); + + // Now that we've polled for & received all data, polling again should show no events. + assert_eq!( + event_ctx + .wait_timeout(std::time::Duration::new(0, 0)) + .unwrap() + .len(), + 0 + ); + } + #[test] fn test_non_blocking_pair_error_no_data() { let (mut sender, mut receiver) =