Skip to content

Commit

Permalink
outbound-governor: added MaxTime to peer selection tests
Browse files Browse the repository at this point in the history
MaxTime generator always returns 10hrs, but it can be shrinked.  This
allows to print smaller traces for found counterexamples.
  • Loading branch information
coot committed Jan 5, 2024
1 parent 8ffc005 commit 0d57f84
Showing 1 changed file with 104 additions and 81 deletions.
185 changes: 104 additions & 81 deletions ouroboros-network/sim-tests-lib/Test/Ouroboros/Network/PeerSelection.hs
Original file line number Diff line number Diff line change
Expand Up @@ -44,6 +44,7 @@ import System.Random (mkStdGen)

import Control.Exception (AssertionFailed (..), catch, evaluate)
import Control.Monad.Class.MonadSTM (STM, retry)
import Control.Monad.Class.MonadTimer.SI
import Control.Tracer (Tracer (..))

import qualified Network.DNS as DNS (defaultResolvConf)
Expand Down Expand Up @@ -911,9 +912,9 @@ prop_governor_target_root_below env =
-- We do not need separate above and below variants of this property since it
-- is not possible to exceed the target.
--
prop_governor_target_established_public :: GovernorMockEnvironment -> Property
prop_governor_target_established_public env =
let events = Signal.eventsFromListUpToTime (Time (10 * 60 * 60))
prop_governor_target_established_public :: MaxTime -> GovernorMockEnvironment -> Property
prop_governor_target_established_public (MaxTime maxTime) env =
let events = Signal.eventsFromListUpToTime maxTime
. selectPeerSelectionTraceEvents
. runGovernorInMockEnvironment
$ env
Expand Down Expand Up @@ -967,10 +968,11 @@ prop_governor_target_established_public env =
-- peers.
--
prop_governor_target_established_big_ledger_peers
:: GovernorMockEnvironment
:: MaxTime
-> GovernorMockEnvironment
-> Property
prop_governor_target_established_big_ledger_peers env =
let events = Signal.eventsFromListUpToTime (Time (10 * 60 * 60))
prop_governor_target_established_big_ledger_peers (MaxTime maxTime) env =
let events = Signal.eventsFromListUpToTime maxTime
. selectPeerSelectionTraceEvents
. runGovernorInMockEnvironment
$ env
Expand Down Expand Up @@ -1023,9 +1025,9 @@ prop_governor_target_established_big_ledger_peers env =
-- number of public root peers becomes active, since there's no target for
-- how many public root peers should be active.
--
prop_governor_target_active_public :: GovernorMockEnvironment -> Property
prop_governor_target_active_public env =
let events = Signal.eventsFromListUpToTime (Time (10 * 60 * 60))
prop_governor_target_active_public :: MaxTime -> GovernorMockEnvironment -> Property
prop_governor_target_active_public (MaxTime maxTime) env =
let events = Signal.eventsFromListUpToTime maxTime
. selectPeerSelectionTraceEvents
. runGovernorInMockEnvironment
$ env
Expand Down Expand Up @@ -1184,23 +1186,23 @@ prop_governor_target_active_public env =
-- frequency is relatively long, and the other progress bounds are relatively
-- short.
--
prop_governor_target_known_below :: GovernorMockEnvironment -> Property
prop_governor_target_known_below env =
prop_governor_target_known_below :: MaxTime -> GovernorMockEnvironment -> Property
prop_governor_target_known_below maxTime env =
counterexample "invalid subset"
(prop_governor_target_known_1_valid_subset env)
(prop_governor_target_known_1_valid_subset maxTime env)
.&&. counterexample "opportunity not taken"
(prop_governor_target_known_2_opportunity_taken env)
(prop_governor_target_known_2_opportunity_taken maxTime env)
.&&. counterexample "too chatty"
(prop_governor_target_known_3_not_too_chatty env)
(prop_governor_target_known_3_not_too_chatty maxTime env)
.&&. counterexample "not used results"
(prop_governor_target_known_4_results_used env)
(prop_governor_target_known_4_results_used maxTime env)
.&&. counterexample "shrinked below"
(prop_governor_target_known_5_no_shrink_below env)
(prop_governor_target_known_5_no_shrink_below maxTime env)

