Archive Module Phase 1: 核心框架搭建完成

实现内容:
 archive模块完整架构(10个文件,约900行)
 ArchiveProcessor trait统一接口
 ProcessorRegistry插件式架构
 FormatDetector格式自动检测
 ArchiveConfig配置管理系统
 Warning警告系统(RAR/XZ/7z争议格式)
 Zip Slip/Zip Bomb安全防护
 核心格式stub(ZIP/TAR/GZIP等9种)
 可选格式stub(RAR/XZ/7z等3种)
 测试框架基础

支持的格式:
核心格式(默认启用):ZIP, TAR, GZIP, ZSTD, BZIP2, LZ4, TAR.GZ, TAR.BZ2, TAR.ZST(9种)
可选格式(默认禁用):RAR(法律风险), XZ(外部依赖), 7z(库不稳定)(3种)
总计:12种压缩格式

安全特性:
- Zip Slip防护(路径遍历攻击)
- Zip Bomb防护(解压比率限制)
- 文件大小限制
- 法律风险警告(RAR专利)

下一步:Phase 2 - 核心格式完整实现(ZIP/TAR/GZIP处理器)
This commit is contained in:
Warren
2026-06-10 17:21:42 +08:00
parent 96bb08dd94
commit 55db79cb8d
9 changed files with 1292 additions and 0 deletions

View File

@@ -0,0 +1,57 @@
// Archive Module Tests
#[cfg(test)]
mod tests {
use crate::archive::*;
#[test]
fn test_processor_registry_initialization() {
let config = ArchiveConfig::default();
let mut registry = ProcessorRegistry::new(config);
registry.initialize().unwrap();
let formats = registry.enabled_formats();
// Core formats (9) should always be enabled
assert!(formats.contains(&ArchiveFormat::Zip));
assert!(formats.contains(&ArchiveFormat::Tar));
assert!(formats.contains(&ArchiveFormat::Gzip));
// Optional formats should be disabled by default
assert!(!formats.contains(&ArchiveFormat::Rar));
assert!(!formats.contains(&ArchiveFormat::Xz));
assert!(!formats.contains(&ArchiveFormat::SevenZ));
// Should have exactly 9 core formats
assert_eq!(formats.len(), 9);
}
#[test]
fn test_optional_formats_disabled_by_default() {
let config = ArchiveConfig::default();
assert_eq!(config.enable_rar, false);
assert_eq!(config.enable_xz, false);
assert_eq!(config.enable_7z, false);
}
#[test]
fn test_config_validation() {
let valid_config = ArchiveConfig::default();
assert!(valid_config.validate().is_ok());
let invalid_config = ArchiveConfig {
max_decompression_ratio: 1, // Too low
..Default::default()
};
assert!(invalid_config.validate().is_err());
}
#[test]
fn test_archive_format_display() {
assert_eq!(ArchiveFormat::Zip.to_string(), "ZIP");
assert_eq!(ArchiveFormat::TarGzip.to_string(), "TAR.GZ");
assert_eq!(ArchiveFormat::Rar.to_string(), "RAR");
}
}