mod util;
mod error;
mod key;
mod crypto;
mod peer;
pub use util::*;
pub use error::{CryptoError, InvalidKeyError};
pub use key::Key;
pub use peer::Peer;
#[cfg(test)]
mod tests {
use super::*;
use std::time::Duration;
fn create_test_key() -> Key {
"5adf5e4a8a779d4cd7985a881b270bcf".parse().unwrap()
}
#[test]
fn test_peer_connect_and_disconnect() {
let key = create_test_key();
let peer1 = Peer::setup("127.0.0.1:0", "0.0.0.0:0", key).expect("failed to create peer1");
let peer2 = Peer::setup("127.0.0.1:0", "0.0.0.0:0", key).expect("failed to create peer2");
let peer2_addr = peer2.local_addr();
peer1.connect(peer2_addr).expect("failed to connect");
assert_eq!(peer1.remote_addr(), peer2_addr, "peer1 should be connected to peer2");
peer1.disconnect().expect("failed to disconnect");
assert!(peer1.remote_addr_optional().is_none(), "peer1 should be disconnected");
}
#[test]
fn test_peer_communication() {
let key = create_test_key();
let peer1 = Peer::setup("127.0.0.1:0", "0.0.0.0:0", key).expect("failed to create peer1");
let peer2 = Peer::setup("127.0.0.1:0", "0.0.0.0:0", key).expect("failed to create peer2");
assert_ne!(peer1.local_addr().port(), 0, "peer1 should be assigned a random port");
assert_ne!(peer2.local_addr().port(), 0, "peer2 should be assigned a random port");
assert!(peer1.remote_addr_optional().is_none(), "peer1 should be unconnected");
assert!(peer2.remote_addr_optional().is_none(), "peer2 should be unconnected");
let peer1_addr = peer1.local_addr();
let peer2_addr = peer2.local_addr();
peer1.connect(peer2_addr).expect("failed to connect peer1 to peer2");
peer2.connect(peer1_addr).expect("failed to connect peer2 to peer1");
assert!(peer1.remote_addr_optional().is_some(), "peer1 should be connected");
assert!(peer2.remote_addr_optional().is_some(), "peer2 should be connected");
let mut peer1_sender = peer1.clone();
let mut peer1_receiver = peer1;
let mut peer2_sender = peer2.clone();
let mut peer2_receiver = peer2;
peer1_receiver.set_read_timeout(Some(Duration::from_secs(1))).expect("failed to set timeout");
peer2_receiver.set_read_timeout(Some(Duration::from_secs(1))).expect("failed to set timeout");
let message1 = b"waves my paw haiii !! i'm peer 1 !! :D";
let message2 = b"omg hello !! i'm peer 2 !! :3c";
let mut send_buffer1 = message1.to_vec();
peer1_sender.send(&mut send_buffer1).expect("failed to send from peer1");
let mut recv_buffer2 = vec![0u8; 1024];
peer2_receiver.recv(&mut recv_buffer2).expect("failed to receive at peer2");
assert_eq!(&recv_buffer2, message1, "message from peer1 to peer2 was corrupted");
let mut send_buffer2 = message2.to_vec();
peer2_sender.send(&mut send_buffer2).expect("failed to send from peer2");
let mut recv_buffer1 = vec![0u8; 1024];
peer1_receiver.recv(&mut recv_buffer1).expect("failed to receive at peer1");
assert_eq!(&recv_buffer1, message2, "message from peer2 to peer1 was corrupted");
}
#[test]
fn test_server_client_connection_switching() {
let key = create_test_key();
let server = Peer::setup("127.0.0.1:0", "0.0.0.0:0", key).expect("failed to create server");
let client1 = Peer::setup("127.0.0.1:0", "0.0.0.0:0", key).expect("failed to create client1");
let client2 = Peer::setup("127.0.0.1:0", "0.0.0.0:0", key).expect("failed to create client2");
let server_addr = server.local_addr();
let client1_addr = client1.local_addr();
let client2_addr = client2.local_addr();
let mut server_sender = server.clone();
let mut server_receiver = server.clone();
let mut client1_sender = client1.clone();
let mut client1_receiver = client1.clone();
let mut client2_sender = client2.clone();
let mut client2_receiver = client2.clone();
server_receiver.set_read_timeout(Some(Duration::from_millis(500))).expect("failed to set timeout");
client1_receiver.set_read_timeout(Some(Duration::from_millis(500))).expect("failed to set timeout");
client2_receiver.set_read_timeout(Some(Duration::from_millis(500))).expect("failed to set timeout");
server.connect(client1_addr).expect("failed to connect server to client1");
client1.connect(server_addr).expect("failed to connect client1 to server");
assert_eq!(server.remote_addr(), client1_addr, "server should be connected to client1");
assert_eq!(client1.remote_addr(), server_addr, "client1 should be connected to server");
let server_to_client1_msg = b"hello client1 from server !! :3";
let client1_to_server_msg = b"hello server from client1 !! :3";
let mut send_buffer = server_to_client1_msg.to_vec();
server_sender.send(&mut send_buffer).expect("failed to send from server to client1");
let mut recv_buffer = vec![0u8; 1024];
client1_receiver.recv(&mut recv_buffer).expect("failed to receive at client1");
assert_eq!(&recv_buffer, server_to_client1_msg);
let mut send_buffer = client1_to_server_msg.to_vec();
client1_sender.send(&mut send_buffer).expect("failed to send from client1 to server");
let mut recv_buffer = vec![0u8; 1024];
server_receiver.recv(&mut recv_buffer).expect("failed to receive at server");
assert_eq!(&recv_buffer, client1_to_server_msg);
server.disconnect().expect("failed to disconnect server from client1");
assert!(server.remote_addr_optional().is_none());
server.connect(client2_addr).expect("failed to connect server to client2");
client2.connect(server_addr).expect("failed to connect client2 to server");
assert_eq!(server.remote_addr(), client2_addr, "server should be connected to client2");
assert_eq!(client2.remote_addr(), server_addr, "client2 should be connected to server");
let server_to_client2_msg = b"hello client2 from server !! :D";
let client2_to_server_msg = b"hello server from client2 !! :D";
let mut send_buffer = server_to_client2_msg.to_vec();
server_sender.send(&mut send_buffer).expect("failed to send from server to client2");
let mut recv_buffer = vec![0u8; 1024];
client2_receiver.recv(&mut recv_buffer).expect("failed to receive at client2");
assert_eq!(&recv_buffer, server_to_client2_msg);
let mut send_buffer = client2_to_server_msg.to_vec();
client2_sender.send(&mut send_buffer).expect("failed to send from client2 to server");
let mut recv_buffer = vec![0u8; 1024];
server_receiver.recv(&mut recv_buffer).expect("failed to receive at server from client2");
assert_eq!(&recv_buffer, client2_to_server_msg);
let mut send_buffer = b"this should not reach server".to_vec();
client1_sender.send(&mut send_buffer)
.expect("failed to send from client1 to server after disconnect, should still send, UDP is connectionless");
let mut recv_buffer = vec![0u8; 1024];
let result = server_receiver.recv(&mut recv_buffer);
assert!(result.is_err(), "server should not receive messages from disconnected client1");
assert!(can_retry(&result.unwrap_err()), "error was not a timeout");
}
}