use crate::inspectors::mime_extension_lookup; use crate::mimedb::*; use crate::{extension_from_path, init_db, scan_directory, scan_from_walkdir}; use cfg_if::cfg_if; use mime_guess::mime::{APPLICATION_OCTET_STREAM, APPLICATION_PDF, IMAGE_JPEG, IMAGE_PNG}; use mime_guess::Mime; use smartstring::alias::String; use std::collections::HashMap; use std::path::Path; const JPEG_BYTES: &[u8] = b"\xFF\xD8\xFF"; const PNG_BYTES: &[u8] = b"\x89\x50\x4E\x47\x0D\x0A\x1A\x0A"; const PDF_BYTES: &[u8] = b"%PDF-"; const ZIP_BYTES: &[u8] = b"PK\x03\x04"; cfg_if! { if #[cfg(any(all(not(target_os = "linux"), not(feature = "xdg-mime-backend")), all(target_os = "linux", feature = "infer-backend")))] { fn get_mime_db() -> InferDb { InferDb::init() } } else { fn get_mime_db() -> XdgDb { XdgDb::init() } } } fn application_zip() -> Mime { use std::str::FromStr; Mime::from_str("application/zip").unwrap() } #[test] fn get_ext() { let mut ext_checks = HashMap::new(); ext_checks.insert(Path::new("test.txt"), Some(String::from("txt"))); ext_checks.insert(Path::new("test.zip"), Some(String::from("zip"))); ext_checks.insert(Path::new("test.tar.gz"), Some(String::from("gz"))); ext_checks.insert(Path::new("test."), Some(String::from(""))); ext_checks.insert(Path::new("test"), None); ext_checks.insert(Path::new(".hidden"), None); for (path, ext) in ext_checks { assert_eq!(extension_from_path(path), ext) } } #[test] fn detect_type() { let db = get_mime_db(); assert_eq!(db.get_type(JPEG_BYTES), Some(IMAGE_JPEG)); assert_eq!(db.get_type(PNG_BYTES), Some(IMAGE_PNG)); assert_eq!(db.get_type(PDF_BYTES), Some(APPLICATION_PDF)); assert_eq!(db.get_type(ZIP_BYTES), Some(application_zip())); } #[test] fn recommend_ext() { assert!(mime_extension_lookup(IMAGE_JPEG) .unwrap() .contains(&String::from("jpg"))); assert!(mime_extension_lookup(IMAGE_PNG).unwrap().contains(&String::from("png"))); assert!(mime_extension_lookup(APPLICATION_PDF) .unwrap() .contains(&String::from("pdf"))); assert!(mime_extension_lookup(application_zip()) .unwrap() .contains(&String::from("zip"))); } #[test] fn simple_directory() { use std::fs::File; use std::io::Write; use tempfile::tempdir; let mut files = HashMap::new(); files.insert("test.jpg", JPEG_BYTES); files.insert("test.jpeg", JPEG_BYTES); files.insert("test.png", PNG_BYTES); files.insert("test.pdf", PDF_BYTES); files.insert("test.zip", ZIP_BYTES); files.insert("wrong.jpg", PNG_BYTES); let dir = tempdir().expect("Failed to create temporary directory."); for (name, bytes) in &files { let mut file = File::create(dir.path().join(name)).expect(&*format!("Failed to create file: {}", name)); file .write_all(bytes) .expect(&*format!("Failed to write to file: {}", name)); drop(file); } let entries = scan_directory( &dir.path().to_path_buf(), &vec!["jpg", "jpeg", "png", "pdf", "zip"], true, ) .expect("Directory scan failed."); assert_eq!(entries.len(), files.len()); // initialise global mime DB init_db(); let results = scan_from_walkdir(&entries); for result in results { let result = result.expect("Error while scanning file"); if !result.valid { // this should be "wrong.jpg", which is a misnamed png file assert_eq!(result.mime, IMAGE_PNG); continue; } assert_eq!( result.mime, match extension_from_path(&*result.file).as_deref() { Some("jpg") | Some("jpeg") => IMAGE_JPEG, Some("png") => IMAGE_PNG, Some("pdf") => APPLICATION_PDF, Some("zip") => application_zip(), Some(_) | None => APPLICATION_OCTET_STREAM, // general "fallback" type } ); } }