Skip to content

Commit d1d03b4

Browse files
Never connect to peers behind a firewall property test
1 parent eef41ec commit d1d03b4

File tree

1 file changed

+60
-0
lines changed

1 file changed

+60
-0
lines changed

ouroboros-network/testlib/Test/Ouroboros/Network/PeerSelection.hs

Lines changed: 60 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -166,6 +166,8 @@ tests =
166166
prop_governor_target_active_local_below
167167
, testProperty "progresses towards active target (from above)"
168168
prop_governor_target_active_local_above
169+
, testProperty "never connect to peers behind a firewall"
170+
prop_governor_never_connect_peer_behind_firewall
169171
]
170172

171173
, testGroup "big ledger peers"
@@ -3233,6 +3235,64 @@ prop_governor_target_active_big_ledger_peers_above (MaxTime maxTime) env =
32333235
<*> demotionOpportunities
32343236
<*> demotionOpportunitiesIgnoredTooLong)
32353237

3238+
-- | Avoid connecting to root peers marked as behind a firewall and without inbound connection.
3239+
prop_governor_never_connect_peer_behind_firewall :: MaxTime -> GovernorMockEnvironment -> Property
3240+
prop_governor_never_connect_peer_behind_firewall (MaxTime maxTime) env@GovernorMockEnvironment{inboundPeers} =
3241+
let events = Signal.eventsFromListUpToTime maxTime
3242+
. selectPeerSelectionTraceEvents
3243+
@Cardano.ExtraState
3244+
@PeerTrustable
3245+
@(Cardano.ExtraPeers PeerAddr)
3246+
@(Cardano.ExtraPeerSelectionSetsWithSizes PeerAddr)
3247+
. runGovernorInMockEnvironment
3248+
$ env
3249+
3250+
govLocalRootPeersSig :: Signal (LocalRootPeers PeerTrustable PeerAddr)
3251+
govLocalRootPeersSig =
3252+
selectGovState Governor.localRootPeers
3253+
(Cardano.ExtraState.empty (consensusMode env) (NumberOfBigLedgerPeers 0)) Cardano.ExtraPeers.empty
3254+
events
3255+
3256+
govUnreachablePeersSig :: Signal (Set PeerAddr)
3257+
govUnreachablePeersSig =
3258+
(\local ->
3259+
let
3260+
isUnreachablePeer addr (LocalRootConfig {behindFirewall}) =
3261+
behindFirewall && not (Set.member addr inboundPeers)
3262+
3263+
unreachablePeers =
3264+
Map.keysSet
3265+
$ Map.filterWithKey isUnreachablePeer
3266+
$ LocalRootPeers.toMap local
3267+
in
3268+
unreachablePeers
3269+
) <$> govLocalRootPeersSig
3270+
3271+
govPromotionSig :: Signal (Set PeerAddr)
3272+
govPromotionSig =
3273+
Signal.fromEventsWith Set.empty
3274+
. Signal.selectEvents
3275+
(\case TracePromoteColdPeers _ _ peers -> Just $! peers
3276+
_ -> Nothing
3277+
)
3278+
. selectGovEvents
3279+
$ events
3280+
3281+
unreachablePromotions :: Signal (Set PeerAddr)
3282+
unreachablePromotions =
3283+
Set.intersection
3284+
<$> govUnreachablePeersSig
3285+
<*> govPromotionSig
3286+
3287+
in counterexample
3288+
"\nSignal key: (local root peers, unreachable local root peers, promotions, unreachable promotions)" $
3289+
3290+
signalProperty 20 show
3291+
(\(_,_,_,promotions) -> Set.null promotions)
3292+
((,,,) <$> govLocalRootPeersSig
3293+
<*> govUnreachablePeersSig
3294+
<*> govPromotionSig
3295+
<*> unreachablePromotions)
32363296

32373297
-- | A variant of 'prop_governor_target_established_below' but for the target
32383298
-- that all local root peers should become established.

0 commit comments

Comments
 (0)