Files
freedak f7a720204a Update: 将子项目从 submodule 转为完整内容
- 移除 GovAI, nomifun-tauri, 算力盒子 的 submodule 引用
- 添加所有子项目的完整源代码
- 保留原始 .git 为 .git.bak 备份
2026-07-04 19:20:46 +08:00

87 lines
2.4 KiB
Rust

use std::sync::Arc;
use nomifun_api_types::WebSocketMessage;
use nomifun_realtime::{BroadcastEventBus, EventBroadcaster};
use serde_json::json;
#[tokio::test]
async fn broadcast_to_multiple_subscribers() {
let bus = Arc::new(BroadcastEventBus::new(64));
let mut rx1 = bus.subscribe();
let mut rx2 = bus.subscribe();
let mut rx3 = bus.subscribe();
let event = WebSocketMessage::new("test:broadcast", json!({"key": "value"}));
bus.broadcast(event);
let msg1 = rx1.recv().await.unwrap();
let msg2 = rx2.recv().await.unwrap();
let msg3 = rx3.recv().await.unwrap();
assert_eq!(msg1.name, "test:broadcast");
assert_eq!(msg2.name, "test:broadcast");
assert_eq!(msg3.name, "test:broadcast");
assert_eq!(msg1.data, msg2.data);
assert_eq!(msg2.data, msg3.data);
}
#[tokio::test]
async fn late_subscriber_misses_earlier_events() {
let bus = BroadcastEventBus::new(64);
// Broadcast before any subscriber exists
bus.broadcast(WebSocketMessage::new("early", json!({})));
// Subscribe after the broadcast
let mut rx = bus.subscribe();
// Broadcast a new event
bus.broadcast(WebSocketMessage::new("late", json!({})));
let msg = rx.recv().await.unwrap();
assert_eq!(msg.name, "late");
}
#[tokio::test]
async fn dropped_subscriber_does_not_block_broadcast() {
let bus = BroadcastEventBus::new(64);
let rx = bus.subscribe();
assert_eq!(bus.receiver_count(), 1);
drop(rx);
assert_eq!(bus.receiver_count(), 0);
// Broadcast should succeed without panic
bus.broadcast(WebSocketMessage::new("after-drop", json!({})));
}
#[tokio::test]
async fn trait_object_via_arc() {
let bus = Arc::new(BroadcastEventBus::new(64));
let mut rx = bus.subscribe();
let broadcaster: Arc<dyn EventBroadcaster> = bus.clone();
broadcaster.broadcast(WebSocketMessage::new("via-trait", json!({"n": 42})));
let msg = rx.recv().await.unwrap();
assert_eq!(msg.name, "via-trait");
assert_eq!(msg.data["n"], 42);
}
#[tokio::test]
async fn high_throughput_broadcast() {
let bus = Arc::new(BroadcastEventBus::new(256));
let mut rx = bus.subscribe();
let count = 100;
for i in 0..count {
bus.broadcast(WebSocketMessage::new(format!("evt-{i}"), json!({"seq": i})));
}
for i in 0..count {
let msg = rx.recv().await.unwrap();
assert_eq!(msg.name, format!("evt-{i}"));
assert_eq!(msg.data["seq"], i);
}
}