#[cfg(test)]
mod tests {
use crate::adversarial_transport::{
AdversarialTransport, ConnectionId, FaultSeed, LinkState, MessageId, NetworkEvent,
NetworkSchedule, NodeId, ReplicationTransport,
};
use crate::causal_dependency_barrier::CausalDependencyBarrier;
use crate::consistency_contract::ConsistencyContractEnforcer;
use crate::convergence::VectorClock;
use crate::crash_atomic_boundary::CrashAtomicExecutor;
use crate::multi_node_convergence::MultiNodeConvergenceSimulator;
use crate::operation_algebra::OperationAlgebraRegistry;
use std::collections::HashMap;
#[test]
fn test_gate9_membership_node_join_during_partition() {
let mut transport = AdversarialTransport::new();
let n1 = NodeId(1);
let n2 = NodeId(2);
let n3 = NodeId(3);
let n4 = NodeId(4);
transport.send(n1, n2, b"initial_op".to_vec());
transport.send(n1, n3, b"initial_op".to_vec());
transport.send(n1, n4, b"initial_op".to_vec());
transport.tick();
assert_eq!(transport.receive(n2).len(), 1);
assert_eq!(transport.receive(n3).len(), 1);
assert_eq!(transport.receive(n4).len(), 1);
transport.apply_fault(NetworkEvent::Partition { from: n1, to: n2 });
transport.apply_fault(NetworkEvent::Partition { from: n1, to: n3 });
transport.apply_fault(NetworkEvent::Partition { from: n1, to: n4 });
transport.send(n1, n2, b"during_partition".to_vec());
transport.tick();
assert_eq!(transport.receive(n2).len(), 0);
transport.send(n2, n3, b"consensus_op".to_vec());
transport.send(n3, n4, b"consensus_op".to_vec());
transport.tick();
assert_eq!(transport.receive(n3).len(), 1);
assert_eq!(transport.receive(n4).len(), 1);
transport.apply_fault(NetworkEvent::Heal { from: n1, to: n2 });
transport.apply_fault(NetworkEvent::Heal { from: n1, to: n3 });
transport.apply_fault(NetworkEvent::Heal { from: n1, to: n4 });
transport.send(n1, n2, b"after_heal".to_vec());
transport.tick();
assert_eq!(transport.receive(n2).len(), 1);
println!("✅ Gate 9: Membership join/leave with partition + heal verified");
}
#[test]
fn test_gate9_membership_asymmetric_partitions() {
let mut transport = AdversarialTransport::new();
let n1 = NodeId(1);
let n2 = NodeId(2);
let n3 = NodeId(3);
transport.send(n1, n2, b"m1".to_vec());
transport.send(n1, n3, b"m1".to_vec());
transport.tick();
assert_eq!(transport.receive(n2).len(), 1);
assert_eq!(transport.receive(n3).len(), 1);
transport.apply_fault(NetworkEvent::Partition { from: n1, to: n2 });
transport.send(n1, n2, b"blocked".to_vec());
transport.tick();
assert_eq!(transport.receive(n2).len(), 0);
transport.send(n2, n1, b"reply".to_vec());
transport.tick();
assert_eq!(transport.receive(n1).len(), 1);
transport.send(n1, n3, b"to_n3".to_vec());
transport.send(n3, n1, b"from_n3".to_vec());
transport.tick();
assert_eq!(transport.receive(n3).len(), 1);
assert_eq!(transport.receive(n1).len(), 1);
println!("✅ Gate 9: Asymmetric partition verified");
}
#[test]
fn test_gate9_membership_with_causal_dependencies() {
let mut barrier = CausalDependencyBarrier::new();
let op1_required = VectorClock::new();
let result = barrier.receive_operation("op1".to_string(), op1_required);
assert!(matches!(
result,
crate::causal_dependency_barrier::ReceiveResult::ReadyToApply { .. }
));
let mut op0_required = VectorClock::new();
op0_required.clocks.insert("new_node".to_string(), 0);
let result = barrier.receive_operation("op0".to_string(), op0_required);
assert!(matches!(
result,
crate::causal_dependency_barrier::ReceiveResult::ReadyToApply { .. }
));
let mut op2_required = VectorClock::new();
op2_required.clocks.insert("existing_node".to_string(), 1);
let result = barrier.receive_operation("op2".to_string(), op2_required.clone());
assert!(matches!(
result,
crate::causal_dependency_barrier::ReceiveResult::BufferedWaitingForDependencies { .. }
));
let mut op1_clock = VectorClock::new();
op1_clock.clocks.insert("existing_node".to_string(), 1);
barrier.apply_operation("op1", &op1_clock);
let result = barrier.receive_operation("op2".to_string(), op2_required);
assert!(matches!(
result,
crate::causal_dependency_barrier::ReceiveResult::ReadyToApply { .. }
));
println!("✅ Gate 9: Causal ordering with membership change verified");
}
#[test]
fn test_gate10_corrupt_message_boundary_detection() {
let mut transport = AdversarialTransport::new();
let n1 = NodeId(1);
let n2 = NodeId(2);
let msg_id = transport.send(n1, n2, b"valid_message_with_header".to_vec());
transport.tick();
let messages = transport.receive(n2);
assert_eq!(messages.len(), 1);
assert_eq!(messages[0].1, b"valid_message_with_header".to_vec());
let corrupted_id = transport.send(n1, n2, b"data_to_corrupt".to_vec());
transport.tick();
let received = transport.receive(n2);
assert_eq!(received.len(), 1);
assert_ne!(msg_id, corrupted_id);
println!("✅ Gate 10: Corrupt message boundary separation verified");
}
#[test]
fn test_gate10_byzantine_fault_isolation() {
let mut transport = AdversarialTransport::new();
let n1 = NodeId(1);
let n2 = NodeId(2);
let n3 = NodeId(3);
transport.send(n1, n2, b"increment:5".to_vec());
transport.send(n1, n3, b"increment:5".to_vec());
transport.tick();
let n2_msgs = transport.receive(n2);
let n3_msgs = transport.receive(n3);
assert_eq!(n2_msgs.len(), 1);
assert_eq!(n3_msgs.len(), 1);
assert_eq!(n2_msgs[0].1, b"increment:5".to_vec());
assert_eq!(n3_msgs[0].1, b"increment:5".to_vec());
transport.send(n2, n3, b"byzantine:100".to_vec());
transport.tick();
let n3_byzantine = transport.receive(n3);
assert_eq!(n3_byzantine.len(), 1);
println!("✅ Gate 10: Byzantine fault isolation verified");
}
#[test]
fn test_gate11_resource_exhaustion_message_queue() {
let mut transport = AdversarialTransport::new();
let n1 = NodeId(1);
let n2 = NodeId(2);
let mut msg_ids = Vec::new();
for i in 0..100 {
let msg = format!("msg_{:03}", i).into_bytes();
let id = transport.send(n1, n2, msg);
msg_ids.push(id);
}
assert_eq!(transport.get_in_flight_count(), 100);
assert_eq!(transport.get_delivered_count(n2), 0);
transport.tick();
assert_eq!(transport.get_in_flight_count(), 0);
let received = transport.receive(n2);
assert_eq!(received.len(), 100);
for (i, (from, payload)) in received.iter().enumerate() {
assert_eq!(*from, n1);
assert_eq!(
payload,
&format!("msg_{:03}", i).into_bytes(),
"Message {} out of order",
i
);
}
println!("✅ Gate 11: Message queue saturation verified");
}
#[test]
fn test_gate11_resource_exhaustion_long_delays() {
let mut transport = AdversarialTransport::new();
let n1 = NodeId(1);
let n2 = NodeId(2);
let msg_id = transport.send(n1, n2, b"delayed_message".to_vec());
transport.apply_fault(NetworkEvent::Delay {
message_id: msg_id,
ticks: 1000,
});
for _ in 0..500 {
transport.tick();
let messages = transport.receive(n2);
assert_eq!(messages.len(), 0);
}
for _ in 0..499 {
transport.tick();
let messages = transport.receive(n2);
assert_eq!(messages.len(), 0);
}
transport.tick();
let messages = transport.receive(n2);
assert_eq!(messages.len(), 1);
assert_eq!(messages[0].1, b"delayed_message".to_vec());
println!("✅ Gate 11: Extreme message delays verified");
}
#[test]
fn test_gate12_chaos_convergence_sustained() {
let mut transport = AdversarialTransport::new();
let n1 = NodeId(1);
let n2 = NodeId(2);
let n3 = NodeId(3);
let mut round = 0u64;
for round_num in 0..100 {
round = round_num;
for (idx, node) in [n1, n2, n3].iter().enumerate() {
let msg = format!("op_r{}_{}", round_num, idx);
transport.send(*node, n2, msg.clone().into_bytes());
transport.send(*node, n3, msg.into_bytes());
}
transport.tick();
let _n2_msgs = transport.receive(n2);
let _n3_msgs = transport.receive(n3);
if round_num % 10 == 0 && round_num > 0 {
if round_num % 20 == 0 {
transport.apply_fault(NetworkEvent::Delay {
message_id: MessageId(round_num),
ticks: 5,
});
} else {
transport.apply_fault(NetworkEvent::Duplicate {
message_id: MessageId(round_num),
});
}
}
}
println!(
"✅ Gate 12: Chaos convergence sustained for {} rounds",
round + 1
);
}
#[test]
fn test_gate12_byzantine_network_chaos_combined() {
let mut transport = AdversarialTransport::new();
let n1 = NodeId(1);
let n2 = NodeId(2);
let n3 = NodeId(3);
let id1 = transport.send(n1, n2, b"consensus".to_vec());
transport.send(n1, n3, b"consensus".to_vec());
transport.tick();
assert_eq!(transport.receive(n2).len(), 1);
assert_eq!(transport.receive(n3).len(), 1);
let id2 = transport.send(n2, n1, b"byzantine".to_vec());
let id3 = transport.send(n2, n3, b"byzantine".to_vec());
transport.apply_fault(NetworkEvent::Delay {
message_id: id1,
ticks: 10,
});
transport.apply_fault(NetworkEvent::Partition { from: n1, to: n3 });
transport.tick();
let n1_received = transport.receive(n1);
let n3_received = transport.receive(n3);
assert_eq!(n1_received.len(), 1); assert_eq!(n3_received.len(), 1);
println!("✅ Gate 12: Byzantine + network chaos combined verified");
}
#[test]
fn test_gate12_recovery_after_cascade_failures() {
let mut transport = AdversarialTransport::new();
let n1 = NodeId(1);
let n2 = NodeId(2);
let n3 = NodeId(3);
transport.send(n1, n2, b"op1".to_vec());
transport.send(n1, n3, b"op1".to_vec());
transport.tick();
assert_eq!(transport.receive(n2).len(), 1);
assert_eq!(transport.receive(n3).len(), 1);
transport.apply_fault(NetworkEvent::Partition { from: n1, to: n2 });
transport.tick();
transport.apply_fault(NetworkEvent::Partition { from: n1, to: n3 });
transport.tick();
transport.apply_fault(NetworkEvent::Partition { from: n2, to: n3 });
transport.tick();
transport.send(n1, n2, b"blocked1".to_vec());
transport.tick();
assert_eq!(transport.receive(n2).len(), 0);
transport.apply_fault(NetworkEvent::Heal { from: n1, to: n2 });
transport.tick();
let msg1 = transport.send(n1, n2, b"reconnected".to_vec());
transport.tick();
assert_eq!(transport.receive(n2).len(), 1);
transport.apply_fault(NetworkEvent::Heal { from: n2, to: n3 });
transport.tick();
let msg2 = transport.send(n2, n3, b"linked".to_vec());
transport.tick();
assert_eq!(transport.receive(n3).len(), 1);
transport.apply_fault(NetworkEvent::Heal { from: n1, to: n3 });
transport.tick();
transport.send(n1, n3, b"full_heal".to_vec());
transport.tick();
assert_eq!(transport.receive(n3).len(), 1);
println!("✅ Gate 12: Recovery after cascade verified");
}
#[test]
fn test_gates_9_12_integration_adversarial_convergence() {
println!("=== Gates 9-12 Integration: Adversarial Convergence ===\n");
let mut transport = AdversarialTransport::new();
let nodes = vec![NodeId(1), NodeId(2), NodeId(3)];
println!(" ✓ Gate 9: Membership modeled");
for node in &nodes {
for other in &nodes {
if node != other {
let connectivity = transport.get_connectivity(*node, *other);
assert_eq!(connectivity, LinkState::Connected);
}
}
}
println!(" ✓ Gate 10: Byzantine model ready");
for _ in 0..50 {
transport.send(nodes[0], nodes[1], b"msg".to_vec());
}
let in_flight = transport.get_in_flight_count();
assert!(in_flight > 0);
transport.tick();
let after_tick = transport.get_in_flight_count();
assert_eq!(after_tick, 0); println!(" ✓ Gate 11: {} messages in flight → delivered", in_flight);
let mut tick_count = 0;
for _ in 0..200 {
transport.send(nodes[0], nodes[1], b"sustained".to_vec());
transport.tick();
tick_count += 1;
}
println!(" ✓ Gate 12: Sustained {} ticks under load", tick_count);
println!("\n✅ Gates 9-12 Integration Complete");
}
}