#![allow(dead_code)]
use std::io::Cursor;
use zesven::{ArchivePath, WriteOptions, WriteResult, Writer};
pub fn create_archive_with_result(
options: Option<WriteOptions>,
entries: &[(&str, &[u8])],
) -> zesven::Result<(Vec<u8>, WriteResult)> {
let mut archive_bytes = Vec::new();
let result = {
let cursor = Cursor::new(&mut archive_bytes);
let writer = Writer::create(cursor)?;
let mut writer = match options {
Some(opts) => writer.options(opts),
None => writer,
};
for (name, data) in entries {
let path = ArchivePath::new(name)?;
writer.add_bytes(path, data)?;
}
writer.finish()?
};
Ok((archive_bytes, result))
}
pub fn create_archive(entries: &[(&str, &[u8])]) -> zesven::Result<Vec<u8>> {
create_archive_with_result(None, entries).map(|(bytes, _)| bytes)
}
pub fn create_archive_with_options(
options: WriteOptions,
entries: &[(&str, &[u8])],
) -> zesven::Result<Vec<u8>> {
create_archive_with_result(Some(options), entries).map(|(bytes, _)| bytes)
}
pub fn expect_err<T, E>(result: Result<T, E>) -> E {
match result {
Ok(_) => panic!("Expected error but got Ok"),
Err(e) => e,
}
}
pub fn verify_archive_contents(archive_bytes: &[u8], expected_entries: &[(&str, &[u8])]) {
use std::io::Cursor;
use zesven::read::{Archive, SelectAll, TestOptions};
let cursor = Cursor::new(archive_bytes);
let mut archive = Archive::open(cursor).expect("Failed to open archive for verification");
let test_result = archive
.test(SelectAll, &TestOptions::default())
.expect("Archive test failed");
assert_eq!(
test_result.entries_failed, 0,
"CRC verification failed: {:?}",
test_result.failures
);
let file_count = expected_entries.len();
let archive_file_count = archive.entries().iter().filter(|e| !e.is_directory).count();
assert_eq!(
archive_file_count, file_count,
"Entry count mismatch: expected {}, got {}",
file_count, archive_file_count
);
for (name, expected_data) in expected_entries {
let mut found = false;
for entry in archive.entries() {
if entry.path.as_str() == *name {
found = true;
let extracted = archive
.extract_to_vec(name)
.unwrap_or_else(|e| panic!("Failed to extract '{}': {}", name, e));
assert_eq!(
&extracted[..],
*expected_data,
"Content mismatch for '{}'",
name
);
break;
}
}
assert!(found, "Entry '{}' not found in archive", name);
}
}
#[cfg(feature = "aes")]
pub fn verify_encrypted_archive(
archive_bytes: &[u8],
password: &str,
expected_entries: &[(&str, &[u8])],
) {
use std::io::Cursor;
use zesven::read::{Archive, SelectAll, TestOptions};
let cursor = Cursor::new(archive_bytes);
let mut archive =
Archive::open_with_password(cursor, password).expect("Failed to open encrypted archive");
let test_result = archive
.test(SelectAll, &TestOptions::default())
.expect("Archive test failed");
assert_eq!(
test_result.entries_failed, 0,
"Decryption failed with correct password: {:?}",
test_result.failures
);
for (name, expected_data) in expected_entries {
let extracted = archive
.extract_to_vec(name)
.unwrap_or_else(|e| panic!("Failed to extract '{}': {}", name, e));
assert_eq!(
&extracted[..],
*expected_data,
"Content mismatch for '{}' after decryption",
name
);
}
}