add more tests
This commit is contained in:
parent
a67718cff2
commit
0a3848d0a2
@ -164,9 +164,9 @@ pub struct PduHeader {
|
|||||||
impl PduHeader {
|
impl PduHeader {
|
||||||
pub fn new_for_file_data(
|
pub fn new_for_file_data(
|
||||||
pdu_conf: CommonPduConfig,
|
pdu_conf: CommonPduConfig,
|
||||||
|
pdu_datafield_len: u16,
|
||||||
seg_metadata_flag: SegmentMetadataFlag,
|
seg_metadata_flag: SegmentMetadataFlag,
|
||||||
seg_ctrl: SegmentationControl,
|
seg_ctrl: SegmentationControl,
|
||||||
pdu_datafield_len: u16,
|
|
||||||
) -> Self {
|
) -> Self {
|
||||||
PduHeader {
|
PduHeader {
|
||||||
pdu_type: PduType::FileData,
|
pdu_type: PduType::FileData,
|
||||||
@ -187,7 +187,7 @@ impl PduHeader {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn write_to_be_bytes(&self, buf: &mut [u8]) -> Result<(), PduError> {
|
pub fn write_to_be_bytes(&self, buf: &mut [u8]) -> Result<usize, PduError> {
|
||||||
if self.pdu_conf.source_entity_id.len() != self.pdu_conf.dest_entity_id.len() {
|
if self.pdu_conf.source_entity_id.len() != self.pdu_conf.dest_entity_id.len() {
|
||||||
return Err(PduError::SourceDestIdLenMissmatch((
|
return Err(PduError::SourceDestIdLenMissmatch((
|
||||||
self.pdu_conf.source_entity_id.len(),
|
self.pdu_conf.source_entity_id.len(),
|
||||||
@ -231,7 +231,8 @@ impl PduHeader {
|
|||||||
self.pdu_conf.dest_entity_id.write_to_be_bytes(
|
self.pdu_conf.dest_entity_id.write_to_be_bytes(
|
||||||
&mut buf[current_idx..current_idx + self.pdu_conf.dest_entity_id.len()],
|
&mut buf[current_idx..current_idx + self.pdu_conf.dest_entity_id.len()],
|
||||||
)?;
|
)?;
|
||||||
Ok(())
|
current_idx += self.pdu_conf.dest_entity_id.len();
|
||||||
|
Ok(current_idx)
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn from_be_bytes(buf: &[u8]) -> Result<Self, PduError> {
|
pub fn from_be_bytes(buf: &[u8]) -> Result<Self, PduError> {
|
||||||
@ -333,9 +334,11 @@ impl PduHeader {
|
|||||||
mod tests {
|
mod tests {
|
||||||
use crate::cfdp::pdu::{CommonPduConfig, PduHeader};
|
use crate::cfdp::pdu::{CommonPduConfig, PduHeader};
|
||||||
use crate::cfdp::{
|
use crate::cfdp::{
|
||||||
Direction, PduType, SegmentMetadataFlag, SegmentationControl, CFDP_VERSION_2,
|
CrcFlag, Direction, LargeFileFlag, PduType, SegmentMetadataFlag, SegmentationControl,
|
||||||
|
TransmissionMode, CFDP_VERSION_2,
|
||||||
};
|
};
|
||||||
use crate::util::UnsignedU8;
|
use crate::util::{UnsignedU16, UnsignedU8};
|
||||||
|
use std::format;
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
fn test_basic_state() {
|
fn test_basic_state() {
|
||||||
@ -360,7 +363,27 @@ mod tests {
|
|||||||
}
|
}
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
fn test_serialization() {
|
fn test_state() {
|
||||||
|
let src_id = UnsignedU8::new(1);
|
||||||
|
let dest_id = UnsignedU8::new(2);
|
||||||
|
let transaction_id = UnsignedU8::new(3);
|
||||||
|
let common_pdu_cfg = CommonPduConfig::new_with_defaults(src_id, dest_id, transaction_id)
|
||||||
|
.expect("common config creation failed");
|
||||||
|
let pdu_header = PduHeader::new_no_file_data(common_pdu_cfg, 5);
|
||||||
|
assert_eq!(pdu_header.pdu_type, PduType::FileDirective);
|
||||||
|
assert_eq!(pdu_header.pdu_datafield_len, 5);
|
||||||
|
assert_eq!(
|
||||||
|
pdu_header.seg_ctrl,
|
||||||
|
SegmentationControl::NoRecordBoundaryPreservation
|
||||||
|
);
|
||||||
|
assert_eq!(
|
||||||
|
pdu_header.seg_metadata_flag,
|
||||||
|
SegmentMetadataFlag::NotPresent
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn test_serialization_1() {
|
||||||
let src_id = UnsignedU8::new(1);
|
let src_id = UnsignedU8::new(1);
|
||||||
let dest_id = UnsignedU8::new(2);
|
let dest_id = UnsignedU8::new(2);
|
||||||
let transaction_id = UnsignedU8::new(3);
|
let transaction_id = UnsignedU8::new(3);
|
||||||
@ -370,6 +393,8 @@ mod tests {
|
|||||||
let mut buf: [u8; 7] = [0; 7];
|
let mut buf: [u8; 7] = [0; 7];
|
||||||
let res = pdu_header.write_to_be_bytes(&mut buf);
|
let res = pdu_header.write_to_be_bytes(&mut buf);
|
||||||
assert!(res.is_ok());
|
assert!(res.is_ok());
|
||||||
|
// 4 byte fixed header plus three bytes src, dest ID and transaction ID
|
||||||
|
assert_eq!(res.unwrap(), 7);
|
||||||
assert_eq!((buf[0] >> 5) & 0b111, CFDP_VERSION_2);
|
assert_eq!((buf[0] >> 5) & 0b111, CFDP_VERSION_2);
|
||||||
// File directive
|
// File directive
|
||||||
assert_eq!((buf[0] >> 4) & 1, 0);
|
assert_eq!((buf[0] >> 4) & 1, 0);
|
||||||
@ -391,5 +416,60 @@ mod tests {
|
|||||||
assert_eq!((buf[3] >> 3) & 0b1, 0);
|
assert_eq!((buf[3] >> 3) & 0b1, 0);
|
||||||
// Transaction Sequence ID length raw value is actual number of octets - 1 => 0
|
// Transaction Sequence ID length raw value is actual number of octets - 1 => 0
|
||||||
assert_eq!(buf[3] & 0b111, 0);
|
assert_eq!(buf[3] & 0b111, 0);
|
||||||
|
assert_eq!(buf[4], 1);
|
||||||
|
assert_eq!(buf[5], 3);
|
||||||
|
assert_eq!(buf[6], 2);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn test_serialization_2() {
|
||||||
|
let src_id = UnsignedU16::new(0x0001);
|
||||||
|
let dest_id = UnsignedU16::new(0x0203);
|
||||||
|
let transaction_id = UnsignedU16::new(0x0405);
|
||||||
|
let mut common_pdu_cfg =
|
||||||
|
CommonPduConfig::new_with_defaults(src_id, dest_id, transaction_id)
|
||||||
|
.expect("common config creation failed");
|
||||||
|
common_pdu_cfg.crc_flag = CrcFlag::WithCrc;
|
||||||
|
common_pdu_cfg.direction = Direction::TowardsSender;
|
||||||
|
common_pdu_cfg.trans_mode = TransmissionMode::Unacknowledged;
|
||||||
|
common_pdu_cfg.file_flag = LargeFileFlag::Large;
|
||||||
|
let pdu_header = PduHeader::new_for_file_data(
|
||||||
|
common_pdu_cfg,
|
||||||
|
5,
|
||||||
|
SegmentMetadataFlag::Present,
|
||||||
|
SegmentationControl::WithRecordBoundaryPreservation,
|
||||||
|
);
|
||||||
|
let mut buf: [u8; 16] = [0; 16];
|
||||||
|
let res = pdu_header.write_to_be_bytes(&mut buf);
|
||||||
|
assert!(res.is_ok(), "{}", format!("Result {res:?} not okay"));
|
||||||
|
// 4 byte fixed header, 6 bytes additional fields
|
||||||
|
assert_eq!(res.unwrap(), 10);
|
||||||
|
assert_eq!((buf[0] >> 5) & 0b111, CFDP_VERSION_2);
|
||||||
|
// File directive
|
||||||
|
assert_eq!((buf[0] >> 4) & 1, 1);
|
||||||
|
// Towards sender
|
||||||
|
assert_eq!((buf[0] >> 3) & 1, 1);
|
||||||
|
// Unacknowledged
|
||||||
|
assert_eq!((buf[0] >> 2) & 1, 1);
|
||||||
|
// With CRC
|
||||||
|
assert_eq!((buf[0] >> 1) & 1, 1);
|
||||||
|
// Large file size
|
||||||
|
assert_eq!(buf[0] & 1, 1);
|
||||||
|
let pdu_datafield_len = u16::from_be_bytes(buf[1..3].try_into().unwrap());
|
||||||
|
assert_eq!(pdu_datafield_len, 5);
|
||||||
|
// With record boundary preservation
|
||||||
|
assert_eq!((buf[3] >> 7) & 1, 1);
|
||||||
|
// Entity ID length raw value is actual number of octets - 1 => 1
|
||||||
|
assert_eq!((buf[3] >> 4) & 0b111, 1);
|
||||||
|
// With segment metadata
|
||||||
|
assert_eq!((buf[3] >> 3) & 0b1, 1);
|
||||||
|
// Transaction Sequence ID length raw value is actual number of octets - 1 => 1
|
||||||
|
assert_eq!(buf[3] & 0b111, 1);
|
||||||
|
assert_eq!(u16::from_be_bytes(buf[4..6].try_into().unwrap()), 0x0001);
|
||||||
|
assert_eq!(u16::from_be_bytes(buf[6..8].try_into().unwrap()), 0x0405);
|
||||||
|
assert_eq!(u16::from_be_bytes(buf[8..10].try_into().unwrap()), 0x0203);
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn test_deserialization_1() {}
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user