mirror of
https://github.com/hl-archive-node/nanoreth.git
synced 2025-12-06 10:59:55 +00:00
test(tokio-util): add unit tests for EventSender (#11980)
This commit is contained in:
@ -40,3 +40,96 @@ impl<T: Clone + Send + Sync + 'static> EventSender<T> {
|
||||
EventStream::new(self.sender.subscribe())
|
||||
}
|
||||
}
|
||||
|
||||
#[cfg(test)]
|
||||
mod tests {
|
||||
use super::*;
|
||||
use tokio::{
|
||||
task,
|
||||
time::{timeout, Duration},
|
||||
};
|
||||
use tokio_stream::StreamExt;
|
||||
|
||||
#[tokio::test]
|
||||
async fn test_event_broadcast_to_listener() {
|
||||
let sender = EventSender::default();
|
||||
|
||||
// Create a listener for the events
|
||||
let mut listener = sender.new_listener();
|
||||
|
||||
// Broadcast an event
|
||||
sender.notify("event1");
|
||||
|
||||
// Check if the listener receives the event
|
||||
let received_event = listener.next().await;
|
||||
assert_eq!(received_event, Some("event1"));
|
||||
}
|
||||
|
||||
#[tokio::test]
|
||||
async fn test_event_no_listener() {
|
||||
let sender = EventSender::default();
|
||||
|
||||
// Broadcast an event with no listeners
|
||||
sender.notify("event2");
|
||||
|
||||
// Ensure it doesn't panic or fail when no listeners are present
|
||||
// (this test passes if it runs without errors).
|
||||
}
|
||||
|
||||
#[tokio::test]
|
||||
async fn test_multiple_listeners_receive_event() {
|
||||
let sender = EventSender::default();
|
||||
|
||||
// Create two listeners
|
||||
let mut listener1 = sender.new_listener();
|
||||
let mut listener2 = sender.new_listener();
|
||||
|
||||
// Broadcast an event
|
||||
sender.notify("event3");
|
||||
|
||||
// Both listeners should receive the same event
|
||||
let event1 = listener1.next().await;
|
||||
let event2 = listener2.next().await;
|
||||
|
||||
assert_eq!(event1, Some("event3"));
|
||||
assert_eq!(event2, Some("event3"));
|
||||
}
|
||||
|
||||
#[tokio::test]
|
||||
async fn test_bounded_channel_size() {
|
||||
// Create a channel with size 2
|
||||
let sender = EventSender::new(2);
|
||||
|
||||
// Create a listener
|
||||
let mut listener = sender.new_listener();
|
||||
|
||||
// Broadcast 3 events, which exceeds the channel size
|
||||
sender.notify("event4");
|
||||
sender.notify("event5");
|
||||
sender.notify("event6");
|
||||
|
||||
// Only the last two should be received due to the size limit
|
||||
let received_event1 = listener.next().await;
|
||||
let received_event2 = listener.next().await;
|
||||
|
||||
assert_eq!(received_event1, Some("event5"));
|
||||
assert_eq!(received_event2, Some("event6"));
|
||||
}
|
||||
|
||||
#[tokio::test]
|
||||
async fn test_event_listener_timeout() {
|
||||
let sender = EventSender::default();
|
||||
let mut listener = sender.new_listener();
|
||||
|
||||
// Broadcast an event asynchronously
|
||||
task::spawn(async move {
|
||||
tokio::time::sleep(Duration::from_millis(50)).await;
|
||||
sender.notify("delayed_event");
|
||||
});
|
||||
|
||||
// Use a timeout to ensure that the event is received within a certain time
|
||||
let result = timeout(Duration::from_millis(100), listener.next()).await;
|
||||
assert!(result.is_ok());
|
||||
assert_eq!(result.unwrap(), Some("delayed_event"));
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user