#![allow(clippy::modulo_arithmetic)]
use super::*;
use crate::parser::ast::{
Endianness, OffsetSpec, Operator, SearchFlags, StringFlags, TypeKind, Value,
};
fn evaluate_single_rule_legacy(
rule: &MagicRule,
buffer: &[u8],
) -> Result<Option<(usize, crate::parser::ast::Value)>, LibmagicError> {
evaluate_single_rule_with_anchor(
rule,
buffer,
0,
0,
crate::evaluator::types::DEFAULT_MAX_STRING_LENGTH,
false,
)
}
fn message_only_byte_rule(offset: i64, byte: u8, message: &str) -> MagicRule {
MagicRule {
offset: OffsetSpec::Absolute(offset),
typ: TypeKind::Byte { signed: false },
op: Operator::Equal,
value: Value::Uint(u64::from(byte)),
message: message.to_string(),
children: vec![],
level: 0,
strength_modifier: None,
value_transform: None,
}
}
fn build_linear_nested_chain(depth: u32) -> (MagicRule, Vec<u8>) {
assert!(depth > 0, "depth must be > 0");
let buffer: Vec<u8> = (0..depth).map(|i| (i & 0xFF) as u8).collect();
let last = depth - 1;
let mut current = MagicRule {
offset: OffsetSpec::Absolute(i64::from(last)),
typ: TypeKind::Byte { signed: false },
op: Operator::Equal,
value: Value::Uint(u64::from(last & 0xFF)),
message: format!("Level {last}"),
children: vec![],
level: last,
strength_modifier: None,
value_transform: None,
};
for i in (0..last).rev() {
current = MagicRule {
offset: OffsetSpec::Absolute(i64::from(i)),
typ: TypeKind::Byte { signed: false },
op: Operator::Equal,
value: Value::Uint(u64::from(i & 0xFF)),
message: format!("Level {i}"),
children: vec![current],
level: i,
strength_modifier: None,
value_transform: None,
};
}
(current, buffer)
}
fn broken_pattern_regex_rule(message: &str, level: u32) -> MagicRule {
MagicRule {
offset: OffsetSpec::Absolute(0),
typ: TypeKind::Regex {
flags: crate::parser::ast::RegexFlags::default(),
count: crate::parser::ast::RegexCount::Default,
},
op: Operator::Equal,
value: Value::Uint(0),
message: message.to_string(),
children: vec![],
level,
strength_modifier: None,
value_transform: None,
}
}
fn broken_pattern_search_rule(message: &str, level: u32) -> MagicRule {
MagicRule {
offset: OffsetSpec::Absolute(0),
typ: TypeKind::Search {
range: ::std::num::NonZeroUsize::new(16),
flags: SearchFlags::default(),
},
op: Operator::Equal,
value: Value::Uint(0),
message: message.to_string(),
children: vec![],
level,
strength_modifier: None,
value_transform: None,
}
}
fn broken_pattern_flagged_string_rule(message: &str, level: u32) -> MagicRule {
MagicRule {
offset: OffsetSpec::Absolute(0),
typ: TypeKind::String {
max_length: None,
flags: StringFlags {
ignore_lowercase: true,
..StringFlags::default()
},
},
op: Operator::Equal,
value: Value::Uint(0),
message: message.to_string(),
children: vec![],
level,
strength_modifier: None,
value_transform: None,
}
}
fn pathological_regex_rule(message: &str, level: u32) -> MagicRule {
MagicRule {
offset: OffsetSpec::Absolute(0),
typ: TypeKind::Regex {
flags: crate::parser::ast::RegexFlags::default(),
count: crate::parser::ast::RegexCount::Default,
},
op: Operator::Equal,
value: Value::String("a{1000000}".to_string()),
message: message.to_string(),
children: vec![],
level,
strength_modifier: None,
value_transform: None,
}
}
fn format_logs(logs: &[testing_logger::CapturedLog]) -> String {
logs.iter()
.map(|l| format!("{:?}: {}", l.level, l.body))
.collect::<Vec<_>>()
.join(", ")
}
mod deep_nesting_resource_tests;
mod evaluate_rules_basic_and_message_tests;
mod evaluate_rules_config_and_error_recovery_tests;
mod evaluate_rules_hierarchy_tests;
mod mixed_valid_invalid_pstring_tests;
mod operator_tests;
mod pattern_recovery_log_tests;
mod pattern_recovery_search_string_tests;
mod pattern_recovery_tests;
mod regex_search_operator_tests;
mod relative_anchor_tests;
mod search_anchor_endtoend_tests;
mod single_rule_error_and_type_tests;
mod single_rule_numeric_type_tests;
mod helpers;
pub(super) use crate::evaluator::RuleEnvironment;
pub(super) use crate::parser::ast::MetaType;
pub(super) use crate::parser::name_table::NameTable;
pub(super) use helpers::meta::*;
#[cfg(test)]
mod meta_default_clear_indirect_tests;
#[cfg(test)]
mod meta_offset_tests;
#[cfg(test)]
mod meta_use_tests;
#[cfg(test)]
mod string_flags_dispatch_tests;