11{-# LANGUAGE BlockArguments #-}
22{-# LANGUAGE DerivingStrategies #-}
33{-# LANGUAGE ExistentialQuantification #-}
4+ {-# LANGUAGE FlexibleContexts #-}
45{-# LANGUAGE NamedFieldPuns #-}
56{-# LANGUAGE RankNTypes #-}
67{-# LANGUAGE ScopedTypeVariables #-}
@@ -19,14 +20,30 @@ import Control.Monad.Class.MonadAsync
1920import Control.Monad.IOSim (IOSim , runSimStrictShutdown )
2021import Control.Tracer (debugTracer , traceWith )
2122import Data.Maybe (mapMaybe )
23+ import Ouroboros.Consensus.Block.Abstract (ConvertRawHash , Header )
24+ import Ouroboros.Consensus.Block.SupportsDiffusionPipelining
25+ ( BlockSupportsDiffusionPipelining
26+ )
27+ import Ouroboros.Consensus.Config.SupportsNode (ConfigSupportsNode )
28+ import Ouroboros.Consensus.HardFork.Abstract
29+ import Ouroboros.Consensus.Ledger.Basics (LedgerState )
30+ import Ouroboros.Consensus.Ledger.Inspect (InspectLedger )
31+ import Ouroboros.Consensus.Ledger.SupportsProtocol
32+ ( LedgerSupportsProtocol
33+ )
2234import Ouroboros.Consensus.MiniProtocol.ChainSync.Client
2335 ( ChainSyncClientException (.. )
2436 )
37+ import qualified Ouroboros.Consensus.Storage.ChainDB.Impl as ChainDB
38+ import Ouroboros.Consensus.Storage.LedgerDB.API
39+ ( CanUpgradeLedgerTables
40+ )
2541import Ouroboros.Consensus.Util.Condense
2642import Ouroboros.Consensus.Util.IOLike (Exception , fromException )
2743import Ouroboros.Network.Driver.Limits
2844 ( ProtocolLimitFailure (ExceededTimeLimit )
2945 )
46+ import Ouroboros.Network.Util.ShowProxy
3047import Test.Consensus.Genesis.Setup.Classifiers
3148 ( Classifiers (.. )
3249 , ResultClassifiers (.. )
@@ -36,16 +53,19 @@ import Test.Consensus.Genesis.Setup.Classifiers
3653 , scheduleClassifiers
3754 )
3855import Test.Consensus.Genesis.Setup.GenChains
56+ import Test.Consensus.PeerSimulator.Config ()
3957import Test.Consensus.PeerSimulator.Run
4058import Test.Consensus.PeerSimulator.StateView
4159import Test.Consensus.PeerSimulator.Trace
4260 ( traceLinesWith
4361 , tracerTestBlock
4462 )
4563import Test.Consensus.PointSchedule
64+ import Test.Consensus.PointSchedule.NodeState (NodeState )
4665import Test.QuickCheck
4766import Test.Util.Orphans.IOLike ()
4867import Test.Util.QuickCheck (forAllGenRunShrinkCheck )
68+ import Test.Util.TersePrinting (Terse )
4969import Test.Util.TestBlock (TestBlock )
5070import Test.Util.Tracer (recordingTracerM )
5171import Text.Printf (printf )
@@ -62,17 +82,37 @@ runSimStrictShutdownOrThrow action =
6282-- | Runs the given 'GenesisTest' and 'PointSchedule' and evaluates the given
6383-- property on the final 'StateView'.
6484runGenesisTest ::
85+ ( Condense (StateView blk )
86+ , CondenseList (NodeState blk )
87+ , ShowProxy blk
88+ , ShowProxy (Header blk )
89+ , ConfigSupportsNode blk
90+ , LedgerSupportsProtocol blk
91+ , ChainDB. SerialiseDiskConstraints blk
92+ , BlockSupportsDiffusionPipelining blk
93+ , InspectLedger blk
94+ , HasHardForkHistory blk
95+ , ConvertRawHash blk
96+ , CanUpgradeLedgerTables (LedgerState blk )
97+ , HasPointScheduleTestParams blk
98+ , Eq (Header blk )
99+ , Eq blk
100+ , Terse blk
101+ , Condense (NodeState blk )
102+ ) =>
103+ ProtocolInfoArgs blk ->
65104 SchedulerConfig ->
66- GenesisTestFull TestBlock ->
67- RunGenesisTestResult
68- runGenesisTest schedulerConfig genesisTest =
105+ GenesisTestFull blk ->
106+ RunGenesisTestResult blk
107+ runGenesisTest protocolInfoArgs schedulerConfig genesisTest =
69108 runSimStrictShutdownOrThrow $ do
70109 (recordingTracer, getTrace) <- recordingTracerM
71110 let tracer = if scDebug schedulerConfig then debugTracer else recordingTracer
72111
73112 traceLinesWith tracer $ prettyGenesisTest prettyPointSchedule genesisTest
74113
75- rgtrStateView <- runPointSchedule schedulerConfig genesisTest =<< tracerTestBlock tracer
114+ rgtrStateView <-
115+ runPointSchedule protocolInfoArgs schedulerConfig genesisTest =<< tracerTestBlock tracer
76116 traceWith tracer (condense rgtrStateView)
77117 rgtrTrace <- unlines <$> getTrace
78118
@@ -87,24 +127,44 @@ runGenesisTest' ::
87127 GenesisTestFull TestBlock ->
88128 (StateView TestBlock -> prop ) ->
89129 Property
90- runGenesisTest' schedulerConfig genesisTest makeProperty =
91- counterexample rgtrTrace $ makeProperty rgtrStateView
92- where
93- RunGenesisTestResult {rgtrTrace, rgtrStateView} =
94- runGenesisTest schedulerConfig genesisTest
130+ runGenesisTest' schedulerConfig genesisTest makeProperty = idempotentIOProperty $ do
131+ protocolInfoArgs <- getProtocolInfoArgs
132+ let RunGenesisTestResult {rgtrTrace, rgtrStateView} =
133+ runGenesisTest protocolInfoArgs schedulerConfig genesisTest
134+ pure $ counterexample rgtrTrace $ makeProperty rgtrStateView
95135
96136-- | All-in-one helper that generates a 'GenesisTest' and a 'Peers
97137-- PeerSchedule', runs them with 'runGenesisTest', check whether the given
98138-- property holds on the resulting 'StateView'.
99139forAllGenesisTest ::
100- Testable prop =>
101- Gen (GenesisTestFull TestBlock ) ->
140+ forall blk prop .
141+ ( Testable prop
142+ , Condense (StateView blk )
143+ , CondenseList (NodeState blk )
144+ , ShowProxy blk
145+ , ShowProxy (Header blk )
146+ , ConfigSupportsNode blk
147+ , LedgerSupportsProtocol blk
148+ , ChainDB. SerialiseDiskConstraints blk
149+ , BlockSupportsDiffusionPipelining blk
150+ , InspectLedger blk
151+ , HasHardForkHistory blk
152+ , ConvertRawHash blk
153+ , CanUpgradeLedgerTables (LedgerState blk )
154+ , HasPointScheduleTestParams blk
155+ , Eq (Header blk )
156+ , Eq blk
157+ , Terse blk
158+ , Condense (NodeState blk )
159+ ) =>
160+ Gen (GenesisTestFull blk ) ->
102161 SchedulerConfig ->
103- (GenesisTestFull TestBlock -> StateView TestBlock -> [GenesisTestFull TestBlock ]) ->
104- (GenesisTestFull TestBlock -> StateView TestBlock -> prop ) ->
162+ (GenesisTestFull blk -> StateView blk -> [GenesisTestFull blk ]) ->
163+ (GenesisTestFull blk -> StateView blk -> prop ) ->
105164 Property
106- forAllGenesisTest generator schedulerConfig shrinker mkProperty =
107- forAllGenRunShrinkCheck generator runner shrinker' $ \ genesisTest result ->
165+ forAllGenesisTest generator schedulerConfig shrinker mkProperty = idempotentIOProperty $ do
166+ protocolInfoArgs <- getProtocolInfoArgs
167+ pure $ forAllGenRunShrinkCheck generator (runGenesisTest protocolInfoArgs schedulerConfig) shrinker' $ \ genesisTest result ->
108168 let cls = classifiers genesisTest
109169 resCls = resultClassifiers genesisTest result
110170 schCls = scheduleClassifiers genesisTest
@@ -128,7 +188,6 @@ forAllGenesisTest generator schedulerConfig shrinker mkProperty =
128188 $ counterexample (rgtrTrace result)
129189 $ mkProperty genesisTest stateView .&&. hasOnlyExpectedExceptions stateView
130190 where
131- runner = runGenesisTest schedulerConfig
132191 shrinker' gt = shrinker gt . rgtrStateView
133192 hasOnlyExpectedExceptions StateView {svPeerSimulatorResults} =
134193 conjoin $
0 commit comments