@@ -1007,3 +1007,101 @@ fn socket_to_nonexistent_node() -> Result {
10071007 } ) ;
10081008 sim. run ( )
10091009}
1010+
1011+ #[ test]
1012+ fn try_recv_not_connected ( ) -> Result {
1013+ let mut sim = Builder :: new ( ) . build ( ) ;
1014+
1015+ sim. client ( "server1" , async move {
1016+ let sock = UdpSocket :: bind ( ( Ipv4Addr :: UNSPECIFIED , 1234 ) ) . await ?;
1017+
1018+ sock. readable ( ) . await ?;
1019+
1020+ let mut buf = [ 0 ; 3 ] ;
1021+
1022+ // When not connected try_recv takes any incoming Datagram.
1023+ let x = sock. try_recv ( & mut buf) ?;
1024+
1025+ assert_eq ! ( x, 3 ) ;
1026+ assert_eq ! ( buf, [ 1 , 2 , 3 ] ) ;
1027+
1028+ Ok ( ( ) )
1029+ } ) ;
1030+
1031+ sim. client ( "server2" , async move {
1032+ let sock = UdpSocket :: bind ( ( Ipv4Addr :: UNSPECIFIED , 5678 ) ) . await ?;
1033+
1034+ sock. send_to ( & [ 1 , 2 , 3 ] , ( "server1" , 1234 ) ) . await ?;
1035+
1036+ Ok ( ( ) )
1037+ } ) ;
1038+
1039+ sim. run ( )
1040+ }
1041+
1042+ #[ test]
1043+ fn try_recv_connected ( ) -> Result {
1044+ let mut sim = Builder :: new ( ) . build ( ) ;
1045+
1046+ sim. client ( "server1" , async move {
1047+ let sock = UdpSocket :: bind ( ( Ipv4Addr :: UNSPECIFIED , 1234 ) ) . await ?;
1048+
1049+ sock. connect ( ( "server2" , 5678 ) ) . await ;
1050+
1051+ sock. readable ( ) . await ?;
1052+
1053+ let mut buf = [ 0 ; 3 ] ;
1054+
1055+ let x = sock. try_recv ( & mut buf) ?;
1056+
1057+ assert_eq ! ( x, 3 ) ;
1058+ assert_eq ! ( buf, [ 1 , 2 , 3 ] ) ;
1059+
1060+ Ok ( ( ) )
1061+ } ) ;
1062+
1063+ sim. client ( "server2" , async move {
1064+ let sock = UdpSocket :: bind ( ( Ipv4Addr :: UNSPECIFIED , 5678 ) ) . await ?;
1065+
1066+ sock. send_to ( & [ 1 , 2 , 3 ] , ( "server1" , 1234 ) ) . await ?;
1067+
1068+ Ok ( ( ) )
1069+ } ) ;
1070+
1071+ sim. run ( )
1072+ }
1073+
1074+ #[ test]
1075+ fn try_recv_connected_wrong_host ( ) -> Result {
1076+ let mut sim = Builder :: new ( ) . build ( ) ;
1077+
1078+ sim. client ( "server1" , async move {
1079+ let sock = UdpSocket :: bind ( ( Ipv4Addr :: UNSPECIFIED , 1234 ) ) . await ?;
1080+
1081+ // Connect to server3, which doesn't send anything.
1082+ sock. connect ( ( "server3" , 6781 ) ) . await ;
1083+
1084+ // Datagram from server2 is filtered so sock never becomes readable.
1085+ tokio:: time:: timeout ( Duration :: from_secs ( 5 ) , sock. readable ( ) )
1086+ . await
1087+ . unwrap_err ( ) ;
1088+
1089+ Ok ( ( ) )
1090+ } ) ;
1091+
1092+ sim. client ( "server2" , async move {
1093+ let sock = UdpSocket :: bind ( ( Ipv4Addr :: UNSPECIFIED , 5678 ) ) . await ?;
1094+
1095+ sock. send_to ( & [ 1 , 2 , 9 ] , ( "server1" , 1234 ) ) . await ?;
1096+
1097+ Ok ( ( ) )
1098+ } ) ;
1099+
1100+ sim. client ( "server3" , async move {
1101+ _ = UdpSocket :: bind ( ( Ipv4Addr :: UNSPECIFIED , 6789 ) ) . await ?;
1102+
1103+ Ok ( ( ) )
1104+ } ) ;
1105+
1106+ sim. run ( )
1107+ }
0 commit comments