use eck::context::EnkryptitContext;
use eck::types::CompressionType;
#[cfg(test)]
mod tests {
use super::*;
use std::io::Write;
use tempfile::TempDir;
const PNG: &[u8] = b"\x89PNG\r\n\x1a\n\x00\x00\x00\x0DIHDR";
const ZIP: &[u8] = b"PK\x03\x04";
const WAV: &[u8] = b"RIFF\x00\x00\x00\x00WAVE";
const XML: &[u8] = b"<?xml version=\"1.0\" encoding=\"UTF-8\"?><root/>";
const UNKNOWN: &[u8] = b"\xE0\xE1\xE2\xE3\xE4\xE5\xE6\xE7\xE8\xE9";
fn auto(dir: &TempDir, name: &str, bytes: &[u8]) -> CompressionType {
let path = dir.path().join(name);
std::fs::write(&path, bytes).unwrap();
let ctx = EnkryptitContext::new(
None,
CompressionType::Auto,
eck::types::ParallelismType::Auto,
);
ctx.resolve_compression(path.to_str().unwrap())
.expect("auto inference must succeed")
}
fn auto_sparse(dir: &TempDir, name: &str, head: &[u8], len: u64) -> CompressionType {
let path = dir.path().join(name);
let mut f = std::fs::File::create(&path).unwrap();
f.write_all(head).unwrap();
f.set_len(len).unwrap();
let ctx = EnkryptitContext::new(
None,
CompressionType::Auto,
eck::types::ParallelismType::Auto,
);
ctx.resolve_compression(path.to_str().unwrap())
.expect("auto inference must succeed")
}
#[test]
fn png_is_already_compressed() {
let dir = TempDir::new().unwrap();
assert_eq!(auto(&dir, "img.png", PNG), CompressionType::NoComp);
}
#[test]
fn zip_archive_is_already_compressed() {
let dir = TempDir::new().unwrap();
assert_eq!(auto(&dir, "bundle.zip", ZIP), CompressionType::NoComp);
}
#[test]
fn raw_wav_is_compressible_small() {
let dir = TempDir::new().unwrap();
assert_eq!(auto(&dir, "sound.wav", WAV), CompressionType::Lz4);
}
#[test]
fn text_xml_is_highly_compressible_small() {
let dir = TempDir::new().unwrap();
assert_eq!(auto(&dir, "doc.xml", XML), CompressionType::Zstd);
}
#[test]
fn unknown_file_small_is_nocomp() {
let dir = TempDir::new().unwrap();
assert_eq!(auto(&dir, "blob.bin", UNKNOWN), CompressionType::NoComp);
}
const LOW: u64 = 50 << 20; const MID_INF: u64 = 250 << 20; const MID_SUP: u64 = 1 << 30; const SUP: u64 = 5 << 30;
#[test]
fn compressible_just_below_low_boundary_uses_lz4() {
let dir = TempDir::new().unwrap();
assert_eq!(
auto_sparse(&dir, "w1.wav", WAV, LOW - 1),
CompressionType::Lz4
);
}
#[test]
fn compressible_above_low_boundary_uses_zstd() {
let dir = TempDir::new().unwrap();
assert_eq!(
auto_sparse(&dir, "w2.wav", WAV, LOW + 1),
CompressionType::Zstd
);
}
#[test]
fn compressible_above_mid_inferior_uses_xz() {
let dir = TempDir::new().unwrap();
assert_eq!(
auto_sparse(&dir, "w3.wav", WAV, MID_INF + 1),
CompressionType::Xz
);
}
#[test]
fn compressible_above_mid_superior_uses_zstd() {
let dir = TempDir::new().unwrap();
assert_eq!(
auto_sparse(&dir, "w4.wav", WAV, MID_SUP + 1),
CompressionType::Zstd
);
}
#[test]
fn compressible_above_superior_uses_lz4() {
let dir = TempDir::new().unwrap();
assert_eq!(
auto_sparse(&dir, "w5.wav", WAV, SUP + 1),
CompressionType::Lz4
);
}
#[test]
fn highly_compressible_mid_range_uses_xz() {
let dir = TempDir::new().unwrap();
assert_eq!(
auto_sparse(&dir, "d.xml", XML, LOW + 1),
CompressionType::Xz
);
}
#[test]
fn highly_compressible_very_large_uses_zstd() {
let dir = TempDir::new().unwrap();
assert_eq!(
auto_sparse(&dir, "d2.xml", XML, SUP + 1),
CompressionType::Zstd
);
}
#[test]
fn explicit_compression_short_circuits_inference() {
let ctx =
EnkryptitContext::new(None, CompressionType::Xz, eck::types::ParallelismType::Auto);
let resolved = ctx
.resolve_compression("/nonexistent/does/not/exist")
.unwrap();
assert_eq!(resolved, CompressionType::Xz);
}
}