mod common;
use common::*;
use predicates::prelude::*;
#[test]
fn test_decompress_basic_file() {
let dir = test_dir();
let original = create_test_file(
dir.path(),
"original.txt",
b"Hello, world! This is test data.",
);
let compressed = dir.path().join("original.txt.crush");
let decompressed = dir.path().join("original.txt");
crush_cmd()
.arg("compress")
.arg(&original)
.assert()
.success();
std::fs::remove_file(&original).unwrap();
crush_cmd()
.arg("decompress")
.arg(&compressed)
.assert()
.success()
.stdout(predicate::str::contains("Decompressed"));
assert_file_exists(&decompressed);
let decompressed_content = read_file(&decompressed);
assert_eq!(
decompressed_content, b"Hello, world! This is test data.",
"Decompressed content should match original"
);
}
#[test]
fn test_decompress_crc32_failure() {
let dir = test_dir();
let original = create_test_file(dir.path(), "test.txt", b"Test data for CRC validation");
let compressed = dir.path().join("test.txt.crush");
crush_cmd()
.arg("compress")
.arg(&original)
.assert()
.success();
let mut data = read_file(&compressed);
if data.len() > 20 {
let mid = data.len() / 2;
data[mid] ^= 0xFF; std::fs::write(&compressed, &data).unwrap();
}
std::fs::remove_file(&original).unwrap();
crush_cmd()
.arg("decompress")
.arg(&compressed)
.assert()
.failure()
.stderr(
predicate::str::contains("CRC")
.or(predicate::str::contains("checksum"))
.or(predicate::str::contains("corrupt"))
.or(predicate::str::contains("integrity")),
);
}
#[test]
fn test_decompress_handles_missing_metadata_gracefully() {
let dir = test_dir();
let original = create_test_file(
dir.path(),
"original.txt",
b"test data for metadata handling",
);
let compressed = dir.path().join("original.txt.crush");
let decompressed = dir.path().join("decompressed.txt");
crush_cmd()
.arg("compress")
.arg(&original)
.assert()
.success();
std::fs::remove_file(&original).unwrap();
crush_cmd()
.arg("decompress")
.arg(&compressed)
.arg("-o")
.arg(&decompressed)
.assert()
.success();
assert_file_exists(&decompressed);
let decompressed_content = read_file(&decompressed);
assert_eq!(
decompressed_content.as_slice(),
b"test data for metadata handling"
);
}
#[test]
fn test_decompress_invalid_header() {
let dir = test_dir();
let invalid = create_test_file(
dir.path(),
"invalid.crush",
b"Not a valid crush file header",
);
crush_cmd()
.arg("decompress")
.arg(&invalid)
.assert()
.failure()
.stderr(
predicate::str::contains("invalid")
.or(predicate::str::contains("header"))
.or(predicate::str::contains("format")),
);
}