#![cfg(feature = "remote_endpoint")]
#![cfg(feature = "test_utilities")]
use std::any::Any;
use std::result;
use std::sync::atomic::{AtomicBool, AtomicU64, Ordering};
use std::sync::Arc;
use std::thread;
use std::time::Duration;
use event_manager::utilities::subscribers::CounterSubscriber;
use event_manager::{self, EventManager, MutEventSubscriber, SubscriberId};
trait GenericSubscriber: MutEventSubscriber {
fn as_mut_any(&mut self) -> &mut dyn Any;
}
impl GenericSubscriber for CounterSubscriber {
fn as_mut_any(&mut self) -> &mut dyn Any {
self
}
}
#[test]
fn test_endpoint() {
let mut event_manager = EventManager::<Box<dyn GenericSubscriber + Send>>::new().unwrap();
let endpoint = event_manager.remote_endpoint();
let sub = Box::<CounterSubscriber>::default();
let run_count = Arc::new(AtomicU64::new(0));
let keep_running = Arc::new(AtomicBool::new(true));
let run_count_clone = run_count.clone();
let keep_running_clone = keep_running.clone();
let thread_handle = thread::spawn(move || {
loop {
event_manager.run().unwrap();
run_count_clone.fetch_add(1, Ordering::Relaxed);
if !keep_running_clone.load(Ordering::Acquire) {
break;
}
}
});
thread::sleep(Duration::from_millis(100));
assert_eq!(run_count.load(Ordering::Relaxed), 0);
let sub_id = endpoint
.call_blocking(
|sub_ops| -> result::Result<SubscriberId, event_manager::Error> {
Ok(sub_ops.add_subscriber(sub))
},
)
.unwrap();
thread::sleep(Duration::from_millis(100));
assert_eq!(run_count.load(Ordering::Relaxed), 1);
endpoint
.fire(move |sub_ops| {
let sub = sub_ops.subscriber_mut(sub_id).unwrap();
sub.as_mut_any()
.downcast_mut::<CounterSubscriber>()
.unwrap()
.trigger_event()
})
.unwrap();
thread::sleep(Duration::from_millis(100));
assert!(run_count.load(Ordering::Relaxed) > 1);
endpoint
.fire(move |sub_ops| {
let sub = sub_ops.subscriber_mut(sub_id).unwrap();
sub.as_mut_any()
.downcast_mut::<CounterSubscriber>()
.unwrap()
.clear_event()
})
.unwrap();
thread::sleep(Duration::from_millis(100));
keep_running.store(false, Ordering::Release);
endpoint.kick().unwrap();
thread_handle.join().unwrap();
}