litl bit more testing
This commit is contained in:
parent
38ca71cc14
commit
955f0e1510
4 changed files with 46 additions and 15 deletions
|
@ -298,7 +298,7 @@ pub fn mime_type<T: MimeDb>(db: &T, path: &Path) -> io::Result<Option<Mime>> {
|
||||||
/// Returns a list of known extensions for this mime type, if any.
|
/// Returns a list of known extensions for this mime type, if any.
|
||||||
/// This function uses the [`Mime`]'s "essence" rather than the [`Mime`] itself - [`mime_guess::get_mime_extensions`]
|
/// This function uses the [`Mime`]'s "essence" rather than the [`Mime`] itself - [`mime_guess::get_mime_extensions`]
|
||||||
/// ignores the type suffix, treating "image/svg+xml" as "image/svg", and thus fails to find any extensions. Passing the
|
/// ignores the type suffix, treating "image/svg+xml" as "image/svg", and thus fails to find any extensions. Passing the
|
||||||
/// essence_str (which includes the suffix) fixes this.
|
/// `essence_str` (which includes the suffix) fixes this.
|
||||||
pub fn mime_extension_lookup(essence: String) -> Option<Vec<String>> {
|
pub fn mime_extension_lookup(essence: String) -> Option<Vec<String>> {
|
||||||
if let Ok(cache) = MIMEXT.read() {
|
if let Ok(cache) = MIMEXT.read() {
|
||||||
if let Some(exts) = cache.get(&essence) {
|
if let Some(exts) = cache.get(&essence) {
|
||||||
|
|
|
@ -13,7 +13,7 @@ use crate::files::mime_extension_lookup;
|
||||||
use crate::String;
|
use crate::String;
|
||||||
|
|
||||||
/// Information about a scanned file.
|
/// Information about a scanned file.
|
||||||
#[derive(Eq, PartialEq)]
|
#[derive(Eq, PartialEq, Debug)]
|
||||||
pub struct Findings {
|
pub struct Findings {
|
||||||
/// The location of the scanned file.
|
/// The location of the scanned file.
|
||||||
pub file: PathBuf,
|
pub file: PathBuf,
|
||||||
|
@ -45,12 +45,6 @@ impl Ord for Findings {
|
||||||
fn cmp(&self, other: &Self) -> Ordering {
|
fn cmp(&self, other: &Self) -> Ordering {
|
||||||
// files with no recommended extension should appear first, so that fif outputs the "no known extension for x"
|
// files with no recommended extension should appear first, so that fif outputs the "no known extension for x"
|
||||||
// comments before the "mv x y" instructions
|
// comments before the "mv x y" instructions
|
||||||
// since fif doesn't output anything for valid files, the comparison will consider any comparison involving a
|
|
||||||
// valid Findings to be equal, avoiding the (somewhat) expensive call to recommended_extension. after all, since
|
|
||||||
// fif never displays valid files, it really doesn't matter what position they end up in.
|
|
||||||
if self.valid || other.valid {
|
|
||||||
return Ordering::Equal;
|
|
||||||
}
|
|
||||||
match (self.recommended_extension(), other.recommended_extension()) {
|
match (self.recommended_extension(), other.recommended_extension()) {
|
||||||
(None, Some(_)) => Ordering::Greater,
|
(None, Some(_)) => Ordering::Greater,
|
||||||
(Some(_), None) => Ordering::Less,
|
(Some(_), None) => Ordering::Less,
|
||||||
|
|
|
@ -23,10 +23,9 @@ use std::process::exit;
|
||||||
use cfg_if::cfg_if;
|
use cfg_if::cfg_if;
|
||||||
use clap::Clap;
|
use clap::Clap;
|
||||||
use fif::files::{scan_directory, scan_from_walkdir};
|
use fif::files::{scan_directory, scan_from_walkdir};
|
||||||
use fif::formats::Format;
|
use fif::formats::{self, Format};
|
||||||
use fif::parameters::{OutputFormat, Prompt};
|
use fif::parameters::{self, OutputFormat, Prompt};
|
||||||
use fif::utils::{os_name, CLAP_LONG_VERSION};
|
use fif::utils::{os_name, CLAP_LONG_VERSION};
|
||||||
use fif::{formats, parameters};
|
|
||||||
use itertools::Itertools;
|
use itertools::Itertools;
|
||||||
use log::{debug, error, info, trace, warn, Level};
|
use log::{debug, error, info, trace, warn, Level};
|
||||||
|
|
||||||
|
@ -205,7 +204,7 @@ fn main() {
|
||||||
let mut buffered_stdout = BufWriter::new(stdout());
|
let mut buffered_stdout = BufWriter::new(stdout());
|
||||||
|
|
||||||
let result = match args.output_format {
|
let result = match args.output_format {
|
||||||
// i want to simplify this to something like formats::write_all(args.output_format, ...)
|
// TODO: simplify this to something like formats::write_all(args.output_format, ...)
|
||||||
OutputFormat::Sh => formats::Shell.write_all(&mut buffered_stdout, &findings, &errors),
|
OutputFormat::Sh => formats::Shell.write_all(&mut buffered_stdout, &findings, &errors),
|
||||||
OutputFormat::PowerShell => formats::PowerShell.write_all(&mut buffered_stdout, &findings, &errors),
|
OutputFormat::PowerShell => formats::PowerShell.write_all(&mut buffered_stdout, &findings, &errors),
|
||||||
#[cfg(feature = "json")]
|
#[cfg(feature = "json")]
|
||||||
|
|
|
@ -8,6 +8,7 @@ use fif::findings::Findings;
|
||||||
use fif::formats::{Format, PowerShell, Shell};
|
use fif::formats::{Format, PowerShell, Shell};
|
||||||
use fif::mime_db::MimeDb;
|
use fif::mime_db::MimeDb;
|
||||||
use fif::{String, MIMEDB};
|
use fif::{String, MIMEDB};
|
||||||
|
use itertools::Itertools;
|
||||||
use maplit::{btreeset, hashmap};
|
use maplit::{btreeset, hashmap};
|
||||||
use mime::{Mime, APPLICATION_OCTET_STREAM, APPLICATION_PDF, IMAGE_JPEG, IMAGE_PNG};
|
use mime::{Mime, APPLICATION_OCTET_STREAM, APPLICATION_PDF, IMAGE_JPEG, IMAGE_PNG};
|
||||||
|
|
||||||
|
@ -324,7 +325,7 @@ fn identify_random_bytes() {
|
||||||
let mut bytes: [u8; BUF_SIZE * 2] = [0; BUF_SIZE * 2];
|
let mut bytes: [u8; BUF_SIZE * 2] = [0; BUF_SIZE * 2];
|
||||||
let mut results: BTreeMap<Mime, i32> = BTreeMap::new();
|
let mut results: BTreeMap<Mime, i32> = BTreeMap::new();
|
||||||
|
|
||||||
for _ in 1..10000 {
|
for _ in 1..1000 {
|
||||||
rng.fill_bytes(&mut bytes);
|
rng.fill_bytes(&mut bytes);
|
||||||
if let Some(detected_type) = MIMEDB.get_type(&bytes) {
|
if let Some(detected_type) = MIMEDB.get_type(&bytes) {
|
||||||
*results.entry(detected_type).or_insert(0) += 1;
|
*results.entry(detected_type).or_insert(0) += 1;
|
||||||
|
@ -467,7 +468,44 @@ fn verbosity() {
|
||||||
}
|
}
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
/// Ensures that smart strings don't deviate from std's Strings
|
/// Ensures `os_name()`'s output is the same as [`std::env::consts::OS`], capitalisation notwithstanding
|
||||||
|
fn validate_os_name() {
|
||||||
|
assert_eq!(
|
||||||
|
fif::utils::os_name().to_lowercase(),
|
||||||
|
std::env::consts::OS.to_lowercase()
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
/// Ensures that [`Findings`] are sorted properly.
|
||||||
|
fn sort_findings() {
|
||||||
|
let findings = vec![
|
||||||
|
Findings {
|
||||||
|
file: Path::new("ccc").to_path_buf(),
|
||||||
|
valid: false,
|
||||||
|
mime: IMAGE_JPEG,
|
||||||
|
},
|
||||||
|
Findings {
|
||||||
|
file: Path::new("bbb.xyz").to_path_buf(),
|
||||||
|
valid: true,
|
||||||
|
mime: IMAGE_PNG,
|
||||||
|
},
|
||||||
|
Findings {
|
||||||
|
file: Path::new("aaa").to_path_buf(),
|
||||||
|
valid: true,
|
||||||
|
mime: APPLICATION_PDF,
|
||||||
|
},
|
||||||
|
];
|
||||||
|
let mut findings = findings.iter().sorted_unstable();
|
||||||
|
|
||||||
|
assert_eq!(findings.next().unwrap().file, Path::new("aaa"));
|
||||||
|
assert_eq!(findings.next().unwrap().file, Path::new("bbb.xyz"));
|
||||||
|
assert_eq!(findings.next().unwrap().file, Path::new("ccc"));
|
||||||
|
assert_eq!(findings.next(), None);
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
/// Ensures that [`SmartString`]s don't deviate from std's Strings
|
||||||
fn validate_string_type() {
|
fn validate_string_type() {
|
||||||
use std::string::String as StdString;
|
use std::string::String as StdString;
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue