Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Refactor UDP Test Utils to be more flexible #50

Merged
merged 1 commit into from
May 11, 2020
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
48 changes: 26 additions & 22 deletions src/server/server.rs
Original file line number Diff line number Diff line change
Expand Up @@ -294,7 +294,7 @@ mod tests {
use crate::config::{Config, ConnectionConfig, EndPoint, Local};
use crate::extensions::default_filters;
use crate::server::sessions::{Packet, SESSION_TIMEOUT_SECONDS};
use crate::test_utils::{assert_recv_udp, ephemeral_socket, logger, recv_socket_done};
use crate::test_utils::{ephemeral_socket, logger, recv_udp, recv_udp_done};

use super::*;

Expand All @@ -311,8 +311,8 @@ mod tests {

let (recv1, mut send) = socket1.split();
let (recv2, _) = socket2.split();
let (done1, wait1) = oneshot::channel::<()>();
let (done2, wait2) = oneshot::channel::<()>();
let (done1, wait1) = oneshot::channel::<String>();
let (done2, wait2) = oneshot::channel::<String>();

let config = Arc::new(Config {
local: Local {
Expand Down Expand Up @@ -340,11 +340,12 @@ mod tests {
server.run(config, stop).await.unwrap();
});

recv_socket_done(recv1, done1);
recv_socket_done(recv2, done2);
send.send_to("hello".as_bytes(), &local_addr).await.unwrap();
wait1.await.unwrap();
wait2.await.unwrap();
let msg = "hello";
recv_udp_done(recv1, done1);
recv_udp_done(recv2, done2);
send.send_to(msg.as_bytes(), &local_addr).await.unwrap();
assert_eq!(msg, wait1.await.unwrap());
assert_eq!(msg, wait2.await.unwrap());
close.send(()).unwrap();
}

Expand All @@ -356,7 +357,7 @@ mod tests {
let endpoint_addr = socket.local_addr().unwrap();
let (recv, mut send) = socket.split();
let local_addr = SocketAddr::new(IpAddr::V4(Ipv4Addr::new(0, 0, 0, 0)), 12357);
let (done, wait) = oneshot::channel::<()>();
let (done, wait) = oneshot::channel::<String>();
let config = Arc::new(Config {
local: Local {
port: local_addr.port(),
Expand All @@ -373,9 +374,10 @@ mod tests {
server.run(config, stop).await.unwrap();
});

recv_socket_done(recv, done);
send.send_to("hello".as_bytes(), &local_addr).await.unwrap();
wait.await.unwrap();
let msg = "hello";
recv_udp_done(recv, done);
send.send_to(msg.as_bytes(), &local_addr).await.unwrap();
assert_eq!(msg, wait.await.unwrap());

close.send(()).unwrap();
}
Expand All @@ -401,7 +403,8 @@ mod tests {
time::pause();

let log = logger();
let (local_addr, wait) = assert_recv_udp().await;
let msg = "hello";
let (local_addr, wait) = recv_udp().await;

let config = Arc::new(Config {
local: Local { port: 0 },
Expand Down Expand Up @@ -438,7 +441,7 @@ mod tests {
.await
.unwrap();

wait.await.unwrap();
assert_eq!(msg, wait.await.unwrap());
recv_packets.close();

let map = sessions.read().await;
Expand Down Expand Up @@ -466,8 +469,9 @@ mod tests {
#[tokio::test]
async fn run_recv_from() {
let log = logger();
let msg = "hello";
let server = Server::new(log.clone(), default_filters(&log));
let (local_addr, wait) = assert_recv_udp().await;
let (local_addr, wait) = recv_udp().await;
let config = Arc::new(Config {
local: Local { port: 0 },
filters: vec![],
Expand All @@ -484,9 +488,8 @@ mod tests {

server.run_recv_from(config, recv, &sessions, send_packets);

send.send_to("hello".as_bytes(), &addr).await.unwrap();

wait.await.unwrap();
send.send_to(msg.as_bytes(), &addr).await.unwrap();
assert_eq!(msg, wait.await.unwrap());
recv_packets.close();
}

Expand Down Expand Up @@ -522,22 +525,23 @@ mod tests {
let server = Server::new(logger(), FilterRegistry::new());
let socket = ephemeral_socket().await;
let local_addr = socket.local_addr().unwrap();
let msg = "hello";

let (recv_socket, send_socket) = socket.split();
let (mut send_packet, recv_packet) = mpsc::channel::<Packet>(5);
let (done, wait) = oneshot::channel::<()>();
let (done, wait) = oneshot::channel::<String>();

recv_socket_done(recv_socket, done);
recv_udp_done(recv_socket, done);

if let Err(err) = send_packet
.send(Packet::new(local_addr, String::from("hello").into_bytes()))
.send(Packet::new(local_addr, msg.as_bytes().to_vec()))
.await
{
assert!(false, err)
}

server.run_receive_packet(send_socket, recv_packet);
wait.await.unwrap();
assert_eq!(msg, wait.await.unwrap());
}

#[tokio::test]
Expand Down
9 changes: 5 additions & 4 deletions src/server/sessions.rs
Original file line number Diff line number Diff line change
Expand Up @@ -202,7 +202,7 @@ mod tests {
use tokio::time;
use tokio::time::delay_for;

use crate::test_utils::{assert_recv_udp, ephemeral_socket, logger};
use crate::test_utils::{ephemeral_socket, logger, recv_udp};

use super::*;

Expand Down Expand Up @@ -260,14 +260,15 @@ mod tests {
#[tokio::test]
async fn session_send_to() {
let log = logger();
let msg = "hello";
let (sender, _) = mpsc::channel::<Packet>(1);
let (local_addr, wait) = assert_recv_udp().await;
let (local_addr, wait) = recv_udp().await;

let mut session = Session::new(&log, local_addr, local_addr, sender)
.await
.unwrap();
session.send_to("hello".as_bytes()).await.unwrap();
wait.await.unwrap();
session.send_to(msg.as_bytes()).await.unwrap();
assert_eq!(msg, wait.await.unwrap());
}

#[tokio::test]
Expand Down
19 changes: 9 additions & 10 deletions src/test_utils.rs
Original file line number Diff line number Diff line change
Expand Up @@ -32,15 +32,14 @@ pub fn logger() -> Logger {
Logger::root(drain, o!())
}

/// assert_recv_udp asserts that the returned SockerAddr received a UDP packet
/// with the contents of "hello"
/// call wait.await.unwrap() to see if the message was received
pub async fn assert_recv_udp() -> (SocketAddr, oneshot::Receiver<()>) {
/// recv_udp waits for a UDP packet to be received on SocketAddr, and sends
/// that value to the oneshot channel so it can be tested.
pub async fn recv_udp() -> (SocketAddr, oneshot::Receiver<String>) {
let socket = ephemeral_socket().await;
let local_addr = socket.local_addr().unwrap();
let (recv, _) = socket.split();
let (done, wait) = oneshot::channel::<()>();
recv_socket_done(recv, done);
let (done, wait) = oneshot::channel::<String>();
recv_udp_done(recv, done);
(local_addr, wait)
}

Expand All @@ -50,12 +49,12 @@ pub async fn ephemeral_socket() -> UdpSocket {
UdpSocket::bind(addr).await.unwrap()
}

/// recv_socket_done will send a value to done when receiving the "hello" UDP packet.
pub fn recv_socket_done(mut recv: RecvHalf, done: oneshot::Sender<()>) {
/// recv_udp_done will send the String value of the receiving UDP packet to the passed in oneshot channel.
pub fn recv_udp_done(mut recv: RecvHalf, done: oneshot::Sender<String>) {
tokio::spawn(async move {
let mut buf = vec![0; 1024];
let size = recv.recv(&mut buf).await.unwrap();
assert_eq!("hello", from_utf8(&buf[..size]).unwrap());
done.send(()).unwrap();
done.send(from_utf8(&buf[..size]).unwrap().to_string())
.unwrap();
});
}
13 changes: 7 additions & 6 deletions tests/no_filter.rs
Original file line number Diff line number Diff line change
Expand Up @@ -24,12 +24,12 @@ mod tests {

use tokio::select;
use tokio::sync::{mpsc, oneshot};
use tokio::time::{delay_for, Duration};

use quilkin::config::{Config, ConnectionConfig, EndPoint, Local};
use quilkin::extensions::default_filters;
use quilkin::server::Server;
use quilkin::test_utils::{ephemeral_socket, logger, recv_socket_done};
use tokio::time::{delay_for, Duration};
use quilkin::test_utils::{ephemeral_socket, logger, recv_udp_done};

#[tokio::test]
async fn echo() {
Expand Down Expand Up @@ -126,10 +126,11 @@ mod tests {
async fn test_echo_server() {
let echo_addr = echo_server().await;
let (recv, mut send) = ephemeral_socket().await.split();
let (done, wait) = oneshot::channel::<()>();
recv_socket_done(recv, done);
send.send_to("hello".as_bytes(), &echo_addr).await.unwrap();
wait.await.unwrap();
let (done, wait) = oneshot::channel::<String>();
let msg = "hello";
recv_udp_done(recv, done);
send.send_to(msg.as_bytes(), &echo_addr).await.unwrap();
assert_eq!(msg, wait.await.unwrap());
}

async fn echo_server() -> SocketAddr {
Expand Down