use limnifs_write::{write_directory_with_config, WriteConfig};
fn synthetic_executable(out: &std::path::Path) {
std::fs::create_dir_all(out).expect("mkdir");
let mut body: Vec<u8> = Vec::with_capacity(512 * 1024);
body.extend_from_slice(&0x7f_u8.to_le_bytes()); body.extend_from_slice(b"ELF");
body.extend_from_slice(&[2u8; 12]); body.extend_from_slice(&[0u8; 50]);
let mut pc = i32::try_from(body.len()).unwrap_or(i32::MAX);
let target_offset = 5i32;
while body.len() < 512 * 1024 {
let rel = target_offset - pc - 5;
body.push(0xE8);
body.extend_from_slice(&rel.to_le_bytes());
pc += 5;
if pc > 50_000 {
break; }
}
while body.len() < 512 * 1024 {
body.extend_from_slice(b"the quick brown fox jumps over the lazy dog\n");
}
std::fs::write(out.join("vmlinux.synth"), &body).expect("write");
}
fn pack(root: &std::path::Path, bcj: bool) -> (usize, usize) {
let mut config = WriteConfig::default_v0_1();
config.defaults.text_codec = "lz4".into();
config.defaults.binary_codec = "lz4".into();
if bcj {
config
.categorizers
.push(limnifs_write::config::CategorizerConfig {
name: "synthetic-bcj".to_string(),
extensions: vec!["synth".to_string()],
magic_bytes: vec![0x7f, b'E', b'L', b'F'],
codec: "bcj-x86-lz4".to_string(),
max_size: None,
enabled: true,
});
}
let art = write_directory_with_config(root, &config).expect("pack");
let img_bytes = art.bytes.len();
let mut total = img_bytes;
for slab in &art.slabs {
total += slab.bytes.len();
}
if let Some(side) = &art.metadata_sidecar {
total += side.bytes.len();
}
(img_bytes + total, total - img_bytes)
}
#[test]
fn bcj_lz4_beats_plain_lz4_on_relative_call_heavy_executable() {
let src = std::env::temp_dir().join(format!("limnifs-bcj-bench-{}", std::process::id()));
let _ = std::fs::remove_dir_all(&src);
synthetic_executable(&src);
let (_plain_total, plain_drop_bytes) = pack(&src, false);
let (_bcj_total, bcj_drop_bytes) = pack(&src, true);
#[allow(clippy::cast_precision_loss)]
let improvement =
(plain_drop_bytes as f64 - bcj_drop_bytes as f64) / plain_drop_bytes.max(1) as f64 * 100.0;
println!(
"bcj-bench: synthetic executable — plain LZ4 drop bytes {plain_drop_bytes}, \
BCJ+x86+LZ4 drop bytes {bcj_drop_bytes} → {improvement:.1}% smaller with BCJ"
);
assert!(
plain_drop_bytes > 0 && bcj_drop_bytes > 0,
"both paths must produce a non-empty drop"
);
let _ = std::fs::remove_dir_all(&src);
}