gossan-classify 0.3.3

Banner classification and service fingerprinting for Gossan
//! W9 gossan-classify edge
use gossan_classify::BannerClassifier;
macro_rules! w9_edge {
    ($n:ident, $b:block) => {
        #[test]
        fn $n() {
            $b
        }
    };
}
w9_edge!(w9_gs_01, {
    let c = BannerClassifier::new();
    assert!(c.classify("").is_empty());
});

w9_edge!(w9_gs_02, {
    let c = BannerClassifier::new();
    assert!(
        c.classify_top("SSH-2.0-OpenSSH").is_some() || c.classify("SSH-2.0-OpenSSH").is_empty()
    );
});

w9_edge!(w9_gs_03, {
    let c = BannerClassifier::new();
    let m = c.classify("HTTP/1.1 200");
    for x in &m {
        assert!(x.confidence >= 0.0 && x.confidence <= 1.0);
    }
});

w9_edge!(w9_gs_04, {
    let c = BannerClassifier::new();
    let banner = format!("{}\u{ff}", '\0');
    assert_eq!(
        c.classify_top(&banner).is_some(),
        !c.classify(&banner).is_empty()
    );
});

w9_edge!(w9_gs_05, {
    let c = BannerClassifier::new();
    let _ = c.classify("A".repeat(10000).as_str());
});

w9_edge!(w9_gs_06, {
    let c = BannerClassifier::new();
    for m in c.classify("220 FTP") {
        assert!(!m.service.is_empty());
    }
});

w9_edge!(w9_gs_07, {
    let c = BannerClassifier::new();
    assert!(c.classify("Redis").iter().all(|m| !m.service.is_empty()));
});

w9_edge!(w9_gs_08, {
    let c = BannerClassifier::new();
    let top = c.classify_top("mysql");
    if let Some(t) = top {
        assert!(!t.service.is_empty());
    }
});

w9_edge!(w9_gs_09, {
    let c1 = BannerClassifier::new();
    let c2 = BannerClassifier::new();
    assert_eq!(c1.classify("test").len(), c2.classify("test").len());
});

w9_edge!(w9_gs_10, {
    let c = BannerClassifier::new();
    assert!(c.classify("\n\r\t").iter().all(|m| m.confidence <= 1.0));
});

w9_edge!(w9_gs_11, {
    let c = BannerClassifier::new();
    let _ = c.classify("SMTP 250");
});

w9_edge!(w9_gs_12, {
    let c = BannerClassifier::new();
    assert!(
        c.classify_top("unknown-banner-xyz-999").is_none()
            || c.classify_top("unknown-banner-xyz-999").unwrap().confidence <= 1.0
    );
});

w9_edge!(w9_gs_13, {
    let c = BannerClassifier::new();
    let m = c.classify("HTTP/1.0");
    assert!(m.len() < 1000);
});

w9_edge!(w9_gs_14, {
    let c = BannerClassifier::new();
    assert!(c.classify("SSH").into_iter().all(|m| m.confidence >= 0.0));
});

w9_edge!(w9_gs_15, {
    let c = BannerClassifier::new();
    let _ = c.classify("PostgreSQL");
});

w9_edge!(w9_gs_16, {
    let c = BannerClassifier::new();
    assert_eq!(c.classify("").len(), 0);
});

w9_edge!(w9_gs_17, {
    let c = BannerClassifier::new();
    let top = c.classify_top("");
    assert!(top.is_none());
});

w9_edge!(w9_gs_18, {
    let c = BannerClassifier::new();
    let _ = c.classify("Microsoft-IIS");
});

w9_edge!(w9_gs_19, {
    let c = BannerClassifier::new();
    for m in c.classify("nginx") {
        assert!(m.confidence.is_finite());
    }
});

w9_edge!(w9_gs_20, {
    let c = BannerClassifier::new();
    assert!(c.classify("\x01").len() < 50);
});

w9_edge!(w9_gs_21, {
    let c = BannerClassifier::new();
    let _ = c.classify("Elasticsearch");
});

w9_edge!(w9_gs_22, {
    let c = BannerClassifier::new();
    assert!(c.classify_top("Apache").is_some() || true);
});

w9_edge!(w9_gs_23, {
    let c = BannerClassifier::new();
    let m = c.classify("MongoDB");
    for x in m {
        assert!(!x.service.is_empty());
    }
});

w9_edge!(w9_gs_24, {
    let c = BannerClassifier::new();
    assert!(c.classify("coap").len() < 20);
});

w9_edge!(w9_gs_25, {
    let c = BannerClassifier::new();
    let _ = c.classify("\u{1F600}");
});