mod common;
use net_kit::{IpStack, Net};
#[test]
fn fresh_net_reports_none() {
let net = Net::new();
assert_eq!(net.ip_stack().unwrap(), IpStack::None);
assert!(!net.has_ipv4().unwrap());
assert!(!net.has_ipv6().unwrap());
}
#[test]
fn default_reports_none() {
let net = Net::default();
assert_eq!(net.ip_stack().unwrap(), IpStack::None);
}
#[test]
fn ip_stack_after_start_is_consistent() {
let rt = common::build_runtime();
let net = Net::new();
rt.block_on(async { net.start().await.unwrap() });
let stack = net
.ip_stack()
.expect("querying ip_stack must not error after start");
assert_eq!(
net.has_ipv4().unwrap(),
stack.has_ipv4(),
"has_ipv4 must agree with ip_stack"
);
assert_eq!(
net.has_ipv6().unwrap(),
stack.has_ipv6(),
"has_ipv6 must agree with ip_stack"
);
net.shutdown().unwrap();
}
#[test]
fn reachable_implies_some_ip_stack() {
use net_kit::NetworkStatus;
let rt = common::build_runtime();
let net = Net::new();
rt.block_on(async { net.start().await.unwrap() });
if net.local_network_reachability().unwrap() == NetworkStatus::Available {
assert_ne!(
net.ip_stack().unwrap(),
IpStack::None,
"a reachable network must expose at least one IP protocol"
);
}
net.shutdown().unwrap();
}
#[test]
fn ip_stack_is_none_after_shutdown() {
let rt = common::build_runtime();
let net = Net::new();
rt.block_on(async { net.start().await.unwrap() });
net.shutdown().unwrap();
assert_eq!(net.ip_stack().unwrap(), IpStack::None);
assert!(!net.has_ipv4().unwrap());
assert!(!net.has_ipv6().unwrap());
}
#[test]
fn ip_stack_repeated_queries_are_stable() {
let rt = common::build_runtime();
let net = Net::new();
rt.block_on(async { net.start().await.unwrap() });
let first = net.ip_stack().unwrap();
for _ in 0..5 {
assert_eq!(
net.ip_stack()
.expect("repeated ip_stack queries must not error"),
first,
"ip_stack should be stable across back-to-back reads"
);
}
net.shutdown().unwrap();
}