use enc_file::{encrypt_file, decrypt_bytes, EncryptOptions};
use secrecy::SecretString;
use std::fs;
use std::io::Write;
use tempfile::tempdir;
fn test_password() -> SecretString {
SecretString::new("test_password_123".into())
}
#[test]
fn test_file_size_validation() {
let dir = tempdir().unwrap();
let input = dir.path().join("input.bin");
let encrypted = dir.path().join("encrypted.enc");
let data = vec![0u8; 1024];
fs::File::create(&input).unwrap().write_all(&data).unwrap();
let opts = EncryptOptions::default();
let password = test_password();
let result = encrypt_file(&input, Some(&encrypted), password, opts);
assert!(result.is_ok());
}
#[test]
fn test_ciphertext_length_validation() {
let password = test_password();
let opts = EncryptOptions::default();
let data = vec![42u8; 1024];
let encrypted = enc_file::encrypt_bytes(&data, password.clone(), &opts).unwrap();
let result = decrypt_bytes(&encrypted, password);
assert!(result.is_ok());
}
#[test]
fn test_malformed_frame_detection() {
use enc_file::validate_chunk_size_for_streaming;
let max_allowed_chunk = (u32::MAX as usize) - 16; assert!(validate_chunk_size_for_streaming(max_allowed_chunk).is_ok());
let oversized_chunk = (u32::MAX as usize) - 15; assert!(validate_chunk_size_for_streaming(oversized_chunk).is_err());
assert!(validate_chunk_size_for_streaming(0).is_err());
}
#[test]
fn test_chunk_size_boundary_validation() {
use enc_file::validate_chunk_size_for_streaming;
assert!(validate_chunk_size_for_streaming(0).is_err()); assert!(validate_chunk_size_for_streaming(1024).is_ok()); assert!(validate_chunk_size_for_streaming(1024 * 1024).is_ok()); assert!(validate_chunk_size_for_streaming(8 * 1024 * 1024).is_ok());
let max_allowed = (u32::MAX as usize) - 16; assert!(validate_chunk_size_for_streaming(max_allowed).is_ok());
assert!(validate_chunk_size_for_streaming(max_allowed + 1).is_err());
}
#[test]
fn test_empty_file_handling() {
let dir = tempdir().unwrap();
let input = dir.path().join("empty.bin");
let encrypted = dir.path().join("empty.enc");
let decrypted = dir.path().join("empty.dec");
fs::File::create(&input).unwrap();
let opts = EncryptOptions::default();
let password = test_password();
encrypt_file(&input, Some(&encrypted), password.clone(), opts).unwrap();
enc_file::decrypt_file(&encrypted, Some(&decrypted), password).unwrap();
let result = fs::read(&decrypted).unwrap();
assert_eq!(result.len(), 0);
}