{-# LANGUAGE DerivingVia #-}
{-# LANGUAGE NamedFieldPuns #-}
{-# LANGUAGE OverloadedStrings #-}
{-# LANGUAGE StandaloneDeriving #-}
{-# LANGUAGE TypeApplications #-}
{-# OPTIONS_GHC -Wno-orphans #-}
module Test.Ouroboros.Network.OrphanInstances
(
genIPv4
, genIPv6
) where
import Data.ByteString.Char8 qualified as BSC
import Data.Hashable (Hashable (hashWithSalt), hashUsing)
import Data.IP qualified as IP
import Data.Word (Word16, Word32, Word64)
import Cardano.Slotting.Slot (SlotNo (..))
import Ouroboros.Network.ConnectionManager.Types (Provenance (..))
import Ouroboros.Network.Diffusion.Topology (LocalRootPeersGroup (..),
LocalRootPeersGroups (..), LocalRoots (..), NetworkTopology (..),
PublicRootPeers (..), RootConfig (..))
import Ouroboros.Network.DiffusionMode (DiffusionMode (..))
import Ouroboros.Network.PeerSelection.LedgerPeers.Type (AfterSlot (..),
UseLedgerPeers (..))
import Ouroboros.Network.PeerSelection.PeerAdvertise (PeerAdvertise (..))
import Ouroboros.Network.PeerSelection.PeerSharing (PeerSharing (..))
import Ouroboros.Network.PeerSelection.RelayAccessPoint
(LedgerRelayAccessPoint (..), PortNumber, RelayAccessPoint,
SRVPrefix, prefixLedgerRelayAccessPoint)
import Ouroboros.Network.PeerSelection.State.LocalRootPeers (HotValency (..),
LocalRootConfig (..), WarmValency (..))
import Test.QuickCheck (Arbitrary (..), Gen, elements, frequency, oneof, resize,
suchThat)
genIPv4 :: Gen IP.IP
genIPv4 :: Gen IP
genIPv4 =
IPv4 -> IP
IP.IPv4 (IPv4 -> IP) -> (Word32 -> IPv4) -> Word32 -> IP
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Word32 -> IPv4
IP.toIPv4w (Word32 -> IP) -> Gen Word32 -> Gen IP
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Int -> Gen Word32 -> Gen Word32
forall a. HasCallStack => Int -> Gen a -> Gen a
resize Int
200 Gen Word32
forall a. Arbitrary a => Gen a
arbitrary Gen Word32 -> (Word32 -> Bool) -> Gen Word32
forall a. Gen a -> (a -> Bool) -> Gen a
`suchThat` (Word32 -> Word32 -> Bool
forall a. Ord a => a -> a -> Bool
> Word32
100)
genIPv6 :: Gen IP.IP
genIPv6 :: Gen IP
genIPv6 =
IPv6 -> IP
IP.IPv6 (IPv6 -> IP)
-> ((Word32, Word32, Word32, Word32) -> IPv6)
-> (Word32, Word32, Word32, Word32)
-> IP
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (Word32, Word32, Word32, Word32) -> IPv6
IP.toIPv6w ((Word32, Word32, Word32, Word32) -> IP)
-> Gen (Word32, Word32, Word32, Word32) -> Gen IP
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Gen (Word32, Word32, Word32, Word32)
genFourWord32
where
genFourWord32 :: Gen (Word32, Word32, Word32, Word32)
genFourWord32 :: Gen (Word32, Word32, Word32, Word32)
genFourWord32 =
(,,,) (Word32
-> Word32 -> Word32 -> Word32 -> (Word32, Word32, Word32, Word32))
-> Gen Word32
-> Gen
(Word32 -> Word32 -> Word32 -> (Word32, Word32, Word32, Word32))
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Int -> Gen Word32 -> Gen Word32
forall a. HasCallStack => Int -> Gen a -> Gen a
resize Int
200 Gen Word32
forall a. Arbitrary a => Gen a
arbitrary Gen Word32 -> (Word32 -> Bool) -> Gen Word32
forall a. Gen a -> (a -> Bool) -> Gen a
`suchThat` (Word32 -> Word32 -> Bool
forall a. Ord a => a -> a -> Bool
> Word32
100)
Gen
(Word32 -> Word32 -> Word32 -> (Word32, Word32, Word32, Word32))
-> Gen Word32
-> Gen (Word32 -> Word32 -> (Word32, Word32, Word32, Word32))
forall a b. Gen (a -> b) -> Gen a -> Gen b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Gen Word32
forall a. Arbitrary a => Gen a
arbitrary
Gen (Word32 -> Word32 -> (Word32, Word32, Word32, Word32))
-> Gen Word32 -> Gen (Word32 -> (Word32, Word32, Word32, Word32))
forall a b. Gen (a -> b) -> Gen a -> Gen b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Gen Word32
forall a. Arbitrary a => Gen a
arbitrary
Gen (Word32 -> (Word32, Word32, Word32, Word32))
-> Gen Word32 -> Gen (Word32, Word32, Word32, Word32)
forall a b. Gen (a -> b) -> Gen a -> Gen b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Gen Word32
forall a. Arbitrary a => Gen a
arbitrary
instance Hashable IP.IPv4
instance Hashable IP.IPv6
instance Hashable IP.IP
instance Hashable PortNumber where
hashWithSalt :: Int -> PortNumber -> Int
hashWithSalt Int
salt PortNumber
pn =
(PortNumber -> Word16) -> Int -> PortNumber -> Int
forall b a. Hashable b => (a -> b) -> Int -> a -> Int
hashUsing (PortNumber -> Word16
forall a b. (Integral a, Num b) => a -> b
fromIntegral :: PortNumber -> Word16) Int
salt PortNumber
pn
deriving via Word64 instance Arbitrary SlotNo
instance Arbitrary PeerAdvertise where
arbitrary :: Gen PeerAdvertise
arbitrary = [PeerAdvertise] -> Gen PeerAdvertise
forall a. HasCallStack => [a] -> Gen a
elements [ PeerAdvertise
DoAdvertisePeer, PeerAdvertise
DoNotAdvertisePeer ]
shrink :: PeerAdvertise -> [PeerAdvertise]
shrink PeerAdvertise
DoAdvertisePeer = []
shrink PeerAdvertise
DoNotAdvertisePeer = [PeerAdvertise
DoAdvertisePeer]
instance Arbitrary PeerSharing where
arbitrary :: Gen PeerSharing
arbitrary = [PeerSharing] -> Gen PeerSharing
forall a. HasCallStack => [a] -> Gen a
elements [ PeerSharing
PeerSharingDisabled, PeerSharing
PeerSharingEnabled ]
shrink :: PeerSharing -> [PeerSharing]
shrink PeerSharing
PeerSharingDisabled = []
shrink PeerSharing
PeerSharingEnabled = [PeerSharing
PeerSharingDisabled]
instance Arbitrary AfterSlot where
arbitrary :: Gen AfterSlot
arbitrary = [Gen AfterSlot] -> Gen AfterSlot
forall a. HasCallStack => [Gen a] -> Gen a
oneof [ AfterSlot -> Gen AfterSlot
forall a. a -> Gen a
forall (f :: * -> *) a. Applicative f => a -> f a
pure AfterSlot
Always
, SlotNo -> AfterSlot
After (SlotNo -> AfterSlot) -> Gen SlotNo -> Gen AfterSlot
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Gen SlotNo
forall a. Arbitrary a => Gen a
arbitrary
]
instance Arbitrary PortNumber where
arbitrary :: Gen PortNumber
arbitrary = [PortNumber] -> Gen PortNumber
forall a. HasCallStack => [a] -> Gen a
elements [PortNumber
1000..PortNumber
1100]
shrink :: PortNumber -> [PortNumber]
shrink = (Word16 -> PortNumber) -> [Word16] -> [PortNumber]
forall a b. (a -> b) -> [a] -> [b]
map Word16 -> PortNumber
forall a b. (Integral a, Num b) => a -> b
fromIntegral
([Word16] -> [PortNumber])
-> (PortNumber -> [Word16]) -> PortNumber -> [PortNumber]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (Word16 -> Bool) -> [Word16] -> [Word16]
forall a. (a -> Bool) -> [a] -> [a]
filter (Word16 -> Word16 -> Bool
forall a. Ord a => a -> a -> Bool
>=Word16
1000)
([Word16] -> [Word16])
-> (PortNumber -> [Word16]) -> PortNumber -> [Word16]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Word16 -> [Word16]
forall a. Arbitrary a => a -> [a]
shrink
(Word16 -> [Word16])
-> (PortNumber -> Word16) -> PortNumber -> [Word16]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a b. (Integral a, Num b) => a -> b
fromIntegral @PortNumber @Word16
instance Arbitrary RelayAccessPoint where
arbitrary :: Gen RelayAccessPoint
arbitrary = SRVPrefix -> LedgerRelayAccessPoint -> RelayAccessPoint
prefixLedgerRelayAccessPoint SRVPrefix
srvPrefix (LedgerRelayAccessPoint -> RelayAccessPoint)
-> Gen LedgerRelayAccessPoint -> Gen RelayAccessPoint
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Gen LedgerRelayAccessPoint
forall a. Arbitrary a => Gen a
arbitrary
where
srvPrefix :: SRVPrefix
srvPrefix :: SRVPrefix
srvPrefix = SRVPrefix
"_cardano._tcp"
instance Arbitrary LedgerRelayAccessPoint where
arbitrary :: Gen LedgerRelayAccessPoint
arbitrary =
[(Int, Gen LedgerRelayAccessPoint)] -> Gen LedgerRelayAccessPoint
forall a. HasCallStack => [(Int, Gen a)] -> Gen a
frequency [ (Int
4, IP -> PortNumber -> LedgerRelayAccessPoint
LedgerRelayAccessAddress (IP -> PortNumber -> LedgerRelayAccessPoint)
-> Gen IP -> Gen (PortNumber -> LedgerRelayAccessPoint)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> [Gen IP] -> Gen IP
forall a. HasCallStack => [Gen a] -> Gen a
oneof [Gen IP
genIPv4, Gen IP
genIPv6] Gen (PortNumber -> LedgerRelayAccessPoint)
-> Gen PortNumber -> Gen LedgerRelayAccessPoint
forall a b. Gen (a -> b) -> Gen a -> Gen b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Gen PortNumber
forall a. Arbitrary a => Gen a
arbitrary)
, (Int
4, SRVPrefix -> PortNumber -> LedgerRelayAccessPoint
LedgerRelayAccessDomain (SRVPrefix -> PortNumber -> LedgerRelayAccessPoint)
-> Gen SRVPrefix -> Gen (PortNumber -> LedgerRelayAccessPoint)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Gen SRVPrefix
genDomainName Gen (PortNumber -> LedgerRelayAccessPoint)
-> Gen PortNumber -> Gen LedgerRelayAccessPoint
forall a b. Gen (a -> b) -> Gen a -> Gen b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Gen PortNumber
forall a. Arbitrary a => Gen a
arbitrary)
, (Int
1, SRVPrefix -> LedgerRelayAccessPoint
LedgerRelayAccessSRVDomain (SRVPrefix -> LedgerRelayAccessPoint)
-> Gen SRVPrefix -> Gen LedgerRelayAccessPoint
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Gen SRVPrefix
genDomainName)]
where
genDomainName :: Gen SRVPrefix
genDomainName = [SRVPrefix] -> Gen SRVPrefix
forall a. HasCallStack => [a] -> Gen a
elements ([SRVPrefix] -> Gen SRVPrefix) -> [SRVPrefix] -> Gen SRVPrefix
forall a b. (a -> b) -> a -> b
$ (\Int
i -> SRVPrefix
"test" SRVPrefix -> SRVPrefix -> SRVPrefix
forall a. Semigroup a => a -> a -> a
<> (String -> SRVPrefix
BSC.pack (String -> SRVPrefix) -> (Int -> String) -> Int -> SRVPrefix
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Int -> String
forall a. Show a => a -> String
show (Int -> SRVPrefix) -> Int -> SRVPrefix
forall a b. (a -> b) -> a -> b
$ Int
i) SRVPrefix -> SRVPrefix -> SRVPrefix
forall a. Semigroup a => a -> a -> a
<> SRVPrefix
".") (Int -> SRVPrefix) -> [Int] -> [SRVPrefix]
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> [Int
1..Int
6 :: Int]
instance Arbitrary UseLedgerPeers where
arbitrary :: Gen UseLedgerPeers
arbitrary = [(Int, Gen UseLedgerPeers)] -> Gen UseLedgerPeers
forall a. HasCallStack => [(Int, Gen a)] -> Gen a
frequency
[ (Int
2, UseLedgerPeers -> Gen UseLedgerPeers
forall a. a -> Gen a
forall (f :: * -> *) a. Applicative f => a -> f a
pure UseLedgerPeers
DontUseLedgerPeers)
, (Int
8, AfterSlot -> UseLedgerPeers
UseLedgerPeers (AfterSlot -> UseLedgerPeers)
-> Gen AfterSlot -> Gen UseLedgerPeers
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Gen AfterSlot
forall a. Arbitrary a => Gen a
arbitrary)
]
instance Arbitrary extraFlags => Arbitrary (LocalRootConfig extraFlags) where
arbitrary :: Gen (LocalRootConfig extraFlags)
arbitrary = PeerAdvertise
-> DiffusionMode
-> Provenance
-> extraFlags
-> LocalRootConfig extraFlags
forall extraFlags.
PeerAdvertise
-> DiffusionMode
-> Provenance
-> extraFlags
-> LocalRootConfig extraFlags
LocalRootConfig
(PeerAdvertise
-> DiffusionMode
-> Provenance
-> extraFlags
-> LocalRootConfig extraFlags)
-> Gen PeerAdvertise
-> Gen
(DiffusionMode
-> Provenance -> extraFlags -> LocalRootConfig extraFlags)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Gen PeerAdvertise
forall a. Arbitrary a => Gen a
arbitrary
Gen
(DiffusionMode
-> Provenance -> extraFlags -> LocalRootConfig extraFlags)
-> Gen DiffusionMode
-> Gen (Provenance -> extraFlags -> LocalRootConfig extraFlags)
forall a b. Gen (a -> b) -> Gen a -> Gen b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Gen DiffusionMode
forall a. Arbitrary a => Gen a
arbitrary
Gen (Provenance -> extraFlags -> LocalRootConfig extraFlags)
-> Gen Provenance -> Gen (extraFlags -> LocalRootConfig extraFlags)
forall a b. Gen (a -> b) -> Gen a -> Gen b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Gen Provenance
forall a. Arbitrary a => Gen a
arbitrary
Gen (extraFlags -> LocalRootConfig extraFlags)
-> Gen extraFlags -> Gen (LocalRootConfig extraFlags)
forall a b. Gen (a -> b) -> Gen a -> Gen b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Gen extraFlags
forall a. Arbitrary a => Gen a
arbitrary
shrink :: LocalRootConfig extraFlags -> [LocalRootConfig extraFlags]
shrink a :: LocalRootConfig extraFlags
a@LocalRootConfig { PeerAdvertise
peerAdvertise :: PeerAdvertise
peerAdvertise :: forall extraFlags. LocalRootConfig extraFlags -> PeerAdvertise
peerAdvertise,
extraLocalRootFlags :: forall extraFlags. LocalRootConfig extraFlags -> extraFlags
extraLocalRootFlags = extraFlags
peerTrustable,
DiffusionMode
diffusionMode :: DiffusionMode
diffusionMode :: forall extraFlags. LocalRootConfig extraFlags -> DiffusionMode
diffusionMode
} =
[ LocalRootConfig extraFlags
a { extraLocalRootFlags = peerTrustable' }
| extraFlags
peerTrustable' <- extraFlags -> [extraFlags]
forall a. Arbitrary a => a -> [a]
shrink extraFlags
peerTrustable
]
[LocalRootConfig extraFlags]
-> [LocalRootConfig extraFlags] -> [LocalRootConfig extraFlags]
forall a. [a] -> [a] -> [a]
++
[ LocalRootConfig extraFlags
a { peerAdvertise = peerAdvertise' }
| PeerAdvertise
peerAdvertise' <- PeerAdvertise -> [PeerAdvertise]
forall a. Arbitrary a => a -> [a]
shrink PeerAdvertise
peerAdvertise
]
[LocalRootConfig extraFlags]
-> [LocalRootConfig extraFlags] -> [LocalRootConfig extraFlags]
forall a. [a] -> [a] -> [a]
++
[ LocalRootConfig extraFlags
a { diffusionMode = diffusionMode' }
| DiffusionMode
diffusionMode' <- case DiffusionMode
diffusionMode of
DiffusionMode
InitiatorOnlyDiffusionMode -> []
DiffusionMode
InitiatorAndResponderDiffusionMode -> [DiffusionMode
InitiatorOnlyDiffusionMode]
]
instance (Arbitrary extraConfig, Arbitrary extraFlags) => Arbitrary (NetworkTopology extraConfig extraFlags) where
arbitrary :: Gen (NetworkTopology extraConfig extraFlags)
arbitrary = LocalRootPeersGroups extraFlags
-> [PublicRootPeers]
-> UseLedgerPeers
-> Maybe String
-> extraConfig
-> NetworkTopology extraConfig extraFlags
forall extraConfig extraFlags.
LocalRootPeersGroups extraFlags
-> [PublicRootPeers]
-> UseLedgerPeers
-> Maybe String
-> extraConfig
-> NetworkTopology extraConfig extraFlags
NetworkTopology
(LocalRootPeersGroups extraFlags
-> [PublicRootPeers]
-> UseLedgerPeers
-> Maybe String
-> extraConfig
-> NetworkTopology extraConfig extraFlags)
-> Gen (LocalRootPeersGroups extraFlags)
-> Gen
([PublicRootPeers]
-> UseLedgerPeers
-> Maybe String
-> extraConfig
-> NetworkTopology extraConfig extraFlags)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Gen (LocalRootPeersGroups extraFlags)
forall a. Arbitrary a => Gen a
arbitrary
Gen
([PublicRootPeers]
-> UseLedgerPeers
-> Maybe String
-> extraConfig
-> NetworkTopology extraConfig extraFlags)
-> Gen [PublicRootPeers]
-> Gen
(UseLedgerPeers
-> Maybe String
-> extraConfig
-> NetworkTopology extraConfig extraFlags)
forall a b. Gen (a -> b) -> Gen a -> Gen b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Gen [PublicRootPeers]
forall a. Arbitrary a => Gen a
arbitrary
Gen
(UseLedgerPeers
-> Maybe String
-> extraConfig
-> NetworkTopology extraConfig extraFlags)
-> Gen UseLedgerPeers
-> Gen
(Maybe String
-> extraConfig -> NetworkTopology extraConfig extraFlags)
forall a b. Gen (a -> b) -> Gen a -> Gen b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Gen UseLedgerPeers
forall a. Arbitrary a => Gen a
arbitrary
Gen
(Maybe String
-> extraConfig -> NetworkTopology extraConfig extraFlags)
-> Gen (Maybe String)
-> Gen (extraConfig -> NetworkTopology extraConfig extraFlags)
forall a b. Gen (a -> b) -> Gen a -> Gen b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Gen (Maybe String)
forall a. Arbitrary a => Gen a
arbitrary
Gen (extraConfig -> NetworkTopology extraConfig extraFlags)
-> Gen extraConfig -> Gen (NetworkTopology extraConfig extraFlags)
forall a b. Gen (a -> b) -> Gen a -> Gen b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Gen extraConfig
forall a. Arbitrary a => Gen a
arbitrary
instance Arbitrary PublicRootPeers where
arbitrary :: Gen PublicRootPeers
arbitrary = RootConfig -> PublicRootPeers
PublicRootPeers (RootConfig -> PublicRootPeers)
-> Gen RootConfig -> Gen PublicRootPeers
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Gen RootConfig
forall a. Arbitrary a => Gen a
arbitrary
instance (Arbitrary extraFlags) => Arbitrary (LocalRootPeersGroups extraFlags) where
arbitrary :: Gen (LocalRootPeersGroups extraFlags)
arbitrary = [LocalRootPeersGroup extraFlags] -> LocalRootPeersGroups extraFlags
forall extraFlags.
[LocalRootPeersGroup extraFlags] -> LocalRootPeersGroups extraFlags
LocalRootPeersGroups ([LocalRootPeersGroup extraFlags]
-> LocalRootPeersGroups extraFlags)
-> Gen [LocalRootPeersGroup extraFlags]
-> Gen (LocalRootPeersGroups extraFlags)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Gen [LocalRootPeersGroup extraFlags]
forall a. Arbitrary a => Gen a
arbitrary
instance (Arbitrary extraFlags) => Arbitrary (LocalRootPeersGroup extraFlags) where
arbitrary :: Gen (LocalRootPeersGroup extraFlags)
arbitrary = LocalRoots
-> HotValency
-> WarmValency
-> DiffusionMode
-> extraFlags
-> LocalRootPeersGroup extraFlags
forall extraFlags.
LocalRoots
-> HotValency
-> WarmValency
-> DiffusionMode
-> extraFlags
-> LocalRootPeersGroup extraFlags
LocalRootPeersGroup
(LocalRoots
-> HotValency
-> WarmValency
-> DiffusionMode
-> extraFlags
-> LocalRootPeersGroup extraFlags)
-> Gen LocalRoots
-> Gen
(HotValency
-> WarmValency
-> DiffusionMode
-> extraFlags
-> LocalRootPeersGroup extraFlags)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Gen LocalRoots
forall a. Arbitrary a => Gen a
arbitrary
Gen
(HotValency
-> WarmValency
-> DiffusionMode
-> extraFlags
-> LocalRootPeersGroup extraFlags)
-> Gen HotValency
-> Gen
(WarmValency
-> DiffusionMode -> extraFlags -> LocalRootPeersGroup extraFlags)
forall a b. Gen (a -> b) -> Gen a -> Gen b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Gen HotValency
forall a. Arbitrary a => Gen a
arbitrary
Gen
(WarmValency
-> DiffusionMode -> extraFlags -> LocalRootPeersGroup extraFlags)
-> Gen WarmValency
-> Gen
(DiffusionMode -> extraFlags -> LocalRootPeersGroup extraFlags)
forall a b. Gen (a -> b) -> Gen a -> Gen b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Gen WarmValency
forall a. Arbitrary a => Gen a
arbitrary
Gen (DiffusionMode -> extraFlags -> LocalRootPeersGroup extraFlags)
-> Gen DiffusionMode
-> Gen (extraFlags -> LocalRootPeersGroup extraFlags)
forall a b. Gen (a -> b) -> Gen a -> Gen b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Gen DiffusionMode
forall a. Arbitrary a => Gen a
arbitrary
Gen (extraFlags -> LocalRootPeersGroup extraFlags)
-> Gen extraFlags -> Gen (LocalRootPeersGroup extraFlags)
forall a b. Gen (a -> b) -> Gen a -> Gen b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Gen extraFlags
forall a. Arbitrary a => Gen a
arbitrary
instance Arbitrary LocalRoots where
arbitrary :: Gen LocalRoots
arbitrary = RootConfig -> Provenance -> LocalRoots
LocalRoots (RootConfig -> Provenance -> LocalRoots)
-> Gen RootConfig -> Gen (Provenance -> LocalRoots)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Gen RootConfig
forall a. Arbitrary a => Gen a
arbitrary Gen (Provenance -> LocalRoots) -> Gen Provenance -> Gen LocalRoots
forall a b. Gen (a -> b) -> Gen a -> Gen b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Gen Provenance
forall a. Arbitrary a => Gen a
arbitrary
instance Arbitrary RootConfig where
arbitrary :: Gen RootConfig
arbitrary = [RelayAccessPoint] -> PeerAdvertise -> RootConfig
RootConfig ([RelayAccessPoint] -> PeerAdvertise -> RootConfig)
-> Gen [RelayAccessPoint] -> Gen (PeerAdvertise -> RootConfig)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Gen [RelayAccessPoint]
forall a. Arbitrary a => Gen a
arbitrary Gen (PeerAdvertise -> RootConfig)
-> Gen PeerAdvertise -> Gen RootConfig
forall a b. Gen (a -> b) -> Gen a -> Gen b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Gen PeerAdvertise
forall a. Arbitrary a => Gen a
arbitrary
instance Arbitrary Provenance where
arbitrary :: Gen Provenance
arbitrary = [Provenance] -> Gen Provenance
forall a. HasCallStack => [a] -> Gen a
elements [Provenance
Inbound, Provenance
Outbound]
instance Arbitrary DiffusionMode where
arbitrary :: Gen DiffusionMode
arbitrary = [DiffusionMode] -> Gen DiffusionMode
forall a. HasCallStack => [a] -> Gen a
elements
[ DiffusionMode
InitiatorOnlyDiffusionMode
, DiffusionMode
InitiatorAndResponderDiffusionMode
]
instance Arbitrary HotValency where
arbitrary :: Gen HotValency
arbitrary = Int -> HotValency
HotValency (Int -> HotValency) -> Gen Int -> Gen HotValency
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Gen Int
forall a. Arbitrary a => Gen a
arbitrary
instance Arbitrary WarmValency where
arbitrary :: Gen WarmValency
arbitrary = Int -> WarmValency
WarmValency (Int -> WarmValency) -> Gen Int -> Gen WarmValency
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Gen Int
forall a. Arbitrary a => Gen a
arbitrary