mod common;
use common::TestEnv;
use ironwal::{CompressionType, WalOptions};
use std::fs;
fn segment_path(root: &std::path::Path, stream: &str) -> std::path::PathBuf {
root.join(stream).join("00000000000000000000.wal")
}
#[test]
fn test_lz4_compression_effectiveness() {
let mut opts = WalOptions::default();
opts.compression = CompressionType::Lz4;
opts.min_compression_size = 0; opts.max_segment_size = u64::MAX;
let env = TestEnv::new(opts);
let stream = "effective_comp";
let payload = vec![b'A'; 10_000];
env.wal.append(stream, &payload).unwrap();
let common::TestEnv { wal, _dir, root } = env;
drop(wal);
let path = segment_path(&root, stream);
let file_size = fs::metadata(&path).unwrap().len();
assert!(
file_size < 1000,
"Compression failed! File size: {} bytes (Expected < 1000)",
file_size
);
let wal = ironwal::Wal::new(WalOptions::new(&root)).unwrap();
let read_back = wal.get(stream, 0).unwrap().unwrap();
assert_eq!(read_back, payload, "Decompressed data mismatch");
}
#[test]
fn test_compression_threshold_skip() {
let mut opts = WalOptions::default();
opts.compression = CompressionType::Lz4;
opts.min_compression_size = 1000; opts.max_segment_size = u64::MAX;
let env = TestEnv::new(opts);
let stream = "skip_comp";
let payload = vec![b'B'; 100];
env.wal.append(stream, &payload).unwrap();
let common::TestEnv { wal, _dir, root } = env;
drop(wal);
let path = segment_path(&root, stream);
let file_size = fs::metadata(&path).unwrap().len();
assert_eq!(
file_size, 136,
"Threshold ignored! File compressed when it shouldn't have been."
);
let wal = ironwal::Wal::new(WalOptions::new(&root)).unwrap();
let read_back = wal.get(stream, 0).unwrap().unwrap();
assert_eq!(read_back, payload);
}
#[test]
fn test_large_batch_compression() {
let mut opts = WalOptions::default();
opts.compression = CompressionType::Lz4;
opts.min_compression_size = 0;
let env = TestEnv::new(opts);
let stream = "batch_comp";
let item = vec![0u8; 1024];
let batch: Vec<&[u8]> = (0..100).map(|_| item.as_slice()).collect();
env.wal.append_batch(stream, &batch).unwrap();
let common::TestEnv { wal, _dir, root } = env;
drop(wal);
let path = segment_path(&root, stream);
let file_size = fs::metadata(&path).unwrap().len();
assert!(
file_size < 10_000,
"Batch compression ineffective. Size: {}",
file_size
);
let wal = ironwal::Wal::new(WalOptions::new(&root)).unwrap();
let mut iter = wal.iter(stream, 0).unwrap();
let mut count = 0;
while let Some(res) = iter.next() {
assert_eq!(res.unwrap(), item);
count += 1;
}
assert_eq!(count, 100);
}
#[test]
fn test_mixed_mode_read() {
let dir = tempfile::tempdir().unwrap();
let root = dir.path().to_path_buf();
let stream = "mixed_mode";
{
let mut opts = WalOptions::default();
opts.root_path = root.clone();
opts.compression = CompressionType::Lz4;
opts.min_compression_size = 0; let wal = ironwal::Wal::new(opts).unwrap();
wal.append(stream, b"compressed_data").unwrap(); }
{
let mut opts = WalOptions::default();
opts.root_path = root.clone();
opts.compression = CompressionType::None; let wal = ironwal::Wal::new(opts).unwrap();
wal.append(stream, b"raw_data").unwrap(); }
{
let opts = WalOptions::new(&root);
let wal = ironwal::Wal::new(opts).unwrap();
let val0 = wal.get(stream, 0).unwrap().unwrap();
assert_eq!(val0, b"compressed_data");
let val1 = wal.get(stream, 1).unwrap().unwrap();
assert_eq!(val1, b"raw_data");
}
}