Files

214 lines
6.5 KiB
Rust
Raw Permalink Normal View History

// 消息路由系统测试示例
// 这些代码展示了如何测试各个组件
#[cfg(test)]
mod integration_tests {
use serde_json::json;
use std::sync::{Arc, Mutex};
use tokio::sync::mpsc;
// 导入被测试的模块
use crate::plugins::{MessagePlugin, TextMessagePlugin, FileMessagePlugin};
use crate::router::MessageRouter;
use crate::handlers::TauriMessageHandler;
/// 集成测试:完整的消息发送流程
#[tokio::test]
async fn test_full_message_flow() {
// 1. 创建 channel
let (sender, mut receiver) = mpsc::channel(100);
// 2. 记录接收到的消息
let received_messages = Arc::new(Mutex::new(Vec::new()));
let received_clone = Arc::clone(&received_messages);
// 3. 创建路由器
let router = MessageRouter::builder()
.register_plugin(TextMessagePlugin::new())
.on_message(move |msg| {
received_clone.lock().unwrap().push(msg);
})
.with_iroh_sender(sender)
.build();
// 4. 发送消息
let message = json!({
"type": "text",
"to": "user123",
"from": "user456",
"content": "Integration test message"
});
let result = router.send(message.clone()).await;
assert!(result.is_ok());
// 5. 验证消息被发送到 channel
let sent_data = receiver.recv().await.unwrap();
let sent_json: serde_json::Value = serde_json::from_slice(&sent_data).unwrap();
assert_eq!(sent_json["type"], "text");
assert_eq!(sent_json["content"], "Integration test message");
// 6. 模拟接收消息
let binary_data = serde_json::to_vec(&sent_json).unwrap();
let result = router.handle_received_message(binary_data);
assert!(result.is_ok());
// 7. 验证回调被调用
let messages = received_messages.lock().unwrap();
assert_eq!(messages.len(), 1);
assert_eq!(messages[0]["content"], "Integration test message");
}
/// 测试多插件协作
#[tokio::test]
async fn test_multiple_plugins() {
let (sender, _receiver) = mpsc::channel(100);
let router = MessageRouter::builder()
.register_plugin(TextMessagePlugin::new())
.register_plugin(FileMessagePlugin::new())
.with_iroh_sender(sender)
.build();
// 发送文本消息
let text_msg = json!({
"type": "text",
"to": "user1",
"from": "user2",
"content": "Text"
});
assert!(router.send(text_msg).await.is_ok());
// 发送文件消息
let file_msg = json!({
"type": "file",
"to": "user1",
"from": "user2"
});
assert!(router.send(file_msg).await.is_ok());
}
/// 测试错误处理
#[tokio::test]
async fn test_error_handling() {
let (sender, _receiver) = mpsc::channel(100);
let router = MessageRouter::builder()
.register_plugin(TextMessagePlugin::new())
.with_iroh_sender(sender)
.build();
// 测试缺失必要字段
let invalid_msg = json!({
"type": "text",
"content": "Missing to and from"
});
let result = router.send(invalid_msg).await;
assert!(result.is_err());
// 测试未知消息类型
let unknown_type = json!({
"type": "unknown_type",
"to": "user1",
"from": "user2"
});
let result = router.send(unknown_type).await;
assert!(result.is_err());
}
/// 测试 Handler 层
#[tokio::test]
async fn test_handler_layer() {
let (sender, _receiver) = mpsc::channel(100);
let router = MessageRouter::builder()
.register_plugin(TextMessagePlugin::new())
.with_iroh_sender(sender)
.build();
let handler = TauriMessageHandler::new(router);
// 测试成功的命令调用
let message = json!({
"type": "text",
"to": "user1",
"from": "user2",
"content": "Handler test"
});
let result = handler.send_message(message).await;
assert!(result.is_ok());
assert_eq!(result.unwrap(), "Message sent successfully");
// 测试获取支持的消息类型
let types = handler.get_supported_message_types().unwrap();
assert!(types.contains(&"text".to_string()));
}
/// 性能测试:大量消息发送
#[tokio::test]
async fn test_performance_many_messages() {
let (sender, mut receiver) = mpsc::channel(1000);
let router = MessageRouter::builder()
.register_plugin(TextMessagePlugin::new())
.with_iroh_sender(sender)
.build();
// 发送 100 条消息
for i in 0..100 {
let message = json!({
"type": "text",
"to": "user1",
"from": "user2",
"content": format!("Message {}", i)
});
let result = router.send(message).await;
assert!(result.is_ok());
}
// 验证所有消息都被发送
let mut count = 0;
while let Ok(_) = receiver.try_recv() {
count += 1;
}
assert_eq!(count, 100);
}
/// 测试并发安全性
#[tokio::test]
async fn test_concurrent_safety() {
let (sender, _receiver) = mpsc::channel(100);
let router = Arc::new(
MessageRouter::builder()
.register_plugin(TextMessagePlugin::new())
.with_iroh_sender(sender)
.build()
);
// 创建多个并发任务
let mut handles = vec![];
for i in 0..10 {
let router_clone = Arc::clone(&router);
let handle = tokio::spawn(async move {
let message = json!({
"type": "text",
"to": "user1",
"from": "user2",
"content": format!("Concurrent message {}", i)
});
router_clone.send(message).await
});
handles.push(handle);
}
// 等待所有任务完成
for handle in handles {
let result = handle.await.unwrap();
assert!(result.is_ok());
}
}
}