Skip to content

Commit 416f011

Browse files
committed
Also test IPv6 & getting both proto_flags
1 parent 7c7cd1a commit 416f011

File tree

1 file changed

+72
-3
lines changed

1 file changed

+72
-3
lines changed

src/lib.rs

Lines changed: 72 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -51,7 +51,7 @@ pub struct ReadmeDoctests;
5151
#[cfg(test)]
5252
mod 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

Comments
 (0)