mod utils; use dust_dds::{ domain::domain_participant_factory::DomainParticipantFactory, infrastructure::{ qos::{DataReaderQos, DataWriterQos, QosKind}, qos_policy::{DeadlineQosPolicy, ReliabilityQosPolicy, ReliabilityQosPolicyKind}, status::{StatusKind, NO_STATUS}, time::{Duration, DurationKind}, wait_set::{Condition, WaitSet}, }, }; use dust_dds_derive::DdsType; 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, None, NO_STATUS) .unwrap(); let topic = participant .create_topic::("MyTopic", "MyData", QosKind::Default, None, NO_STATUS) .unwrap(); let publisher = participant .create_publisher(QosKind::Default, None, 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), None, NO_STATUS) .unwrap(); let subscriber = participant .create_subscriber(QosKind::Default, None, 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::(&topic, QosKind::Specific(reader_qos), None, 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); }