use qudag_protocol::{Coordinator, ProtocolConfig, ProtocolState};
use qudag_crypto::{KeyPair, PublicKey};
use std::time::Duration;
use tokio::time::sleep;
#[tokio::test]
async fn test_end_to_end_message_authentication() {
let config = ProtocolConfig::default();
let mut coordinator = Coordinator::new(config).await.unwrap();
coordinator.start().await.unwrap();
let crypto = coordinator.crypto_manager();
assert!(crypto.is_some(), "Crypto manager should be available");
let message = b"authenticated test message".to_vec();
let result = coordinator.broadcast_message(message.clone()).await;
assert!(result.is_ok(), "Authenticated message should be accepted");
if let Some(dag) = coordinator.dag_manager() {
assert!(dag.contains_message(&message));
if let Some(crypto) = crypto {
assert!(dag.verify_message(&message, crypto.public_key()));
}
}
coordinator.stop().await.unwrap();
}
#[tokio::test]
async fn test_quantum_resistant_key_exchange() {
let config1 = ProtocolConfig {
network: qudag_protocol::config::NetworkConfig {
port: 11001,
max_peers: 10,
connect_timeout: Duration::from_secs(5),
},
..Default::default()
};
let config2 = ProtocolConfig {
network: qudag_protocol::config::NetworkConfig {
port: 11002,
max_peers: 10,
connect_timeout: Duration::from_secs(5),
},
..Default::default()
};
let mut coordinator1 = Coordinator::new(config1).await.unwrap();
let mut coordinator2 = Coordinator::new(config2).await.unwrap();
coordinator1.start().await.unwrap();
coordinator2.start().await.unwrap();
assert!(coordinator1.crypto_manager().is_some());
assert!(coordinator2.crypto_manager().is_some());
let message1 = b"quantum resistant message 1".to_vec();
let message2 = b"quantum resistant message 2".to_vec();
let result1 = coordinator1.broadcast_message(message1).await;
let result2 = coordinator2.broadcast_message(message2).await;
assert!(result1.is_ok());
assert!(result2.is_ok());
coordinator1.stop().await.unwrap();
coordinator2.stop().await.unwrap();
}
#[tokio::test]
async fn test_anonymous_routing_integration() {
let config = ProtocolConfig::default();
let mut coordinator = Coordinator::new(config).await.unwrap();
coordinator.start().await.unwrap();
let anonymous_messages = vec![
b"anonymous message 1".to_vec(),
b"anonymous message 2".to_vec(),
b"anonymous message 3".to_vec(),
];
for message in &anonymous_messages {
let result = coordinator.broadcast_message(message.clone()).await;
assert!(result.is_ok(), "Anonymous message should be routed successfully");
}
if let Some(dag) = coordinator.dag_manager() {
for message in &anonymous_messages {
assert!(dag.contains_message(message));
}
}
coordinator.stop().await.unwrap();
}
#[tokio::test]
async fn test_side_channel_resistance() {
let config = ProtocolConfig::default();
let mut coordinator = Coordinator::new(config).await.unwrap();
coordinator.start().await.unwrap();
let test_messages = vec![
vec![1u8; 10], vec![2u8; 100], vec![3u8; 1000], vec![4u8; 10000], ];
let mut timings = Vec::new();
for message in &test_messages {
let start = std::time::Instant::now();
let result = coordinator.broadcast_message(message.clone()).await;
let duration = start.elapsed();
assert!(result.is_ok());
timings.push(duration);
}
println!("Message processing timings: {:?}", timings);
coordinator.stop().await.unwrap();
}
#[tokio::test]
async fn test_cryptographic_integrity_validation() {
let config = ProtocolConfig::default();
let mut coordinator = Coordinator::new(config).await.unwrap();
coordinator.start().await.unwrap();
let integrity_test_messages = vec![
b"integrity test 1".to_vec(),
vec![0u8; 32], vec![255u8; 32], (0..255).collect::<Vec<u8>>(), ];
for message in &integrity_test_messages {
let result = coordinator.broadcast_message(message.clone()).await;
assert!(result.is_ok(), "Integrity validation should pass for valid messages");
if let Some(dag) = coordinator.dag_manager() {
assert!(dag.contains_message(message));
if let Some(crypto) = coordinator.crypto_manager() {
assert!(dag.verify_message(message, crypto.public_key()));
}
}
}
coordinator.stop().await.unwrap();
}
#[tokio::test]
async fn test_replay_attack_prevention() {
let config = ProtocolConfig::default();
let mut coordinator = Coordinator::new(config).await.unwrap();
coordinator.start().await.unwrap();
let original_message = b"original message for replay test".to_vec();
let result1 = coordinator.broadcast_message(original_message.clone()).await;
assert!(result1.is_ok());
let result2 = coordinator.broadcast_message(original_message.clone()).await;
assert!(result2.is_ok(), "Replay should be handled gracefully");
if let Some(dag) = coordinator.dag_manager() {
assert!(dag.contains_message(&original_message));
}
coordinator.stop().await.unwrap();
}
#[tokio::test]
async fn test_malicious_message_filtering() {
let config = ProtocolConfig::default();
let mut coordinator = Coordinator::new(config).await.unwrap();
coordinator.start().await.unwrap();
let malicious_messages = vec![
vec![0u8; 100_000], vec![], vec![0xAA; 16_777_216], ];
for (i, message) in malicious_messages.iter().enumerate() {
let result = coordinator.broadcast_message(message.clone()).await;
match result {
Ok(_) => {
assert_eq!(coordinator.state().await, ProtocolState::Running);
println!("Malicious message {} accepted but system stable", i);
}
Err(_) => {
println!("Malicious message {} rejected as expected", i);
}
}
}
let normal_message = b"normal message after attack".to_vec();
let result = coordinator.broadcast_message(normal_message).await;
assert!(result.is_ok(), "Normal messages should work after malicious attempts");
coordinator.stop().await.unwrap();
}
#[tokio::test]
async fn test_privacy_preserving_consensus() {
let config = ProtocolConfig::default();
let mut coordinator = Coordinator::new(config).await.unwrap();
coordinator.start().await.unwrap();
let private_messages = vec![
b"private transaction 1".to_vec(),
b"confidential data 2".to_vec(),
b"sensitive information 3".to_vec(),
];
for message in &private_messages {
let result = coordinator.broadcast_message(message.clone()).await;
assert!(result.is_ok(), "Private messages should be processed");
}
if let Some(dag) = coordinator.dag_manager() {
for message in &private_messages {
assert!(dag.contains_message(message));
}
}
coordinator.stop().await.unwrap();
}
#[tokio::test]
async fn test_forward_secrecy() {
let config = ProtocolConfig::default();
let mut coordinator = Coordinator::new(config).await.unwrap();
coordinator.start().await.unwrap();
let phase1_messages = vec![
b"phase 1 message 1".to_vec(),
b"phase 1 message 2".to_vec(),
];
for message in &phase1_messages {
let result = coordinator.broadcast_message(message.clone()).await;
assert!(result.is_ok());
}
sleep(Duration::from_millis(100)).await;
let phase2_messages = vec![
b"phase 2 message 1".to_vec(),
b"phase 2 message 2".to_vec(),
];
for message in &phase2_messages {
let result = coordinator.broadcast_message(message.clone()).await;
assert!(result.is_ok());
}
if let Some(dag) = coordinator.dag_manager() {
for message in phase1_messages.iter().chain(phase2_messages.iter()) {
assert!(dag.contains_message(message));
}
}
coordinator.stop().await.unwrap();
}
#[tokio::test]
async fn test_cryptographic_protocol_compliance() {
let config = ProtocolConfig::default();
let mut coordinator = Coordinator::new(config).await.unwrap();
coordinator.start().await.unwrap();
if let Some(crypto) = coordinator.crypto_manager() {
let public_key = crypto.public_key();
assert!(!public_key.is_empty(), "Public key should not be empty");
}
let test_message = b"cryptographic compliance test".to_vec();
let result = coordinator.broadcast_message(test_message.clone()).await;
assert!(result.is_ok());
if let Some(dag) = coordinator.dag_manager() {
assert!(dag.contains_message(&test_message));
}
coordinator.stop().await.unwrap();
}