#![allow(clippy::unwrap_used, clippy::expect_used, clippy::doc_markdown)]
use std::io::{Cursor, Read};
use std::path::PathBuf;
use zip_core::{CompressionMethod, ZipArchive};
fn winzip_lorem() -> &'static [u8] {
include_bytes!(concat!(
env!("CARGO_MANIFEST_DIR"),
"/../tests/data/codecs/realworld-winzip-lorem.txt"
))
}
fn fixture(name: &str) -> Vec<u8> {
let path =
PathBuf::from(concat!(env!("CARGO_MANIFEST_DIR"), "/../tests/data/codecs")).join(name);
std::fs::read(&path).unwrap_or_else(|e| panic!("read fixture {}: {e}", path.display()))
}
fn assert_zip_core_decodes(bytes: &[u8], name: &str, method: CompressionMethod, expect: &[u8]) {
let mut ar = ZipArchive::new(Cursor::new(bytes.to_vec())).unwrap();
let mut e = ar.by_name(name).unwrap();
assert_eq!(e.compression(), method, "method for {name}");
let mut got = Vec::new();
e.read_to_end(&mut got).unwrap();
assert_eq!(got, expect, "decoded bytes for {name}");
}
#[test]
fn bzip2_decodes_real_world_libzip_fixture() {
let bytes = fixture("realworld-bzip2-libzip.zip");
let expected = b"aaaaaaaaaaaaaa\nbbbbbbbbbbbbbb\naaaaaaaaaaaaaa\ncccccccccccccc\n";
assert_zip_core_decodes(
&bytes,
"abac-repeat.txt",
CompressionMethod::Bzip2,
expected,
);
}
#[test]
fn zstd_decodes_real_world_winzip_fixture() {
let bytes = fixture("realworld-zstd-winzip.zip");
assert_zip_core_decodes(&bytes, "lorem.txt", CompressionMethod::Zstd, winzip_lorem());
}
#[test]
fn deflate64_decodes_real_world_winzip_fixture() {
let bytes = fixture("realworld-deflate64-winzip.zip");
assert_zip_core_decodes(
&bytes,
"lorem.txt",
CompressionMethod::Deflate64,
winzip_lorem(),
);
}
#[test]
fn lzma_decodes_real_world_winzip_fixture() {
let bytes = fixture("realworld-lzma-winzip.zip");
assert_zip_core_decodes(&bytes, "lorem.txt", CompressionMethod::Lzma, winzip_lorem());
}
#[test]
fn xz_decodes_real_world_winzip_fixture() {
let bytes = fixture("realworld-xz-winzip.zip");
assert_zip_core_decodes(&bytes, "lorem.txt", CompressionMethod::Xz, winzip_lorem());
}
#[test]
fn deflate64_decodes_real_securitynik_ctf() {
let Ok(zip_path) = std::env::var("ZIP_CORE_REAL_DEFLATE64_ZIP") else {
eprintln!("skipping: ZIP_CORE_REAL_DEFLATE64_ZIP not set");
return;
};
let file = std::fs::File::open(&zip_path).unwrap();
let mut ar = ZipArchive::new(file).unwrap();
{
let json = "SECURITYNIK-WIN-20231116-235706.json";
let mut e = ar.by_name(json).unwrap();
assert_eq!(e.compression(), CompressionMethod::Deflate64);
let mut out = Vec::new();
e.read_to_end(&mut out).unwrap();
assert_eq!(out.len() as u64, e.size(), "decoded length vs CD size");
}
if std::env::var("ZIP_CORE_REAL_DEFLATE64_FULL").is_ok() {
let dmp = "SECURITYNIK-WIN-20231116-235706.dmp";
let mut d = ar.by_name(dmp).unwrap();
assert_eq!(d.compression(), CompressionMethod::Deflate64);
let n = std::io::copy(&mut d, &mut std::io::sink()).unwrap();
assert_eq!(n, d.size(), "decoded length vs CD size");
}
}