mod common;
use std::sync::atomic::{AtomicUsize, Ordering};
use std::sync::Arc;
use net_kit::Net;
#[test]
fn massive_registration_then_clear() {
let rt = common::build_runtime();
let net = Net::new();
rt.block_on(async { net.start().await.unwrap() });
const COUNT: usize = 50_000;
let mut handles = Vec::with_capacity(COUNT);
for _ in 0..COUNT {
handles.push(
net.register(Box::new(|_| {}))
.unwrap()
.expect("register ok"),
);
}
assert_eq!(handles.len(), COUNT);
net.clear_all_listener().unwrap();
for h in handles.iter().step_by(COUNT / 100) {
assert!(!net.unregister(*h).unwrap());
}
net.shutdown().unwrap();
}
#[test]
fn high_churn_register_unregister() {
let rt = common::build_runtime();
let net = Net::new();
rt.block_on(async { net.start().await.unwrap() });
for _ in 0..100_000 {
let h = net
.register(Box::new(|_| {}))
.unwrap()
.expect("register ok");
assert!(
net.unregister(h).unwrap(),
"freshly registered handle unregisters"
);
}
net.shutdown().unwrap();
}
#[test]
fn many_lifecycle_cycles() {
let rt = common::build_runtime();
let net = Net::new();
for i in 0..25 {
rt.block_on(async {
net.start()
.await
.unwrap_or_else(|e| panic!("start on cycle {i} failed: {e}"));
});
let h = net.register(Box::new(|_| {})).unwrap().unwrap();
let _ = net.local_network_reachability();
assert!(net.unregister(h).unwrap());
net.shutdown().unwrap();
}
}
#[test]
fn large_stateful_listener_set() {
let rt = common::build_runtime();
let net = Net::new();
rt.block_on(async { net.start().await.unwrap() });
let counter = Arc::new(AtomicUsize::new(0));
const COUNT: usize = 10_000;
let mut handles = Vec::with_capacity(COUNT);
for _ in 0..COUNT {
let c = Arc::clone(&counter);
handles.push(
net.register(Box::new(move |_| {
c.fetch_add(1, Ordering::SeqCst);
}))
.unwrap()
.unwrap(),
);
}
for h in handles.iter().take(COUNT / 2) {
assert!(net.unregister(*h).unwrap());
}
net.clear_all_listener().unwrap();
for h in handles.iter().skip(COUNT / 2) {
assert!(
!net.unregister(*h).unwrap(),
"remaining handles were cleared"
);
}
net.shutdown().unwrap();
}