{-# LANGUAGE DerivingVia        #-}
{-# LANGUAGE NamedFieldPuns     #-}
{-# LANGUAGE OverloadedStrings  #-}
{-# LANGUAGE StandaloneDeriving #-}
{-# LANGUAGE TypeApplications   #-}

{-# OPTIONS_GHC -Wno-orphans    #-}

module Test.Ouroboros.Network.OrphanInstances
  ( -- * Generators
    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)

-- * Generators

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

-- * Orphans

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