prop_governor_target_known_big_ledger_peers_below :: GovernorMockEnvironment -> Property
prop_governor_target_known_big_ledger_peers_below env =
prop_governor_target_known_big_ledger_peers_below :: MaxTime -> GovernorMockEnvironment -> Property
prop_governor_target_known_big_ledger_peers_below maxTime env =
counterexample "shrinked big ledger peers below"
(prop_governor_target_known_5_no_shrink_big_ledger_peers_below env)
(prop_governor_target_known_5_no_shrink_big_ledger_peers_below maxTime env)

-- | The set of peers the governor knows about is a subset of the peers the
-- environment has told the governor about.
Expand All @@ -1217,10 +1219,11 @@ prop_governor_target_known_big_ledger_peers_below env =
-- * That the governor known peers is a subset of the accumulated environment
-- known peers.
--
prop_governor_target_known_1_valid_subset :: GovernorMockEnvironment
prop_governor_target_known_1_valid_subset :: MaxTime
-> GovernorMockEnvironment
-> Property
prop_governor_target_known_1_valid_subset env =
let events = Signal.eventsFromListUpToTime (Time (10 * 60 * 60))
prop_governor_target_known_1_valid_subset (MaxTime maxTime) env =
let events = Signal.eventsFromListUpToTime maxTime
. selectPeerSelectionTraceEvents
. runGovernorInMockEnvironment
$ env
Expand Down Expand Up @@ -1285,11 +1288,12 @@ prop_governor_target_known_1_valid_subset env =
--
-- * That the signal 6 remains True at all times.
--
prop_governor_target_known_2_opportunity_taken :: GovernorMockEnvironment
prop_governor_target_known_2_opportunity_taken :: MaxTime
-> GovernorMockEnvironment
-> Property
prop_governor_target_known_2_opportunity_taken env =
prop_governor_target_known_2_opportunity_taken (MaxTime maxTime) env =

