Skip to content

Commit c132caf

Browse files
committed
Add smoke test for CertDiffusion
1 parent 1df7101 commit c132caf

File tree

7 files changed

+172
-13
lines changed

7 files changed

+172
-13
lines changed

cabal.project

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -60,9 +60,11 @@ if impl (ghc >= 9.12)
6060
source-repository-package
6161
type: git
6262
location: https://github.com/IntersectMBO/ouroboros-network
63-
tag: 3e8d3b4b8c87ead794876c62d7fe25f32efb5142
64-
--sha256: 08fpkx3iagj83nn413h9a865zjcj3lrf7017a756qd2wg2jg3amq
63+
tag: a43711a0501c4164f444d6adfff10128a6036a67
64+
--sha256: 1csgwxvdabd843jwy31qrvg0r1g5ar7lckkwrd8vv0fy8z0vxf1b
6565
subdir:
66+
ouroboros-network
67+
ouroboros-network-protocols
6668
ouroboros-network-api
6769

6870
source-repository-package

ouroboros-consensus-diffusion/src/ouroboros-consensus-diffusion/Ouroboros/Consensus/Network/NodeToNode.hs

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -131,8 +131,6 @@ import Ouroboros.Network.Protocol.KeepAlive.Client
131131
import Ouroboros.Network.Protocol.KeepAlive.Codec
132132
import Ouroboros.Network.Protocol.KeepAlive.Server
133133
import Ouroboros.Network.Protocol.KeepAlive.Type
134-
import Ouroboros.Network.Protocol.ObjectDiffusion.Inbound (ObjectDiffusionInboundPipelined)
135-
import Ouroboros.Network.Protocol.ObjectDiffusion.Outbound (ObjectDiffusionOutbound)
136134
import Ouroboros.Network.Protocol.PeerSharing.Client
137135
( PeerSharingClient
138136
, peerSharingClientPeer

ouroboros-consensus-diffusion/src/unstable-diffusion-testlib/Test/ThreadNet/Network.hs

Lines changed: 2 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -122,8 +122,8 @@ import Ouroboros.Network.NodeToNode
122122
( ConnectionId (..)
123123
, ExpandedInitiatorContext (..)
124124
, IsBigLedgerPeer (..)
125-
, MiniProtocolParameters (..)
126125
, ResponderContext (..)
126+
, defaultMiniProtocolParameters
127127
)
128128
import Ouroboros.Network.PeerSelection.Governor
129129
( makePublicPeerSelectionStateVar
@@ -1053,13 +1053,7 @@ runThreadNetwork
10531053
, mempoolCapacityOverride = NoMempoolCapacityBytesOverride
10541054
, keepAliveRng = kaRng
10551055
, peerSharingRng = psRng
1056-
, miniProtocolParameters =
1057-
MiniProtocolParameters
1058-
{ chainSyncPipeliningHighMark = 4
1059-
, chainSyncPipeliningLowMark = 2
1060-
, blockFetchPipeliningMax = 10
1061-
, txSubmissionMaxUnacked = 1000 -- TODO ?
1062-
}
1056+
, miniProtocolParameters = defaultMiniProtocolParameters
10631057
, blockFetchConfiguration =
10641058
BlockFetchConfiguration
10651059
{ bfcMaxConcurrencyBulkSync = 1

ouroboros-consensus/ouroboros-consensus.cabal

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -604,6 +604,7 @@ test-suite consensus-test
604604
Test.Consensus.MiniProtocol.ChainSync.Client
605605
Test.Consensus.MiniProtocol.LocalStateQuery.Server
606606
Test.Consensus.MiniProtocol.ObjectDiffusion.Smoke
607+
Test.Consensus.MiniProtocol.ObjectDiffusion.Cert.Smoke
607608
Test.Consensus.Util.MonadSTM.NormalForm
608609
Test.Consensus.Util.Versioned
609610

ouroboros-consensus/test/consensus-test/Main.hs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@ import qualified Test.Consensus.MiniProtocol.BlockFetch.Client (tests)
1616
import qualified Test.Consensus.MiniProtocol.ChainSync.CSJ (tests)
1717
import qualified Test.Consensus.MiniProtocol.ChainSync.Client (tests)
1818
import qualified Test.Consensus.MiniProtocol.LocalStateQuery.Server (tests)
19+
import qualified Test.Consensus.MiniProtocol.ObjectDiffusion.Cert.Smoke (tests)
1920
import qualified Test.Consensus.MiniProtocol.ObjectDiffusion.Smoke (tests)
2021
import qualified Test.Consensus.Util.MonadSTM.NormalForm (tests)
2122
import qualified Test.Consensus.Util.Versioned (tests)
@@ -38,6 +39,7 @@ tests =
3839
, Test.Consensus.MiniProtocol.ChainSync.CSJ.tests
3940
, Test.Consensus.MiniProtocol.ChainSync.Client.tests
4041
, Test.Consensus.MiniProtocol.ObjectDiffusion.Smoke.tests
42+
, Test.Consensus.MiniProtocol.ObjectDiffusion.Cert.Smoke.tests
4143
, Test.Consensus.MiniProtocol.LocalStateQuery.Server.tests
4244
, testGroup
4345
"Mempool"
Lines changed: 162 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,162 @@
1+
{-# LANGUAGE FlexibleContexts #-}
2+
{-# LANGUAGE FlexibleInstances #-}
3+
{-# LANGUAGE MultiParamTypeClasses #-}
4+
{-# LANGUAGE NamedFieldPuns #-}
5+
{-# LANGUAGE TypeApplications #-}
6+
{-# LANGUAGE UndecidableInstances #-}
7+
{-# OPTIONS_GHC -Wno-orphans #-}
8+
{-# OPTIONS_GHC -Wno-unused-top-binds #-}
9+
10+
module Test.Consensus.MiniProtocol.ObjectDiffusion.Cert.Smoke (tests) where
11+
12+
import Control.Monad.IOSim (runSimStrictShutdown)
13+
import Control.Tracer (Tracer (..), contramap, nullTracer, traceWith)
14+
import Data.Functor.Identity (Identity (..))
15+
import qualified Data.List.NonEmpty as NE
16+
import Debug.Trace (traceM)
17+
import Network.TypedProtocol.Channel (createConnectedChannels)
18+
import Network.TypedProtocol.Driver.Simple (runPeer, runPipelinedPeer)
19+
import Ouroboros.Consensus.Block.SupportsPeras
20+
import Ouroboros.Consensus.MiniProtocol.ObjectDiffusion.Inbound
21+
import Ouroboros.Consensus.MiniProtocol.ObjectDiffusion.ObjectPool.Cert
22+
import Ouroboros.Consensus.MiniProtocol.ObjectDiffusion.Outbound
23+
import Ouroboros.Consensus.Node.NetworkProtocolVersion (NodeToNodeVersion (NodeToNodeV_14))
24+
import Ouroboros.Consensus.Storage.PerasCertDB.API (AddPerasCertResult (..), PerasCertDB)
25+
import qualified Ouroboros.Consensus.Storage.PerasCertDB.API as PerasCertDB
26+
import qualified Ouroboros.Consensus.Storage.PerasCertDB.Impl as PerasCertDB
27+
import Ouroboros.Consensus.Util.IOLike
28+
import Ouroboros.Network.Block (Point (..), SlotNo (SlotNo), StandardHash)
29+
import Ouroboros.Network.ControlMessage (ControlMessage (..))
30+
import Ouroboros.Network.Diffusion.Configuration
31+
import Ouroboros.Network.Point (Block (Block), WithOrigin (..))
32+
import Ouroboros.Network.Protocol.ObjectDiffusion.Codec
33+
import Ouroboros.Network.Protocol.ObjectDiffusion.Inbound
34+
( objectDiffusionNonInitInboundPeerPipelined
35+
)
36+
import Ouroboros.Network.Protocol.ObjectDiffusion.Outbound (objectDiffusionInitOutboundPeer)
37+
import Test.Consensus.MiniProtocol.ObjectDiffusion.Smoke (ListWithUniqueIds (..), WithId, getId)
38+
import Test.QuickCheck
39+
import Test.Tasty
40+
import Test.Tasty.QuickCheck (testProperty)
41+
import Test.Util.TestBlock
42+
43+
-- When wanting to debug a part of the test:
44+
debugTracer :: Monad m => Tracer m String
45+
debugTracer = Tracer traceM
46+
47+
tests :: TestTree
48+
tests =
49+
testGroup
50+
"ObjectDiffusion.Cert.Smoke"
51+
[ testProperty "smoke" prop_smoke
52+
]
53+
54+
instance Arbitrary (Point TestBlock) where
55+
arbitrary =
56+
-- Sometimes pick the genesis point
57+
frequency
58+
[ (1, pure $ Point Origin)
59+
,
60+
( 4
61+
, do
62+
slotNo <- SlotNo <$> arbitrary
63+
hash <- TestHash . NE.fromList . getNonEmpty <$> arbitrary
64+
pure $ Point (At (Block slotNo hash))
65+
)
66+
]
67+
68+
instance Arbitrary (Point blk) => Arbitrary (PerasCert blk) where
69+
arbitrary = do
70+
pcCertRound <- PerasRoundNo <$> arbitrary
71+
pcCertBoostedBlock <- arbitrary
72+
pure $ PerasCert{pcCertRound, pcCertBoostedBlock}
73+
74+
instance WithId (PerasCert blk) PerasRoundNo where
75+
getId = pcCertRound
76+
77+
newCertDB :: (IOLike m, StandardHash blk) => [PerasCert blk] -> m (PerasCertDB m blk)
78+
newCertDB certs = do
79+
db <- PerasCertDB.openDB (PerasCertDB.PerasCertDbArgs @Identity nullTracer)
80+
mapM_
81+
( \cert -> do
82+
result <- PerasCertDB.addCert db cert
83+
case result of
84+
AddedPerasCertToDB -> pure ()
85+
PerasCertAlreadyInDB -> throwIO (userError "Expected AddedPerasCertToDB, but cert was already in DB")
86+
)
87+
certs
88+
pure db
89+
90+
prop_smoke :: ListWithUniqueIds (PerasCert TestBlock) PerasRoundNo -> Property
91+
prop_smoke (ListWithUniqueIds certs) =
92+
case simulationResult of
93+
Right actualCerts -> actualCerts === certs
94+
Left msg -> counterexample (show msg) $ property False
95+
where
96+
simulationResult = runSimStrictShutdown $ do
97+
traceWith nullTracer "========== [ Starting test ] =========="
98+
traceWith nullTracer (show certs)
99+
100+
inboundPool <- newCertDB []
101+
outboundPool <- newCertDB certs
102+
103+
controlMessage <- uncheckedNewTVarM Continue
104+
105+
let
106+
server =
107+
objectDiffusionInbound
108+
nullTracer
109+
numObjectIdsToAck
110+
(makeCertPoolReaderFromCertDB inboundPool)
111+
(makeCertPoolWriterFromCertDB inboundPool)
112+
nodeToNodeVersion
113+
114+
client =
115+
objectDiffusionOutbound
116+
nullTracer
117+
numObjectIdsToAck
118+
(makeCertPoolReaderFromCertDB outboundPool)
119+
nodeToNodeVersion
120+
(readTVar controlMessage)
121+
122+
(clientChannel, serverChannel) <- createConnectedChannels
123+
clientAsync <-
124+
async $
125+
( ()
126+
<$ runPeer
127+
((\x -> "Client: " ++ show x) `contramap` nullTracer)
128+
codecObjectDiffusionId
129+
clientChannel
130+
(objectDiffusionInitOutboundPeer client)
131+
)
132+
133+
serverAsync <-
134+
async $
135+
( ()
136+
<$ runPipelinedPeer
137+
((\x -> "Server: " ++ show x) `contramap` nullTracer)
138+
codecObjectDiffusionId
139+
serverChannel
140+
(objectDiffusionNonInitInboundPeerPipelined server)
141+
)
142+
143+
controlMessageAsync <- async $ do
144+
threadDelay 1000 -- give a head start to the other threads
145+
atomically $ writeTVar controlMessage Terminate
146+
threadDelay 1000 -- wait for the other threads to finish
147+
_ <- waitAnyCancel [clientAsync, serverAsync, controlMessageAsync]
148+
149+
actualCerts <- certsFrom inboundPool
150+
traceWith nullTracer ("Certs received by server: " ++ show actualCerts)
151+
152+
traceWith nullTracer "========== [ Test finished ] =========="
153+
154+
pure actualCerts
155+
156+
certsFrom db = do
157+
certSnapshot <- atomically $ PerasCertDB.getCertSnapshot db
158+
let certsTickets = PerasCertDB.getCertsAfter certSnapshot PerasCertDB.zeroPerasCertTicketNo
159+
pure $ map fst certsTickets
160+
161+
numObjectIdsToAck = certDiffusionMaxUnacked defaultMiniProtocolParameters
162+
nodeToNodeVersion = NodeToNodeV_14

ouroboros-consensus/test/consensus-test/Test/Consensus/MiniProtocol/ObjectDiffusion/Smoke.hs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@
77
{-# LANGUAGE ScopedTypeVariables #-}
88

99
-- | Smoke tests for the object diffusion protocol
10-
module Test.Consensus.MiniProtocol.ObjectDiffusion.Smoke (tests) where
10+
module Test.Consensus.MiniProtocol.ObjectDiffusion.Smoke (tests, WithId (..), ListWithUniqueIds (..)) where
1111

1212
import Control.Monad (guard)
1313
import Control.Monad.IOSim (runSimStrictShutdown)

0 commit comments

Comments
 (0)