Skip to content

Commit 5abbe1e

Browse files
tbagrel1agustinmistaamesgengeo2anbacquey
committed
Add smoke tests for PerasCertDiffusion
Co-authored-by: Agustin Mista <agustin.mista@moduscreate.com> Co-authored-by: Alexander Esgen <alexander.esgen@iohk.io> Co-authored-by: Georgy Lukyanov <georgy.lukyanov@iohk.io> Co-authored-by: Thomas BAGREL <thomas.bagrel@tweag.io> Co-authored-by: Nicolas BACQUEY <nicolas.bacquey@tweag.io> Co-authored-by: Nicolas "Niols" Jeannerod <nicolas.jeannerod@moduscreate.com>
1 parent 5cec5cd commit 5abbe1e

File tree

3 files changed

+148
-0
lines changed

3 files changed

+148
-0
lines changed

ouroboros-consensus/ouroboros-consensus.cabal

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -669,6 +669,7 @@ test-suite consensus-test
669669
Test.Consensus.MiniProtocol.ChainSync.CSJ
670670
Test.Consensus.MiniProtocol.ChainSync.Client
671671
Test.Consensus.MiniProtocol.LocalStateQuery.Server
672+
Test.Consensus.MiniProtocol.ObjectDiffusion.PerasCert.Smoke
672673
Test.Consensus.MiniProtocol.ObjectDiffusion.Smoke
673674
Test.Consensus.Peras.WeightSnapshot
674675
Test.Consensus.Util.MonadSTM.NormalForm

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.PerasCert.Smoke (tests)
1920
import qualified Test.Consensus.MiniProtocol.ObjectDiffusion.Smoke (tests)
2021
import qualified Test.Consensus.Peras.WeightSnapshot (tests)
2122
import qualified Test.Consensus.Util.MonadSTM.NormalForm (tests)
@@ -39,6 +40,7 @@ tests =
3940
, Test.Consensus.MiniProtocol.ChainSync.CSJ.tests
4041
, Test.Consensus.MiniProtocol.ChainSync.Client.tests
4142
, Test.Consensus.MiniProtocol.ObjectDiffusion.Smoke.tests
43+
, Test.Consensus.MiniProtocol.ObjectDiffusion.PerasCert.Smoke.tests
4244
, Test.Consensus.MiniProtocol.LocalStateQuery.Server.tests
4345
, testGroup
4446
"Mempool"
Lines changed: 145 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,145 @@
1+
{-# LANGUAGE FlexibleContexts #-}
2+
{-# LANGUAGE FlexibleInstances #-}
3+
{-# LANGUAGE MultiParamTypeClasses #-}
4+
{-# LANGUAGE NamedFieldPuns #-}
5+
{-# LANGUAGE RankNTypes #-}
6+
{-# LANGUAGE TypeApplications #-}
7+
{-# LANGUAGE UndecidableInstances #-}
8+
{-# OPTIONS_GHC -Wno-orphans #-}
9+
10+
module Test.Consensus.MiniProtocol.ObjectDiffusion.PerasCert.Smoke (tests) where
11+
12+
import Control.Tracer (contramap, nullTracer)
13+
import Data.Functor.Identity (Identity (..))
14+
import qualified Data.List.NonEmpty as NE
15+
import qualified Data.Map as Map
16+
import Network.TypedProtocol.Driver.Simple (runPeer, runPipelinedPeer)
17+
import Ouroboros.Consensus.Block.SupportsPeras
18+
import Ouroboros.Consensus.MiniProtocol.ObjectDiffusion.ObjectPool.API
19+
import Ouroboros.Consensus.MiniProtocol.ObjectDiffusion.ObjectPool.PerasCert
20+
import Ouroboros.Consensus.Storage.PerasCertDB.API
21+
( AddPerasCertResult (..)
22+
, PerasCertDB
23+
, PerasCertTicketNo
24+
)
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.Point (Block (Block), WithOrigin (..))
30+
import Ouroboros.Network.Protocol.ObjectDiffusion.Codec
31+
import Ouroboros.Network.Protocol.ObjectDiffusion.Inbound
32+
( objectDiffusionInboundPeerPipelined
33+
)
34+
import Ouroboros.Network.Protocol.ObjectDiffusion.Outbound (objectDiffusionOutboundPeer)
35+
import Test.Consensus.MiniProtocol.ObjectDiffusion.Smoke
36+
( ListWithUniqueIds (..)
37+
, WithId
38+
, genListWithUniqueIds
39+
, genProtocolConstants
40+
, getId
41+
, prop_smoke_object_diffusion
42+
)
43+
import Test.QuickCheck
44+
import Test.Tasty
45+
import Test.Tasty.QuickCheck (testProperty)
46+
import Test.Util.TestBlock
47+
48+
tests :: TestTree
49+
tests =
50+
testGroup
51+
"ObjectDiffusion.PerasCert.Smoke"
52+
[ testProperty
53+
"PerasCertDiffusion smoke test"
54+
prop_smoke
55+
]
56+
57+
genPoint :: Gen (Point (TestBlock))
58+
genPoint =
59+
-- Sometimes pick the genesis point
60+
frequency
61+
[ (1, pure $ Point Origin)
62+
,
63+
( 50
64+
, do
65+
slotNo <- SlotNo <$> arbitrary
66+
hash <- TestHash . NE.fromList . getNonEmpty <$> arbitrary
67+
pure $ Point (At (Block slotNo hash))
68+
)
69+
]
70+
71+
genPerasCert :: Gen (PerasCert TestBlock)
72+
genPerasCert = do
73+
pcCertRound <- PerasRoundNo <$> arbitrary
74+
pcCertBoostedBlock <- genPoint
75+
pure $ PerasCert{pcCertRound, pcCertBoostedBlock}
76+
77+
instance WithId (PerasCert blk) PerasRoundNo where
78+
getId = pcCertRound
79+
80+
newCertDB :: (IOLike m, StandardHash blk) => [PerasCert blk] -> m (PerasCertDB m blk)
81+
newCertDB certs = do
82+
db <- PerasCertDB.openDB (PerasCertDB.PerasCertDbArgs @Identity nullTracer)
83+
mapM_
84+
( \cert -> do
85+
let validatedCert =
86+
ValidatedPerasCert
87+
{ vpcCert = cert
88+
, vpcCertBoost = boostPerCert
89+
}
90+
result <- PerasCertDB.addCert db validatedCert
91+
case result of
92+
AddedPerasCertToDB -> pure ()
93+
PerasCertAlreadyInDB -> throwIO (userError "Expected AddedPerasCertToDB, but cert was already in DB")
94+
)
95+
certs
96+
pure db
97+
98+
prop_smoke :: Property
99+
prop_smoke =
100+
forAll genProtocolConstants $ \protocolConstants ->
101+
forAll (genListWithUniqueIds genPerasCert) $ \(ListWithUniqueIds certs) ->
102+
let
103+
runOutboundPeer outbound outboundChannel tracer =
104+
runPeer
105+
((\x -> "Outbound (Client): " ++ show x) `contramap` tracer)
106+
codecObjectDiffusionId
107+
outboundChannel
108+
(objectDiffusionOutboundPeer outbound)
109+
>> pure ()
110+
runInboundPeer inbound inboundChannel tracer =
111+
runPipelinedPeer
112+
((\x -> "Inbound (Server): " ++ show x) `contramap` tracer)
113+
codecObjectDiffusionId
114+
inboundChannel
115+
(objectDiffusionInboundPeerPipelined inbound)
116+
>> pure ()
117+
mkPoolInterfaces ::
118+
forall m.
119+
IOLike m =>
120+
m
121+
( ObjectPoolReader PerasRoundNo (PerasCert TestBlock) PerasCertTicketNo m
122+
, ObjectPoolWriter PerasRoundNo (PerasCert TestBlock) m
123+
, m [PerasCert TestBlock]
124+
)
125+
mkPoolInterfaces = do
126+
outboundPool <- newCertDB certs
127+
inboundPool <- newCertDB []
128+
129+
let outboundPoolReader = makePerasCertPoolReaderFromCertDB outboundPool
130+
inboundPoolWriter = makePerasCertPoolWriterFromCertDB inboundPool
131+
getAllInboundPoolContent = atomically $ do
132+
snap <- PerasCertDB.getCertSnapshot inboundPool
133+
let rawContent =
134+
Map.toAscList $
135+
PerasCertDB.getCertsAfter snap (PerasCertDB.zeroPerasCertTicketNo)
136+
pure $ getPerasCert . snd <$> rawContent
137+
138+
return (outboundPoolReader, inboundPoolWriter, getAllInboundPoolContent)
139+
in
140+
prop_smoke_object_diffusion
141+
protocolConstants
142+
certs
143+
runOutboundPeer
144+
runInboundPeer
145+
mkPoolInterfaces

0 commit comments

Comments
 (0)