use super::types::FuzzResult;
use std::collections::HashMap;
#[derive(Debug, Clone)]
pub struct FuzzTargetConfig {
pub name: String,
pub iterations: u64,
pub timeout_secs: u64,
pub seed: Option<u64>,
pub track_coverage: bool,
}
impl FuzzTargetConfig {
pub fn new(name: &str) -> Self {
Self {
name: name.to_string(),
iterations: 10000,
timeout_secs: 60,
seed: None,
track_coverage: true,
}
}
pub fn with_iterations(mut self, iterations: u64) -> Self {
self.iterations = iterations;
self
}
pub fn with_timeout(mut self, timeout_secs: u64) -> Self {
self.timeout_secs = timeout_secs;
self
}
pub fn with_seed(mut self, seed: u64) -> Self {
self.seed = Some(seed);
self
}
}
#[derive(Debug, Default)]
pub struct FuzzSuite {
results: HashMap<String, FuzzResult>,
total_cases: u64,
total_failures: u64,
}
impl FuzzSuite {
pub fn new() -> Self {
Self::default()
}
pub fn add_result(&mut self, result: FuzzResult) {
self.total_cases += result.test_cases;
self.total_failures += result.failures;
self.results.insert(result.target.clone(), result);
}
pub fn get_result(&self, target: &str) -> Option<&FuzzResult> {
self.results.get(target)
}
pub fn all_passed(&self) -> bool {
self.total_failures == 0
}
pub fn total_cases(&self) -> u64 {
self.total_cases
}
pub fn total_failures(&self) -> u64 {
self.total_failures
}
pub fn results(&self) -> &HashMap<String, FuzzResult> {
&self.results
}
pub fn summary(&self) -> FuzzSummary {
let targets_passed = self.results.values().filter(|r| r.passed()).count();
let avg_coverage = if self.results.is_empty() {
0.0
} else {
self.results
.values()
.map(|r| r.coverage_percent)
.sum::<f64>()
/ self.results.len() as f64
};
FuzzSummary {
total_targets: self.results.len(),
targets_passed,
total_cases: self.total_cases,
total_failures: self.total_failures,
avg_coverage,
overall_passed: self.all_passed(),
}
}
}
#[derive(Debug, Clone)]
pub struct FuzzSummary {
pub total_targets: usize,
pub targets_passed: usize,
pub total_cases: u64,
pub total_failures: u64,
pub avg_coverage: f64,
pub overall_passed: bool,
}
impl FuzzSummary {
pub fn pass_rate(&self) -> f64 {
if self.total_targets == 0 {
100.0
} else {
(self.targets_passed as f64 / self.total_targets as f64) * 100.0
}
}
}