use std::sync::{Arc, Mutex};
use crate::{Dispatcher, LocalDispatcherGuard, Metric, Sink, set_local_dispatcher};
type TestMetrics = Arc<Mutex<Vec<Metric>>>;
struct TestSink {
metrics: TestMetrics,
}
impl Sink for TestSink {
fn emit(&self, metric: Metric) {
self.metrics.lock().unwrap().push(metric)
}
}
pub struct TestDispatcher {
dispatcher: LocalDispatcherGuard,
metrics: TestMetrics,
}
impl TestDispatcher {
pub fn new() -> Self {
let metrics: TestMetrics = Default::default();
let sink = TestSink {
metrics: metrics.clone(),
};
let dispatcher = Dispatcher::new(sink);
let guard = set_local_dispatcher(dispatcher);
Self {
dispatcher: guard,
metrics,
}
}
pub fn finish(self) -> Vec<Metric> {
drop(self.dispatcher);
Arc::into_inner(self.metrics)
.expect("dispatcher should be dropped")
.into_inner()
.unwrap()
}
}
impl Default for TestDispatcher {
fn default() -> Self {
Self::new()
}
}