use qudag_protocol::{Coordinator, ProtocolConfig, ProtocolState};
use qudag_crypto::KeyPair;
use qudag_dag::QrDag;
use qudag_network::NetworkManager;
use qudag_cli::{CliConfig, NodeCommand, NodeRunner};
use std::time::Duration;
use tokio::time::sleep;
#[tokio::test]
async fn test_cli_node_startup() {
let cli_config = CliConfig {
network_port: 9001,
bootstrap_nodes: vec![],
max_peers: 10,
validation_timeout: 1000,
data_dir: "/tmp/qudag-test-9001".into(),
};
let node_runner = NodeRunner::new(cli_config).await.unwrap();
node_runner.execute(NodeCommand::Start).await.unwrap();
sleep(Duration::from_millis(100)).await;
assert_eq!(node_runner.state().await, ProtocolState::Running);
node_runner.execute(NodeCommand::Stop).await.unwrap();
assert_eq!(node_runner.state().await, ProtocolState::Stopped);
}
#[tokio::test]
async fn test_cli_message_broadcast() {
let cli_config1 = CliConfig {
network_port: 9002,
bootstrap_nodes: vec![],
max_peers: 10,
validation_timeout: 1000,
data_dir: "/tmp/qudag-test-9002".into(),
};
let cli_config2 = CliConfig {
network_port: 9003,
bootstrap_nodes: vec!["127.0.0.1:9002".to_string()],
max_peers: 10,
validation_timeout: 1000,
data_dir: "/tmp/qudag-test-9003".into(),
};
let node_runner1 = NodeRunner::new(cli_config1).await.unwrap();
let node_runner2 = NodeRunner::new(cli_config2).await.unwrap();
node_runner1.execute(NodeCommand::Start).await.unwrap();
node_runner2.execute(NodeCommand::Start).await.unwrap();
sleep(Duration::from_millis(200)).await;
let test_message = b"cli test message".to_vec();
node_runner1.execute(NodeCommand::Broadcast(test_message.clone())).await.unwrap();
sleep(Duration::from_millis(200)).await;
assert!(node_runner1.dag_contains_message(&test_message).await.unwrap());
assert!(node_runner2.dag_contains_message(&test_message).await.unwrap());
node_runner1.execute(NodeCommand::Stop).await.unwrap();
node_runner2.execute(NodeCommand::Stop).await.unwrap();
}
#[tokio::test]
async fn test_cli_crypto_operations() {
let cli_config = CliConfig {
network_port: 9004,
bootstrap_nodes: vec![],
max_peers: 10,
validation_timeout: 1000,
data_dir: "/tmp/qudag-test-9004".into(),
};
let node_runner = NodeRunner::new(cli_config).await.unwrap();
node_runner.execute(NodeCommand::Start).await.unwrap();
let keypair = node_runner.execute(NodeCommand::GenerateKeypair).await.unwrap();
let message = b"crypto test message".to_vec();
let signature = node_runner.execute(NodeCommand::SignMessage(message.clone())).await.unwrap();
assert!(node_runner.execute(NodeCommand::VerifySignature(message, signature, keypair.public_key())).await.unwrap());
node_runner.execute(NodeCommand::Stop).await.unwrap();
}
#[tokio::test]
async fn test_cli_network_management() {
let cli_config = CliConfig {
network_port: 9005,
bootstrap_nodes: vec![],
max_peers: 10,
validation_timeout: 1000,
data_dir: "/tmp/qudag-test-9005".into(),
};
let node_runner = NodeRunner::new(cli_config).await.unwrap();
node_runner.execute(NodeCommand::Start).await.unwrap();
let peer_addr = "127.0.0.1:9006";
node_runner.execute(NodeCommand::Connect(peer_addr.to_string())).await.unwrap();
let peers = node_runner.execute(NodeCommand::ListPeers).await.unwrap();
assert!(peers.contains(&peer_addr.to_string()));
node_runner.execute(NodeCommand::Disconnect(peer_addr.to_string())).await.unwrap();
let peers = node_runner.execute(NodeCommand::ListPeers).await.unwrap();
assert!(!peers.contains(&peer_addr.to_string()));
node_runner.execute(NodeCommand::Stop).await.unwrap();
}
#[tokio::test]
async fn test_cli_dag_operations() {
let cli_config = CliConfig {
network_port: 9007,
bootstrap_nodes: vec![],
max_peers: 10,
validation_timeout: 1000,
data_dir: "/tmp/qudag-test-9007".into(),
};
let node_runner = NodeRunner::new(cli_config).await.unwrap();
node_runner.execute(NodeCommand::Start).await.unwrap();
let messages = vec![
b"dag_message_1".to_vec(),
b"dag_message_2".to_vec(),
b"dag_message_3".to_vec(),
];
for msg in &messages {
node_runner.execute(NodeCommand::Broadcast(msg.clone())).await.unwrap();
sleep(Duration::from_millis(50)).await;
}
let dag_info = node_runner.execute(NodeCommand::GetDagInfo).await.unwrap();
assert_eq!(dag_info.message_count, messages.len());
let ordered_messages = node_runner.execute(NodeCommand::GetOrderedMessages).await.unwrap();
assert_eq!(ordered_messages.len(), messages.len());
node_runner.execute(NodeCommand::Stop).await.unwrap();
}
#[tokio::test]
async fn test_cli_error_handling() {
let invalid_config = CliConfig {
network_port: 0, bootstrap_nodes: vec![],
max_peers: 10,
validation_timeout: 1000,
data_dir: "/tmp/qudag-test-invalid".into(),
};
let result = NodeRunner::new(invalid_config).await;
assert!(result.is_err());
let valid_config = CliConfig {
network_port: 9008,
bootstrap_nodes: vec![],
max_peers: 10,
validation_timeout: 1000,
data_dir: "/tmp/qudag-test-9008".into(),
};
let node_runner = NodeRunner::new(valid_config).await.unwrap();
let result = node_runner.execute(NodeCommand::Broadcast(vec![1,2,3])).await;
assert!(result.is_err());
node_runner.execute(NodeCommand::Start).await.unwrap();
let result = node_runner.execute(NodeCommand::Connect("invalid:addr".to_string())).await;
assert!(result.is_err());
node_runner.execute(NodeCommand::Stop).await.unwrap();
}