mod utils;
use dust_dds::{
domain::domain_participant_factory::DomainParticipantFactory,
infrastructure::{
qos::{DataReaderQos, DataWriterQos, QosKind},
qos_policy::{DeadlineQosPolicy, ReliabilityQosPolicy, ReliabilityQosPolicyKind},
status::{NO_STATUS, StatusKind},
time::{Duration, DurationKind},
type_support::DdsType,
},
listener::NO_LISTENER,
wait_set::{Condition, WaitSet},
};
use crate::utils::domain_id_generator::TEST_DOMAIN_ID_GENERATOR;
#[derive(Debug, PartialEq, DdsType)]
struct MyData {
#[dust_dds(key)]
id: u8,
value: u8,
}
#[test]
fn writer_offered_deadline_missed_waitset() {
let domain_id = TEST_DOMAIN_ID_GENERATOR.generate_unique_domain_id();
let participant = DomainParticipantFactory::get_instance()
.create_participant(domain_id, QosKind::Default, NO_LISTENER, NO_STATUS)
.unwrap();
let topic = participant
.create_topic::<MyData>(
"MyTopic",
"MyData",
QosKind::Default,
NO_LISTENER,
NO_STATUS,
)
.unwrap();
let publisher = participant
.create_publisher(QosKind::Default, NO_LISTENER, NO_STATUS)
.unwrap();
let writer_qos = DataWriterQos {
reliability: ReliabilityQosPolicy {
kind: ReliabilityQosPolicyKind::Reliable,
max_blocking_time: DurationKind::Finite(Duration::new(1, 0)),
},
deadline: DeadlineQosPolicy {
period: DurationKind::Finite(Duration::new(1, 0)),
},
..Default::default()
};
let writer = publisher
.create_datawriter(
&topic,
QosKind::Specific(writer_qos),
NO_LISTENER,
NO_STATUS,
)
.unwrap();
let subscriber = participant
.create_subscriber(QosKind::Default, NO_LISTENER, NO_STATUS)
.unwrap();
let reader_qos = DataReaderQos {
reliability: ReliabilityQosPolicy {
kind: ReliabilityQosPolicyKind::Reliable,
max_blocking_time: DurationKind::Finite(Duration::new(1, 0)),
},
deadline: DeadlineQosPolicy {
period: DurationKind::Finite(Duration::new(1, 0)),
},
..Default::default()
};
let _reader = subscriber
.create_datareader::<MyData>(
&topic,
QosKind::Specific(reader_qos),
NO_LISTENER,
NO_STATUS,
)
.unwrap();
let cond = writer.get_statuscondition();
cond.set_enabled_statuses(&[StatusKind::PublicationMatched])
.unwrap();
let mut wait_set = WaitSet::new();
wait_set
.attach_condition(Condition::StatusCondition(cond))
.unwrap();
wait_set.wait(Duration::new(10, 0)).unwrap();
let data1 = MyData { id: 1, value: 1 };
writer.write(data1, None).unwrap();
writer
.wait_for_acknowledgments(Duration::new(10, 0))
.unwrap();
let cond = writer.get_statuscondition();
cond.set_enabled_statuses(&[StatusKind::OfferedDeadlineMissed])
.unwrap();
let mut wait_set = WaitSet::new();
wait_set
.attach_condition(Condition::StatusCondition(cond))
.unwrap();
wait_set.wait(Duration::new(10, 0)).unwrap();
let status = writer.get_offered_deadline_missed_status().unwrap();
assert_eq!(status.total_count, 1);
assert_eq!(status.total_count_change, 1);
}