#![cfg(feature = "pubsub")]
#[cfg(test)]
mod tests {
use std::net::IpAddr;
use std::str::FromStr;
use remdb::pubsub::{PubSub, PubSubConfig, Result, UdpMode};
#[test]
fn test_pubsub_basic() {
let config = PubSubConfig {
udp_mode: UdpMode::Broadcast,
multicast_addr: None,
port: 5555,
max_topics: 32,
max_subscribers_per_topic: 16,
buffer_size: 4096,
enable_nack: true,
retransmit_timeout: std::time::Duration::from_millis(100),
max_retransmits: 3,
heartbeat_interval: std::time::Duration::from_secs(10),
frame_pool_size: 128,
};
let mut pubsub = PubSub::new(config).expect("Failed to create PubSub instance");
pubsub.init().expect("Failed to initialize PubSub");
fn test_callback(_topic_id: u16, data: &[u8]) -> bool {
assert_eq!(data, b"test data");
true
}
let subscription_id = pubsub
.subscribe(0, test_callback)
.expect("Failed to subscribe");
assert!(subscription_id > 0);
pubsub.publish(0, b"test data").expect("Failed to publish");
pubsub
.unsubscribe(subscription_id)
.expect("Failed to unsubscribe");
}
#[test]
fn test_pubsub_multicast() {
let multicast_addr = IpAddr::from_str("224.0.0.1").unwrap();
let config = PubSubConfig {
udp_mode: UdpMode::Multicast,
multicast_addr: Some(multicast_addr),
port: 5556,
max_topics: 32,
max_subscribers_per_topic: 16,
buffer_size: 4096,
enable_nack: true,
retransmit_timeout: std::time::Duration::from_millis(100),
max_retransmits: 3,
heartbeat_interval: std::time::Duration::from_secs(10),
frame_pool_size: 128,
};
let mut pubsub = PubSub::new(config).expect("Failed to create PubSub instance");
pubsub.init().expect("Failed to initialize PubSub");
let callback = |_topic_id: u16, _data: &[u8]| -> bool { true };
let subscription_id = pubsub.subscribe(1, callback).expect("Failed to subscribe");
pubsub
.publish(1, b"multicast test")
.expect("Failed to publish multicast");
pubsub
.unsubscribe(subscription_id)
.expect("Failed to unsubscribe");
}
#[test]
fn test_pubsub_broadcast() {
let config = PubSubConfig {
udp_mode: UdpMode::Broadcast,
multicast_addr: None,
port: 6667, max_topics: 32,
max_subscribers_per_topic: 16,
buffer_size: 4096,
enable_nack: true,
retransmit_timeout: std::time::Duration::from_millis(100),
max_retransmits: 3,
heartbeat_interval: std::time::Duration::from_secs(10),
frame_pool_size: 128,
};
let mut pubsub = PubSub::new(config).expect("Failed to create PubSub instance");
pubsub.init().expect("Failed to initialize PubSub");
let callback = |_topic_id: u16, _data: &[u8]| -> bool { true };
let subscription_id = pubsub.subscribe(2, callback).expect("Failed to subscribe");
pubsub
.publish(2, b"broadcast test")
.expect("Failed to publish broadcast");
pubsub
.unsubscribe(subscription_id)
.expect("Failed to unsubscribe");
pubsub.shutdown().expect("Failed to shutdown PubSub");
}
}