@@ -134,6 +134,92 @@ async fn send_to_peek_from_poll() -> std::io::Result<()> {
134134 Ok ( ( ) )
135135}
136136
137+ #[ tokio:: test]
138+ async fn peek_sender ( ) -> std:: io:: Result < ( ) > {
139+ let sender = UdpSocket :: bind ( "127.0.0.1:0" ) . await ?;
140+ let receiver = UdpSocket :: bind ( "127.0.0.1:0" ) . await ?;
141+
142+ let sender_addr = sender. local_addr ( ) ?;
143+ let receiver_addr = receiver. local_addr ( ) ?;
144+
145+ let msg = b"Hello, world!" ;
146+ sender. send_to ( msg, receiver_addr) . await ?;
147+
148+ let peeked_sender = receiver. peek_sender ( ) . await ?;
149+ assert_eq ! ( peeked_sender, sender_addr) ;
150+
151+ // Assert that `peek_sender()` returns the right sender but
152+ // doesn't remove from the receive queue.
153+ let mut recv_buf = [ 0u8 ; 32 ] ;
154+ let ( read, received_sender) = receiver. recv_from ( & mut recv_buf) . await ?;
155+
156+ assert_eq ! ( & recv_buf[ ..read] , msg) ;
157+ assert_eq ! ( received_sender, peeked_sender) ;
158+
159+ Ok ( ( ) )
160+ }
161+
162+ #[ tokio:: test]
163+ async fn poll_peek_sender ( ) -> std:: io:: Result < ( ) > {
164+ let sender = UdpSocket :: bind ( "127.0.0.1:0" ) . await ?;
165+ let receiver = UdpSocket :: bind ( "127.0.0.1:0" ) . await ?;
166+
167+ let sender_addr = sender. local_addr ( ) ?;
168+ let receiver_addr = receiver. local_addr ( ) ?;
169+
170+ let msg = b"Hello, world!" ;
171+ poll_fn ( |cx| sender. poll_send_to ( cx, msg, receiver_addr) ) . await ?;
172+
173+ let peeked_sender = poll_fn ( |cx| receiver. poll_peek_sender ( cx) ) . await ?;
174+ assert_eq ! ( peeked_sender, sender_addr) ;
175+
176+ // Assert that `poll_peek_sender()` returns the right sender but
177+ // doesn't remove from the receive queue.
178+ let mut recv_buf = [ 0u8 ; 32 ] ;
179+ let mut read = ReadBuf :: new ( & mut recv_buf) ;
180+ let received_sender = poll_fn ( |cx| receiver. poll_recv_from ( cx, & mut read) ) . await ?;
181+
182+ assert_eq ! ( read. filled( ) , msg) ;
183+ assert_eq ! ( received_sender, peeked_sender) ;
184+
185+ Ok ( ( ) )
186+ }
187+
188+ #[ tokio:: test]
189+ async fn try_peek_sender ( ) -> std:: io:: Result < ( ) > {
190+ let sender = UdpSocket :: bind ( "127.0.0.1:0" ) . await ?;
191+ let receiver = UdpSocket :: bind ( "127.0.0.1:0" ) . await ?;
192+
193+ let sender_addr = sender. local_addr ( ) ?;
194+ let receiver_addr = receiver. local_addr ( ) ?;
195+
196+ let msg = b"Hello, world!" ;
197+ sender. send_to ( msg, receiver_addr) . await ?;
198+
199+ let peeked_sender = loop {
200+ match receiver. try_peek_sender ( ) {
201+ Ok ( peeked_sender) => break peeked_sender,
202+ Err ( ref e) if e. kind ( ) == io:: ErrorKind :: WouldBlock => {
203+ receiver. readable ( ) . await ?;
204+ }
205+ Err ( e) => return Err ( e) ,
206+ }
207+ } ;
208+
209+ assert_eq ! ( peeked_sender, sender_addr) ;
210+
211+ // Assert that `try_peek_sender()` returns the right sender but
212+ // didn't remove from the receive queue.
213+ let mut recv_buf = [ 0u8 ; 32 ] ;
214+ // We already peeked the sender so there must be data in the receive queue.
215+ let ( read, received_sender) = receiver. try_recv_from ( & mut recv_buf) . unwrap ( ) ;
216+
217+ assert_eq ! ( & recv_buf[ ..read] , msg) ;
218+ assert_eq ! ( received_sender, peeked_sender) ;
219+
220+ Ok ( ( ) )
221+ }
222+
137223#[ tokio:: test]
138224async fn split ( ) -> std:: io:: Result < ( ) > {
139225 let socket = UdpSocket :: bind ( "127.0.0.1:0" ) . await ?;
0 commit comments