let events = Signal.eventsFromListUpToTime (Time (10 * 60 * 60))
let events = Signal.eventsFromListUpToTime maxTime
. selectPeerSelectionTraceEvents
. runGovernorInMockEnvironment
$ env
Expand Down Expand Up @@ -1414,10 +1418,11 @@ governorEventuallyTakesPeerShareOpportunities peerSharing =
--
-- Based on these signals we check:
--
prop_governor_target_known_3_not_too_chatty :: GovernorMockEnvironment
prop_governor_target_known_3_not_too_chatty :: MaxTime
-> GovernorMockEnvironment
-> Property
prop_governor_target_known_3_not_too_chatty env =
let events = Signal.eventsFromListUpToTime (Time (10 * 60 * 60))
prop_governor_target_known_3_not_too_chatty (MaxTime maxTime) env =
let events = Signal.eventsFromListUpToTime maxTime
. selectPeerSelectionTraceEvents
. runGovernorInMockEnvironment
$ env
Expand Down Expand Up @@ -1623,9 +1628,9 @@ recentPeerShareActivity d =
--
-- * That the signal 4 above is always empty.
--
prop_governor_target_known_4_results_used :: GovernorMockEnvironment -> Property
prop_governor_target_known_4_results_used env =
let events = Signal.eventsFromListUpToTime (Time (10 * 60 * 60))
prop_governor_target_known_4_results_used :: MaxTime -> GovernorMockEnvironment -> Property
prop_governor_target_known_4_results_used (MaxTime maxTime) env =
let events = Signal.eventsFromListUpToTime maxTime
. selectPeerSelectionTraceEvents
. runGovernorInMockEnvironment
$ env
Expand Down Expand Up @@ -1697,9 +1702,9 @@ prop_governor_target_known_4_results_used env =
--
-- * That the signal 4 above is always False.
--
prop_governor_target_known_5_no_shrink_below :: GovernorMockEnvironment -> Property
prop_governor_target_known_5_no_shrink_below env =
let events = Signal.eventsFromListUpToTime (Time (10 * 60 * 60))
prop_governor_target_known_5_no_shrink_below :: MaxTime -> GovernorMockEnvironment -> Property
prop_governor_target_known_5_no_shrink_below (MaxTime maxTime) env =
let events = Signal.eventsFromListUpToTime maxTime
. selectPeerSelectionTraceEvents
. runGovernorInMockEnvironment
$ env
Expand Down Expand Up @@ -1761,9 +1766,9 @@ prop_governor_target_known_5_no_shrink_below env =
-- | Like 'prop_governor_target_known_5_no_shrink_below' but for big ledger
-- peers.
--
prop_governor_target_known_5_no_shrink_big_ledger_peers_below :: GovernorMockEnvironment -> Property
prop_governor_target_known_5_no_shrink_big_ledger_peers_below env =
let events = Signal.eventsFromListUpToTime (Time (10 * 60 * 60))
prop_governor_target_known_5_no_shrink_big_ledger_peers_below :: MaxTime -> GovernorMockEnvironment -> Property
prop_governor_target_known_5_no_shrink_big_ledger_peers_below (MaxTime maxTime) env =
let events = Signal.eventsFromListUpToTime maxTime
. selectPeerSelectionTraceEvents
. runGovernorInMockEnvironment
$ env
Expand Down Expand Up @@ -1836,9 +1841,9 @@ prop_governor_target_known_5_no_shrink_big_ledger_peers_below env =
--
-- * That the signal 5 above is always False.
--
prop_governor_target_known_above :: GovernorMockEnvironment -> Property
prop_governor_target_known_above env =
let events = Signal.eventsFromListUpToTime (Time (10 * 60 * 60))
prop_governor_target_known_above :: MaxTime -> GovernorMockEnvironment -> Property
prop_governor_target_known_above (MaxTime maxTime) env =
let events = Signal.eventsFromListUpToTime maxTime
. selectPeerSelectionTraceEvents
. runGovernorInMockEnvironment
$ env
Expand Down Expand Up @@ -1926,9 +1931,9 @@ prop_governor_target_known_above env =
-- | Like 'prop_governor_target_known_above' but for big ledger peers.
--
prop_governor_target_known_big_ledger_peers_above
:: GovernorMockEnvironment -> Property
prop_governor_target_known_big_ledger_peers_above env =
let events = Signal.eventsFromListUpToTime (Time (10 * 60 * 60))
:: MaxTime -> GovernorMockEnvironment -> Property
prop_governor_target_known_big_ledger_peers_above (MaxTime maxTime) env =
let events = Signal.eventsFromListUpToTime maxTime
. selectPeerSelectionTraceEvents
. runGovernorInMockEnvironment
$ env
Expand Down Expand Up @@ -2016,9 +2021,9 @@ prop_governor_target_known_big_ledger_peers_above env =
-- we label the cases where this happens, and then we can use a statistical
-- test to assert that this happens in some fraction of test cases.
--
prop_governor_target_established_below :: GovernorMockEnvironment -> Property
prop_governor_target_established_below env =
let events = Signal.eventsFromListUpToTime (Time (10 * 60 * 60))
prop_governor_target_established_below :: MaxTime -> GovernorMockEnvironment -> Property
prop_governor_target_established_below (MaxTime maxTime) env =
let events = Signal.eventsFromListUpToTime maxTime
. selectPeerSelectionTraceEvents
. runGovernorInMockEnvironment
$ env
Expand Down Expand Up @@ -2111,14 +2116,13 @@ prop_governor_target_established_below env =
<*> promotionOpportunities
<*> promotionOpportunitiesIgnoredTooLong)


-- | A version of the `prop_governor_target_established_below` for big ledger
-- peers.
--
prop_governor_target_established_big_ledger_peers_below
:: GovernorMockEnvironment -> Property
prop_governor_target_established_big_ledger_peers_below env =
let events = Signal.eventsFromListUpToTime (Time (10 * 60 * 60))
:: MaxTime -> GovernorMockEnvironment -> Property
prop_governor_target_established_big_ledger_peers_below (MaxTime maxTime) env =
let events = Signal.eventsFromListUpToTime maxTime
. selectPeerSelectionTraceEvents
. runGovernorInMockEnvironment
$ env
Expand Down Expand Up @@ -2206,6 +2210,8 @@ prop_governor_target_established_big_ledger_peers_below env =
("\nSignal key: (target, known big ledger peers, established big ledger peers, recent failures, " ++
"opportunities, ignored too long)") $

-- counterexample (unlines $ fmap show $ Signal.eventsToList events) $

signalProperty 20 show
(\(_,_,_,_,_,toolong) -> Set.null toolong)
((,,,,,) <$> govTargetsSig
Expand All @@ -2216,9 +2222,9 @@ prop_governor_target_established_big_ledger_peers_below env =
<*> promotionOpportunitiesIgnoredTooLong)


