use std::sync::Arc;
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum TriggerHealth {
Healthy,
Degraded,
Unhealthy,
}
pub trait HealthTriggerable: Send + Sync {
fn trigger_unhealthy(&self);
fn trigger_healthy(&self);
fn trigger_degraded(&self) {}
}
pub type SharedHealthTrigger = Arc<dyn HealthTriggerable>;
#[cfg(test)]
mod tests {
use super::*;
use std::sync::atomic::{AtomicU32, Ordering};
struct MockTrigger {
unhealthy_calls: AtomicU32,
healthy_calls: AtomicU32,
degraded_calls: AtomicU32,
}
impl MockTrigger {
fn new() -> Self {
Self {
unhealthy_calls: AtomicU32::new(0),
healthy_calls: AtomicU32::new(0),
degraded_calls: AtomicU32::new(0),
}
}
}
impl HealthTriggerable for MockTrigger {
fn trigger_unhealthy(&self) {
self.unhealthy_calls.fetch_add(1, Ordering::SeqCst);
}
fn trigger_healthy(&self) {
self.healthy_calls.fetch_add(1, Ordering::SeqCst);
}
fn trigger_degraded(&self) {
self.degraded_calls.fetch_add(1, Ordering::SeqCst);
}
}
#[test]
fn test_trigger_methods() {
let trigger = MockTrigger::new();
trigger.trigger_unhealthy();
trigger.trigger_healthy();
trigger.trigger_degraded();
assert_eq!(trigger.unhealthy_calls.load(Ordering::SeqCst), 1);
assert_eq!(trigger.healthy_calls.load(Ordering::SeqCst), 1);
assert_eq!(trigger.degraded_calls.load(Ordering::SeqCst), 1);
}
#[test]
fn test_shared_trigger() {
let trigger: SharedHealthTrigger = Arc::new(MockTrigger::new());
trigger.trigger_unhealthy();
trigger.trigger_healthy();
let trigger2 = Arc::clone(&trigger);
trigger2.trigger_unhealthy();
}
#[test]
fn test_trigger_health_equality() {
assert_eq!(TriggerHealth::Healthy, TriggerHealth::Healthy);
assert_ne!(TriggerHealth::Healthy, TriggerHealth::Unhealthy);
assert_ne!(TriggerHealth::Degraded, TriggerHealth::Unhealthy);
}
}