use crate::{engine::Engine, selection::Selection};
use anyhow::Result;
use humantime::Duration;
use std::path::PathBuf;
use structopt::StructOpt;
#[derive(Debug, StructOpt)]
pub struct Test {
#[structopt(short, long, default_value = "libfuzzer")]
engine: Engine,
#[structopt(flatten)]
args: Args,
#[structopt(flatten)]
selection: Selection,
}
#[derive(Debug, StructOpt)]
pub struct Args {
#[structopt(short = "S")]
pub seed: Option<usize>,
#[structopt(short, long)]
pub runs: Option<usize>,
#[structopt(short = "T")]
pub time: Option<Duration>,
#[structopt(short = "l", long)]
pub max_input_length: Option<usize>,
#[structopt(short, long, default_value = "10s")]
pub timeout: Duration,
#[structopt(short, long)]
pub jobs: Option<usize>,
#[structopt(long)]
pub corpus_dir: Option<PathBuf>,
#[structopt(long)]
pub crashes_dir: Option<PathBuf>,
#[structopt(short = "E", long)]
pub engine_args: Vec<String>,
}
impl Args {
pub fn time_as_secs(&self) -> Option<u64> {
self.time.as_ref().map(|d| d.as_secs().max(1))
}
pub fn timeout_as_secs(&self) -> u64 {
self.timeout.as_secs().max(1)
}
}
impl Test {
pub fn exec(&self) -> Result<()> {
self.engine.test(&self.selection, &self.args)
}
}