mod common;
use net_kit::Net;
#[test]
fn fresh_net_reports_not_started() {
let net = Net::new();
assert!(!net.is_started(), "a new Net has not been started");
assert!(net.is_shutdown(), "a new Net is in the shutdown state");
assert_ne!(net.is_started(), net.is_shutdown());
}
#[test]
fn default_reports_not_started() {
let net = Net::default();
assert!(!net.is_started());
assert!(net.is_shutdown());
}
#[test]
fn started_then_shutdown_toggles_state() {
let rt = common::build_runtime();
let net = Net::new();
rt.block_on(async { net.start().await.expect("start should succeed") });
assert!(net.is_started(), "started after start()");
assert!(!net.is_shutdown(), "not shut down after start()");
assert_ne!(net.is_started(), net.is_shutdown());
net.shutdown().expect("shutdown should succeed");
assert!(!net.is_started(), "not started after shutdown()");
assert!(net.is_shutdown(), "shut down after shutdown()");
assert_ne!(net.is_started(), net.is_shutdown());
}
#[test]
fn redundant_start_keeps_started() {
let rt = common::build_runtime();
let net = Net::new();
rt.block_on(async {
net.start().await.unwrap();
net.start().await.expect("second start is a no-op Ok");
});
assert!(net.is_started());
assert!(!net.is_shutdown());
net.shutdown().unwrap();
}
#[test]
fn shutdown_without_start_stays_shutdown() {
let net = Net::new();
net.shutdown().expect("shutdown on unstarted Net is Ok");
assert!(!net.is_started());
assert!(net.is_shutdown());
}
#[test]
fn double_shutdown_stays_shutdown() {
let rt = common::build_runtime();
let net = Net::new();
rt.block_on(async { net.start().await.unwrap() });
net.shutdown().expect("first shutdown ok");
net.shutdown().expect("second shutdown is a no-op Ok");
assert!(!net.is_started());
assert!(net.is_shutdown());
}
#[test]
fn state_queries_across_full_lifecycle() {
let rt = common::build_runtime();
let net = Net::new();
assert!(net.is_shutdown());
for _ in 0..5 {
rt.block_on(async { net.start().await.unwrap() });
assert!(net.is_started());
assert!(!net.is_shutdown());
net.shutdown().unwrap();
assert!(!net.is_started());
assert!(net.is_shutdown());
}
}
#[test]
fn network_name_is_none_before_start() {
let net = Net::new();
assert_eq!(
net.get_current_network_name().unwrap(),
None,
"no network name before start"
);
}
#[test]
fn network_name_after_start_does_not_error() {
let rt = common::build_runtime();
let net = Net::new();
rt.block_on(async { net.start().await.unwrap() });
let name = net
.get_current_network_name()
.expect("querying network name must not error after start");
if let Some(name) = name.as_ref() {
assert!(
!name.trim().is_empty(),
"a resolved network name is never blank"
);
}
net.shutdown().unwrap();
}
#[test]
fn network_name_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.get_current_network_name().unwrap(),
None,
"no network name once shut down again"
);
}
#[test]
fn network_name_repeated_queries_are_stable() {
let rt = common::build_runtime();
let net = Net::new();
rt.block_on(async { net.start().await.unwrap() });
for _ in 0..5 {
net.get_current_network_name()
.expect("repeated network-name queries must not error");
}
net.shutdown().unwrap();
}