From d112df6fca2ee9a8c0b5d0dee3c0b18d725bb9b0 Mon Sep 17 00:00:00 2001 From: Robin Mueller Date: Tue, 23 Sep 2025 15:04:50 +0200 Subject: [PATCH] make first acked test work --- src/dest.rs | 115 +++++++++++++++++++++++++++++++++++----------------- src/lib.rs | 4 ++ 2 files changed, 82 insertions(+), 37 deletions(-) diff --git a/src/dest.rs b/src/dest.rs index 95a1d7f..23bc1a8 100644 --- a/src/dest.rs +++ b/src/dest.rs @@ -1826,6 +1826,12 @@ mod tests { use super::*; + #[derive(Debug, Clone, Copy)] + pub struct TransferInfo { + id: TransactionId, + header: PduHeader, + } + type TestDestHandler = DestinationHandler< TestCfdpSender, TestFaultHandler, @@ -1906,6 +1912,14 @@ mod tests { &mut self.handler.local_cfg.indication_cfg } + fn pdu_queue_empty(&mut self) -> bool { + self.handler.pdu_sender.queue_empty() + } + + fn pdu_queue_len(&mut self) -> usize { + self.handler.pdu_sender.queue_len() + } + fn get_next_pdu(&mut self) -> Option { self.handler.pdu_sender.retrieve_next_pdu() } @@ -1934,7 +1948,7 @@ mod tests { user: &mut TestCfdpUser, file_size: u64, transmission_mode: TransmissionMode, - ) -> Result { + ) -> Result { self.expected_file_size = file_size; self.pdu_conf.trans_mode = transmission_mode; assert_eq!(user.transaction_indication_call_count, 0); @@ -1966,7 +1980,10 @@ mod tests { assert_eq!(metadata_recvd.id, self.handler.transaction_id().unwrap()); assert_eq!(metadata_recvd.file_size, file_size); assert!(metadata_recvd.msgs_to_user.is_empty()); - Ok(self.handler.transaction_id().unwrap()) + Ok(TransferInfo { + id: self.handler.transaction_id().unwrap(), + header: pdu_header, + }) } fn generic_file_data_insert( @@ -2182,12 +2199,36 @@ mod tests { let fault_handler = TestFaultHandler::default(); let mut tb = DestHandlerTestbench::new_with_fixed_paths(fault_handler, false); let mut test_user = tb.test_user_from_cached_paths(0); - tb.generic_transfer_init(&mut test_user, 0, TransmissionMode::Acknowledged) + let transfer_info = tb + .generic_transfer_init(&mut test_user, 0, TransmissionMode::Acknowledged) .expect("transfer init failed"); tb.state_check(State::Busy, TransactionStep::ReceivingFileDataPdus); tb.generic_eof_no_error(&mut test_user, Vec::new()) .expect("EOF no error insertion failed"); tb.check_completion_indication_success(&mut test_user); + assert!(!tb.pdu_queue_empty()); + assert_eq!(tb.pdu_queue_len(), 2); + let pdu = tb.get_next_pdu().unwrap(); + assert_eq!(pdu.pdu_type, PduType::FileDirective); + assert_eq!(pdu.file_directive_type.unwrap(), FileDirectiveType::AckPdu); + assert!(!tb.pdu_queue_empty()); + let pdu = tb.get_next_pdu().unwrap(); + assert_eq!(pdu.pdu_type, PduType::FileDirective); + assert_eq!( + pdu.file_directive_type.unwrap(), + FileDirectiveType::FinishedPdu + ); + let ack_pdu = AckPdu::new_for_finished_pdu( + transfer_info.header, + ConditionCode::NoError, + TransactionStatus::Active, + ); + tb.handler + .state_machine( + &mut test_user, + Some(&create_packet_info(&ack_pdu, &mut tb.buf)), + ) + .expect("handling ack PDU failed"); assert!(test_user.indication_queues_empty()); } @@ -2250,7 +2291,7 @@ mod tests { let mut tb = DestHandlerTestbench::new_with_fixed_paths(fault_handler, false); let mut test_user = tb.test_user_from_cached_paths(file_size); - let transaction_id = tb + let transfer_info = tb .generic_transfer_init(&mut test_user, file_size, TransmissionMode::Unacknowledged) .expect("transfer init failed"); @@ -2264,7 +2305,7 @@ mod tests { let mut fault_handler = tb.handler.local_cfg.fault_handler.user_hook.borrow_mut(); assert_eq!(fault_handler.ignored_queue.len(), 1); let cancelled = fault_handler.ignored_queue.pop_front().unwrap(); - assert_eq!(cancelled.0, transaction_id); + assert_eq!(cancelled.0, transfer_info.id); assert_eq!(cancelled.1, ConditionCode::FileChecksumFailure); assert_eq!(cancelled.2, segment_len as u64); @@ -2311,7 +2352,7 @@ mod tests { let fault_handler = TestFaultHandler::default(); let mut testbench = DestHandlerTestbench::new_with_fixed_paths(fault_handler, false); let mut test_user = testbench.test_user_from_cached_paths(file_size); - let transaction_id = testbench + let transfer_info = testbench .generic_transfer_init(&mut test_user, file_size, TransmissionMode::Unacknowledged) .expect("transfer init failed"); @@ -2322,7 +2363,7 @@ mod tests { testbench .generic_eof_no_error(&mut test_user, random_data.to_vec()) .expect("EOF no error insertion failed"); - check_checksum_failure(&mut testbench, transaction_id); + check_checksum_failure(&mut testbench, transfer_info.id); testbench.state_check( State::Busy, @@ -2338,14 +2379,14 @@ mod tests { State::Busy, TransactionStep::ReceivingFileDataPdusWithCheckLimitHandling, ); - check_checksum_failure(&mut testbench, transaction_id); + check_checksum_failure(&mut testbench, transfer_info.id); testbench.set_check_timer_expired(); testbench .handler .state_machine_no_packet(&mut test_user) .expect("fsm error"); - check_checksum_failure(&mut testbench, transaction_id); + check_checksum_failure(&mut testbench, transfer_info.id); testbench.state_check(State::Idle, TransactionStep::Idle); @@ -2354,14 +2395,14 @@ mod tests { let cancelled_queue = &mut fault_hook.notice_of_cancellation_queue; assert_eq!(cancelled_queue.len(), 1); let cancelled = cancelled_queue.pop_front().unwrap(); - assert_eq!(cancelled.0, transaction_id); + assert_eq!(cancelled.0, transfer_info.id); assert_eq!(cancelled.1, ConditionCode::CheckLimitReached); assert_eq!(cancelled.2, segment_len as u64); } assert_eq!(test_user.finished_indic_queue.len(), 1); let finished_indication = test_user.finished_indic_queue.pop_front().unwrap(); - assert_eq!(finished_indication.id, transaction_id); + assert_eq!(finished_indication.id, transfer_info.id); assert_eq!( finished_indication.condition_code, ConditionCode::CheckLimitReached @@ -2478,7 +2519,7 @@ mod tests { let fault_handler = TestFaultHandler::default(); let mut tb = DestHandlerTestbench::new_with_fixed_paths(fault_handler, true); let mut user = tb.test_user_from_cached_paths(file_size); - tb.generic_transfer_init(&mut user, 0, TransmissionMode::Unacknowledged) + tb.generic_transfer_init(&mut user, file_size, TransmissionMode::Unacknowledged) .expect("transfer init failed"); let faulty_file_data = b"Hemlo World!"; assert_eq!( @@ -2606,7 +2647,7 @@ mod tests { let fault_handler = TestFaultHandler::default(); let mut tb = DestHandlerTestbench::new_with_fixed_paths(fault_handler, false); let mut user = tb.test_user_from_cached_paths(0); - let id = tb + let transfer_info = tb .generic_transfer_init(&mut user, 0, TransmissionMode::Unacknowledged) .expect("transfer init failed"); tb.state_check(State::Busy, TransactionStep::ReceivingFileDataPdus); @@ -2629,7 +2670,7 @@ mod tests { user.verify_finished_indication_retained( DeliveryCode::Complete, ConditionCode::CancelRequestReceived, - id, + transfer_info.id, ); } @@ -2644,8 +2685,8 @@ mod tests { let fault_handler = TestFaultHandler::default(); let mut tb = DestHandlerTestbench::new_with_fixed_paths(fault_handler, with_closure); let mut user = tb.test_user_from_cached_paths(file_size); - let id = tb - .generic_transfer_init(&mut user, 0, TransmissionMode::Unacknowledged) + let transfer_info = tb + .generic_transfer_init(&mut user, file_size, TransmissionMode::Unacknowledged) .expect("transfer init failed"); tb.state_check(State::Busy, TransactionStep::ReceivingFileDataPdus); if insert_packet { @@ -2689,7 +2730,7 @@ mod tests { user.verify_finished_indication_retained( DeliveryCode::Complete, ConditionCode::CancelRequestReceived, - id, + transfer_info.id, ); } else { // Checksum failure, so data is incomplete. @@ -2698,13 +2739,13 @@ mod tests { let mut fault_hook = tb.handler.local_cfg.user_fault_hook().borrow_mut(); let ignored_queue = &mut fault_hook.ignored_queue; let ignored = ignored_queue.pop_front().unwrap(); - assert_eq!(ignored.0, id); + assert_eq!(ignored.0, transfer_info.id); assert_eq!(ignored.1, ConditionCode::FileChecksumFailure); assert_eq!(ignored.2, 5); user.verify_finished_indication_retained( DeliveryCode::Incomplete, ConditionCode::CancelRequestReceived, - id, + transfer_info.id, ); } assert_eq!(finished_pdu.file_status(), FileStatus::Retained); @@ -2718,7 +2759,7 @@ mod tests { user.verify_finished_indication_retained( DeliveryCode::Complete, ConditionCode::CancelRequestReceived, - id, + transfer_info.id, ); assert_eq!(packets, 0); } @@ -2746,11 +2787,11 @@ mod tests { let fault_handler = TestFaultHandler::default(); let mut tb = DestHandlerTestbench::new_with_fixed_paths(fault_handler, false); let mut user = tb.test_user_from_cached_paths(0); - let id = tb + let transfer_info = tb .generic_transfer_init(&mut user, 0, TransmissionMode::Unacknowledged) .expect("transfer init failed"); tb.state_check(State::Busy, TransactionStep::ReceivingFileDataPdus); - tb.handler.cancel_request(&id); + tb.handler.cancel_request(&transfer_info.id); let packets = tb .handler .state_machine_no_packet(&mut user) @@ -2758,7 +2799,7 @@ mod tests { user.verify_finished_indication_retained( DeliveryCode::Complete, ConditionCode::CancelRequestReceived, - id, + transfer_info.id, ); assert_eq!(packets, 0); } @@ -2768,11 +2809,11 @@ mod tests { let fault_handler = TestFaultHandler::default(); let mut tb = DestHandlerTestbench::new_with_fixed_paths(fault_handler, true); let mut user = tb.test_user_from_cached_paths(0); - let id = tb + let transfer_info = tb .generic_transfer_init(&mut user, 0, TransmissionMode::Unacknowledged) .expect("transfer init failed"); tb.state_check(State::Busy, TransactionStep::ReceivingFileDataPdus); - tb.handler.cancel_request(&id); + tb.handler.cancel_request(&transfer_info.id); let packets = tb .handler .state_machine_no_packet(&mut user) @@ -2800,7 +2841,7 @@ mod tests { user.verify_finished_indication_retained( DeliveryCode::Complete, ConditionCode::CancelRequestReceived, - id, + transfer_info.id, ); } @@ -2813,14 +2854,14 @@ mod tests { let fault_handler = TestFaultHandler::default(); let mut tb = DestHandlerTestbench::new_with_fixed_paths(fault_handler, true); let mut user = tb.test_user_from_cached_paths(file_size); - let id = tb - .generic_transfer_init(&mut user, 0, TransmissionMode::Unacknowledged) + let transfer_info = tb + .generic_transfer_init(&mut user, file_size, TransmissionMode::Unacknowledged) .expect("transfer init failed"); tb.state_check(State::Busy, TransactionStep::ReceivingFileDataPdus); tb.generic_file_data_insert(&mut user, 0, &file_data[0..5]) .expect("file data insertion failed"); - tb.handler.cancel_request(&id); + tb.handler.cancel_request(&transfer_info.id); let packets = tb .handler .state_machine_no_packet(&mut user) @@ -2849,7 +2890,7 @@ mod tests { user.verify_finished_indication_retained( DeliveryCode::Incomplete, ConditionCode::CancelRequestReceived, - id, + transfer_info.id, ); } @@ -2865,12 +2906,12 @@ mod tests { .unwrap(); remote_cfg_mut.disposition_on_cancellation = true; let mut user = tb.test_user_from_cached_paths(0); - let id = tb + let transfer_info = tb .generic_transfer_init(&mut user, 0, TransmissionMode::Unacknowledged) .expect("transfer init failed"); tb.state_check(State::Busy, TransactionStep::ReceivingFileDataPdus); - tb.handler.cancel_request(&id); + tb.handler.cancel_request(&transfer_info.id); let packets = tb .handler .state_machine_no_packet(&mut user) @@ -2879,7 +2920,7 @@ mod tests { user.verify_finished_indication_retained( DeliveryCode::Complete, ConditionCode::CancelRequestReceived, - id, + transfer_info.id, ); } @@ -2899,14 +2940,14 @@ mod tests { .unwrap(); remote_cfg_mut.disposition_on_cancellation = true; let mut user = tb.test_user_from_cached_paths(file_size); - let transaction_id = tb - .generic_transfer_init(&mut user, 0, TransmissionMode::Unacknowledged) + let transfer_info = tb + .generic_transfer_init(&mut user, file_size, TransmissionMode::Unacknowledged) .expect("transfer init failed"); tb.state_check(State::Busy, TransactionStep::ReceivingFileDataPdus); tb.generic_file_data_insert(&mut user, 0, &file_data[0..5]) .expect("file data insertion failed"); - tb.handler.cancel_request(&transaction_id); + tb.handler.cancel_request(&transfer_info.id); let packets = tb .handler .state_machine_no_packet(&mut user) @@ -2918,7 +2959,7 @@ mod tests { user.verify_finished_indication( DeliveryCode::Incomplete, ConditionCode::CancelRequestReceived, - transaction_id, + transfer_info.id, FileStatus::DiscardDeliberately, ); } diff --git a/src/lib.rs b/src/lib.rs index 457e6fc..830d30d 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -1494,6 +1494,10 @@ pub(crate) mod tests { } impl TestCfdpSender { + pub fn queue_len(&self) -> usize { + self.packet_queue.borrow_mut().len() + } + pub fn retrieve_next_pdu(&self) -> Option { self.packet_queue.borrow_mut().pop_front() }