use crate::error::{Error, Result};
pub fn compress(src: &[u8]) -> Result<Vec<u8>> {
zstd::encode_all(src, 0).map_err(|e| Error::InvalidZstd(e.to_string()))
}
pub fn uncompress(src: &[u8]) -> Result<Vec<u8>> {
zstd::decode_all(src).map_err(|e| Error::InvalidZstd(e.to_string()))
}
#[cfg(test)]
mod tests {
use super::{compress, uncompress};
use crate::error::Result;
#[test]
fn test_compress_and_uncompress_roundtrip() {
let msg = b"This is a test message for ZSTD compression";
let compressed = compress(msg).unwrap();
let decompressed = uncompress(&compressed).unwrap();
assert_eq!(msg.to_vec(), decompressed);
}
#[test]
fn test_uncompress_corrupted_data() {
let data = b"Hello, ZSTD compression!";
let mut compressed = compress(data).unwrap();
if compressed.len() > 4 {
compressed[4] ^= 0xFF;
}
let result: Result<Vec<u8>> = uncompress(&compressed);
assert!(result.is_err());
}
#[test]
fn test_empty_input() {
let empty = b"";
let compressed = compress(empty).unwrap();
let decompressed = uncompress(&compressed).unwrap();
assert!(decompressed.is_empty());
}
#[test]
fn test_large_input_compression_ratio() {
let data: Vec<u8> = (0..100_000).map(|i| (i % 256) as u8).collect();
let compressed = compress(&data).unwrap();
assert!(compressed.len() < data.len());
let decompressed = uncompress(&compressed).unwrap();
assert_eq!(data, decompressed);
}
#[test]
fn test_repetitive_data() {
let data = "aaaaaa".repeat(10_000).into_bytes();
let compressed = compress(&data).unwrap();
assert!(compressed.len() < data.len() / 2);
let decompressed = uncompress(&compressed).unwrap();
assert_eq!(data, decompressed);
}
#[test]
fn test_all_byte_values() {
let data: Vec<u8> = (0u8..=255).collect();
let compressed = compress(&data).unwrap();
let decompressed = uncompress(&compressed).unwrap();
assert_eq!(data, decompressed);
}
#[test]
fn test_single_byte() {
let data = b"X";
let compressed = compress(data).unwrap();
let decompressed = uncompress(&compressed).unwrap();
assert_eq!(data.to_vec(), decompressed);
}
#[test]
fn test_non_repetitive_data() {
let data: Vec<u8> = (0u32..1_000)
.flat_map(|i| i.to_le_bytes())
.collect();
let compressed = compress(&data).unwrap();
let decompressed = uncompress(&compressed).unwrap();
assert_eq!(data, decompressed);
}
#[test]
fn test_zstd_compression_attribute_value() {
use crate::compression::Compression;
assert_eq!(Compression::ZSTD as i8, 4);
}
#[test]
fn test_invalid_data() {
let result: Result<Vec<u8>> = uncompress(b"not valid zstd data at all");
assert!(result.is_err());
}
}