{-# LANGUAGE FlexibleInstances #-}
{-# LANGUAGE GADTs             #-}
{-# LANGUAGE TypeOperators     #-}

{-# OPTIONS_GHC -Wno-orphans #-}

module Test.Ouroboros.Network.PeerSelection.Cardano.PublicRootPeers
  ( arbitraryCardanoExtraPeers
  , tests
  ) where

import Data.Map.Strict (Map)
import Data.Map.Strict qualified as Map
import Data.Set (Set)
import Data.Set qualified as Set

import Ouroboros.Network.PeerSelection.PublicRootPeers (PublicRootPeers)

import Test.Ouroboros.Network.PeerSelection.Instances
import Test.Ouroboros.Network.Utils (ShrinkCarefully, prop_shrink_nonequal,
           prop_shrink_valid)

import Cardano.Network.PeerSelection.ExtraRootPeers qualified as Cardano
import Cardano.Network.PeerSelection.PublicRootPeers (CardanoPublicRootPeers)
import Cardano.Network.PeerSelection.PublicRootPeers qualified as Cardano.PublicRootPeers
import Ouroboros.Network.PeerSelection.PeerAdvertise (PeerAdvertise)
import Ouroboros.Network.PeerSelection.PublicRootPeers (PublicRootPeers (..))
import Ouroboros.Network.PeerSelection.PublicRootPeers qualified as PublicRootPeers
import Test.QuickCheck
import Test.Tasty (TestTree, testGroup)
import Test.Tasty.QuickCheck (testProperty)


tests :: TestTree
tests :: TestTree
tests =
  TestName -> [TestTree] -> TestTree
testGroup TestName
"Ouroboros.Network.PeerSelection"
  [ TestName -> [TestTree] -> TestTree
testGroup TestName
"PublicRootPeers"
    [ TestName
-> (CardanoPublicRootPeers PeerAddr -> Property) -> TestTree
forall a. Testable a => TestName -> a -> TestTree
testProperty TestName
"arbitrary"              CardanoPublicRootPeers PeerAddr -> Property
prop_arbitrary_CardanoExtraPeers
    , TestName
-> (Map PeerAddr PeerAdvertise
    -> Set PeerAddr -> Set PeerAddr -> Set PeerAddr -> Bool)
-> TestTree
forall a. Testable a => TestName -> a -> TestTree
testProperty TestName
"fromMapAndSet"          Map PeerAddr PeerAdvertise
-> Set PeerAddr -> Set PeerAddr -> Set PeerAddr -> Bool
prop_fromMapAndSet
    , TestName
-> (Map PeerAddr PeerAdvertise
    -> Set PeerAddr -> Set PeerAddr -> Set PeerAddr -> Property)
-> TestTree
forall a. Testable a => TestName -> a -> TestTree
testProperty TestName
"fromMapAndSet'"         Map PeerAddr PeerAdvertise
-> Set PeerAddr -> Set PeerAddr -> Set PeerAddr -> Property
prop_fromMapAndSet'
    , TestName -> (CardanoPublicRootPeers PeerAddr -> Bool) -> TestTree
forall a. Testable a => TestName -> a -> TestTree
testProperty TestName
"fromToMapAndSet"        CardanoPublicRootPeers PeerAddr -> Bool
prop_fromToMapAndSet
    , TestName
-> (CardanoPublicRootPeers PeerAddr
    -> CardanoPublicRootPeers PeerAddr -> Bool)
-> TestTree
forall a. Testable a => TestName -> a -> TestTree
testProperty TestName
"merge"                  CardanoPublicRootPeers PeerAddr
-> CardanoPublicRootPeers PeerAddr -> Bool
prop_merge
    , TestName
-> (CardanoPublicRootPeers PeerAddr
    -> PeerAddr -> PeerAdvertise -> Bool)
-> TestTree
forall a. Testable a => TestName -> a -> TestTree
testProperty TestName
"insertPublicConfigPeer" CardanoPublicRootPeers PeerAddr
-> PeerAddr -> PeerAdvertise -> Bool
prop_insertPublicConfigPeer
    , TestName
-> (CardanoPublicRootPeers PeerAddr -> PeerAddr -> Bool)
-> TestTree
forall a. Testable a => TestName -> a -> TestTree
testProperty TestName
"insertBootstrapPeer"    CardanoPublicRootPeers PeerAddr -> PeerAddr -> Bool
prop_insertBootstrapPeer
    , TestName
-> (CardanoPublicRootPeers PeerAddr -> PeerAddr -> Bool)
-> TestTree
forall a. Testable a => TestName -> a -> TestTree
testProperty TestName
"insertLedgerPeer"       CardanoPublicRootPeers PeerAddr -> PeerAddr -> Bool
prop_insertLedgerPeer
    , TestName
-> (CardanoPublicRootPeers PeerAddr -> PeerAddr -> Bool)
-> TestTree
forall a. Testable a => TestName -> a -> TestTree
testProperty TestName
"insertBigLedgerPeer"    CardanoPublicRootPeers PeerAddr -> PeerAddr -> Bool
prop_insertBigLedgerPeer
    , TestName -> (PeerAddr -> PeerAdvertise -> Bool) -> TestTree
forall a. Testable a => TestName -> a -> TestTree
testProperty TestName
"fromPeers"              PeerAddr -> PeerAdvertise -> Bool
prop_fromPeers
    , TestName
-> (ShrinkCarefully (CardanoPublicRootPeers PeerAddr) -> Property)
-> TestTree
forall a. Testable a => TestName -> a -> TestTree
testProperty TestName
"shrink"                 ShrinkCarefully (CardanoPublicRootPeers PeerAddr) -> Property
prop_shrink_CardanoExtraPeers
    ]
  ]

arbitraryCardanoExtraPeers :: (Ord peeraddr, Arbitrary peeraddr)
                                => Gen (CardanoPublicRootPeers peeraddr)
arbitraryCardanoExtraPeers :: forall peeraddr.
(Ord peeraddr, Arbitrary peeraddr) =>
Gen (CardanoPublicRootPeers peeraddr)
arbitraryCardanoExtraPeers = do
  peeraddrs <- Gen (Set peeraddr)
forall a. Arbitrary a => Gen a
arbitrary
  let peersSize = Set peeraddr -> Int
forall a. Set a -> Int
Set.size Set peeraddr
peeraddrs
      (publicConfigPeers, otherPeers) = Set.splitAt (peersSize `div` 2) peeraddrs
      (bootstrapPeers, ledgerPeers) = Set.splitAt (Set.size otherPeers `div` 2) otherPeers
      (normalLedgerPeers, bigLedgerPeers) = Set.splitAt (Set.size ledgerPeers `div` 2) ledgerPeers

  advertiseInfo <- vectorOf (Set.size publicConfigPeers) arbitrary

  let publicConfigPeersMap = [(peeraddr, PeerAdvertise)] -> Map peeraddr PeerAdvertise
forall k a. Ord k => [(k, a)] -> Map k a
Map.fromList
                           ([(peeraddr, PeerAdvertise)] -> Map peeraddr PeerAdvertise)
-> [(peeraddr, PeerAdvertise)] -> Map peeraddr PeerAdvertise
forall a b. (a -> b) -> a -> b
$ [peeraddr] -> [PeerAdvertise] -> [(peeraddr, PeerAdvertise)]
forall a b. [a] -> [b] -> [(a, b)]
zip (Set peeraddr -> [peeraddr]
forall a. Set a -> [a]
Set.toList Set peeraddr
publicConfigPeers) [PeerAdvertise]
advertiseInfo

  return (Cardano.PublicRootPeers.fromMapAndSet publicConfigPeersMap bootstrapPeers normalLedgerPeers bigLedgerPeers)

instance ( Arbitrary peeraddr
         , Ord peeraddr
         ) => Arbitrary (CardanoPublicRootPeers peeraddr) where
    arbitrary :: Gen (CardanoPublicRootPeers peeraddr)
arbitrary = Gen (CardanoPublicRootPeers peeraddr)
forall peeraddr.
(Ord peeraddr, Arbitrary peeraddr) =>
Gen (CardanoPublicRootPeers peeraddr)
arbitraryCardanoExtraPeers

    shrink :: CardanoPublicRootPeers peeraddr
-> [CardanoPublicRootPeers peeraddr]
shrink (PublicRootPeers Set peeraddr
lp Set peeraddr
blp (Cardano.ExtraPeers Map peeraddr PeerAdvertise
pp Set peeraddr
bsp)) =
        Map peeraddr PeerAdvertise
-> Set peeraddr
-> Set peeraddr
-> Set peeraddr
-> CardanoPublicRootPeers peeraddr
forall peeraddr.
Ord peeraddr =>
Map peeraddr PeerAdvertise
-> Set peeraddr
-> Set peeraddr
-> Set peeraddr
-> CardanoPublicRootPeers peeraddr
Cardano.PublicRootPeers.fromMapAndSet (Map peeraddr PeerAdvertise
 -> Set peeraddr
 -> Set peeraddr
 -> Set peeraddr
 -> CardanoPublicRootPeers peeraddr)
-> [Map peeraddr PeerAdvertise]
-> [Set peeraddr
    -> Set peeraddr -> Set peeraddr -> CardanoPublicRootPeers peeraddr]
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Map peeraddr PeerAdvertise -> [Map peeraddr PeerAdvertise]
forall a. Arbitrary a => a -> [a]
shrink Map peeraddr PeerAdvertise
pp
                                      [Set peeraddr
 -> Set peeraddr -> Set peeraddr -> CardanoPublicRootPeers peeraddr]
-> [Set peeraddr]
-> [Set peeraddr
    -> Set peeraddr -> CardanoPublicRootPeers peeraddr]
forall a b. [a -> b] -> [a] -> [b]
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Set peeraddr -> [Set peeraddr]
forall a. Arbitrary a => a -> [a]
shrink Set peeraddr
bsp
                                      [Set peeraddr -> Set peeraddr -> CardanoPublicRootPeers peeraddr]
-> [Set peeraddr]
-> [Set peeraddr -> CardanoPublicRootPeers peeraddr]
forall a b. [a -> b] -> [a] -> [b]
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Set peeraddr -> [Set peeraddr]
forall a. Arbitrary a => a -> [a]
shrink Set peeraddr
lp
                                      [Set peeraddr -> CardanoPublicRootPeers peeraddr]
-> [Set peeraddr] -> [CardanoPublicRootPeers peeraddr]
forall a b. [a -> b] -> [a] -> [b]
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Set peeraddr -> [Set peeraddr]
forall a. Arbitrary a => a -> [a]
shrink Set peeraddr
blp

prop_arbitrary_CardanoExtraPeers :: PublicRootPeers (Cardano.ExtraPeers PeerAddr) PeerAddr -> Property
prop_arbitrary_CardanoExtraPeers :: CardanoPublicRootPeers PeerAddr -> Property
prop_arbitrary_CardanoExtraPeers = Bool -> Property
forall prop. Testable prop => prop -> Property
property (Bool -> Property)
-> (CardanoPublicRootPeers PeerAddr -> Bool)
-> CardanoPublicRootPeers PeerAddr
-> Property
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (ExtraPeers PeerAddr -> Bool)
-> (ExtraPeers PeerAddr -> Set PeerAddr)
-> CardanoPublicRootPeers PeerAddr
-> Bool
forall peeraddr extraPeers.
Ord peeraddr =>
(extraPeers -> Bool)
-> (extraPeers -> Set peeraddr)
-> PublicRootPeers extraPeers peeraddr
-> Bool
PublicRootPeers.invariant ExtraPeers PeerAddr -> Bool
forall peeraddr. Ord peeraddr => ExtraPeers peeraddr -> Bool
Cardano.invariant ExtraPeers PeerAddr -> Set PeerAddr
forall peeraddr.
Ord peeraddr =>
ExtraPeers peeraddr -> Set peeraddr
Cardano.toSet


prop_shrink_CardanoExtraPeers
  :: ShrinkCarefully (PublicRootPeers (Cardano.ExtraPeers PeerAddr) PeerAddr)
  -> Property
prop_shrink_CardanoExtraPeers :: ShrinkCarefully (CardanoPublicRootPeers PeerAddr) -> Property
prop_shrink_CardanoExtraPeers ShrinkCarefully (CardanoPublicRootPeers PeerAddr)
x =
      (CardanoPublicRootPeers PeerAddr -> Bool)
-> ShrinkCarefully (CardanoPublicRootPeers PeerAddr) -> Property
forall a prop.
(Arbitrary a, Show a, Testable prop) =>
(a -> prop) -> ShrinkCarefully a -> Property
prop_shrink_valid ((ExtraPeers PeerAddr -> Bool)
-> (ExtraPeers PeerAddr -> Set PeerAddr)
-> CardanoPublicRootPeers PeerAddr
-> Bool
forall peeraddr extraPeers.
Ord peeraddr =>
(extraPeers -> Bool)
-> (extraPeers -> Set peeraddr)
-> PublicRootPeers extraPeers peeraddr
-> Bool
PublicRootPeers.invariant ExtraPeers PeerAddr -> Bool
forall peeraddr. Ord peeraddr => ExtraPeers peeraddr -> Bool
Cardano.invariant ExtraPeers PeerAddr -> Set PeerAddr
forall peeraddr.
Ord peeraddr =>
ExtraPeers peeraddr -> Set peeraddr
Cardano.toSet) ShrinkCarefully (CardanoPublicRootPeers PeerAddr)
x
 Property -> Property -> Property
forall prop1 prop2.
(Testable prop1, Testable prop2) =>
prop1 -> prop2 -> Property
.&&. ShrinkCarefully (CardanoPublicRootPeers PeerAddr) -> Property
forall a.
(Arbitrary a, Eq a, Show a) =>
ShrinkCarefully a -> Property
prop_shrink_nonequal ShrinkCarefully (CardanoPublicRootPeers PeerAddr)
x

prop_fromMapAndSet :: Map PeerAddr PeerAdvertise
                   -> Set PeerAddr
                   -> Set PeerAddr
                   -> Set PeerAddr
                   -> Bool
prop_fromMapAndSet :: Map PeerAddr PeerAdvertise
-> Set PeerAddr -> Set PeerAddr -> Set PeerAddr -> Bool
prop_fromMapAndSet Map PeerAddr PeerAdvertise
pp Set PeerAddr
bsp Set PeerAddr
lp =
  let newPP :: Map PeerAddr PeerAdvertise
newPP = Map PeerAddr PeerAdvertise
pp Map PeerAddr PeerAdvertise
-> Set PeerAddr -> Map PeerAddr PeerAdvertise
forall k a. Ord k => Map k a -> Set k -> Map k a
`Map.withoutKeys` Set PeerAddr
bsp
   in (ExtraPeers PeerAddr -> Bool)
-> (ExtraPeers PeerAddr -> Set PeerAddr)
-> CardanoPublicRootPeers PeerAddr
-> Bool
forall peeraddr extraPeers.
Ord peeraddr =>
(extraPeers -> Bool)
-> (extraPeers -> Set peeraddr)
-> PublicRootPeers extraPeers peeraddr
-> Bool
PublicRootPeers.invariant ExtraPeers PeerAddr -> Bool
forall peeraddr. Ord peeraddr => ExtraPeers peeraddr -> Bool
Cardano.invariant ExtraPeers PeerAddr -> Set PeerAddr
forall peeraddr.
Ord peeraddr =>
ExtraPeers peeraddr -> Set peeraddr
Cardano.toSet
    (CardanoPublicRootPeers PeerAddr -> Bool)
-> (Set PeerAddr -> CardanoPublicRootPeers PeerAddr)
-> Set PeerAddr
-> Bool
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Map PeerAddr PeerAdvertise
-> Set PeerAddr
-> Set PeerAddr
-> Set PeerAddr
-> CardanoPublicRootPeers PeerAddr
forall peeraddr.
Ord peeraddr =>
Map peeraddr PeerAdvertise
-> Set peeraddr
-> Set peeraddr
-> Set peeraddr
-> CardanoPublicRootPeers peeraddr
Cardano.PublicRootPeers.fromMapAndSet Map PeerAddr PeerAdvertise
newPP Set PeerAddr
bsp Set PeerAddr
lp

prop_fromToMapAndSet :: CardanoPublicRootPeers PeerAddr -> Bool
prop_fromToMapAndSet :: CardanoPublicRootPeers PeerAddr -> Bool
prop_fromToMapAndSet prp :: CardanoPublicRootPeers PeerAddr
prp@(PublicRootPeers Set PeerAddr
lp Set PeerAddr
blp (Cardano.ExtraPeers Map PeerAddr PeerAdvertise
pp Set PeerAddr
bsp)) =
  Map PeerAddr PeerAdvertise
-> Set PeerAddr
-> Set PeerAddr
-> Set PeerAddr
-> CardanoPublicRootPeers PeerAddr
forall peeraddr.
Ord peeraddr =>
Map peeraddr PeerAdvertise
-> Set peeraddr
-> Set peeraddr
-> Set peeraddr
-> CardanoPublicRootPeers peeraddr
Cardano.PublicRootPeers.fromMapAndSet Map PeerAddr PeerAdvertise
pp Set PeerAddr
bsp Set PeerAddr
lp Set PeerAddr
blp CardanoPublicRootPeers PeerAddr
-> CardanoPublicRootPeers PeerAddr -> Bool
forall a. Eq a => a -> a -> Bool
== CardanoPublicRootPeers PeerAddr
prp

prop_fromMapAndSet' :: Map PeerAddr PeerAdvertise
                   -> Set PeerAddr
                   -> Set PeerAddr
                   -> Set PeerAddr
                   -> Property
prop_fromMapAndSet' :: Map PeerAddr PeerAdvertise
-> Set PeerAddr -> Set PeerAddr -> Set PeerAddr -> Property
prop_fromMapAndSet' Map PeerAddr PeerAdvertise
pp Set PeerAddr
bsp Set PeerAddr
lp Set PeerAddr
blp =
  -- Make sets disjoint
  let pp' :: Map PeerAddr PeerAdvertise
pp'  = Map PeerAddr PeerAdvertise
-> Set PeerAddr -> Map PeerAddr PeerAdvertise
forall k a. Ord k => Map k a -> Set k -> Map k a
Map.withoutKeys Map PeerAddr PeerAdvertise
pp (Set PeerAddr
bsp Set PeerAddr -> Set PeerAddr -> Set PeerAddr
forall a. Semigroup a => a -> a -> a
<> Set PeerAddr
lp Set PeerAddr -> Set PeerAddr -> Set PeerAddr
forall a. Semigroup a => a -> a -> a
<> Set PeerAddr
blp)
      bsp' :: Set PeerAddr
bsp' = Set PeerAddr -> Set PeerAddr -> Set PeerAddr
forall a. Ord a => Set a -> Set a -> Set a
Set.difference Set PeerAddr
bsp (Set PeerAddr
lp Set PeerAddr -> Set PeerAddr -> Set PeerAddr
forall a. Semigroup a => a -> a -> a
<> Set PeerAddr
blp)
      lp' :: Set PeerAddr
lp'  = Set PeerAddr -> Set PeerAddr -> Set PeerAddr
forall a. Ord a => Set a -> Set a -> Set a
Set.difference Set PeerAddr
lp Set PeerAddr
blp
      prp :: CardanoPublicRootPeers PeerAddr
prp = Map PeerAddr PeerAdvertise
-> Set PeerAddr
-> Set PeerAddr
-> Set PeerAddr
-> CardanoPublicRootPeers PeerAddr
forall peeraddr.
Ord peeraddr =>
Map peeraddr PeerAdvertise
-> Set peeraddr
-> Set peeraddr
-> Set peeraddr
-> CardanoPublicRootPeers peeraddr
Cardano.PublicRootPeers.fromMapAndSet Map PeerAddr PeerAdvertise
pp' Set PeerAddr
bsp' Set PeerAddr
lp' Set PeerAddr
blp
   in  CardanoPublicRootPeers PeerAddr -> Map PeerAddr PeerAdvertise
forall peeraddr.
CardanoPublicRootPeers peeraddr -> Map peeraddr PeerAdvertise
Cardano.PublicRootPeers.getPublicConfigPeers CardanoPublicRootPeers PeerAddr
prp Map PeerAddr PeerAdvertise
-> Map PeerAddr PeerAdvertise -> Property
forall a. (Eq a, Show a) => a -> a -> Property
=== Map PeerAddr PeerAdvertise
pp'
    Property -> Property -> Property
forall prop1 prop2.
(Testable prop1, Testable prop2) =>
prop1 -> prop2 -> Property
.&&. CardanoPublicRootPeers PeerAddr -> Set PeerAddr
forall peeraddr. CardanoPublicRootPeers peeraddr -> Set peeraddr
Cardano.PublicRootPeers.getBootstrapPeers CardanoPublicRootPeers PeerAddr
prp  Set PeerAddr -> Set PeerAddr -> Property
forall a. (Eq a, Show a) => a -> a -> Property
=== Set PeerAddr
bsp'
    Property -> Property -> Property
forall prop1 prop2.
(Testable prop1, Testable prop2) =>
prop1 -> prop2 -> Property
.&&. CardanoPublicRootPeers PeerAddr -> Set PeerAddr
forall extraPeers peeraddr.
PublicRootPeers extraPeers peeraddr -> Set peeraddr
PublicRootPeers.getLedgerPeers CardanoPublicRootPeers PeerAddr
prp       Set PeerAddr -> Set PeerAddr -> Property
forall a. (Eq a, Show a) => a -> a -> Property
=== Set PeerAddr
lp'
    Property -> Property -> Property
forall prop1 prop2.
(Testable prop1, Testable prop2) =>
prop1 -> prop2 -> Property
.&&. CardanoPublicRootPeers PeerAddr -> Set PeerAddr
forall extraPeers peeraddr.
PublicRootPeers extraPeers peeraddr -> Set peeraddr
PublicRootPeers.getBigLedgerPeers CardanoPublicRootPeers PeerAddr
prp    Set PeerAddr -> Set PeerAddr -> Property
forall a. (Eq a, Show a) => a -> a -> Property
=== Set PeerAddr
blp

prop_merge :: CardanoPublicRootPeers PeerAddr
           -> CardanoPublicRootPeers PeerAddr
           -> Bool
prop_merge :: CardanoPublicRootPeers PeerAddr
-> CardanoPublicRootPeers PeerAddr -> Bool
prop_merge CardanoPublicRootPeers PeerAddr
prp = (ExtraPeers PeerAddr -> Bool)
-> (ExtraPeers PeerAddr -> Set PeerAddr)
-> CardanoPublicRootPeers PeerAddr
-> Bool
forall peeraddr extraPeers.
Ord peeraddr =>
(extraPeers -> Bool)
-> (extraPeers -> Set peeraddr)
-> PublicRootPeers extraPeers peeraddr
-> Bool
PublicRootPeers.invariant ExtraPeers PeerAddr -> Bool
forall peeraddr. Ord peeraddr => ExtraPeers peeraddr -> Bool
Cardano.invariant ExtraPeers PeerAddr -> Set PeerAddr
forall peeraddr.
Ord peeraddr =>
ExtraPeers peeraddr -> Set peeraddr
Cardano.toSet
               (CardanoPublicRootPeers PeerAddr -> Bool)
-> (CardanoPublicRootPeers PeerAddr
    -> CardanoPublicRootPeers PeerAddr)
-> CardanoPublicRootPeers PeerAddr
-> Bool
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (CardanoPublicRootPeers PeerAddr
-> CardanoPublicRootPeers PeerAddr
-> CardanoPublicRootPeers PeerAddr
forall a. Semigroup a => a -> a -> a
<> CardanoPublicRootPeers PeerAddr
prp)

prop_insertPublicConfigPeer :: CardanoPublicRootPeers PeerAddr
                            -> PeerAddr
                            -> PeerAdvertise
                            -> Bool
prop_insertPublicConfigPeer :: CardanoPublicRootPeers PeerAddr
-> PeerAddr -> PeerAdvertise -> Bool
prop_insertPublicConfigPeer CardanoPublicRootPeers PeerAddr
prp PeerAddr
p PeerAdvertise
pa =
  (ExtraPeers PeerAddr -> Bool)
-> (ExtraPeers PeerAddr -> Set PeerAddr)
-> CardanoPublicRootPeers PeerAddr
-> Bool
forall peeraddr extraPeers.
Ord peeraddr =>
(extraPeers -> Bool)
-> (extraPeers -> Set peeraddr)
-> PublicRootPeers extraPeers peeraddr
-> Bool
PublicRootPeers.invariant ExtraPeers PeerAddr -> Bool
forall peeraddr. Ord peeraddr => ExtraPeers peeraddr -> Bool
Cardano.invariant ExtraPeers PeerAddr -> Set PeerAddr
forall peeraddr.
Ord peeraddr =>
ExtraPeers peeraddr -> Set peeraddr
Cardano.toSet (PeerAddr
-> PeerAdvertise
-> CardanoPublicRootPeers PeerAddr
-> CardanoPublicRootPeers PeerAddr
forall peeraddr.
Ord peeraddr =>
peeraddr
-> PeerAdvertise
-> CardanoPublicRootPeers peeraddr
-> CardanoPublicRootPeers peeraddr
Cardano.PublicRootPeers.insertPublicConfigPeer PeerAddr
p PeerAdvertise
pa CardanoPublicRootPeers PeerAddr
prp)

prop_insertBootstrapPeer :: CardanoPublicRootPeers PeerAddr
                         -> PeerAddr
                         -> Bool
prop_insertBootstrapPeer :: CardanoPublicRootPeers PeerAddr -> PeerAddr -> Bool
prop_insertBootstrapPeer CardanoPublicRootPeers PeerAddr
prp PeerAddr
p =
  (ExtraPeers PeerAddr -> Bool)
-> (ExtraPeers PeerAddr -> Set PeerAddr)
-> CardanoPublicRootPeers PeerAddr
-> Bool
forall peeraddr extraPeers.
Ord peeraddr =>
(extraPeers -> Bool)
-> (extraPeers -> Set peeraddr)
-> PublicRootPeers extraPeers peeraddr
-> Bool
PublicRootPeers.invariant ExtraPeers PeerAddr -> Bool
forall peeraddr. Ord peeraddr => ExtraPeers peeraddr -> Bool
Cardano.invariant ExtraPeers PeerAddr -> Set PeerAddr
forall peeraddr.
Ord peeraddr =>
ExtraPeers peeraddr -> Set peeraddr
Cardano.toSet (PeerAddr
-> CardanoPublicRootPeers PeerAddr
-> CardanoPublicRootPeers PeerAddr
forall peeraddr.
Ord peeraddr =>
peeraddr
-> CardanoPublicRootPeers peeraddr
-> CardanoPublicRootPeers peeraddr
Cardano.PublicRootPeers.insertBootstrapPeer PeerAddr
p CardanoPublicRootPeers PeerAddr
prp)

prop_insertLedgerPeer :: CardanoPublicRootPeers PeerAddr
                      -> PeerAddr
                      -> Bool
prop_insertLedgerPeer :: CardanoPublicRootPeers PeerAddr -> PeerAddr -> Bool
prop_insertLedgerPeer CardanoPublicRootPeers PeerAddr
prp PeerAddr
p =
  (ExtraPeers PeerAddr -> Bool)
-> (ExtraPeers PeerAddr -> Set PeerAddr)
-> CardanoPublicRootPeers PeerAddr
-> Bool
forall peeraddr extraPeers.
Ord peeraddr =>
(extraPeers -> Bool)
-> (extraPeers -> Set peeraddr)
-> PublicRootPeers extraPeers peeraddr
-> Bool
PublicRootPeers.invariant ExtraPeers PeerAddr -> Bool
forall peeraddr. Ord peeraddr => ExtraPeers peeraddr -> Bool
Cardano.invariant ExtraPeers PeerAddr -> Set PeerAddr
forall peeraddr.
Ord peeraddr =>
ExtraPeers peeraddr -> Set peeraddr
Cardano.toSet (PeerAddr
-> CardanoPublicRootPeers PeerAddr
-> CardanoPublicRootPeers PeerAddr
forall peeraddr.
Ord peeraddr =>
peeraddr
-> CardanoPublicRootPeers peeraddr
-> CardanoPublicRootPeers peeraddr
Cardano.PublicRootPeers.insertLedgerPeer PeerAddr
p CardanoPublicRootPeers PeerAddr
prp)

prop_insertBigLedgerPeer :: CardanoPublicRootPeers PeerAddr
                         -> PeerAddr
                         -> Bool
prop_insertBigLedgerPeer :: CardanoPublicRootPeers PeerAddr -> PeerAddr -> Bool
prop_insertBigLedgerPeer CardanoPublicRootPeers PeerAddr
prp PeerAddr
p =
  (ExtraPeers PeerAddr -> Bool)
-> (ExtraPeers PeerAddr -> Set PeerAddr)
-> CardanoPublicRootPeers PeerAddr
-> Bool
forall peeraddr extraPeers.
Ord peeraddr =>
(extraPeers -> Bool)
-> (extraPeers -> Set peeraddr)
-> PublicRootPeers extraPeers peeraddr
-> Bool
PublicRootPeers.invariant ExtraPeers PeerAddr -> Bool
forall peeraddr. Ord peeraddr => ExtraPeers peeraddr -> Bool
Cardano.invariant ExtraPeers PeerAddr -> Set PeerAddr
forall peeraddr.
Ord peeraddr =>
ExtraPeers peeraddr -> Set peeraddr
Cardano.toSet (PeerAddr
-> CardanoPublicRootPeers PeerAddr
-> CardanoPublicRootPeers PeerAddr
forall peeraddr.
Ord peeraddr =>
peeraddr
-> CardanoPublicRootPeers peeraddr
-> CardanoPublicRootPeers peeraddr
Cardano.PublicRootPeers.insertBigLedgerPeer PeerAddr
p CardanoPublicRootPeers PeerAddr
prp)

prop_fromPeers :: PeerAddr
               -> PeerAdvertise
               -> Bool
prop_fromPeers :: PeerAddr -> PeerAdvertise -> Bool
prop_fromPeers PeerAddr
peer PeerAdvertise
peerAdvertise =
  let insertPP :: CardanoPublicRootPeers PeerAddr
insertPP  = PeerAddr
-> PeerAdvertise
-> CardanoPublicRootPeers PeerAddr
-> CardanoPublicRootPeers PeerAddr
forall peeraddr.
Ord peeraddr =>
peeraddr
-> PeerAdvertise
-> CardanoPublicRootPeers peeraddr
-> CardanoPublicRootPeers peeraddr
Cardano.PublicRootPeers.insertPublicConfigPeer PeerAddr
peer PeerAdvertise
peerAdvertise (ExtraPeers PeerAddr -> CardanoPublicRootPeers PeerAddr
forall extraPeers peeraddr.
extraPeers -> PublicRootPeers extraPeers peeraddr
PublicRootPeers.empty ExtraPeers PeerAddr
forall peeraddr. ExtraPeers peeraddr
Cardano.empty)
      insertBSP :: CardanoPublicRootPeers PeerAddr
insertBSP = PeerAddr
-> CardanoPublicRootPeers PeerAddr
-> CardanoPublicRootPeers PeerAddr
forall peeraddr.
Ord peeraddr =>
peeraddr
-> CardanoPublicRootPeers peeraddr
-> CardanoPublicRootPeers peeraddr
Cardano.PublicRootPeers.insertBootstrapPeer PeerAddr
peer (ExtraPeers PeerAddr -> CardanoPublicRootPeers PeerAddr
forall extraPeers peeraddr.
extraPeers -> PublicRootPeers extraPeers peeraddr
PublicRootPeers.empty ExtraPeers PeerAddr
forall peeraddr. ExtraPeers peeraddr
Cardano.empty)
      insertLP :: CardanoPublicRootPeers PeerAddr
insertLP  = PeerAddr
-> CardanoPublicRootPeers PeerAddr
-> CardanoPublicRootPeers PeerAddr
forall peeraddr.
Ord peeraddr =>
peeraddr
-> CardanoPublicRootPeers peeraddr
-> CardanoPublicRootPeers peeraddr
Cardano.PublicRootPeers.insertLedgerPeer PeerAddr
peer (ExtraPeers PeerAddr -> CardanoPublicRootPeers PeerAddr
forall extraPeers peeraddr.
extraPeers -> PublicRootPeers extraPeers peeraddr
PublicRootPeers.empty ExtraPeers PeerAddr
forall peeraddr. ExtraPeers peeraddr
Cardano.empty)
      insertBLP :: CardanoPublicRootPeers PeerAddr
insertBLP = PeerAddr
-> CardanoPublicRootPeers PeerAddr
-> CardanoPublicRootPeers PeerAddr
forall peeraddr.
Ord peeraddr =>
peeraddr
-> CardanoPublicRootPeers peeraddr
-> CardanoPublicRootPeers peeraddr
Cardano.PublicRootPeers.insertBigLedgerPeer PeerAddr
peer (ExtraPeers PeerAddr -> CardanoPublicRootPeers PeerAddr
forall extraPeers peeraddr.
extraPeers -> PublicRootPeers extraPeers peeraddr
PublicRootPeers.empty ExtraPeers PeerAddr
forall peeraddr. ExtraPeers peeraddr
Cardano.empty)
   in    CardanoPublicRootPeers PeerAddr -> Map PeerAddr PeerAdvertise
forall peeraddr.
CardanoPublicRootPeers peeraddr -> Map peeraddr PeerAdvertise
Cardano.PublicRootPeers.getPublicConfigPeers CardanoPublicRootPeers PeerAddr
insertPP Map PeerAddr PeerAdvertise -> Map PeerAddr PeerAdvertise -> Bool
forall a. Eq a => a -> a -> Bool
== PeerAddr -> PeerAdvertise -> Map PeerAddr PeerAdvertise
forall k a. k -> a -> Map k a
Map.singleton PeerAddr
peer PeerAdvertise
peerAdvertise
      Bool -> Bool -> Bool
&& CardanoPublicRootPeers PeerAddr -> Set PeerAddr
forall peeraddr. CardanoPublicRootPeers peeraddr -> Set peeraddr
Cardano.PublicRootPeers.getBootstrapPeers CardanoPublicRootPeers PeerAddr
insertBSP   Set PeerAddr -> Set PeerAddr -> Bool
forall a. Eq a => a -> a -> Bool
== PeerAddr -> Set PeerAddr
forall a. a -> Set a
Set.singleton PeerAddr
peer
      Bool -> Bool -> Bool
&& CardanoPublicRootPeers PeerAddr -> Set PeerAddr
forall extraPeers peeraddr.
PublicRootPeers extraPeers peeraddr -> Set peeraddr
PublicRootPeers.getLedgerPeers CardanoPublicRootPeers PeerAddr
insertLP       Set PeerAddr -> Set PeerAddr -> Bool
forall a. Eq a => a -> a -> Bool
== PeerAddr -> Set PeerAddr
forall a. a -> Set a
Set.singleton PeerAddr
peer
      Bool -> Bool -> Bool
&& CardanoPublicRootPeers PeerAddr -> Set PeerAddr
forall extraPeers peeraddr.
PublicRootPeers extraPeers peeraddr -> Set peeraddr
PublicRootPeers.getBigLedgerPeers CardanoPublicRootPeers PeerAddr
insertBLP   Set PeerAddr -> Set PeerAddr -> Bool
forall a. Eq a => a -> a -> Bool
== PeerAddr -> Set PeerAddr
forall a. a -> Set a
Set.singleton PeerAddr
peer