use core::ops::{BitOr, BitOrAssign};
#[cfg(any(test, feature = "generator"))]
use bolero_generator::*;
#[derive(Clone, Copy, Debug, PartialEq, Eq, Hash)]
#[cfg_attr(any(feature = "generator", test), derive(TypeGenerator))]
pub enum Probe {
NonProbing,
Probing,
}
impl Probe {
pub fn is_probing(self) -> bool {
matches!(self, Self::Probing)
}
}
impl Default for Probe {
fn default() -> Self {
Self::Probing
}
}
impl BitOr<Probe> for Probe {
type Output = Self;
fn bitor(self, rhs: Self) -> Self {
match (self, rhs) {
(Self::Probing, Self::Probing) => Self::Probing,
(_, _) => Self::NonProbing,
}
}
}
impl BitOrAssign<Probe> for Probe {
fn bitor_assign(&mut self, rhs: Self) {
*self = *self | rhs;
}
}
pub trait Probing {
#[inline]
fn path_validation(&self) -> Probe {
Probe::NonProbing
}
}
impl<AckRanges> Probing for crate::frame::Ack<AckRanges> {}
impl Probing for crate::frame::ConnectionClose<'_> {}
impl<Data> Probing for crate::frame::Crypto<Data> {}
impl<Data> Probing for crate::frame::Datagram<Data> {}
impl Probing for crate::frame::DataBlocked {}
impl Probing for crate::frame::HandshakeDone {}
impl Probing for crate::frame::MaxData {}
impl Probing for crate::frame::MaxStreamData {}
impl Probing for crate::frame::MaxStreams {}
impl Probing for crate::frame::NewConnectionId<'_> {
#[inline]
fn path_validation(&self) -> Probe {
Probe::Probing
}
}
impl Probing for crate::frame::NewToken<'_> {}
impl Probing for crate::frame::Padding {
#[inline]
fn path_validation(&self) -> Probe {
Probe::Probing
}
}
impl Probing for crate::frame::PathChallenge<'_> {
#[inline]
fn path_validation(&self) -> Probe {
Probe::Probing
}
}
impl Probing for crate::frame::PathResponse<'_> {
#[inline]
fn path_validation(&self) -> Probe {
Probe::Probing
}
}
impl Probing for crate::frame::Ping {}
impl Probing for crate::frame::ResetStream {}
impl Probing for crate::frame::RetireConnectionId {}
impl Probing for crate::frame::StopSending {}
impl<Data> Probing for crate::frame::Stream<Data> {}
impl Probing for crate::frame::StreamDataBlocked {}
impl Probing for crate::frame::StreamsBlocked {}
#[cfg(test)]
mod test {
use super::*;
#[test]
fn probing_packet_test() {
let mut probe = Probe::Probing;
probe |= Probe::Probing;
assert!(probe.is_probing())
}
#[test]
fn probing_and_non_probing_packet_test() {
let mut probe = Probe::Probing;
probe |= Probe::NonProbing;
assert!(!probe.is_probing())
}
}