prop_governor_target_active_below :: GovernorMockEnvironment -> Property
prop_governor_target_active_below env =
let events = Signal.eventsFromListUpToTime (Time (10 * 60 * 60))
prop_governor_target_active_below :: MaxTime -> GovernorMockEnvironment -> Property
prop_governor_target_active_below (MaxTime maxTime) env =
let events = Signal.eventsFromListUpToTime maxTime
. selectPeerSelectionTraceEvents
. runGovernorInMockEnvironment
$ env
Expand Down Expand Up @@ -2333,9 +2339,9 @@ prop_governor_target_active_below env =
-- | A variant of 'prop_governor_target_active_below' but for big ledger peers.
--
prop_governor_target_active_big_ledger_peers_below
:: GovernorMockEnvironment -> Property
prop_governor_target_active_big_ledger_peers_below env =
let events = Signal.eventsFromListUpToTime (Time (10 * 60 * 60))
:: MaxTime -> GovernorMockEnvironment -> Property
prop_governor_target_active_big_ledger_peers_below (MaxTime maxTime) env =
let events = Signal.eventsFromListUpToTime maxTime
. selectPeerSelectionTraceEvents
. runGovernorInMockEnvironment
$ env
Expand Down Expand Up @@ -2421,9 +2427,9 @@ prop_governor_target_active_big_ledger_peers_below env =
<*> promotionOpportunitiesIgnoredTooLong)


prop_governor_target_established_above :: GovernorMockEnvironment -> Property
prop_governor_target_established_above env =
let events = Signal.eventsFromListUpToTime (Time (10 * 60 * 60))
prop_governor_target_established_above :: MaxTime -> GovernorMockEnvironment -> Property
prop_governor_target_established_above (MaxTime maxTime) env =
let events = Signal.eventsFromListUpToTime maxTime
. selectPeerSelectionTraceEvents
. runGovernorInMockEnvironment
$ env
Expand Down Expand Up @@ -2497,9 +2503,9 @@ prop_governor_target_established_above env =
-- | Like 'prop_governor_target_established_above' but for big ledger peers.
--
prop_governor_target_established_big_ledger_peers_above
:: GovernorMockEnvironment -> Property
prop_governor_target_established_big_ledger_peers_above env =
let events = Signal.eventsFromListUpToTime (Time (10 * 60 * 60))
:: MaxTime -> GovernorMockEnvironment -> Property
prop_governor_target_established_big_ledger_peers_above (MaxTime maxTime) env =
let events = Signal.eventsFromListUpToTime maxTime
. selectPeerSelectionTraceEvents
. runGovernorInMockEnvironment
$ env
Expand Down Expand Up @@ -2562,9 +2568,9 @@ prop_governor_target_established_big_ledger_peers_above env =
<*> demotionOpportunitiesIgnoredTooLong)


