{-# 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 Ouroboros.Network.PeerSelection.PublicRootPeers qualified as PublicRootPeers
import Test.Ouroboros.Network.PeerSelection.Instances
import Test.Ouroboros.Network.Utils (ShrinkCarefully, prop_shrink_nonequal,
prop_shrink_valid)
import Ouroboros.Cardano.Network.PublicRootPeers qualified as Cardano
import Ouroboros.Network.PeerSelection.PeerAdvertise (PeerAdvertise)
import Ouroboros.Network.PeerSelection.PublicRootPeers (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
-> (PublicRootPeers (ExtraPeers PeerAddr) PeerAddr -> Property)
-> TestTree
forall a. Testable a => TestName -> a -> TestTree
testProperty TestName
"arbitrary" PublicRootPeers (ExtraPeers PeerAddr) 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
-> (PublicRootPeers (ExtraPeers PeerAddr) PeerAddr -> Bool)
-> TestTree
forall a. Testable a => TestName -> a -> TestTree
testProperty TestName
"fromToMapAndSet" PublicRootPeers (ExtraPeers PeerAddr) PeerAddr -> Bool
prop_fromToMapAndSet
, TestName
-> (PublicRootPeers (ExtraPeers PeerAddr) PeerAddr
-> PublicRootPeers (ExtraPeers PeerAddr) PeerAddr -> Bool)
-> TestTree
forall a. Testable a => TestName -> a -> TestTree
testProperty TestName
"merge" PublicRootPeers (ExtraPeers PeerAddr) PeerAddr
-> PublicRootPeers (ExtraPeers PeerAddr) PeerAddr -> Bool
prop_merge
, TestName
-> (PublicRootPeers (ExtraPeers PeerAddr) PeerAddr
-> PeerAddr -> PeerAdvertise -> Bool)
-> TestTree
forall a. Testable a => TestName -> a -> TestTree
testProperty TestName
"insertPublicConfigPeer" PublicRootPeers (ExtraPeers PeerAddr) PeerAddr
-> PeerAddr -> PeerAdvertise -> Bool
prop_insertPublicConfigPeer
, TestName
-> (PublicRootPeers (ExtraPeers PeerAddr) PeerAddr
-> PeerAddr -> Bool)
-> TestTree
forall a. Testable a => TestName -> a -> TestTree
testProperty TestName
"insertBootstrapPeer" PublicRootPeers (ExtraPeers PeerAddr) PeerAddr -> PeerAddr -> Bool
prop_insertBootstrapPeer
, TestName
-> (PublicRootPeers (ExtraPeers PeerAddr) PeerAddr
-> PeerAddr -> Bool)
-> TestTree
forall a. Testable a => TestName -> a -> TestTree
testProperty TestName
"insertLedgerPeer" PublicRootPeers (ExtraPeers PeerAddr) PeerAddr -> PeerAddr -> Bool
prop_insertLedgerPeer
, TestName
-> (PublicRootPeers (ExtraPeers PeerAddr) PeerAddr
-> PeerAddr -> Bool)
-> TestTree
forall a. Testable a => TestName -> a -> TestTree
testProperty TestName
"insertBigLedgerPeer" PublicRootPeers (ExtraPeers PeerAddr) 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
(PublicRootPeers (ExtraPeers PeerAddr) PeerAddr)
-> Property)
-> TestTree
forall a. Testable a => TestName -> a -> TestTree
testProperty TestName
"shrink" ShrinkCarefully (PublicRootPeers (ExtraPeers PeerAddr) PeerAddr)
-> Property
prop_shrink_CardanoExtraPeers
]
]
arbitraryCardanoExtraPeers :: (Ord peeraddr, Arbitrary peeraddr)
=> Gen (PublicRootPeers (Cardano.ExtraPeers peeraddr) peeraddr)
= 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 (PublicRootPeers.fromMapAndSet publicConfigPeersMap bootstrapPeers normalLedgerPeers bigLedgerPeers)
instance ( Arbitrary peeraddr
, Ord peeraddr
) => Arbitrary (PublicRootPeers (Cardano.ExtraPeers peeraddr) peeraddr) where
arbitrary :: Gen (PublicRootPeers (ExtraPeers peeraddr) peeraddr)
arbitrary = Gen (PublicRootPeers (ExtraPeers peeraddr) peeraddr)
forall peeraddr.
(Ord peeraddr, Arbitrary peeraddr) =>
Gen (PublicRootPeers (ExtraPeers peeraddr) peeraddr)
arbitraryCardanoExtraPeers
shrink :: PublicRootPeers (ExtraPeers peeraddr) peeraddr
-> [PublicRootPeers (ExtraPeers peeraddr) 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
-> PublicRootPeers (ExtraPeers peeraddr) peeraddr
forall peeraddr.
Ord peeraddr =>
Map peeraddr PeerAdvertise
-> Set peeraddr
-> Set peeraddr
-> Set peeraddr
-> PublicRootPeers (ExtraPeers peeraddr) peeraddr
PublicRootPeers.fromMapAndSet (Map peeraddr PeerAdvertise
-> Set peeraddr
-> Set peeraddr
-> Set peeraddr
-> PublicRootPeers (ExtraPeers peeraddr) peeraddr)
-> [Map peeraddr PeerAdvertise]
-> [Set peeraddr
-> Set peeraddr
-> Set peeraddr
-> PublicRootPeers (ExtraPeers peeraddr) 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
-> PublicRootPeers (ExtraPeers peeraddr) peeraddr]
-> [Set peeraddr]
-> [Set peeraddr
-> Set peeraddr -> PublicRootPeers (ExtraPeers peeraddr) 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 -> PublicRootPeers (ExtraPeers peeraddr) peeraddr]
-> [Set peeraddr]
-> [Set peeraddr -> PublicRootPeers (ExtraPeers peeraddr) 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 -> PublicRootPeers (ExtraPeers peeraddr) peeraddr]
-> [Set peeraddr]
-> [PublicRootPeers (ExtraPeers peeraddr) 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
= Bool -> Property
forall prop. Testable prop => prop -> Property
property (Bool -> Property)
-> (PublicRootPeers (ExtraPeers PeerAddr) PeerAddr -> Bool)
-> PublicRootPeers (ExtraPeers PeerAddr) PeerAddr
-> Property
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (ExtraPeers PeerAddr -> Bool)
-> (ExtraPeers PeerAddr -> Set PeerAddr)
-> PublicRootPeers (ExtraPeers PeerAddr) 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
ShrinkCarefully (PublicRootPeers (ExtraPeers PeerAddr) PeerAddr)
x =
(PublicRootPeers (ExtraPeers PeerAddr) PeerAddr -> Bool)
-> ShrinkCarefully (PublicRootPeers (ExtraPeers PeerAddr) 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)
-> PublicRootPeers (ExtraPeers PeerAddr) 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 (PublicRootPeers (ExtraPeers PeerAddr) PeerAddr)
x
Property -> Property -> Property
forall prop1 prop2.
(Testable prop1, Testable prop2) =>
prop1 -> prop2 -> Property
.&&. ShrinkCarefully (PublicRootPeers (ExtraPeers PeerAddr) PeerAddr)
-> Property
forall a.
(Arbitrary a, Eq a, Show a) =>
ShrinkCarefully a -> Property
prop_shrink_nonequal ShrinkCarefully (PublicRootPeers (ExtraPeers PeerAddr) 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)
-> PublicRootPeers (ExtraPeers PeerAddr) 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
(PublicRootPeers (ExtraPeers PeerAddr) PeerAddr -> Bool)
-> (Set PeerAddr -> PublicRootPeers (ExtraPeers PeerAddr) PeerAddr)
-> Set PeerAddr
-> Bool
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Map PeerAddr PeerAdvertise
-> Set PeerAddr
-> Set PeerAddr
-> Set PeerAddr
-> PublicRootPeers (ExtraPeers PeerAddr) PeerAddr
forall peeraddr.
Ord peeraddr =>
Map peeraddr PeerAdvertise
-> Set peeraddr
-> Set peeraddr
-> Set peeraddr
-> PublicRootPeers (ExtraPeers peeraddr) peeraddr
PublicRootPeers.fromMapAndSet Map PeerAddr PeerAdvertise
newPP Set PeerAddr
bsp Set PeerAddr
lp
prop_fromToMapAndSet :: PublicRootPeers (Cardano.ExtraPeers PeerAddr) PeerAddr -> Bool
prop_fromToMapAndSet :: PublicRootPeers (ExtraPeers PeerAddr) PeerAddr -> Bool
prop_fromToMapAndSet prp :: PublicRootPeers (ExtraPeers PeerAddr) 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
-> PublicRootPeers (ExtraPeers PeerAddr) PeerAddr
forall peeraddr.
Ord peeraddr =>
Map peeraddr PeerAdvertise
-> Set peeraddr
-> Set peeraddr
-> Set peeraddr
-> PublicRootPeers (ExtraPeers peeraddr) peeraddr
PublicRootPeers.fromMapAndSet Map PeerAddr PeerAdvertise
pp Set PeerAddr
bsp Set PeerAddr
lp Set PeerAddr
blp PublicRootPeers (ExtraPeers PeerAddr) PeerAddr
-> PublicRootPeers (ExtraPeers PeerAddr) PeerAddr -> Bool
forall a. Eq a => a -> a -> Bool
== PublicRootPeers (ExtraPeers PeerAddr) 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 =
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 :: PublicRootPeers (ExtraPeers PeerAddr) PeerAddr
prp = Map PeerAddr PeerAdvertise
-> Set PeerAddr
-> Set PeerAddr
-> Set PeerAddr
-> PublicRootPeers (ExtraPeers PeerAddr) PeerAddr
forall peeraddr.
Ord peeraddr =>
Map peeraddr PeerAdvertise
-> Set peeraddr
-> Set peeraddr
-> Set peeraddr
-> PublicRootPeers (ExtraPeers peeraddr) peeraddr
PublicRootPeers.fromMapAndSet Map PeerAddr PeerAdvertise
pp' Set PeerAddr
bsp' Set PeerAddr
lp' Set PeerAddr
blp
in PublicRootPeers (ExtraPeers PeerAddr) PeerAddr
-> Map PeerAddr PeerAdvertise
forall peeraddr.
PublicRootPeers (ExtraPeers peeraddr) peeraddr
-> Map peeraddr PeerAdvertise
PublicRootPeers.getPublicConfigPeers PublicRootPeers (ExtraPeers PeerAddr) 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
.&&. PublicRootPeers (ExtraPeers PeerAddr) PeerAddr -> Set PeerAddr
forall peeraddr.
PublicRootPeers (ExtraPeers peeraddr) peeraddr -> Set peeraddr
PublicRootPeers.getBootstrapPeers PublicRootPeers (ExtraPeers PeerAddr) 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
.&&. PublicRootPeers (ExtraPeers PeerAddr) PeerAddr -> Set PeerAddr
forall extraPeers peeraddr.
PublicRootPeers extraPeers peeraddr -> Set peeraddr
PublicRootPeers.getLedgerPeers PublicRootPeers (ExtraPeers PeerAddr) 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
.&&. PublicRootPeers (ExtraPeers PeerAddr) PeerAddr -> Set PeerAddr
forall extraPeers peeraddr.
PublicRootPeers extraPeers peeraddr -> Set peeraddr
PublicRootPeers.getBigLedgerPeers PublicRootPeers (ExtraPeers PeerAddr) PeerAddr
prp Set PeerAddr -> Set PeerAddr -> Property
forall a. (Eq a, Show a) => a -> a -> Property
=== Set PeerAddr
blp
prop_merge :: PublicRootPeers (Cardano.ExtraPeers PeerAddr) PeerAddr
-> PublicRootPeers (Cardano.ExtraPeers PeerAddr) PeerAddr
-> Bool
prop_merge :: PublicRootPeers (ExtraPeers PeerAddr) PeerAddr
-> PublicRootPeers (ExtraPeers PeerAddr) PeerAddr -> Bool
prop_merge PublicRootPeers (ExtraPeers PeerAddr) PeerAddr
prp = (ExtraPeers PeerAddr -> Bool)
-> (ExtraPeers PeerAddr -> Set PeerAddr)
-> PublicRootPeers (ExtraPeers PeerAddr) 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
(PublicRootPeers (ExtraPeers PeerAddr) PeerAddr -> Bool)
-> (PublicRootPeers (ExtraPeers PeerAddr) PeerAddr
-> PublicRootPeers (ExtraPeers PeerAddr) PeerAddr)
-> PublicRootPeers (ExtraPeers PeerAddr) PeerAddr
-> Bool
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (PublicRootPeers (ExtraPeers PeerAddr) PeerAddr
-> PublicRootPeers (ExtraPeers PeerAddr) PeerAddr
-> PublicRootPeers (ExtraPeers PeerAddr) PeerAddr
forall a. Semigroup a => a -> a -> a
<> PublicRootPeers (ExtraPeers PeerAddr) PeerAddr
prp)
prop_insertPublicConfigPeer :: PublicRootPeers (Cardano.ExtraPeers PeerAddr) PeerAddr
-> PeerAddr
-> PeerAdvertise
-> Bool
prop_insertPublicConfigPeer :: PublicRootPeers (ExtraPeers PeerAddr) PeerAddr
-> PeerAddr -> PeerAdvertise -> Bool
prop_insertPublicConfigPeer PublicRootPeers (ExtraPeers PeerAddr) PeerAddr
prp PeerAddr
p PeerAdvertise
pa =
(ExtraPeers PeerAddr -> Bool)
-> (ExtraPeers PeerAddr -> Set PeerAddr)
-> PublicRootPeers (ExtraPeers PeerAddr) 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
-> PublicRootPeers (ExtraPeers PeerAddr) PeerAddr
-> PublicRootPeers (ExtraPeers PeerAddr) PeerAddr
forall peeraddr.
Ord peeraddr =>
peeraddr
-> PeerAdvertise
-> PublicRootPeers (ExtraPeers peeraddr) peeraddr
-> PublicRootPeers (ExtraPeers peeraddr) peeraddr
PublicRootPeers.insertPublicConfigPeer PeerAddr
p PeerAdvertise
pa PublicRootPeers (ExtraPeers PeerAddr) PeerAddr
prp)
prop_insertBootstrapPeer :: PublicRootPeers (Cardano.ExtraPeers PeerAddr) PeerAddr
-> PeerAddr
-> Bool
prop_insertBootstrapPeer :: PublicRootPeers (ExtraPeers PeerAddr) PeerAddr -> PeerAddr -> Bool
prop_insertBootstrapPeer PublicRootPeers (ExtraPeers PeerAddr) PeerAddr
prp PeerAddr
p =
(ExtraPeers PeerAddr -> Bool)
-> (ExtraPeers PeerAddr -> Set PeerAddr)
-> PublicRootPeers (ExtraPeers PeerAddr) 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
-> PublicRootPeers (ExtraPeers PeerAddr) PeerAddr
-> PublicRootPeers (ExtraPeers PeerAddr) PeerAddr
forall peeraddr.
Ord peeraddr =>
peeraddr
-> PublicRootPeers (ExtraPeers peeraddr) peeraddr
-> PublicRootPeers (ExtraPeers peeraddr) peeraddr
PublicRootPeers.insertBootstrapPeer PeerAddr
p PublicRootPeers (ExtraPeers PeerAddr) PeerAddr
prp)
prop_insertLedgerPeer :: PublicRootPeers (Cardano.ExtraPeers PeerAddr) PeerAddr
-> PeerAddr
-> Bool
prop_insertLedgerPeer :: PublicRootPeers (ExtraPeers PeerAddr) PeerAddr -> PeerAddr -> Bool
prop_insertLedgerPeer PublicRootPeers (ExtraPeers PeerAddr) PeerAddr
prp PeerAddr
p =
(ExtraPeers PeerAddr -> Bool)
-> (ExtraPeers PeerAddr -> Set PeerAddr)
-> PublicRootPeers (ExtraPeers PeerAddr) 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
-> PublicRootPeers (ExtraPeers PeerAddr) PeerAddr
-> PublicRootPeers (ExtraPeers PeerAddr) PeerAddr
forall peeraddr.
Ord peeraddr =>
peeraddr
-> PublicRootPeers (ExtraPeers peeraddr) peeraddr
-> PublicRootPeers (ExtraPeers peeraddr) peeraddr
PublicRootPeers.insertLedgerPeer PeerAddr
p PublicRootPeers (ExtraPeers PeerAddr) PeerAddr
prp)
prop_insertBigLedgerPeer :: PublicRootPeers (Cardano.ExtraPeers PeerAddr) PeerAddr
-> PeerAddr
-> Bool
prop_insertBigLedgerPeer :: PublicRootPeers (ExtraPeers PeerAddr) PeerAddr -> PeerAddr -> Bool
prop_insertBigLedgerPeer PublicRootPeers (ExtraPeers PeerAddr) PeerAddr
prp PeerAddr
p =
(ExtraPeers PeerAddr -> Bool)
-> (ExtraPeers PeerAddr -> Set PeerAddr)
-> PublicRootPeers (ExtraPeers PeerAddr) 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
-> PublicRootPeers (ExtraPeers PeerAddr) PeerAddr
-> PublicRootPeers (ExtraPeers PeerAddr) PeerAddr
forall peeraddr.
Ord peeraddr =>
peeraddr
-> PublicRootPeers (ExtraPeers peeraddr) peeraddr
-> PublicRootPeers (ExtraPeers peeraddr) peeraddr
PublicRootPeers.insertBigLedgerPeer PeerAddr
p PublicRootPeers (ExtraPeers PeerAddr) PeerAddr
prp)
prop_fromPeers :: PeerAddr
-> PeerAdvertise
-> Bool
prop_fromPeers :: PeerAddr -> PeerAdvertise -> Bool
prop_fromPeers PeerAddr
peer PeerAdvertise
peerAdvertise =
let insertPP :: PublicRootPeers (ExtraPeers PeerAddr) PeerAddr
insertPP = PeerAddr
-> PeerAdvertise
-> PublicRootPeers (ExtraPeers PeerAddr) PeerAddr
-> PublicRootPeers (ExtraPeers PeerAddr) PeerAddr
forall peeraddr.
Ord peeraddr =>
peeraddr
-> PeerAdvertise
-> PublicRootPeers (ExtraPeers peeraddr) peeraddr
-> PublicRootPeers (ExtraPeers peeraddr) peeraddr
PublicRootPeers.insertPublicConfigPeer PeerAddr
peer PeerAdvertise
peerAdvertise (ExtraPeers PeerAddr
-> PublicRootPeers (ExtraPeers PeerAddr) PeerAddr
forall extraPeers peeraddr.
extraPeers -> PublicRootPeers extraPeers peeraddr
PublicRootPeers.empty ExtraPeers PeerAddr
forall peeraddr. ExtraPeers peeraddr
Cardano.empty)
insertBSP :: PublicRootPeers (ExtraPeers PeerAddr) PeerAddr
insertBSP = PeerAddr
-> PublicRootPeers (ExtraPeers PeerAddr) PeerAddr
-> PublicRootPeers (ExtraPeers PeerAddr) PeerAddr
forall peeraddr.
Ord peeraddr =>
peeraddr
-> PublicRootPeers (ExtraPeers peeraddr) peeraddr
-> PublicRootPeers (ExtraPeers peeraddr) peeraddr
PublicRootPeers.insertBootstrapPeer PeerAddr
peer (ExtraPeers PeerAddr
-> PublicRootPeers (ExtraPeers PeerAddr) PeerAddr
forall extraPeers peeraddr.
extraPeers -> PublicRootPeers extraPeers peeraddr
PublicRootPeers.empty ExtraPeers PeerAddr
forall peeraddr. ExtraPeers peeraddr
Cardano.empty)
insertLP :: PublicRootPeers (ExtraPeers PeerAddr) PeerAddr
insertLP = PeerAddr
-> PublicRootPeers (ExtraPeers PeerAddr) PeerAddr
-> PublicRootPeers (ExtraPeers PeerAddr) PeerAddr
forall peeraddr.
Ord peeraddr =>
peeraddr
-> PublicRootPeers (ExtraPeers peeraddr) peeraddr
-> PublicRootPeers (ExtraPeers peeraddr) peeraddr
PublicRootPeers.insertLedgerPeer PeerAddr
peer (ExtraPeers PeerAddr
-> PublicRootPeers (ExtraPeers PeerAddr) PeerAddr
forall extraPeers peeraddr.
extraPeers -> PublicRootPeers extraPeers peeraddr
PublicRootPeers.empty ExtraPeers PeerAddr
forall peeraddr. ExtraPeers peeraddr
Cardano.empty)
insertBLP :: PublicRootPeers (ExtraPeers PeerAddr) PeerAddr
insertBLP = PeerAddr
-> PublicRootPeers (ExtraPeers PeerAddr) PeerAddr
-> PublicRootPeers (ExtraPeers PeerAddr) PeerAddr
forall peeraddr.
Ord peeraddr =>
peeraddr
-> PublicRootPeers (ExtraPeers peeraddr) peeraddr
-> PublicRootPeers (ExtraPeers peeraddr) peeraddr
PublicRootPeers.insertBigLedgerPeer PeerAddr
peer (ExtraPeers PeerAddr
-> PublicRootPeers (ExtraPeers PeerAddr) PeerAddr
forall extraPeers peeraddr.
extraPeers -> PublicRootPeers extraPeers peeraddr
PublicRootPeers.empty ExtraPeers PeerAddr
forall peeraddr. ExtraPeers peeraddr
Cardano.empty)
in PublicRootPeers (ExtraPeers PeerAddr) PeerAddr
-> Map PeerAddr PeerAdvertise
forall peeraddr.
PublicRootPeers (ExtraPeers peeraddr) peeraddr
-> Map peeraddr PeerAdvertise
PublicRootPeers.getPublicConfigPeers PublicRootPeers (ExtraPeers PeerAddr) 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
&& PublicRootPeers (ExtraPeers PeerAddr) PeerAddr -> Set PeerAddr
forall peeraddr.
PublicRootPeers (ExtraPeers peeraddr) peeraddr -> Set peeraddr
PublicRootPeers.getBootstrapPeers PublicRootPeers (ExtraPeers PeerAddr) 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
&& PublicRootPeers (ExtraPeers PeerAddr) PeerAddr -> Set PeerAddr
forall extraPeers peeraddr.
PublicRootPeers extraPeers peeraddr -> Set peeraddr
PublicRootPeers.getLedgerPeers PublicRootPeers (ExtraPeers PeerAddr) 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
&& PublicRootPeers (ExtraPeers PeerAddr) PeerAddr -> Set PeerAddr
forall extraPeers peeraddr.
PublicRootPeers extraPeers peeraddr -> Set peeraddr
PublicRootPeers.getBigLedgerPeers PublicRootPeers (ExtraPeers PeerAddr) 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