1use crate::attacks;
2use crate::differential;
3use crate::report::SimReport;
4use anyhow::Result;
5use assay_evidence::VerifyLimits;
6use std::path::PathBuf;
7
8#[derive(Debug, Clone)]
9pub enum SuiteTier {
10 Quick,
11 Nightly,
12 Stress,
13}
14
15#[derive(Debug, Clone)]
16pub struct SuiteConfig {
17 pub tier: SuiteTier,
18 pub target_bundle: PathBuf, pub seed: u64,
20 pub verify_limits: Option<VerifyLimits>,
21}
22
23pub fn run_suite(cfg: SuiteConfig) -> Result<SimReport> {
24 let mut report = SimReport::new(&format!("{:?}", cfg.tier), cfg.seed);
25
26 attacks::integrity::check_integrity_attacks(&mut report, cfg.seed)?;
28
29 let iterations = match cfg.tier {
31 SuiteTier::Quick => 5,
32 SuiteTier::Nightly => 100,
33 SuiteTier::Stress => 1000,
34 };
35
36 let start = std::time::Instant::now();
37 let res = differential::check_invariants(iterations, Some(cfg.seed));
38 let duration = start.elapsed().as_millis() as u64;
39
40 report.add_check("differential.invariants", res, duration);
41
42 Ok(report)
43}