pub trait PayloadOracle: Send + Sync {
fn is_semantically_valid(&self, original: &str, transformed: &str) -> bool;
fn name(&self) -> &'static str;
}
#[cfg(test)]
mod tests {
use super::*;
struct EchoOracle;
impl PayloadOracle for EchoOracle {
fn is_semantically_valid(&self, _original: &str, transformed: &str) -> bool {
!transformed.is_empty()
}
fn name(&self) -> &'static str {
"echo"
}
}
#[test]
fn trait_object_works() {
let oracle: Box<dyn PayloadOracle> = Box::new(EchoOracle);
assert!(oracle.is_semantically_valid("test", "test"));
assert!(!oracle.is_semantically_valid("test", ""));
assert_eq!(oracle.name(), "echo");
}
#[test]
fn trait_is_send_sync() {
fn assert_send_sync<T: Send + Sync>() {}
assert_send_sync::<Box<dyn PayloadOracle>>();
}
}