prop_governor_target_active_above :: GovernorMockEnvironment -> Property
prop_governor_target_active_above env =
let events = Signal.eventsFromListUpToTime (Time (10 * 60 * 60))
prop_governor_target_active_above :: MaxTime -> GovernorMockEnvironment -> Property
prop_governor_target_active_above (MaxTime maxTime) env =
let events = Signal.eventsFromListUpToTime maxTime
. selectPeerSelectionTraceEvents
. runGovernorInMockEnvironment
$ env
Expand Down Expand Up @@ -2624,9 +2630,9 @@ prop_governor_target_active_above env =
-- | Like 'prop_governor_target_active_above' but for big ledger peers.
--
prop_governor_target_active_big_ledger_peers_above
:: GovernorMockEnvironment -> Property
prop_governor_target_active_big_ledger_peers_above env =
let events = Signal.eventsFromListUpToTime (Time (10 * 60 * 60))
:: MaxTime -> GovernorMockEnvironment -> Property
prop_governor_target_active_big_ledger_peers_above (MaxTime maxTime) env =
let events = Signal.eventsFromListUpToTime maxTime
. selectPeerSelectionTraceEvents
. runGovernorInMockEnvironment
$ env
Expand Down Expand Up @@ -2677,9 +2683,9 @@ prop_governor_target_active_big_ledger_peers_above env =
-- We do not need separate above and below variants of this property since it
-- is not possible to exceed the target.
--
prop_governor_target_established_local :: GovernorMockEnvironment -> Property
prop_governor_target_established_local env =
let events = Signal.eventsFromListUpToTime (Time (10 * 60 * 60))
prop_governor_target_established_local :: MaxTime -> GovernorMockEnvironment -> Property
prop_governor_target_established_local (MaxTime maxTime) env =
let events = Signal.eventsFromListUpToTime maxTime
. selectPeerSelectionTraceEvents
. runGovernorInMockEnvironment
$ env
Expand Down Expand Up @@ -2783,9 +2789,9 @@ prop_governor_target_established_local env =
-- TODO: perhaps we do need a below property that we do not demote active peers
-- causing us to undershoot the target for local root peers being active.
--
prop_governor_target_active_local_below :: GovernorMockEnvironment -> Property
prop_governor_target_active_local_below env =
let events = Signal.eventsFromListUpToTime (Time (10 * 60 * 60))
prop_governor_target_active_local_below :: MaxTime -> GovernorMockEnvironment -> Property
prop_governor_target_active_local_below (MaxTime maxTime) env =
let events = Signal.eventsFromListUpToTime maxTime
. selectPeerSelectionTraceEvents
. runGovernorInMockEnvironment
$ env
Expand Down Expand Up @@ -2875,9 +2881,9 @@ prop_governor_target_active_local_below env =
<*> promotionOpportunities
<*> promotionOpportunitiesIgnoredTooLong)

prop_governor_target_active_local_above :: GovernorMockEnvironment -> Property
prop_governor_target_active_local_above env =
let events = Signal.eventsFromListUpToTime (Time (10 * 60 * 60))
prop_governor_target_active_local_above :: MaxTime -> GovernorMockEnvironment -> Property
prop_governor_target_active_local_above (MaxTime maxTime) env =
let events = Signal.eventsFromListUpToTime maxTime
. selectPeerSelectionTraceEvents
. runGovernorInMockEnvironment
$ env
Expand Down Expand Up @@ -3048,7 +3054,7 @@ _governorFindingPublicRoots targetNumberOfRootPeers readDomains peerSharing = do
transformPeerSelectionAction = fmap (fmap (\(x, y) -> (Map.map (\z -> (z, IsNotLedgerPeer)) x, y)))

prop_issue_3550 :: Property
prop_issue_3550 = prop_governor_target_established_below $
prop_issue_3550 = prop_governor_target_established_below defaultMaxTime $
GovernorMockEnvironment {
peerGraph = PeerGraph
[ (PeerAddr 4,[],GovernorScripts {peerShareScript = Script (Just ([],PeerShareTimeSlow) :| []), peerSharingScript = Script (PeerSharingDisabled :| []), connectionScript = Script ((Noop,NoDelay) :| [])}),
Expand Down Expand Up @@ -3198,9 +3204,9 @@ prop_issue_3233 = prop_governor_nolivelock $

-- | Verify that re-promote delay is applied with a fuzz.
--
prop_governor_repromote_delay :: GovernorMockEnvironment -> Property
prop_governor_repromote_delay env =
let evs = Signal.eventsFromListUpToTime (Time (10 * 60 * 60))
prop_governor_repromote_delay :: MaxTime -> GovernorMockEnvironment -> Property
prop_governor_repromote_delay (MaxTime maxTime) env =
let evs = Signal.eventsFromListUpToTime maxTime
. selectPeerSelectionTraceEvents
. runGovernorInMockEnvironment
$ env
Expand Down Expand Up @@ -3237,6 +3243,23 @@ prop_governor_repromote_delay env =
--


-- | Max simulation time. We start with 10hrs, and shrink it to smaller values
-- if needed.
--
newtype MaxTime = MaxTime { getTime :: Time }
deriving (Show)

defaultMaxTime :: MaxTime
defaultMaxTime = MaxTime (Time (10 * 3600))

instance Arbitrary MaxTime where
arbitrary = pure defaultMaxTime
shrink (MaxTime (Time t)) =
[ MaxTime (Time (microsecondsAsIntToDiffTime t'))
| t' <- shrink (diffTimeToMicrosecondsAsInt t)
]


-- | filter big ledger peers
--
takeBigLedgerPeers
Expand Down

0 comments on commit 0d57f84

Please sign in to comment.