|
@@ -603,6 +603,7 @@ pub fn bind_more_with_config(
|
|
|
mod tests {
|
|
mod tests {
|
|
|
use {
|
|
use {
|
|
|
super::*,
|
|
super::*,
|
|
|
|
|
+ crate::sockets::unique_port_range_for_tests,
|
|
|
ip_echo_server::IpEchoServerResponse,
|
|
ip_echo_server::IpEchoServerResponse,
|
|
|
itertools::Itertools,
|
|
itertools::Itertools,
|
|
|
std::{net::Ipv4Addr, time::Duration},
|
|
std::{net::Ipv4Addr, time::Duration},
|
|
@@ -748,14 +749,16 @@ mod tests {
|
|
|
#[test]
|
|
#[test]
|
|
|
fn test_bind_in_range_nil() {
|
|
fn test_bind_in_range_nil() {
|
|
|
let ip_addr = IpAddr::V4(Ipv4Addr::UNSPECIFIED);
|
|
let ip_addr = IpAddr::V4(Ipv4Addr::UNSPECIFIED);
|
|
|
- bind_in_range(ip_addr, (2000, 2000)).unwrap_err();
|
|
|
|
|
- bind_in_range(ip_addr, (2000, 1999)).unwrap_err();
|
|
|
|
|
|
|
+ let range = sockets::unique_port_range_for_tests(2);
|
|
|
|
|
+ bind_in_range(ip_addr, (range.end, range.end)).unwrap_err();
|
|
|
|
|
+ bind_in_range(ip_addr, (range.end, range.start)).unwrap_err();
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
#[test]
|
|
#[test]
|
|
|
fn test_find_available_port_in_range() {
|
|
fn test_find_available_port_in_range() {
|
|
|
let ip_addr = IpAddr::V4(Ipv4Addr::LOCALHOST);
|
|
let ip_addr = IpAddr::V4(Ipv4Addr::LOCALHOST);
|
|
|
- let (pr_s, pr_e) = sockets::localhost_port_range_for_tests();
|
|
|
|
|
|
|
+ let range = sockets::unique_port_range_for_tests(4);
|
|
|
|
|
+ let (pr_s, pr_e) = (range.start, range.end);
|
|
|
assert_eq!(
|
|
assert_eq!(
|
|
|
find_available_port_in_range(ip_addr, (pr_s, pr_s + 1)).unwrap(),
|
|
find_available_port_in_range(ip_addr, (pr_s, pr_s + 1)).unwrap(),
|
|
|
pr_s
|
|
pr_s
|
|
@@ -784,12 +787,11 @@ mod tests {
|
|
|
#[test]
|
|
#[test]
|
|
|
fn test_bind_common_in_range() {
|
|
fn test_bind_common_in_range() {
|
|
|
let ip_addr = IpAddr::V4(Ipv4Addr::LOCALHOST);
|
|
let ip_addr = IpAddr::V4(Ipv4Addr::LOCALHOST);
|
|
|
- let (pr_s, pr_e) = sockets::localhost_port_range_for_tests();
|
|
|
|
|
|
|
+ let range = sockets::unique_port_range_for_tests(5);
|
|
|
let config = SocketConfig::default();
|
|
let config = SocketConfig::default();
|
|
|
let (port, _sockets) =
|
|
let (port, _sockets) =
|
|
|
- bind_common_in_range_with_config(ip_addr, (pr_s, pr_e), config).unwrap();
|
|
|
|
|
- assert!((pr_s..pr_e).contains(&port));
|
|
|
|
|
-
|
|
|
|
|
|
|
+ bind_common_in_range_with_config(ip_addr, (range.start, range.end), config).unwrap();
|
|
|
|
|
+ assert!(range.contains(&port));
|
|
|
bind_common_in_range_with_config(ip_addr, (port, port + 1), config).unwrap_err();
|
|
bind_common_in_range_with_config(ip_addr, (port, port + 1), config).unwrap_err();
|
|
|
}
|
|
}
|
|
|
|
|
|
|
@@ -889,16 +891,18 @@ mod tests {
|
|
|
fn test_verify_ports_udp_unreachable() {
|
|
fn test_verify_ports_udp_unreachable() {
|
|
|
solana_logger::setup();
|
|
solana_logger::setup();
|
|
|
let ip_addr = IpAddr::V4(Ipv4Addr::LOCALHOST);
|
|
let ip_addr = IpAddr::V4(Ipv4Addr::LOCALHOST);
|
|
|
- let port_range = sockets::localhost_port_range_for_tests();
|
|
|
|
|
|
|
+ let port_range = unique_port_range_for_tests(2);
|
|
|
let config = SocketConfig::default();
|
|
let config = SocketConfig::default();
|
|
|
let (_server_port, (server_udp_socket, _server_tcp_listener)) =
|
|
let (_server_port, (server_udp_socket, _server_tcp_listener)) =
|
|
|
- bind_common_in_range_with_config(ip_addr, port_range, config).unwrap();
|
|
|
|
|
|
|
+ bind_common_in_range_with_config(ip_addr, (port_range.start, port_range.end), config)
|
|
|
|
|
+ .unwrap();
|
|
|
|
|
|
|
|
// make the socket unreachable by not running the ip echo server!
|
|
// make the socket unreachable by not running the ip echo server!
|
|
|
let server_ip_echo_addr = server_udp_socket.local_addr().unwrap();
|
|
let server_ip_echo_addr = server_udp_socket.local_addr().unwrap();
|
|
|
|
|
|
|
|
let (_correct_client_port, (client_udp_socket, _client_tcp_listener)) =
|
|
let (_correct_client_port, (client_udp_socket, _client_tcp_listener)) =
|
|
|
- bind_common_in_range_with_config(ip_addr, port_range, config).unwrap();
|
|
|
|
|
|
|
+ bind_common_in_range_with_config(ip_addr, (port_range.start, port_range.end), config)
|
|
|
|
|
+ .unwrap();
|
|
|
|
|
|
|
|
let rt = runtime();
|
|
let rt = runtime();
|
|
|
assert!(!rt.block_on(ip_echo_client::verify_all_reachable_udp(
|
|
assert!(!rt.block_on(ip_echo_client::verify_all_reachable_udp(
|
|
@@ -917,13 +921,16 @@ mod tests {
|
|
|
let mut tcp_listeners = vec![];
|
|
let mut tcp_listeners = vec![];
|
|
|
let mut udp_sockets = vec![];
|
|
let mut udp_sockets = vec![];
|
|
|
|
|
|
|
|
|
|
+ let port_range = unique_port_range_for_tests(1);
|
|
|
let (_server_port, (_, server_tcp_listener)) =
|
|
let (_server_port, (_, server_tcp_listener)) =
|
|
|
- bind_common_in_range_with_config(ip_addr, (2200, 2300), config).unwrap();
|
|
|
|
|
|
|
+ bind_common_in_range_with_config(ip_addr, (port_range.start, port_range.end), config)
|
|
|
|
|
+ .unwrap();
|
|
|
for _ in 0..MAX_PORT_VERIFY_THREADS * 2 {
|
|
for _ in 0..MAX_PORT_VERIFY_THREADS * 2 {
|
|
|
|
|
+ let port_range = unique_port_range_for_tests(1);
|
|
|
let (_client_port, (client_udp_socket, client_tcp_listener)) =
|
|
let (_client_port, (client_udp_socket, client_tcp_listener)) =
|
|
|
bind_common_in_range_with_config(
|
|
bind_common_in_range_with_config(
|
|
|
ip_addr,
|
|
ip_addr,
|
|
|
- (2300, 2300 + (MAX_PORT_VERIFY_THREADS * 3) as u16),
|
|
|
|
|
|
|
+ (port_range.start, port_range.end),
|
|
|
config,
|
|
config,
|
|
|
)
|
|
)
|
|
|
.unwrap();
|
|
.unwrap();
|
|
@@ -961,18 +968,24 @@ mod tests {
|
|
|
solana_logger::setup();
|
|
solana_logger::setup();
|
|
|
let ip_addr = IpAddr::V4(Ipv4Addr::UNSPECIFIED);
|
|
let ip_addr = IpAddr::V4(Ipv4Addr::UNSPECIFIED);
|
|
|
let offset = 6;
|
|
let offset = 6;
|
|
|
|
|
+ let port_range = unique_port_range_for_tests(10);
|
|
|
if let Ok(((port1, _), (port2, _))) =
|
|
if let Ok(((port1, _), (port2, _))) =
|
|
|
- bind_two_in_range_with_offset(ip_addr, (1024, 65535), offset)
|
|
|
|
|
|
|
+ bind_two_in_range_with_offset(ip_addr, (port_range.start, port_range.end), offset)
|
|
|
{
|
|
{
|
|
|
assert!(port2 == port1 + offset);
|
|
assert!(port2 == port1 + offset);
|
|
|
}
|
|
}
|
|
|
- let offset = 42;
|
|
|
|
|
|
|
+ let offset = 7;
|
|
|
if let Ok(((port1, _), (port2, _))) =
|
|
if let Ok(((port1, _), (port2, _))) =
|
|
|
- bind_two_in_range_with_offset(ip_addr, (1024, 65535), offset)
|
|
|
|
|
|
|
+ bind_two_in_range_with_offset(ip_addr, (port_range.start, port_range.end), offset)
|
|
|
{
|
|
{
|
|
|
assert!(port2 == port1 + offset);
|
|
assert!(port2 == port1 + offset);
|
|
|
}
|
|
}
|
|
|
- assert!(bind_two_in_range_with_offset(ip_addr, (1024, 1044), offset).is_err());
|
|
|
|
|
|
|
+ assert!(bind_two_in_range_with_offset(
|
|
|
|
|
+ ip_addr,
|
|
|
|
|
+ (port_range.start, port_range.start + 5),
|
|
|
|
|
+ offset
|
|
|
|
|
+ )
|
|
|
|
|
+ .is_err());
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
#[test]
|
|
#[test]
|
|
@@ -980,7 +993,9 @@ mod tests {
|
|
|
let ip_addr: IpAddr = IpAddr::V4(Ipv4Addr::LOCALHOST);
|
|
let ip_addr: IpAddr = IpAddr::V4(Ipv4Addr::LOCALHOST);
|
|
|
let config = SocketConfig::default(); //reuseport is false by default
|
|
let config = SocketConfig::default(); //reuseport is false by default
|
|
|
|
|
|
|
|
- let result = multi_bind_in_range_with_config(ip_addr, (2010, 2110), config, 2);
|
|
|
|
|
|
|
+ let port_range = unique_port_range_for_tests(3);
|
|
|
|
|
+ let result =
|
|
|
|
|
+ multi_bind_in_range_with_config(ip_addr, (port_range.start, port_range.end), config, 2);
|
|
|
|
|
|
|
|
assert!(
|
|
assert!(
|
|
|
result.is_err(),
|
|
result.is_err(),
|
|
@@ -995,9 +1010,10 @@ mod tests {
|
|
|
let ip_a = IpAddr::V4(Ipv4Addr::LOCALHOST);
|
|
let ip_a = IpAddr::V4(Ipv4Addr::LOCALHOST);
|
|
|
let ip_b = IpAddr::V4(Ipv4Addr::new(127, 0, 0, 2));
|
|
let ip_b = IpAddr::V4(Ipv4Addr::new(127, 0, 0, 2));
|
|
|
|
|
|
|
|
- let server_ports = sockets::localhost_port_range_for_tests();
|
|
|
|
|
|
|
+ let port_range = sockets::localhost_port_range_for_tests();
|
|
|
|
|
+
|
|
|
let (_srv_udp_port, (srv_udp_sock, srv_tcp_listener)) =
|
|
let (_srv_udp_port, (srv_udp_sock, srv_tcp_listener)) =
|
|
|
- bind_common_in_range_with_config(ip_a, server_ports, config).unwrap();
|
|
|
|
|
|
|
+ bind_common_in_range_with_config(ip_a, port_range, config).unwrap();
|
|
|
|
|
|
|
|
let ip_echo_server_addr = srv_udp_sock.local_addr().unwrap();
|
|
let ip_echo_server_addr = srv_udp_sock.local_addr().unwrap();
|
|
|
let _runtime = ip_echo_server(
|
|
let _runtime = ip_echo_server(
|
|
@@ -1007,18 +1023,10 @@ mod tests {
|
|
|
);
|
|
);
|
|
|
|
|
|
|
|
let mut udp_sockets = Vec::new();
|
|
let mut udp_sockets = Vec::new();
|
|
|
- let (_p1, (sock_a, _tl_a)) = bind_common_in_range_with_config(
|
|
|
|
|
- ip_a,
|
|
|
|
|
- sockets::localhost_port_range_for_tests(),
|
|
|
|
|
- config,
|
|
|
|
|
- )
|
|
|
|
|
- .unwrap();
|
|
|
|
|
- let (_p2, (sock_b, _tl_b)) = bind_common_in_range_with_config(
|
|
|
|
|
- ip_b,
|
|
|
|
|
- sockets::localhost_port_range_for_tests(),
|
|
|
|
|
- config,
|
|
|
|
|
- )
|
|
|
|
|
- .unwrap();
|
|
|
|
|
|
|
+ let (_p1, (sock_a, _tl_a)) =
|
|
|
|
|
+ bind_common_in_range_with_config(ip_a, port_range, config).unwrap();
|
|
|
|
|
+ let (_p2, (sock_b, _tl_b)) =
|
|
|
|
|
+ bind_common_in_range_with_config(ip_b, port_range, config).unwrap();
|
|
|
|
|
|
|
|
udp_sockets.push(sock_a);
|
|
udp_sockets.push(sock_a);
|
|
|
udp_sockets.push(sock_b);
|
|
udp_sockets.push(sock_b);
|