use epics_base_rs::types::EpicsValue;
use epics_ca_rs::server::CaServerBuilder;
use std::collections::HashMap;
#[tokio::test]
async fn test_asyn_non_pp_put_does_not_process() {
let db_str = r#"
record(asyn, "TEST:ASYN") {
field(FLNK, "TEST:ACNT")
}
record(calc, "TEST:ACNT") {
field(INPA, "TEST:ACNT.VAL")
field(CALC, "A+1")
}
"#;
let macros = HashMap::new();
let server = CaServerBuilder::new()
.port(0)
.register_record_type("asyn", || {
Box::new(asyn_rs::asyn_record::AsynRecord::default())
})
.register_record_type("calc", || {
Box::new(epics_base_rs::server::records::calc::CalcRecord::new("A+1"))
})
.db_string(db_str, ¯os)
.unwrap()
.build()
.await
.unwrap();
let db = server.database().clone();
assert_eq!(
server.get("TEST:ACNT").await.unwrap(),
EpicsValue::Double(0.0),
"counter must be 0 before any asyn process"
);
db.put_record_field_from_ca("TEST:ASYN", "TMOT", EpicsValue::Double(2.5))
.await
.unwrap();
tokio::time::sleep(std::time::Duration::from_millis(30)).await;
assert_eq!(
server.get("TEST:ACNT").await.unwrap(),
EpicsValue::Double(0.0),
"a put to non-pp TMOT must NOT process the asyn record (no spurious I/O)"
);
db.put_record_field_from_ca("TEST:ASYN", "AOUT", EpicsValue::String("x".into()))
.await
.unwrap();
tokio::time::sleep(std::time::Duration::from_millis(30)).await;
assert_eq!(
server.get("TEST:ACNT").await.unwrap(),
EpicsValue::Double(1.0),
"a put to pp AOUT must process the asyn record and fire FLNK once"
);
}