use bzip2::write::BzEncoder;
use std::io::Write;
fn bz2(data: &[u8]) -> Vec<u8> {
let mut enc = BzEncoder::new(Vec::new(), bzip2::Compression::best());
enc.write_all(data).unwrap();
enc.finish().unwrap()
}
fn payload() -> Vec<u8> {
(0..200_000u32)
.map(|i| (i.wrapping_mul(2654435761) >> 13) as u8)
.collect()
}
#[test]
fn parallel_roundtrip_is_byte_identical() {
let original = payload();
let compressed = bz2(&original);
let par = lbzip2::parallel::decompress_parallel(&compressed).unwrap();
let seq = lbzip2::stream::decompress(&compressed).unwrap();
assert_eq!(par, original, "parallel decode must reproduce the input");
assert_eq!(par, seq, "parallel and sequential decode must agree");
}
#[test]
fn parallel_rejects_corrupted_block_data() {
let original = payload();
let mut compressed = bz2(&original);
let mid = compressed.len() / 2;
compressed[mid] ^= 0xFF;
let result = lbzip2::parallel::decompress_parallel(&compressed);
assert!(
result.is_err(),
"a corrupted block must be REJECTED, got Ok({} bytes)",
result.map(|v| v.len()).unwrap_or(0)
);
}
#[test]
fn parallel_rejects_corrupted_stream_crc() {
let original = payload();
let mut compressed = bz2(&original);
let n = compressed.len();
assert!(n > 5);
compressed[n - 3] ^= 0xFF;
let result = lbzip2::parallel::decompress_parallel(&compressed);
assert!(
result.is_err(),
"a tampered stream CRC must be REJECTED, got Ok({} bytes)",
result.map(|v| v.len()).unwrap_or(0)
);
}