mod common;
use std::{
sync::{
atomic::{AtomicBool, Ordering},
Arc,
},
time::Duration,
};
use deadline::deadline;
use quickie::*;
use tokio::time::timeout;
#[tokio::test]
#[should_panic]
async fn conns_double_none_config() {
let _node = common::TestNode(Node::new(Config::new(None, None)));
}
#[tokio::test]
async fn conns_server_only() {
let (client_cfg, server_cfg) = common::client_and_server_config();
let node = common::TestNode(Node::new(Config::new(None, Some(server_cfg.clone()))));
let node_addr = node.start("127.0.0.1:0".parse().unwrap()).await.unwrap();
let raw_endpoint = common::raw_endpoint(client_cfg, server_cfg);
let raw_endpoint_addr = raw_endpoint.local_addr().unwrap();
assert!(node
.connect(raw_endpoint_addr, common::SERVER_NAME)
.await
.is_err());
assert!(raw_endpoint
.connect(node_addr, common::SERVER_NAME)
.unwrap()
.await
.is_ok());
let node_clone = node.clone();
deadline!(Duration::from_secs(1), move || node_clone.num_connections()
== 1);
let conn_id = node.get_connections().pop().unwrap().stable_id();
assert!(node.disconnect(conn_id, Default::default(), &[0]).await);
assert!(node.get_connection(conn_id).is_none());
}
#[tokio::test]
async fn conns_client_only() {
let (client_cfg, server_cfg) = common::client_and_server_config();
let node = common::TestNode(Node::new(Config::new(Some(client_cfg.clone()), None)));
let node_addr = node.start("127.0.0.1:0".parse().unwrap()).await.unwrap();
let raw_endpoint = common::raw_endpoint(client_cfg, server_cfg);
let raw_endpoint_addr = raw_endpoint.local_addr().unwrap();
assert!(timeout(
Duration::from_millis(50),
raw_endpoint
.connect(node_addr, common::SERVER_NAME)
.unwrap()
)
.await
.is_err());
let conn_success_flag: Arc<AtomicBool> = Default::default();
let flag = conn_success_flag.clone();
tokio::spawn(async move {
if let Some(conn) = raw_endpoint.accept().await {
conn.await.unwrap();
flag.store(true, Ordering::Relaxed);
}
});
let conn_id = node
.connect(raw_endpoint_addr, common::SERVER_NAME)
.await
.unwrap();
assert!(conn_success_flag.load(Ordering::Relaxed));
assert!(node.disconnect(conn_id, Default::default(), &[0]).await);
assert!(node.get_connection(conn_id).is_none());
}
#[tokio::test]
async fn conns_client_plus_server() {
let (client_cfg, server_cfg) = common::client_and_server_config();
let node = common::TestNode(Node::new(Config::new(
Some(client_cfg.clone()),
Some(server_cfg.clone()),
)));
let node_addr = node.start("127.0.0.1:0".parse().unwrap()).await.unwrap();
let raw_endpoint = common::raw_endpoint(client_cfg, server_cfg);
let raw_endpoint_addr = raw_endpoint.local_addr().unwrap();
assert!(raw_endpoint
.connect(node_addr, common::SERVER_NAME)
.unwrap()
.await
.is_ok());
let conn_success_flag: Arc<AtomicBool> = Default::default();
let flag = conn_success_flag.clone();
tokio::spawn(async move {
if let Some(conn) = raw_endpoint.accept().await {
conn.await.unwrap();
flag.store(true, Ordering::Relaxed);
}
});
let conn_id = node
.connect(raw_endpoint_addr, common::SERVER_NAME)
.await
.unwrap();
assert!(conn_success_flag.load(Ordering::Relaxed));
assert!(node.disconnect(conn_id, Default::default(), &[0]).await);
assert!(node.get_connection(conn_id).is_none());
let node_clone = node.clone();
deadline!(Duration::from_secs(1), move || node_clone.num_connections()
== 1);
let conn_id = node.get_connections().pop().unwrap().stable_id();
assert!(node.disconnect(conn_id, Default::default(), &[0]).await);
assert!(node.get_connection(conn_id).is_none());
}