use serde::{Deserialize, Serialize};
use crate::OracleClass;
#[derive(Debug, Clone)]
pub struct Technique {
pub id: &'static str,
pub name: &'static str,
pub oracle_class: OracleClass,
pub vector: Vector,
pub strength: NormativeStrength,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Serialize, Deserialize)]
pub enum Vector {
StatusCodeDiff,
CacheProbing,
ErrorMessageGranularity,
}
#[cfg(test)]
mod tests {
use super::Vector;
#[test]
fn error_message_granularity_variant_exists() {
let v = Vector::ErrorMessageGranularity;
assert_ne!(v, Vector::StatusCodeDiff);
assert_ne!(v, Vector::CacheProbing);
}
#[test]
fn error_message_granularity_serializes() {
let original = Vector::ErrorMessageGranularity;
let json = serde_json::to_string(&original).expect("serialization must succeed");
let roundtrip: Vector =
serde_json::from_str(&json).expect("deserialization must succeed");
assert_eq!(original, roundtrip);
}
#[test]
fn error_message_granularity_is_copy() {
let a = Vector::ErrorMessageGranularity;
let b = a;
assert_eq!(a, b);
}
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Serialize, Deserialize)]
pub enum NormativeStrength {
Must,
MustNot,
Should,
May,
}