use super::*;
use test_log::test;
#[test]
fn block_header_serde_roundtrip() -> crate::Result<()> {
let header = Header {
block_type: BlockType::Manifest,
block_flags: block_flags::KV_CHECKSUM_FOOTER | block_flags::COMPRESSED,
checksum: Checksum::from_raw(5),
data_length: 252_356,
uncompressed_length: 124_124_124,
};
let bytes = header.encode_into_vec();
assert_eq!(bytes.len(), Header::header_len(BlockType::Manifest));
assert_eq!(header, Header::decode_from(&mut &bytes[..])?);
Ok(())
}
#[test]
fn block_header_serde_roundtrip_sst_omits_flags_byte() -> crate::Result<()> {
let header = Header {
block_type: BlockType::Data,
block_flags: 0,
checksum: Checksum::from_raw(7),
data_length: 42,
uncompressed_length: 42,
};
let bytes = header.encode_into_vec();
assert_eq!(bytes.len(), Header::MIN_LEN);
assert_eq!(header, Header::decode_from(&mut &bytes[..])?);
Ok(())
}
#[test]
fn block_header_rejects_unknown_block_flags_bit() {
let header = Header {
block_type: BlockType::Manifest,
block_flags: 1 << 4,
checksum: Checksum::from_raw(5),
data_length: 10,
uncompressed_length: 10,
};
let bytes = header.encode_into_vec();
assert!(
matches!(
Header::decode_from(&mut &bytes[..]),
Err(crate::Error::InvalidTag(("block_flags", _))),
),
"decode must reject an unknown block_flags bit",
);
}
#[test]
#[expect(clippy::indexing_slicing)]
fn block_header_detect_corruption() {
let header = Header {
block_type: BlockType::Data,
block_flags: 0,
checksum: Checksum::from_raw(5),
data_length: 252_356,
uncompressed_length: 124_124_124,
};
let mut bytes = header.encode_into_vec();
bytes[5] += 1;
assert!(
matches!(
Header::decode_from(&mut &bytes[..]),
Err(crate::Error::ChecksumMismatch { .. }),
),
"did not detect header corruption",
);
}