#[cfg(test)]
#[allow(clippy::expect_used, clippy::unwrap_used)]
mod tests {
use crate::wal_export::{
buffered_sink::BufferedWalSink, WalRecordSink, MAX_RECORD_BYTES, STREAM_HEADER_MAGIC,
};
fn synth_record(seq: u64, padding: usize) -> Vec<u8> {
let mut bytes = postcard::to_allocvec(&seq).unwrap();
bytes.extend(std::iter::repeat(0u8).take(padding));
bytes
}
fn export_one_record(record: &[u8]) -> Vec<u8> {
let mut sink = BufferedWalSink::new(Vec::<u8>::new());
sink.append_record(record).expect("append OK");
sink.flush().expect("flush OK");
sink.into_writer_for_test()
}
fn export_records(records: &[Vec<u8>]) -> Vec<u8> {
let mut sink = BufferedWalSink::new(Vec::<u8>::new());
for r in records {
sink.append_record(r).expect("append OK");
}
sink.flush().expect("flush OK");
sink.into_writer_for_test()
}
#[test]
fn postcard_record_bytes_preserved_bit_exact() {
let input = synth_record(0xABCD_1234, 64);
let output = export_one_record(&input);
let header_end = STREAM_HEADER_MAGIC.len();
let prefix_end = header_end + 8;
let record_section = &output[prefix_end..prefix_end + input.len()];
assert_eq!(
record_section, input,
"record section in streamed output must equal input bytes bit-exact"
);
}
#[test]
fn multi_record_sections_preserved_bit_exact_in_order() {
let r1 = synth_record(1, 8);
let r2 = synth_record(2, 16);
let r3 = synth_record(3, 12);
let output = export_records(&[r1.clone(), r2.clone(), r3.clone()]);
let mut cursor = STREAM_HEADER_MAGIC.len();
for expected in [&r1, &r2, &r3] {
let len_bytes: [u8; 8] = output[cursor..cursor + 8]
.try_into()
.expect("8 bytes for length prefix");
let len = u64::from_be_bytes(len_bytes) as usize;
assert_eq!(len, expected.len(), "framed length matches input length");
cursor += 8;
let section = &output[cursor..cursor + len];
assert_eq!(
section, expected,
"record section preserved bit-exact at frame boundary"
);
cursor += len;
}
assert_eq!(cursor, output.len(), "no trailing bytes after records");
}
#[test]
fn streaming_header_byte_pattern_golden() {
let input = synth_record(1, 8);
let output = export_one_record(&input);
let header_section = &output[..STREAM_HEADER_MAGIC.len()];
assert_eq!(
header_section,
&[0x41, 0x52, 0x4B, 0x48, 0x45, 0x58, 0x50, 0x31][..],
"header magic at offset 0 matches pinned hex (ARKHEXP1)"
);
}
#[test]
fn length_prefix_uses_u64_big_endian_encoding() {
let input = synth_record(1, 257);
assert_eq!(
input.len(),
258,
"synthetic record = postcard(1) [1B] + 257 padding [257B] = 258B"
);
let output = export_one_record(&input);
let prefix_section = &output[STREAM_HEADER_MAGIC.len()..STREAM_HEADER_MAGIC.len() + 8];
assert_eq!(
prefix_section,
&[0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x02][..],
"u64 BE length prefix encodes high-order byte first"
);
}
#[test]
fn stream_framing_golden_vector() {
let mut input = postcard::to_allocvec(&1u64).unwrap();
input.extend_from_slice(&[0xAB, 0xCD, 0xEF]);
assert_eq!(input.len(), 4, "synthetic input is 4 bytes");
assert_eq!(
input.as_slice(),
&[0x01, 0xAB, 0xCD, 0xEF][..],
"postcard varint(1) = 0x01"
);
let output = export_one_record(&input);
let expected: &[u8] = &[
0x41, 0x52, 0x4B, 0x48, 0x45, 0x58, 0x50, 0x31, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x01, 0xAB, 0xCD, 0xEF, ];
assert_eq!(
output.as_slice(),
expected,
"entire stream output matches pinned wire-format hex vector"
);
}
#[test]
fn max_record_bytes_constant_anchored_at_sixteen_mib() {
assert_eq!(MAX_RECORD_BYTES, 1 << 24);
assert_eq!(MAX_RECORD_BYTES, 16_777_216);
}
}