214 lines
6.5 KiB
Rust
214 lines
6.5 KiB
Rust
// 消息路由系统测试示例
|
|
// 这些代码展示了如何测试各个组件
|
|
|
|
#[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());
|
|
}
|
|
}
|
|
}
|