@@ -51,7 +51,7 @@ pub struct ReadmeDoctests;
5151#[ cfg( test) ]
5252mod tests {
5353 use super :: * ;
54- use std:: net:: { IpAddr , Ipv4Addr , TcpListener , UdpSocket } ;
54+ use std:: net:: { IpAddr , Ipv4Addr , Ipv6Addr , TcpListener , TcpStream , UdpSocket } ;
5555 use std:: process;
5656
5757 #[ test]
@@ -70,7 +70,7 @@ mod tests {
7070
7171 let sock = sock_info
7272 . into_iter ( )
73- . find ( |s| s. associated_pids . contains ( & pid) )
73+ . find ( |s| s. associated_pids . contains ( & pid) && s . local_port ( ) == open_port )
7474 . unwrap ( ) ;
7575
7676 assert_eq ! (
@@ -86,6 +86,38 @@ mod tests {
8686 assert_eq ! ( sock. associated_pids, vec![ pid] ) ;
8787 }
8888
89+ #[ test]
90+ fn listening_tcp_socket_ipv6_is_found ( ) {
91+ let listener = TcpListener :: bind ( "::1:0" ) . unwrap ( ) ;
92+
93+ let open_port = listener. local_addr ( ) . unwrap ( ) . port ( ) ;
94+ let pid = process:: id ( ) ;
95+
96+ let af_flags = AddressFamilyFlags :: all ( ) ;
97+ let proto_flags = ProtocolFlags :: TCP ;
98+
99+ let sock_info = get_sockets_info ( af_flags, proto_flags) . unwrap ( ) ;
100+
101+ assert ! ( !sock_info. is_empty( ) ) ;
102+
103+ let sock = sock_info
104+ . into_iter ( )
105+ . find ( |s| s. associated_pids . contains ( & pid) && s. local_port ( ) == open_port)
106+ . unwrap ( ) ;
107+
108+ assert_eq ! (
109+ sock. protocol_socket_info,
110+ ProtocolSocketInfo :: Tcp ( TcpSocketInfo {
111+ local_addr: IpAddr :: V6 ( Ipv6Addr :: LOCALHOST ) ,
112+ local_port: open_port,
113+ remote_addr: IpAddr :: V6 ( Ipv6Addr :: UNSPECIFIED ) ,
114+ remote_port: 0 ,
115+ state: TcpState :: Listen ,
116+ } )
117+ ) ;
118+ assert_eq ! ( sock. associated_pids, vec![ pid] ) ;
119+ }
120+
89121 #[ test]
90122 fn listening_udp_socket_is_found ( ) {
91123 let listener = UdpSocket :: bind ( "127.0.0.1:0" ) . unwrap ( ) ;
@@ -102,7 +134,7 @@ mod tests {
102134
103135 let sock = sock_info
104136 . into_iter ( )
105- . find ( |s| s. associated_pids . contains ( & pid) )
137+ . find ( |s| s. associated_pids . contains ( & pid) && s . local_port ( ) == open_port )
106138 . unwrap ( ) ;
107139
108140 assert_eq ! (
@@ -115,6 +147,43 @@ mod tests {
115147 assert_eq ! ( sock. associated_pids, vec![ pid] ) ;
116148 }
117149
150+ #[ test]
151+ fn listening_all_tcp_socket_is_found ( ) {
152+ let listener = TcpListener :: bind ( "127.0.0.1:0" ) . unwrap ( ) ;
153+ let _ipv6_listener = TcpListener :: bind ( "::1:0" ) . unwrap ( ) ;
154+ let _udp_listener = UdpSocket :: bind ( "127.0.0.1:0" ) . unwrap ( ) ;
155+
156+
157+ let open_port = listener. local_addr ( ) . unwrap ( ) . port ( ) ;
158+
159+ let _connection = TcpStream :: connect ( listener. local_addr ( ) . unwrap ( ) ) . unwrap ( ) ;
160+ let pid = process:: id ( ) ;
161+
162+ let af_flags = AddressFamilyFlags :: all ( ) ;
163+ let proto_flags = ProtocolFlags :: TCP | ProtocolFlags :: UDP ;
164+
165+ let sock_info = get_sockets_info ( af_flags, proto_flags) . unwrap ( ) ;
166+
167+ assert ! ( !sock_info. is_empty( ) ) ;
168+
169+ let sock = sock_info
170+ . into_iter ( )
171+ . find ( |s| s. associated_pids . contains ( & pid) && s. local_port ( ) == open_port)
172+ . unwrap ( ) ;
173+
174+ assert_eq ! (
175+ sock. protocol_socket_info,
176+ ProtocolSocketInfo :: Tcp ( TcpSocketInfo {
177+ local_addr: IpAddr :: V4 ( Ipv4Addr :: LOCALHOST ) ,
178+ local_port: open_port,
179+ remote_addr: IpAddr :: V4 ( Ipv4Addr :: new( 0 , 0 , 0 , 0 ) ) ,
180+ remote_port: 0 ,
181+ state: TcpState :: Listen ,
182+ } )
183+ ) ;
184+ assert_eq ! ( sock. associated_pids, vec![ pid] ) ;
185+ }
186+
118187 #[ test]
119188 fn result_is_ok_for_any_flags ( ) {
120189 let af_flags_combs = ( 0 ..AddressFamilyFlags :: all ( ) . bits ( ) + 1 )
0 commit comments