use gossan_classify::BannerClassifier;
const MIN_BANNERS_PER_SEC: f64 = 100_000.0;
#[test]
#[cfg(not(debug_assertions))]
fn classify_sustains_100k_banners_per_sec_single_thread() {
let c = BannerClassifier::new();
let banners: Vec<&str> = (0..10_000)
.map(|i| match i % 5 {
0 => "Server: nginx/1.25.3\r\nContent-Type: text/html",
1 => "Server: Apache/2.4.52 (Ubuntu)",
2 => "SSH-2.0-OpenSSH_8.9p1 Ubuntu-3ubuntu0.6",
3 => "+PONG\r\n",
_ => "\x00\x01\x02\x03random-noise",
})
.collect();
for b in banners.iter().take(1000) {
let _ = c.classify(b);
}
let start = std::time::Instant::now();
let mut hit_count = 0usize;
for b in &banners {
let hits = c.classify(b);
hit_count += hits.len();
}
let elapsed = start.elapsed();
let banners_per_sec = banners.len() as f64 / elapsed.as_secs_f64();
println!(
"classify: {} banners in {:?} = {:.0} banners/sec ({} total matches)",
banners.len(),
elapsed,
banners_per_sec,
hit_count
);
assert!(
banners_per_sec >= MIN_BANNERS_PER_SEC,
"classify throughput {:.0} banners/sec is below the {:.0} banners/sec gate",
banners_per_sec,
MIN_BANNERS_PER_SEC
);
}
#[test]
fn classify_perf_gate_is_release_only() {
let c = BannerClassifier::new();
let _ = c.classify("Server: nginx");
}