use moonpool_sim::{
SIM_FAULT_TIMELINE, SimFaultEvent, SimWorld, StateHandle, network::config::NetworkConfiguration,
};
use std::{net::IpAddr, time::Duration};
#[test]
fn test_partition_api() {
let sim = SimWorld::new_with_network_config(NetworkConfiguration::fast_local());
let client_ip: IpAddr = "127.0.0.1".parse().unwrap();
let server_ip: IpAddr = "192.168.1.1".parse().unwrap();
assert!(!sim.is_partitioned(client_ip, server_ip).unwrap());
sim.partition_pair(client_ip, server_ip, Duration::from_secs(10))
.unwrap();
assert!(sim.is_partitioned(client_ip, server_ip).unwrap());
assert!(!sim.is_partitioned(server_ip, client_ip).unwrap());
sim.restore_partition(client_ip, server_ip).unwrap();
assert!(!sim.is_partitioned(client_ip, server_ip).unwrap());
}
#[test]
fn test_send_partition_api() {
let sim = SimWorld::new_with_network_config(NetworkConfiguration::fast_local());
let client_ip: IpAddr = "127.0.0.1".parse().unwrap();
let server_ip: IpAddr = "192.168.1.1".parse().unwrap();
sim.partition_send_from(client_ip, Duration::from_secs(5))
.unwrap();
assert!(sim.is_partitioned(client_ip, server_ip).unwrap());
assert!(
sim.is_partitioned(client_ip, "10.0.0.1".parse().unwrap())
.unwrap()
);
assert!(!sim.is_partitioned(server_ip, client_ip).unwrap());
}
#[test]
fn test_receive_partition_api() {
let sim = SimWorld::new_with_network_config(NetworkConfiguration::fast_local());
let client_ip: IpAddr = "127.0.0.1".parse().unwrap();
let server_ip: IpAddr = "192.168.1.1".parse().unwrap();
sim.partition_recv_to(server_ip, Duration::from_secs(5))
.unwrap();
assert!(sim.is_partitioned(client_ip, server_ip).unwrap());
assert!(
sim.is_partitioned("10.0.0.1".parse().unwrap(), server_ip)
.unwrap()
);
assert!(!sim.is_partitioned(server_ip, client_ip).unwrap());
}
#[test]
fn test_automatic_partition_restoration() {
let mut sim = SimWorld::new_with_network_config(NetworkConfiguration::fast_local());
let client_ip: IpAddr = "127.0.0.1".parse().unwrap();
let server_ip: IpAddr = "192.168.1.1".parse().unwrap();
sim.partition_pair(client_ip, server_ip, Duration::from_millis(50))
.unwrap();
assert!(sim.is_partitioned(client_ip, server_ip).unwrap());
sim.run_until_empty();
assert!(!sim.is_partitioned(client_ip, server_ip).unwrap());
}
#[test]
fn test_multiple_partition_types() {
let sim = SimWorld::new_with_network_config(NetworkConfiguration::fast_local());
let client_ip: IpAddr = "127.0.0.1".parse().unwrap();
let server_ip: IpAddr = "192.168.1.1".parse().unwrap();
sim.partition_send_from(client_ip, Duration::from_secs(10))
.unwrap();
sim.partition_recv_to(server_ip, Duration::from_secs(10))
.unwrap();
assert!(sim.is_partitioned(client_ip, server_ip).unwrap());
sim.restore_partition(client_ip, server_ip).unwrap(); assert!(sim.is_partitioned(client_ip, server_ip).unwrap()); }
#[test]
fn test_partition_behavior() {
let sim = SimWorld::new_with_network_config(NetworkConfiguration::fast_local());
let client_ip: IpAddr = "127.0.0.1".parse().unwrap();
let server_ip: IpAddr = "192.168.1.1".parse().unwrap();
sim.partition_pair(client_ip, server_ip, Duration::from_secs(10))
.unwrap();
assert!(sim.is_partitioned(client_ip, server_ip).unwrap());
sim.restore_partition(client_ip, server_ip).unwrap();
assert!(!sim.is_partitioned(client_ip, server_ip).unwrap());
}
#[test]
fn test_partition_fault_timeline() {
let sim = SimWorld::new_with_network_config(NetworkConfiguration::fast_local());
let state = StateHandle::new();
sim.set_state(state.clone());
let a: IpAddr = "10.0.1.1".parse().unwrap();
let b: IpAddr = "10.0.1.2".parse().unwrap();
sim.partition_pair(a, b, Duration::from_secs(10)).unwrap();
sim.restore_partition(a, b).unwrap();
sim.partition_send_from(a, Duration::from_secs(5)).unwrap();
sim.partition_recv_to(b, Duration::from_secs(5)).unwrap();
let tl = state
.timeline::<SimFaultEvent>(SIM_FAULT_TIMELINE)
.expect("fault timeline should exist after partition operations");
let entries = tl.all();
assert_eq!(entries.len(), 4, "should have 4 fault events");
assert!(
matches!(&entries[0].event, SimFaultEvent::PartitionCreated { from, to } if from == "10.0.1.1" && to == "10.0.1.2")
);
assert!(matches!(
&entries[1].event,
SimFaultEvent::PartitionHealed { .. }
));
assert!(matches!(
&entries[2].event,
SimFaultEvent::SendPartitionCreated { ip } if ip == "10.0.1.1"
));
assert!(matches!(
&entries[3].event,
SimFaultEvent::RecvPartitionCreated { ip } if ip == "10.0.1.2"
));
for entry in entries.iter() {
assert_eq!(entry.source, "sim");
}
for window in entries.windows(2) {
assert!(window[1].seq > window[0].seq);
}
}