use archivator::zip::ZipError; use archivator::{Archive, Zip}; use std::io::{Read, Seek, SeekFrom}; #[test] fn test_zip_passwd() { let mut archive = Archive::::read_from_file("tests/files/archive_passwd.zip").unwrap(); assert_eq!(archive.comment(), "archive comment"); assert_eq!( archive .files() .iter() .map(|f| &f.name) .collect::>(), vec!["store", "deflate", "bzip"] ); assert!(archive .get_file_reader_by_name("store") .is_err_and(|e| e == ZipError::PasswordIsNotSpecified)); assert!(archive .get_file_reader_by_name_with_password("store", b"wrong_passwd") .is_err_and(|e| e == ZipError::IncorrectPassword)); for (name, check_data) in [ ("store", "1e643774f40510e37c6f3c451d9d"), ("deflate", "a70aff4b6b2754ad47852503236a"), ("bzip", "f7085f4f8ecc512a8c2c3cbe8227"), ] { let mut f = archive .get_file_reader_by_name_with_password(name, b"passwd") .unwrap(); let mut data = String::new(); f.read_to_string(&mut data).unwrap(); assert_eq!(&data[..24], "test encrypted file data"); assert_eq!(&data[172..], check_data); } } #[test] fn test_zip() { let mut archive = Archive::::read_from_file("tests/files/archive.zip").unwrap(); assert_eq!(archive.comment(), "archive comment"); assert_eq!( archive .files() .iter() .map(|f| &f.name) .collect::>(), vec!["store", "deflate", "bzip", "lzma", "zstd", "xz"] ); let mut f = archive.get_file_reader_by_name("store").unwrap(); let mut data = String::new(); f.read_to_string(&mut data).unwrap(); assert_eq!(data, "test file data"); assert_eq!(f.seek(SeekFrom::Start(5)).unwrap(), 5); let mut data = String::new(); f.read_to_string(&mut data).unwrap(); assert_eq!(data, "file data"); assert_eq!(f.seek(SeekFrom::Start(0)).unwrap(), 0); let mut data = vec![0; 4]; f.read_exact(&mut data).unwrap(); assert_eq!(String::from_utf8(data).unwrap(), "test"); assert_eq!(f.seek(SeekFrom::Current(1)).unwrap(), 5); let mut data = vec![0; 4]; f.read_exact(&mut data).unwrap(); assert_eq!(String::from_utf8(data).unwrap(), "file"); assert_eq!(f.seek(SeekFrom::End(-4)).unwrap(), 10); let mut data = vec![0; 4]; f.read_exact(&mut data).unwrap(); assert_eq!(String::from_utf8(data).unwrap(), "data"); f.seek(SeekFrom::Start(7)).unwrap(); assert_eq!(f.seek(SeekFrom::Current(0)).unwrap(), 7); assert!(f .seek(SeekFrom::End(-100)) .is_err_and(|e| e.get_ref().unwrap().to_string() == "Invalid seek to a negative or overflowing position")); assert_eq!(f.seek(SeekFrom::Current(0)).unwrap(), 7); assert_eq!(f.seek(SeekFrom::Start(100)).unwrap(), 14); for index in 0..archive.len() { let mut f = archive.get_file_reader_by_index(index).unwrap(); let mut data = String::new(); f.read_to_string(&mut data).unwrap(); assert_eq!(data, "test file data"); assert!(!f.is_seekable() || f.info().name == "store") } } #[test] fn test_bad_zip() { assert!(Archive::::read_from_file("tests/files/blank") .is_err_and(|e| e == ZipError::EocdrNotFound)); assert_eq!( Archive::::read_from_file("tests/files/empty.zip") .unwrap() .len(), 0 ); }