use std::sync::{Arc, Mutex};
use std::time::{Duration, Instant};
use ek_core::main_engine::MainEngine;
use ek_core::plugin::Plugin;
use ek_event::Event as BusEvent;
use ek_station::{StationConfig, boot_with_cfg};
use ek_ui::{spawn_host_watcher, ui_kinds};
#[derive(Default)]
pub struct StopProbe {
stops: Arc<Mutex<Vec<String>>>,
}
impl Plugin for StopProbe {
fn name(&self) -> &str {
"stopp"
}
fn on_stop(&self) {
self.stops.lock().unwrap().push("stopp".to_string());
}
fn on_mail(&self, _event: &BusEvent) {}
}
fn wait_until(tag: &str, secs: u64, f: impl Fn() -> bool) {
let deadline = Instant::now() + Duration::from_secs(secs);
while Instant::now() < deadline {
if f() {
return;
}
std::thread::sleep(Duration::from_millis(20));
}
panic!("wait_until timeout: {tag}");
}
#[test]
fn t0_ui_kind_snapshot_loop_and_close_chain() {
let engine = Arc::new(MainEngine::new(None));
let shared = Arc::new(ek_ui::UiShared::new());
let stops = Arc::new(Mutex::new(Vec::<String>::new()));
engine
.add_plugin(Arc::new(StopProbe {
stops: Arc::clone(&stops),
}))
.unwrap();
let cfg = StationConfig {
plugins: vec!["cfg".to_string(), "dm".to_string(), "oms".to_string(), "ui".to_string()],
};
let rig = ek_cfg::Store::with_root(std::path::PathBuf::from("target/ui-runtime-rig"));
boot_with_cfg(&engine, &ui_kinds(&shared, true), &cfg, Some(&rig)).unwrap();
engine.start().unwrap();
wait_until("snapshot fills", 4, || {
let s = shared.snapshot();
s.rows.len() >= 4 && s.rows.iter().any(|r| r.name == "ui")
});
assert!(
shared
.logs_snapshot()
.0
.iter()
.any(|l| l.contains("界面插件上线")),
"ui plugin started log missing"
);
let watcher = spawn_host_watcher(&engine, &shared);
shared.request_stop();
watcher.join().unwrap();
let got = stops.lock().unwrap();
assert!(
got.iter().any(|n| n == "stopp"),
"stop probe must have fired on close chain: {got:?}"
);
}
#[test]
fn t1_run_opts_default_dm_rt_true() {
assert!(ek_ui::runtime::RunOpts::default().dm_rt);
assert!(ek_ui::runtime::RunOpts::plain().dm_rt);
assert!(ek_ui::runtime::RunOpts::default().ready_marker.is_none());
}