Skip to content

Commit

Permalink
Merge pull request #11 from quackitsquinn/os-port-allocation
Browse files Browse the repository at this point in the history
Have tests use socket 0 for port allocation
  • Loading branch information
quackitsquinn authored May 19, 2024
2 parents c9db5bf + b0dde40 commit 857cc0b
Show file tree
Hide file tree
Showing 2 changed files with 7 additions and 49 deletions.
50 changes: 3 additions & 47 deletions lazuli_core/src/client/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -24,65 +24,21 @@ mod test_utils {
use self::server::Server;

use super::*;
static PORTS_BASE: u16 = 5000;
static PORT_ACTIVE_BASE: Mutex<u16> = Mutex::new(PORTS_BASE);

fn addr_in_use(addr: SocketAddr) -> bool {
use std::net::TcpListener;
TcpListener::bind(addr).is_err()
}

pub(super) fn get_socket_addr() -> SocketAddr {
let mut port = *PORT_ACTIVE_BASE.lock().unwrap();
let addr = SocketAddr::new(IpAddr::V4(Ipv4Addr::LOCALHOST), port);
while addr_in_use(addr) {
debug!("Port {} is in use, trying next port.", port);
port += 1;
}
*PORT_ACTIVE_BASE.lock().unwrap() = port + 1;
addr
}

/// Creates a client and server pair.
/// (client, server)
pub(super) fn make_client_server_pair() -> (Client, Client) {
use std::net::TcpListener;
let server = TcpListener::bind((Ipv4Addr::LOCALHOST, *PORT_ACTIVE_BASE.lock().unwrap()));

*PORT_ACTIVE_BASE.lock().unwrap() += 1;

if let Err(e) = server {
// If the port is in use, try again.
if e.kind() == std::io::ErrorKind::AddrInUse {
return make_client_server_pair();
} else {
panic!("Failed to bind server: {}", e);
}
}

let server = server.unwrap();
let server = TcpListener::bind((Ipv4Addr::LOCALHOST, 0)).expect("Failed to create server!");

let client = Client::connect(server.local_addr().unwrap()).unwrap();
let server = server.accept().unwrap().0;

(client, Client::from_stream(server))
}

/// Creates a Server. Expects the OS to assign a port.
pub(super) fn make_server() -> Server {
let server = Server::new((Ipv4Addr::LOCALHOST, *PORT_ACTIVE_BASE.lock().unwrap()));

if let Err(e) = server {
// If the port is in use, try again.
if e.kind() == std::io::ErrorKind::AddrInUse {
return make_server();
} else {
panic!("Failed to bind server: {}", e);
}
}

*PORT_ACTIVE_BASE.lock().unwrap() += 1;

server.unwrap()
Server::new((Ipv4Addr::LOCALHOST, 0)).expect("Failed to create server!")
}

/// Tests sending and receiving data. Convenience function for testing.
Expand Down
6 changes: 4 additions & 2 deletions lazuli_core/src/client/server.rs
Original file line number Diff line number Diff line change
Expand Up @@ -74,7 +74,9 @@ impl Server {

#[cfg(test)]
mod test {
use crate::client::test_utils::{get_socket_addr, make_server, test_send_recv};
use std::net::Ipv4Addr;

use crate::client::test_utils::{make_server, test_send_recv};

use super::*;

Expand Down Expand Up @@ -114,7 +116,7 @@ mod test {
}
#[test]
fn test_nonblocking_server() -> Result<()> {
let mut server = Server::new_nonblocking(get_socket_addr())?;
let mut server = Server::new_nonblocking((Ipv4Addr::LOCALHOST, 0))?;
assert!(server.accept().is_err());
if let Err(e) = server.accept() {
assert_eq!(e.kind(), std::io::ErrorKind::WouldBlock);
Expand Down

0 comments on commit 857cc0b

Please sign in to comment.