diff --git a/zebra-chain/src/serialization/arbitrary.rs b/zebra-chain/src/serialization/arbitrary.rs index fa1c09105..d81beca00 100644 --- a/zebra-chain/src/serialization/arbitrary.rs +++ b/zebra-chain/src/serialization/arbitrary.rs @@ -1,5 +1,7 @@ +use super::read_zcash::canonical_ip_addr; use chrono::{TimeZone, Utc, MAX_DATETIME, MIN_DATETIME}; use proptest::{arbitrary::any, prelude::*}; +use std::net::SocketAddr; /// Returns a strategy that produces an arbitrary [`chrono::DateTime`], /// based on the full valid range of the type. @@ -39,3 +41,14 @@ pub fn datetime_full() -> impl Strategy> { pub fn datetime_u32() -> impl Strategy> { any::().prop_map(|secs| Utc.timestamp(secs.into(), 0)) } + +/// Returns a random canonical Zebra `SocketAddr`. +/// +/// See [`canonical_ip_addr`] for details. +pub fn canonical_socket_addr() -> impl Strategy { + use SocketAddr::*; + any::().prop_map(|addr| match addr { + V4(_) => addr, + V6(v6_addr) => SocketAddr::new(canonical_ip_addr(v6_addr.ip()), v6_addr.port()), + }) +} diff --git a/zebra-network/src/meta_addr/arbitrary.rs b/zebra-network/src/meta_addr/arbitrary.rs index 3c2231afb..8b43ea7ba 100644 --- a/zebra-network/src/meta_addr/arbitrary.rs +++ b/zebra-network/src/meta_addr/arbitrary.rs @@ -2,15 +2,30 @@ use proptest::{arbitrary::any, arbitrary::Arbitrary, prelude::*}; use super::{MetaAddr, PeerAddrState, PeerServices}; +use zebra_chain::serialization::arbitrary::{canonical_socket_addr, datetime_u32}; + use chrono::{TimeZone, Utc}; -use std::net::SocketAddr; + +impl MetaAddr { + pub fn gossiped_strategy() -> BoxedStrategy { + ( + canonical_socket_addr(), + any::(), + datetime_u32(), + ) + .prop_map(|(address, services, untrusted_last_seen)| { + MetaAddr::new_gossiped_meta_addr(address, services, untrusted_last_seen) + }) + .boxed() + } +} impl Arbitrary for MetaAddr { type Parameters = (); fn arbitrary_with(_args: Self::Parameters) -> Self::Strategy { ( - any::(), + canonical_socket_addr(), any::(), any::(), any::(),