Skip to content
This repository was archived by the owner on Aug 18, 2020. It is now read-only.

Commit a32086e

Browse files
authored
Merge pull request #3281 from input-output-hk/jordan/CDEC-452
[CDEC-452] Implement ToJSON instance, golden test and round trip test for `AttackTarget` data type.
2 parents fe82ae8 + ddac69c commit a32086e

File tree

9 files changed

+192
-0
lines changed

9 files changed

+192
-0
lines changed

pkgs/default.nix

+38
Original file line numberDiff line numberDiff line change
@@ -17210,26 +17210,34 @@ license = stdenv.lib.licenses.mit;
1721017210
, array
1721117211
, base
1721217212
, bytestring
17213+
, cardano-crypto
1721317214
, cardano-sl-binary
17215+
, cardano-sl-binary-test
1721417216
, cardano-sl-core
17217+
, cardano-sl-core-test
1721517218
, cardano-sl-crypto
17219+
, cardano-sl-crypto-test
1721617220
, cardano-sl-db
1721717221
, cardano-sl-lrc
1721817222
, cardano-sl-util
17223+
, cardano-sl-util-test
1721917224
, containers
1722017225
, cpphs
1722117226
, cryptonite
1722217227
, data-default
1722317228
, ether
1722417229
, exceptions
1722517230
, formatting
17231+
, generic-arbitrary
17232+
, hedgehog
1722617233
, lens
1722717234
, log-warper
1722817235
, memory
1722917236
, mmorph
1723017237
, mono-traversable
1723117238
, mtl
1723217239
, parsec
17240+
, QuickCheck
1723317241
, reflection
1723417242
, rocksdb-haskell-ng
1723517243
, serokell-util
@@ -17291,6 +17299,26 @@ unordered-containers
1729117299
libraryToolDepends = [
1729217300
cpphs
1729317301
];
17302+
testHaskellDepends = [
17303+
aeson
17304+
base
17305+
bytestring
17306+
cardano-crypto
17307+
cardano-sl-binary-test
17308+
cardano-sl-core
17309+
cardano-sl-core-test
17310+
cardano-sl-crypto
17311+
cardano-sl-crypto-test
17312+
cardano-sl-util-test
17313+
generic-arbitrary
17314+
hedgehog
17315+
parsec
17316+
QuickCheck
17317+
universum
17318+
];
17319+
testToolDepends = [
17320+
cpphs
17321+
];
1729417322
doHaddock = false;
1729517323
description = "Cardano SL - shared seed computation";
1729617324
license = stdenv.lib.licenses.mit;
@@ -17299,14 +17327,19 @@ license = stdenv.lib.licenses.mit;
1729917327
"cardano-sl-ssc-test" = callPackage
1730017328
({
1730117329
mkDerivation
17330+
, aeson
1730217331
, base
17332+
, bytestring
17333+
, cardano-crypto
17334+
, cardano-sl-binary-test
1730317335
, cardano-sl-core
1730417336
, cardano-sl-core-test
1730517337
, cardano-sl-crypto
1730617338
, cardano-sl-crypto-test
1730717339
, cardano-sl-ssc
1730817340
, cardano-sl-util-test
1730917341
, generic-arbitrary
17342+
, hedgehog
1731017343
, QuickCheck
1731117344
, stdenv
1731217345
, universum
@@ -17317,14 +17350,19 @@ pname = "cardano-sl-ssc-test";
1731717350
version = "1.3.0";
1731817351
src = ./../ssc/test;
1731917352
libraryHaskellDepends = [
17353+
aeson
1732017354
base
17355+
bytestring
17356+
cardano-crypto
17357+
cardano-sl-binary-test
1732117358
cardano-sl-core
1732217359
cardano-sl-core-test
1732317360
cardano-sl-crypto
1732417361
cardano-sl-crypto-test
1732517362
cardano-sl-ssc
1732617363
cardano-sl-util-test
1732717364
generic-arbitrary
17365+
hedgehog
1732817366
QuickCheck
1732917367
universum
1733017368
];

ssc/cardano-sl-ssc.cabal

+43
Original file line numberDiff line numberDiff line change
@@ -123,3 +123,46 @@ library
123123

124124
build-tools: cpphs >= 1.19
125125
ghc-options: -pgmP cpphs -optP --cpp
126+
127+
test-suite test
128+
main-is: test.hs
129+
hs-source-dirs: test
130+
default-language: Haskell2010
131+
type: exitcode-stdio-1.0
132+
133+
other-modules:
134+
Test.Pos.Ssc.Arbitrary
135+
Test.Pos.Ssc.Gen
136+
Test.Pos.Ssc.Json
137+
138+
139+
build-depends: QuickCheck
140+
, aeson
141+
, base
142+
, bytestring
143+
, cardano-crypto
144+
, cardano-sl-binary-test
145+
, cardano-sl-core
146+
, cardano-sl-core-test
147+
, cardano-sl-crypto
148+
, cardano-sl-crypto-test
149+
, cardano-sl-ssc
150+
, cardano-sl-util-test
151+
, generic-arbitrary
152+
, hedgehog
153+
, parsec
154+
, universum
155+
156+
ghc-options:
157+
-threaded
158+
-rtsopts
159+
-Wall
160+
161+
-- linker speed up for linux
162+
if os(linux)
163+
ghc-options: -optl-fuse-ld=gold
164+
ld-options: -fuse-ld=gold
165+
166+
build-tools: cpphs >= 1.19
167+
ghc-options: -pgmP cpphs -optP --cpp
168+

ssc/src/Pos/Security/Params.hs

+11
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ import qualified Data.Aeson as A
1212
import Data.Aeson.Options (defaultOptions)
1313
import qualified Data.Aeson.Types as A
1414
import Data.Default (Default (..))
15+
import qualified Data.Text as T
1516
import qualified Text.Parsec as Parsec
1617

1718
import Pos.Core.Common (StakeholderId)
@@ -67,6 +68,16 @@ data AttackTarget
6768
| PubKeyAddressTarget !StakeholderId
6869
deriving (Eq, Show)
6970

71+
instance A.ToJSON AttackTarget where
72+
toJSON = A.object . \case
73+
NetworkAddressTarget attNetworkAddr ->
74+
["Network" A..=
75+
((decodeUtf8 @Text $ fst attNetworkAddr)
76+
`T.append` ":"
77+
`T.append` (T.pack . show $ snd attNetworkAddr))
78+
]
79+
PubKeyAddressTarget attPkAddr -> ["PubKey" A..= attPkAddr]
80+
7081
instance A.FromJSON AttackTarget where
7182
parseJSON = A.withObject "AttackTarget" $ \o ->
7283
asum [ NetworkAddressTarget <$>

ssc/test/Test/Pos/Ssc/Gen.hs

+28
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
module Test.Pos.Ssc.Gen
2+
( genAttackTarget
3+
) where
4+
5+
import Universum
6+
7+
import qualified Data.ByteString.Char8 as BC
8+
import Hedgehog
9+
import qualified Hedgehog.Gen as Gen
10+
import qualified Hedgehog.Range as Range
11+
import Pos.Security.Params (AttackTarget (..))
12+
import Test.Pos.Core.Gen (genStakeholderId)
13+
14+
15+
----------------------------------------------------------------------------
16+
-- Pos.Ssc.Security Generators
17+
----------------------------------------------------------------------------
18+
19+
genAttackTarget :: Gen AttackTarget
20+
genAttackTarget = do
21+
netHostAddr <- genHost
22+
port <- Gen.word16 (Range.constant 1 65535)
23+
Gen.choice [ pure $ NetworkAddressTarget (netHostAddr, port)
24+
, PubKeyAddressTarget <$> genStakeholderId
25+
]
26+
27+
genHost :: Gen ByteString
28+
genHost = BC.pack <$> Gen.string (Range.constant 1 10) Gen.alphaNum

ssc/test/Test/Pos/Ssc/Json.hs

+55
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,55 @@
1+
{-# LANGUAGE NoImplicitPrelude #-}
2+
{-# LANGUAGE OverloadedStrings #-}
3+
{-# LANGUAGE TemplateHaskell #-}
4+
5+
module Test.Pos.Ssc.Json
6+
( tests
7+
) where
8+
import Universum
9+
10+
import qualified Cardano.Crypto.Wallet as CC
11+
import Hedgehog (Property)
12+
import qualified Hedgehog as H
13+
import Pos.Crypto.Hashing (abstractHash)
14+
import Pos.Crypto.Signing (PublicKey (..))
15+
import Pos.Security.Params (AttackTarget (..))
16+
import Test.Pos.Ssc.Gen (genAttackTarget)
17+
import Test.Pos.Util.Golden (discoverGolden, eachOf, goldenTestJSON)
18+
import Test.Pos.Util.Tripping (discoverRoundTrip, roundTripsAesonShow)
19+
20+
-------------------------------------------------------------------------------
21+
-- AttackTarget
22+
-------------------------------------------------------------------------------
23+
golden_AttackTarget_NetworkAddressTarget :: Property
24+
golden_AttackTarget_NetworkAddressTarget =
25+
goldenTestJSON exampleAttackTarget_NetworkAddressTarget
26+
"test/golden/AttackTarget_NetworkAddressTarget"
27+
where
28+
exampleAttackTarget_NetworkAddressTarget =
29+
NetworkAddressTarget ("ggv", 32313)
30+
31+
32+
golden_AttackTarget_PubKeyAddressTarget :: Property
33+
golden_AttackTarget_PubKeyAddressTarget =
34+
goldenTestJSON exampleAttackTarget_PubKeyAddressTarget
35+
"test/golden/AttackTarget_PubKeyAddressTarget"
36+
37+
exampleAttackTarget_PubKeyAddressTarget :: AttackTarget
38+
exampleAttackTarget_PubKeyAddressTarget =
39+
PubKeyAddressTarget
40+
$ abstractHash (PublicKey (CC.XPub {CC.xpubPublicKey = pubKey1
41+
, CC.xpubChaincode = CC.ChainCode "Test"}))
42+
where
43+
pubKey1 = "\145\&3\131kUF\226\131\253M\174\157;w>\156k"
44+
45+
roundTripAttackTarget :: Property
46+
roundTripAttackTarget =
47+
eachOf 1000 genAttackTarget roundTripsAesonShow
48+
49+
-------------------------------------------------------------------------------
50+
-- Main test export
51+
-------------------------------------------------------------------------------
52+
53+
tests :: IO Bool
54+
tests = (&&) <$> H.checkSequential $$discoverGolden
55+
<*> H.checkParallel $$discoverRoundTrip

ssc/test/cardano-sl-ssc-test.cabal

+7
Original file line numberDiff line numberDiff line change
@@ -15,16 +15,23 @@ cabal-version: >=1.10
1515
library
1616
exposed-modules:
1717
Test.Pos.Ssc.Arbitrary
18+
Test.Pos.Ssc.Gen
19+
Test.Pos.Ssc.Json
1820

1921
build-depends: QuickCheck
22+
, aeson
2023
, base
24+
, bytestring
25+
, cardano-crypto
26+
, cardano-sl-binary-test
2127
, cardano-sl-core
2228
, cardano-sl-core-test
2329
, cardano-sl-crypto
2430
, cardano-sl-crypto-test
2531
, cardano-sl-ssc
2632
, cardano-sl-util-test
2733
, generic-arbitrary
34+
, hedgehog
2835
, universum
2936

3037
default-language: Haskell2010
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
{"Network":"ggv:32313"}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
{"PubKey":"cae922c720ea93e5ead49b4652fb24caf4948e31eee378a4c4513f11"}

ssc/test/test.hs

+8
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
import Test.Pos.Binary.Helpers (runTests)
2+
import qualified Test.Pos.Ssc.Json
3+
4+
main :: IO ()
5+
main = do
6+
runTests
7+
[ Test.Pos.Ssc.Json.tests
8+
]

0 commit comments

Comments
 (0)