Skip to content

Commit a3b0acc

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 561f667 commit a3b0acc

File tree

3 files changed

+137
-0
lines changed

3 files changed

+137
-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: 134 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,134 @@
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+
, ProtocolConstants
38+
, WithId
39+
, getId
40+
, prop_smoke_object_diffusion
41+
)
42+
import Test.QuickCheck
43+
import Test.Tasty
44+
import Test.Tasty.QuickCheck (testProperty)
45+
import Test.Util.TestBlock
46+
47+
tests :: TestTree
48+
tests =
49+
testGroup
50+
"ObjectDiffusion.PerasCert.Smoke"
51+
[ testProperty "PerasCertDiffusion smoke test" 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+
let validatedCert =
83+
ValidatedPerasCert
84+
{ vpcCert = cert
85+
, vpcCertBoost = boostPerCert
86+
}
87+
result <- PerasCertDB.addCert db validatedCert
88+
case result of
89+
AddedPerasCertToDB -> pure ()
90+
PerasCertAlreadyInDB -> throwIO (userError "Expected AddedPerasCertToDB, but cert was already in DB")
91+
)
92+
certs
93+
pure db
94+
95+
prop_smoke :: ProtocolConstants -> ListWithUniqueIds (PerasCert TestBlock) PerasRoundNo -> Property
96+
prop_smoke protocolConstants (ListWithUniqueIds certs) =
97+
prop_smoke_object_diffusion protocolConstants certs runOutboundPeer runInboundPeer mkPoolInterfaces
98+
where
99+
runOutboundPeer outbound outboundChannel tracer =
100+
runPeer
101+
((\x -> "Outbound (Client): " ++ show x) `contramap` tracer)
102+
codecObjectDiffusionId
103+
outboundChannel
104+
(objectDiffusionOutboundPeer outbound)
105+
>> pure ()
106+
runInboundPeer inbound inboundChannel tracer =
107+
runPipelinedPeer
108+
((\x -> "Inbound (Server): " ++ show x) `contramap` tracer)
109+
codecObjectDiffusionId
110+
inboundChannel
111+
(objectDiffusionInboundPeerPipelined inbound)
112+
>> pure ()
113+
mkPoolInterfaces ::
114+
forall m.
115+
IOLike m =>
116+
m
117+
( ObjectPoolReader PerasRoundNo (PerasCert TestBlock) PerasCertTicketNo m
118+
, ObjectPoolWriter PerasRoundNo (PerasCert TestBlock) m
119+
, m [PerasCert TestBlock]
120+
)
121+
mkPoolInterfaces = do
122+
outboundPool <- newCertDB certs
123+
inboundPool <- newCertDB []
124+
125+
let outboundPoolReader = makePerasCertPoolReaderFromCertDB outboundPool
126+
inboundPoolWriter = makePerasCertPoolWriterFromCertDB inboundPool
127+
getAllInboundPoolContent = do
128+
snap <- atomically $ PerasCertDB.getCertSnapshot inboundPool
129+
let rawContent =
130+
Map.toAscList $
131+
PerasCertDB.getCertsAfter snap (PerasCertDB.zeroPerasCertTicketNo)
132+
pure $ getPerasCert . snd <$> rawContent
133+
134+
return (outboundPoolReader, inboundPoolWriter, getAllInboundPoolContent)

0 commit comments

Comments
 (0)