use super::*;
#[tokio::test(start_paused = true)]
async fn dcc_timer_auto_re_enables() {
use std::sync::Arc;
let comm_state = Arc::new(AtomicU8::new(0));
let request = bacnet_services::device_mgmt::DeviceCommunicationControlRequest {
time_duration: Some(1), enable_disable: EnableDisable::DISABLE_INITIATION,
password: None,
};
let mut buf = BytesMut::new();
request.encode(&mut buf).unwrap();
let (state, duration) = handle_device_communication_control(&buf, &comm_state, &None).unwrap();
assert_eq!(state, EnableDisable::DISABLE_INITIATION);
assert_eq!(duration, Some(1));
assert_eq!(comm_state.load(Ordering::Acquire), 2);
let comm_clone = Arc::clone(&comm_state);
let minutes = duration.unwrap();
let handle = tokio::spawn(async move {
tokio::time::sleep(std::time::Duration::from_secs(minutes as u64 * 60)).await;
comm_clone.store(0, Ordering::Release);
});
assert_eq!(comm_state.load(Ordering::Acquire), 2);
tokio::time::advance(std::time::Duration::from_secs(61)).await;
handle.await.unwrap();
assert_eq!(comm_state.load(Ordering::Acquire), 0);
}
#[tokio::test(start_paused = true)]
async fn dcc_timer_cancelled_by_new_dcc() {
use std::sync::Arc;
use tokio::task::JoinHandle;
let comm_state = Arc::new(AtomicU8::new(0));
let request = bacnet_services::device_mgmt::DeviceCommunicationControlRequest {
time_duration: Some(2),
enable_disable: EnableDisable::DISABLE_INITIATION,
password: None,
};
let mut buf = BytesMut::new();
request.encode(&mut buf).unwrap();
let (_, duration) = handle_device_communication_control(&buf, &comm_state, &None).unwrap();
assert_eq!(comm_state.load(Ordering::Acquire), 2);
let comm_clone = Arc::clone(&comm_state);
let minutes = duration.unwrap();
let handle1: JoinHandle<()> = tokio::spawn(async move {
tokio::time::sleep(std::time::Duration::from_secs(minutes as u64 * 60)).await;
comm_clone.store(0, Ordering::Release);
});
let request2 = bacnet_services::device_mgmt::DeviceCommunicationControlRequest {
time_duration: None,
enable_disable: EnableDisable::ENABLE,
password: None,
};
let mut buf2 = BytesMut::new();
request2.encode(&mut buf2).unwrap();
let (state2, duration2) =
handle_device_communication_control(&buf2, &comm_state, &None).unwrap();
assert_eq!(state2, EnableDisable::ENABLE);
assert_eq!(duration2, None);
assert_eq!(comm_state.load(Ordering::Acquire), 0);
handle1.abort();
tokio::time::advance(std::time::Duration::from_secs(121)).await;
tokio::task::yield_now().await;
assert_eq!(comm_state.load(Ordering::Acquire), 0);
}