make first acked test work

This commit is contained in:
Robin Mueller
2025-09-23 15:04:50 +02:00
parent 014df5ee7f
commit d112df6fca
2 changed files with 82 additions and 37 deletions

View File

@@ -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<SentPdu> {
self.handler.pdu_sender.retrieve_next_pdu()
}
@@ -1934,7 +1948,7 @@ mod tests {
user: &mut TestCfdpUser,
file_size: u64,
transmission_mode: TransmissionMode,
) -> Result<TransactionId, DestError> {
) -> Result<TransferInfo, DestError> {
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,
);
}

View File

@@ -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<SentPdu> {
self.packet_queue.borrow_mut().pop_front()
}