@@ -166,6 +166,8 @@ tests =
166
166
prop_governor_target_active_local_below
167
167
, testProperty " progresses towards active target (from above)"
168
168
prop_governor_target_active_local_above
169
+ , testProperty " never connect to peers behind a firewall"
170
+ prop_governor_never_connect_peer_behind_firewall
169
171
]
170
172
171
173
, testGroup " big ledger peers"
@@ -3233,6 +3235,64 @@ prop_governor_target_active_big_ledger_peers_above (MaxTime maxTime) env =
3233
3235
<*> demotionOpportunities
3234
3236
<*> demotionOpportunitiesIgnoredTooLong)
3235
3237
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
+ " \n Signal 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)
3236
3296
3237
3297
-- | A variant of 'prop_governor_target_established_below' but for the target
3238
3298
-- that all local root peers should become established.
0 commit comments