use super::*;
use std::net::{IpAddr, Ipv4Addr, Ipv6Addr, SocketAddr, SocketAddrV4, SocketAddrV6};
#[derive(Clone, Debug, Default)]
pub struct Ipv4AddrMutator {
_private: (),
}
pub fn ipv4_addr() -> Ipv4AddrMutator {
Ipv4AddrMutator { _private: () }
}
impl Mutate<Ipv4Addr> for Ipv4AddrMutator {
#[inline]
fn mutation_count(&self, _value: &Ipv4Addr, _shrink: bool) -> core::option::Option<u32> {
Some(9)
}
#[inline]
fn mutate(&mut self, c: &mut Candidates, value: &mut Ipv4Addr) -> Result<()> {
c.mutation_group(4, |ctx, which| {
let mut octets = value.octets();
octets[which as usize] = ctx.rng().gen_u8();
*value = Ipv4Addr::from(octets);
Ok(())
})?;
c.mutation(|_ctx| {
*value = Ipv4Addr::new(127, 0, 0, 1);
Ok(())
})?;
c.mutation(|_ctx| {
*value = Ipv4Addr::new(0, 0, 0, 0);
Ok(())
})?;
c.mutation(|_ctx| {
*value = Ipv4Addr::new(255, 255, 255, 255);
Ok(())
})?;
c.mutation(|_ctx| {
*value = Ipv4Addr::new(192, 168, 0, 1);
Ok(())
})?;
c.mutation(|_ctx| {
*value = Ipv4Addr::new(10, 0, 0, 1);
Ok(())
})?;
Ok(())
}
}
impl Generate<Ipv4Addr> for Ipv4AddrMutator {
#[inline]
fn generate(&mut self, ctx: &mut Context) -> Result<Ipv4Addr> {
let a = ctx.rng().gen_u8();
let b = ctx.rng().gen_u8();
let c = ctx.rng().gen_u8();
let d = ctx.rng().gen_u8();
Ok(Ipv4Addr::new(a, b, c, d))
}
}
impl DefaultMutate for Ipv4Addr {
type DefaultMutate = Ipv4AddrMutator;
}
#[derive(Clone, Debug, Default)]
pub struct Ipv6AddrMutator {
_private: (),
}
pub fn ipv6_addr() -> Ipv6AddrMutator {
Ipv6AddrMutator { _private: () }
}
impl Mutate<Ipv6Addr> for Ipv6AddrMutator {
#[inline]
fn mutation_count(&self, _value: &Ipv6Addr, _shrink: bool) -> core::option::Option<u32> {
Some(11)
}
#[inline]
fn mutate(&mut self, c: &mut Candidates, value: &mut Ipv6Addr) -> Result<()> {
c.mutation_group(8, |ctx, which| {
let mut segs = value.segments();
segs[which as usize] = ctx.rng().gen_u16();
*value = Ipv6Addr::from(segs);
Ok(())
})?;
c.mutation(|_ctx| {
*value = Ipv6Addr::LOCALHOST;
Ok(())
})?;
c.mutation(|_ctx| {
*value = Ipv6Addr::UNSPECIFIED;
Ok(())
})?;
c.mutation(|_ctx| {
*value = Ipv6Addr::new(0xff02, 0, 0, 0, 0, 0, 0, 1);
Ok(())
})?;
Ok(())
}
}
impl Generate<Ipv6Addr> for Ipv6AddrMutator {
#[inline]
fn generate(&mut self, ctx: &mut Context) -> Result<Ipv6Addr> {
let segs: [u16; 8] = [
ctx.rng().gen_u16(),
ctx.rng().gen_u16(),
ctx.rng().gen_u16(),
ctx.rng().gen_u16(),
ctx.rng().gen_u16(),
ctx.rng().gen_u16(),
ctx.rng().gen_u16(),
ctx.rng().gen_u16(),
];
Ok(Ipv6Addr::from(segs))
}
}
impl DefaultMutate for Ipv6Addr {
type DefaultMutate = Ipv6AddrMutator;
}
#[derive(Clone, Debug, Default)]
pub struct IpAddrMutator {
v4: Ipv4AddrMutator,
v6: Ipv6AddrMutator,
}
pub fn ip_addr() -> IpAddrMutator {
IpAddrMutator::default()
}
impl Mutate<IpAddr> for IpAddrMutator {
#[inline]
fn mutation_count(&self, value: &IpAddr, shrink: bool) -> core::option::Option<u32> {
let inner = match value {
IpAddr::V4(addr) => self.v4.mutation_count(addr, shrink)?,
IpAddr::V6(addr) => self.v6.mutation_count(addr, shrink)?,
};
Some(inner + 1)
}
#[inline]
fn mutate(&mut self, c: &mut Candidates, value: &mut IpAddr) -> Result<()> {
match value {
IpAddr::V4(ref mut addr) => self.v4.mutate(c, addr)?,
IpAddr::V6(ref mut addr) => self.v6.mutate(c, addr)?,
}
c.mutation(|ctx| {
*value = match *value {
IpAddr::V4(_) => IpAddr::V6(self.v6.generate(ctx)?),
IpAddr::V6(_) => IpAddr::V4(self.v4.generate(ctx)?),
};
Ok(())
})?;
Ok(())
}
}
impl Generate<IpAddr> for IpAddrMutator {
#[inline]
fn generate(&mut self, ctx: &mut Context) -> Result<IpAddr> {
if ctx.rng().gen_bool() {
Ok(IpAddr::V4(self.v4.generate(ctx)?))
} else {
Ok(IpAddr::V6(self.v6.generate(ctx)?))
}
}
}
impl DefaultMutate for IpAddr {
type DefaultMutate = IpAddrMutator;
}
#[derive(Clone, Debug, Default)]
pub struct SocketAddrV4Mutator {
addr: Ipv4AddrMutator,
}
pub fn socket_addr_v4() -> SocketAddrV4Mutator {
SocketAddrV4Mutator::default()
}
impl Mutate<SocketAddrV4> for SocketAddrV4Mutator {
#[inline]
fn mutation_count(&self, _value: &SocketAddrV4, _shrink: bool) -> core::option::Option<u32> {
Some(2)
}
#[inline]
fn mutate(&mut self, c: &mut Candidates, value: &mut SocketAddrV4) -> Result<()> {
c.mutation(|ctx| {
let mut ip = *value.ip();
let result = ctx.mutate_with(&mut self.addr, &mut ip);
value.set_ip(ip);
result
})?;
c.mutation(|ctx| {
value.set_port(ctx.rng().gen_u16());
Ok(())
})?;
Ok(())
}
}
impl Generate<SocketAddrV4> for SocketAddrV4Mutator {
#[inline]
fn generate(&mut self, ctx: &mut Context) -> Result<SocketAddrV4> {
let ip = self.addr.generate(ctx)?;
let port = ctx.rng().gen_u16();
Ok(SocketAddrV4::new(ip, port))
}
}
impl DefaultMutate for SocketAddrV4 {
type DefaultMutate = SocketAddrV4Mutator;
}
#[derive(Clone, Debug, Default)]
pub struct SocketAddrV6Mutator {
addr: Ipv6AddrMutator,
}
pub fn socket_addr_v6() -> SocketAddrV6Mutator {
SocketAddrV6Mutator::default()
}
impl Mutate<SocketAddrV6> for SocketAddrV6Mutator {
#[inline]
fn mutation_count(&self, _value: &SocketAddrV6, _shrink: bool) -> core::option::Option<u32> {
Some(4)
}
#[inline]
fn mutate(&mut self, c: &mut Candidates, value: &mut SocketAddrV6) -> Result<()> {
c.mutation(|ctx| {
let mut ip = *value.ip();
let result = ctx.mutate_with(&mut self.addr, &mut ip);
value.set_ip(ip);
result
})?;
c.mutation(|ctx| {
value.set_port(ctx.rng().gen_u16());
Ok(())
})?;
c.mutation(|ctx| {
value.set_flowinfo(ctx.rng().gen_u32());
Ok(())
})?;
c.mutation(|ctx| {
value.set_scope_id(ctx.rng().gen_u32());
Ok(())
})?;
Ok(())
}
}
impl Generate<SocketAddrV6> for SocketAddrV6Mutator {
#[inline]
fn generate(&mut self, ctx: &mut Context) -> Result<SocketAddrV6> {
let ip = self.addr.generate(ctx)?;
let port = ctx.rng().gen_u16();
let flowinfo = ctx.rng().gen_u32();
let scope_id = ctx.rng().gen_u32();
Ok(SocketAddrV6::new(ip, port, flowinfo, scope_id))
}
}
impl DefaultMutate for SocketAddrV6 {
type DefaultMutate = SocketAddrV6Mutator;
}
#[derive(Clone, Debug, Default)]
pub struct SocketAddrMutator {
v4: SocketAddrV4Mutator,
v6: SocketAddrV6Mutator,
}
pub fn socket_addr() -> SocketAddrMutator {
SocketAddrMutator::default()
}
impl Mutate<SocketAddr> for SocketAddrMutator {
#[inline]
fn mutation_count(&self, value: &SocketAddr, shrink: bool) -> core::option::Option<u32> {
let inner = match value {
SocketAddr::V4(addr) => self.v4.mutation_count(addr, shrink)?,
SocketAddr::V6(addr) => self.v6.mutation_count(addr, shrink)?,
};
Some(inner + 1)
}
#[inline]
fn mutate(&mut self, c: &mut Candidates, value: &mut SocketAddr) -> Result<()> {
match value {
SocketAddr::V4(ref mut addr) => self.v4.mutate(c, addr)?,
SocketAddr::V6(ref mut addr) => self.v6.mutate(c, addr)?,
}
c.mutation(|ctx| {
*value = match *value {
SocketAddr::V4(_) => SocketAddr::V6(self.v6.generate(ctx)?),
SocketAddr::V6(_) => SocketAddr::V4(self.v4.generate(ctx)?),
};
Ok(())
})?;
Ok(())
}
}
impl Generate<SocketAddr> for SocketAddrMutator {
#[inline]
fn generate(&mut self, ctx: &mut Context) -> Result<SocketAddr> {
if ctx.rng().gen_bool() {
Ok(SocketAddr::V4(self.v4.generate(ctx)?))
} else {
Ok(SocketAddr::V6(self.v6.generate(ctx)?))
}
}
}
impl DefaultMutate for SocketAddr {
type DefaultMutate = SocketAddrMutator;
}