use msy::compress::{Compression, compress, decompress, should_compress_adaptive};
use std::fs;
use tempfile::TempDir;
#[test]
fn test_compression_end_to_end() {
let source_dir = TempDir::new().unwrap();
let dest_dir = TempDir::new().unwrap();
let source_file = source_dir.path().join("test.txt");
let test_data = "This is test data that should compress well. ".repeat(25_000); fs::write(&source_file, &test_data).unwrap();
let file_size = test_data.len() as u64;
let compression = should_compress_adaptive(
source_file.to_str().unwrap(),
file_size,
false, None, );
assert_eq!(compression, Compression::Zstd, "Should use Zstd for network transfers");
let source_data = fs::read(&source_file).unwrap();
let compressed = compress(&source_data, compression).unwrap();
let compression_ratio = compressed.len() as f64 / source_data.len() as f64;
assert!(compression_ratio < 0.5, "Should compress to less than 50% for repetitive data");
println!("Compression ratio: {:.1}% ({}KB -> {}KB)", compression_ratio * 100.0, source_data.len() / 1024, compressed.len() / 1024);
let dest_file = dest_dir.path().join("test.txt.compressed");
fs::write(&dest_file, &compressed).unwrap();
let transferred = fs::read(&dest_file).unwrap();
let decompressed = decompress(&transferred, compression).unwrap();
assert_eq!(decompressed, source_data, "Decompressed data should match original");
println!("✓ Compression integration test passed");
}
#[test]
fn test_compression_skip_precompressed() {
let compression = should_compress_adaptive(
"video.mp4",
10_000_000, false, None,
);
assert_eq!(compression, Compression::None, "Should not compress mp4 files");
}
#[test]
fn test_compression_skip_small_files() {
let compression = should_compress_adaptive(
"small.txt",
512_000, false, None,
);
assert_eq!(compression, Compression::None, "Should not compress files < 1MB");
}
#[test]
fn test_compression_skip_local() {
let compression = should_compress_adaptive(
"large.txt",
10_000_000, true, None,
);
assert_eq!(compression, Compression::None, "Should not compress local transfers");
}
#[test]
fn test_compression_performance() {
use std::time::Instant;
let data: Vec<u8> = "ABCDEFGH".repeat(1_250_000).into_bytes();
let start = Instant::now();
let compressed = compress(&data, Compression::Zstd).unwrap();
let duration = start.elapsed();
let throughput = (data.len() as f64 / duration.as_secs_f64()) / 1_000_000_000.0; let ratio = compressed.len() as f64 / data.len() as f64;
println!("Zstd Performance:");
println!(" Throughput: {:.2} GB/s", throughput);
println!(" Ratio: {:.1}%", ratio * 100.0);
println!(" Size: {} KB -> {} KB", data.len() / 1024, compressed.len() / 1024);
assert!(throughput > 0.3, "Zstd should compress at >0.3 GB/s, got {:.2} GB/s", throughput);
}