use proptest::collection::vec;
use proptest::strategy::{Strategy, ValueTree};
use proptest::test_runner::{Config, TestRunner};
#[derive(Debug, Default)]
pub struct Rvg {
runner: TestRunner,
}
impl Rvg {
pub fn new() -> Self {
Rvg {
runner: TestRunner::new(Config::default()),
}
}
pub fn deterministic() -> Self {
Rvg {
runner: TestRunner::deterministic(),
}
}
pub fn generate<S: Strategy>(&mut self, strategy: &S) -> S::Value {
strategy
.new_tree(&mut self.runner)
.expect("No value can be generated")
.current()
}
pub fn generate_vec<S: Strategy>(&mut self, strategy: &S, len: usize) -> Vec<S::Value> {
vec(strategy, len..=len)
.new_tree(&mut self.runner)
.expect("No value can be generated")
.current()
}
}
#[cfg(test)]
mod tests {
use super::*;
use crate::fieldmap;
use crate::packets::ip::ProtocolNumbers;
use crate::testils::packet::PacketExt;
use crate::testils::proptest::*;
use std::net::Ipv6Addr;
#[capsule::test]
fn gen_v4_packet() {
let mut gen = Rvg::new();
let packet = gen.generate(&v4_udp());
let v4 = packet.into_v4();
assert_eq!(ProtocolNumbers::Udp, v4.protocol());
}
#[capsule::test]
fn gen_sr_packets() {
let mut gen = Rvg::new();
let srhs = gen.generate_vec(&sr_tcp().prop_map(|v| v.into_sr_tcp()), 10);
assert_eq!(10, srhs.len());
}
#[capsule::test]
fn gen_sr_packets_with_fieldmap() {
let mut gen = Rvg::new();
let segments = vec![
"::2".parse::<Ipv6Addr>().unwrap(),
"::3".parse::<Ipv6Addr>().unwrap(),
"::4".parse::<Ipv6Addr>().unwrap(),
];
let srhs = gen.generate_vec(
&sr_tcp_with(fieldmap! {field::sr_segments => segments}).prop_map(|v| v.into_sr()),
10,
);
assert_eq!(10, srhs.len());
let _ = srhs.iter().map(|srh| assert_eq!(3, srh.segments().len()));
}
}