use pretty_assertions::assert_eq;
use std::sync::atomic::{AtomicBool, Ordering};
use std::sync::Arc;
use strut_core::AppContext;
pub struct AppContextTestVehicle {
markers: Vec<Arc<AtomicBool>>,
}
impl AppContextTestVehicle {
pub fn new() -> Self {
Self { markers: vec![] }
}
pub async fn spawn_workload(&mut self) {
let marker = Arc::new(AtomicBool::new(false));
tokio::spawn(Self::flip_marker_after_context_terminates(marker.clone()));
self.markers.push(marker);
tokio::task::yield_now().await;
}
async fn flip_marker_after_context_terminates(marker: Arc<AtomicBool>) {
AppContext::terminated().await;
marker.store(true, Ordering::SeqCst);
}
pub fn assert_workloads_not_finished(&mut self) {
for marker in &self.markers {
assert_eq!(marker.load(Ordering::SeqCst), false);
}
}
pub fn assert_workloads_finished(&mut self) {
for marker in &self.markers {
assert_eq!(marker.load(Ordering::SeqCst), true);
}
}
}