Skip to content

Commit b4359f2

Browse files
committed
Added test of p2p topology decoder
Test p2p topology decoder by generating valid encodings.
1 parent f1d6ed3 commit b4359f2

File tree

4 files changed

+67
-1
lines changed

4 files changed

+67
-1
lines changed

Diff for: cardano-node/cardano-node.cabal

+2
Original file line numberDiff line numberDiff line change
@@ -215,6 +215,7 @@ test-suite cardano-node-test
215215
type: exitcode-stdio-1.0
216216

217217
build-depends: aeson >= 1.5.6.0
218+
, bytestring
218219
, cardano-api
219220
, cardano-node
220221
, cardano-prelude
@@ -226,6 +227,7 @@ test-suite cardano-node-test
226227
, ouroboros-consensus
227228
, ouroboros-network
228229
, time
230+
, vector
229231

230232
other-modules: Test.Cardano.Node.FilePermissions
231233
Test.Cardano.Node.Gen

Diff for: cardano-node/src/Cardano/Node/Configuration/TopologyP2P.hs

+1-1
Original file line numberDiff line numberDiff line change
@@ -163,7 +163,7 @@ instance FromJSON LocalRootPeersGroups where
163163
parseJSON = fmap LocalRootPeersGroups . parseJSONList
164164

165165
instance ToJSON LocalRootPeersGroups where
166-
toJSON = toJSON . groups
166+
toJSON = toJSONList . groups
167167

168168
newtype PublicRootPeers = PublicRootPeers
169169
{ publicRoots :: RootConfig

Diff for: cardano-node/test/Test/Cardano/Node/Gen.hs

+53
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77

88
module Test.Cardano.Node.Gen
99
( genNetworkTopology
10+
, genNetworkTopologyEncoding
1011
, genNodeHostIPv4Address
1112
, genNodeHostIPv6Address
1213
, genNodeHostIPAddress
@@ -16,6 +17,11 @@ module Test.Cardano.Node.Gen
1617
, genNodeSetup
1718
) where
1819

20+
import qualified Data.Aeson as Aeson
21+
import qualified Data.Aeson.KeyMap as Aeson.KeyMap
22+
import qualified Data.Vector as Vector
23+
import qualified Data.ByteString.Lazy as LBS
24+
1925
import Cardano.Prelude
2026

2127
import Cardano.Node.Configuration.TopologyP2P (NetworkTopology (..), PublicRootPeers (..),
@@ -46,6 +52,53 @@ genNetworkTopology =
4652
<*> genUseLedger
4753
]
4854

55+
-- | Generate valid encodings of p2p topology files
56+
--
57+
genNetworkTopologyEncoding :: Gen LBS.ByteString
58+
genNetworkTopologyEncoding = Aeson.encode <$> genNetworkTopologyValue
59+
60+
-- | Generate a Aeson.Object which encodes a p2p topology.
61+
--
62+
genNetworkTopologyValue :: Gen Aeson.Object
63+
genNetworkTopologyValue =
64+
(\a b c -> Aeson.KeyMap.fromList
65+
[ ("LocalRoots", Aeson.Array . Vector.fromList $ a)
66+
, ("PublicRoots", Aeson.Array . Vector.fromList $ b)
67+
, ("useLedgerAfter", Aeson.Number . fromIntegral $ c)
68+
]
69+
) <$> Gen.list (Range.constantFrom 0 0 10) genLocalRootsValue
70+
<*> Gen.list (Range.constantFrom 0 0 10) genPublicRootsValue
71+
<*> Gen.int (Range.constantFrom 0 0 100)
72+
where
73+
genLocalRootsValue :: Gen Aeson.Value
74+
genLocalRootsValue =
75+
(\a b c -> Aeson.Object $ Aeson.KeyMap.fromList
76+
[ ("accessPoints", Aeson.Array . Vector.fromList $ a)
77+
, ("advertise", Aeson.Bool b)
78+
, ("valency", Aeson.Number (fromIntegral c))
79+
]
80+
) <$> Gen.list (Range.constantFrom 0 0 10) genAccessPointValue
81+
<*> Gen.bool
82+
<*> Gen.int (Range.constantFrom 0 0 100)
83+
84+
genPublicRootsValue :: Gen Aeson.Value
85+
genPublicRootsValue =
86+
(\a b -> Aeson.Object $ Aeson.KeyMap.fromList
87+
[ ("accessPoints", Aeson.Array . Vector.fromList $ a)
88+
, ("advertise", Aeson.Bool b)
89+
]
90+
) <$> Gen.list (Range.constantFrom 0 0 10) genAccessPointValue
91+
<*> Gen.bool
92+
93+
genAccessPointValue :: Gen Aeson.Value
94+
genAccessPointValue =
95+
(\a -> Aeson.Object $ Aeson.KeyMap.fromList
96+
[ ("address", Aeson.String (show $ naHostAddress a))
97+
, ("port", Aeson.Number (fromIntegral $ naPort a))
98+
]
99+
) <$> genNodeIPAddress
100+
101+
49102
genNodeAddress' :: Gen addr -> Gen (NodeAddress' addr)
50103
genNodeAddress' genAddr =
51104
NodeAddress

Diff for: cardano-node/test/Test/Cardano/Node/Json.hs

+11
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ module Test.Cardano.Node.Json
55
) where
66

77
import Cardano.Prelude
8+
import Cardano.Node.Configuration.TopologyP2P (NetworkTopology)
89

910
import Data.Aeson (decode, encode, fromJSON, toJSON)
1011

@@ -55,6 +56,16 @@ prop_roundtrip_NetworkTopology_JSON =
5556
Hedgehog.tripping ntop toJSON fromJSON
5657
Hedgehog.tripping ntop encode decode
5758

59+
-- | Verify that we can parse valid encoding of p2p topology files.
60+
--
61+
prop_decode_NetworkTopology_JSON :: Property
62+
prop_decode_NetworkTopology_JSON =
63+
Hedgehog.property $ do
64+
enc <- Hedgehog.forAll genNetworkTopologyEncoding
65+
let tp :: Maybe NetworkTopology
66+
tp = decode enc
67+
Hedgehog.assert $ isJust tp
68+
5869

5970
-- -----------------------------------------------------------------------------
6071

0 commit comments

Comments
 (0)