Skip to content

Commit 0ac5f32

Browse files
committed
Improve test output.
1 parent 289f905 commit 0ac5f32

File tree

6 files changed

+69
-74
lines changed

6 files changed

+69
-74
lines changed

Diff for: .github/workflows/haskell.yml

+5-1
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,10 @@ jobs:
2424
strategy:
2525
fail-fast: false
2626
matrix:
27+
# Add more elements to this list to run multiple instances of the build in CI. Increasing the
28+
# number instances is a good way to trigger flaky build failures
29+
n: [1]
30+
2731
ghc: ["8.10.7"]
2832
os: [ubuntu-latest, macos-latest, windows-latest]
2933

@@ -257,7 +261,7 @@ jobs:
257261
if: ${{ always() }}
258262
continue-on-error: true
259263
with:
260-
name: chairman-test-artifacts-${{ matrix.os }}-${{ matrix.ghc }}
264+
name: chairman-test-artifacts-${{ matrix.os }}-${{ matrix.n }}-${{ matrix.ghc }}
261265
path: ${{ runner.temp }}/chairman/
262266

263267
release:

Diff for: cardano-testnet/src/Testnet/Byron.hs

+1-1
Original file line numberDiff line numberDiff line change
@@ -237,7 +237,7 @@ testnet testnetOptions H.Conf {..} = do
237237
sprocket <- H.noteShow $ Sprocket tempBaseAbsPath (socketDir </> "node-" <> si)
238238
_spocketSystemNameFile <- H.noteShow $ IO.sprocketSystemName sprocket
239239
-- TODO: Better error message need to indicate a sprocket was not created
240-
H.assertByDeadlineM deadline $ H.doesSprocketExist sprocket
240+
H.byDeadlineM 10 deadline $ H.assertM $ H.doesSprocketExist sprocket
241241

242242
forM_ nodeIndexes $ \i -> do
243243
si <- H.noteShow $ show @Int i

Diff for: cardano-testnet/src/Testnet/Cardano.hs

+1-1
Original file line numberDiff line numberDiff line change
@@ -833,7 +833,7 @@ testnet testnetOptions H.Conf {..} = do
833833
forM_ allNodeNames $ \node -> do
834834
sprocket <- H.noteShow $ Sprocket tempBaseAbsPath (socketDir </> node)
835835
_spocketSystemNameFile <- H.noteShow $ IO.sprocketSystemName sprocket
836-
H.assertByDeadlineM deadline $ H.doesSprocketExist sprocket
836+
H.byDeadlineM 10 deadline $ H.assertM $ H.doesSprocketExist sprocket
837837

838838
forM_ allNodeNames $ \node -> do
839839
nodeStdoutFile <- H.noteTempFile logDir $ node <> ".stdout.log"

Diff for: cardano-testnet/src/Testnet/Shelley.hs

+1-1
Original file line numberDiff line numberDiff line change
@@ -454,7 +454,7 @@ testnet testnetOptions H.Conf {..} = do
454454
forM_ allNodes $ \node -> do
455455
sprocket <- H.noteShow $ Sprocket tempBaseAbsPath (socketDir </> node)
456456
_spocketSystemNameFile <- H.noteShow $ IO.sprocketSystemName sprocket
457-
H.assertByDeadlineM deadline $ H.doesSprocketExist sprocket
457+
H.byDeadlineM 10 deadline $ H.assertM $ H.doesSprocketExist sprocket
458458

459459
forM_ allNodes $ \node -> do
460460
nodeStdoutFile <- H.noteTempFile logDir $ node <> ".stdout.log"

Diff for: cardano-testnet/src/Testnet/Utils.hs

+3-4
Original file line numberDiff line numberDiff line change
@@ -10,20 +10,19 @@ module Testnet.Utils
1010
import Cardano.Api
1111
import Prelude
1212

13+
import Cardano.CLI.Shelley.Output
1314
import Control.Concurrent (threadDelay)
1415
import Control.Exception.Safe (MonadCatch)
1516
import Control.Monad
1617
import Control.Monad.IO.Class
1718
import Data.Aeson (fromJSON)
1819
import GHC.Stack
20+
import Hedgehog.Extras.Test.Process (ExecConfig)
21+
import Hedgehog.Internal.Property (MonadTest)
1922
import System.Directory (doesFileExist, removeFile)
2023

21-
import Cardano.CLI.Shelley.Output
22-
2324
import qualified Hedgehog.Extras.Test.Base as H
2425
import qualified Hedgehog.Extras.Test.File as H
25-
import Hedgehog.Extras.Test.Process (ExecConfig)
26-
import Hedgehog.Internal.Property (MonadTest)
2726
import qualified Test.Process as H
2827

2928

Diff for: cardano-testnet/test/Spec/Cli/KesPeriodInfo.hs

+58-66
Original file line numberDiff line numberDiff line change
@@ -8,44 +8,42 @@ module Spec.Cli.KesPeriodInfo
88
( hprop_kes_period_info
99
) where
1010

11-
12-
import Prelude
13-
1411
import Cardano.Api
15-
import Cardano.Api.Shelley
16-
12+
import Cardano.Api.Shelley (PoolId)
1713
import Control.Monad (void)
18-
import qualified Data.Aeson as J
19-
import qualified Data.Map.Strict as Map
2014
import Data.Monoid (Last (..))
2115
import Data.Set (Set)
22-
import qualified Data.Set as Set
23-
import qualified Data.Text as T
2416
import GHC.Stack (callStack)
25-
import qualified System.Directory as IO
17+
import Hedgehog (Property, (===))
18+
import Prelude
2619
import System.Environment (getEnvironment)
2720
import System.FilePath ((</>))
2821

2922
import Cardano.CLI.Shelley.Output
3023
import Cardano.CLI.Shelley.Run.Query
3124

32-
import Hedgehog (Property, (===))
25+
import Testnet.Cardano (TestnetOptions (..), TestnetRuntime (..), defaultTestnetOptions,
26+
testnet)
27+
import Testnet.Utils (waitUntilEpoch)
28+
29+
import qualified Data.Aeson as J
30+
import qualified Data.Map.Strict as Map
31+
import qualified Data.Set as Set
32+
import qualified Data.Text as T
3333
import qualified Hedgehog as H
3434
import qualified Hedgehog.Extras.Stock.IO.Network.Sprocket as IO
3535
import qualified Hedgehog.Extras.Test.Base as H
36-
import qualified Hedgehog.Extras.Test.Concurrent as H
3736
import qualified Hedgehog.Extras.Test.File as H
3837
import qualified Hedgehog.Extras.Test.Process as H
38+
import qualified System.Directory as IO
3939
import qualified System.Info as SYS
4040
import qualified Test.Base as H
4141
import qualified Test.Process as H
4242
import qualified Test.Runtime as TR
4343
import qualified Testnet.Cardano as TC
44-
import Testnet.Cardano (TestnetOptions (..), TestnetRuntime (..),
45-
defaultTestnetNodeOptions, defaultTestnetOptions, testnet)
44+
import Testnet.Cardano (defaultTestnetNodeOptions)
4645
import qualified Testnet.Conf as H
4746
import Testnet.Conf (ProjectBase (..), YamlFilePath (..))
48-
import Testnet.Utils (waitUntilEpoch)
4947

5048
import Testnet.Properties.Cli.KesPeriodInfo
5149

@@ -107,7 +105,7 @@ hprop_kes_period_info = H.integration . H.runFinallies . H.workspace "chairman"
107105

108106
utxo1Json <- H.leftFailM . H.readJsonFile $ work </> "utxo-1.json"
109107
UTxO utxo1 <- H.noteShowM $ H.jsonErrorFail $ J.fromJSON @(UTxO AlonzoEra) utxo1Json
110-
txin <- H.noteShow $ head $ Map.keys utxo1
108+
txin <- H.noteShow =<< H.headM (Map.keys utxo1)
111109

112110
-- Staking keys
113111
utxoStakingVkey2 <- H.note $ tempAbsPath </> "shelley/utxo-keys/utxo2-stake.vkey"
@@ -188,27 +186,24 @@ hprop_kes_period_info = H.integration . H.runFinallies . H.workspace "chairman"
188186
, "--testnet-magic", show @Int testnetMagic
189187
]
190188

191-
-- Things take long on non-linux machines
192-
if H.isLinux
193-
then H.threadDelay 5000000
194-
else H.threadDelay 10000000
189+
delegsAndRewards <- H.byDurationM 3 12 $ do
190+
-- Check to see if pledge's stake address was registered
195191

196-
-- Check to see if pledge's stake address was registered
197-
198-
void $ H.execCli' execConfig
199-
[ "query", "stake-address-info"
200-
, "--address", poolownerstakeaddr
201-
, "--testnet-magic", show @Int testnetMagic
202-
, "--out-file", work </> "pledgeownerregistration.json"
203-
]
192+
void $ H.execCli' execConfig
193+
[ "query", "stake-address-info"
194+
, "--address", poolownerstakeaddr
195+
, "--testnet-magic", show @Int testnetMagic
196+
, "--out-file", work </> "pledgeownerregistration.json"
197+
]
204198

205-
pledgerStakeInfo <- H.leftFailM . H.readJsonFile $ work </> "pledgeownerregistration.json"
206-
delegsAndRewardsMap <- H.noteShowM $ H.jsonErrorFail $ J.fromJSON @DelegationsAndRewards pledgerStakeInfo
207-
let delegsAndRewards = mergeDelegsAndRewards delegsAndRewardsMap
199+
pledgerStakeInfo <- H.leftFailM . H.readJsonFile $ work </> "pledgeownerregistration.json"
200+
delegsAndRewardsMap <- H.noteShowM $ H.jsonErrorFail $ J.fromJSON @DelegationsAndRewards pledgerStakeInfo
201+
delegsAndRewards <- H.noteShow $ mergeDelegsAndRewards delegsAndRewardsMap
208202

209-
length delegsAndRewards === 1
203+
length delegsAndRewards === 1
204+
return delegsAndRewards
210205

211-
let (pledgerSAddr, _rewards, _poolId) = head delegsAndRewards
206+
(pledgerSAddr, _rewards, _poolId) <- H.headM delegsAndRewards
212207

213208
-- Pledger and owner are and can be the same
214209
T.unpack (serialiseAddress pledgerSAddr) === poolownerstakeaddr
@@ -227,7 +222,7 @@ hprop_kes_period_info = H.integration . H.runFinallies . H.workspace "chairman"
227222

228223
utxoWithStaking1Json <- H.leftFailM . H.readJsonFile $ work </> "utxo-addr-with-staking-1.json"
229224
UTxO utxoWithStaking1 <- H.noteShowM $ H.jsonErrorFail $ J.fromJSON @(UTxO AlonzoEra) utxoWithStaking1Json
230-
txinForStakeReg <- H.noteShow $ head $ Map.keys utxoWithStaking1
225+
txinForStakeReg <- H.noteShow =<< H.headM (Map.keys utxoWithStaking1)
231226

232227
void $ H.execCli [ "stake-address", "registration-certificate"
233228
, "--stake-verification-key-file", utxoStakingVkey2
@@ -262,21 +257,21 @@ hprop_kes_period_info = H.integration . H.runFinallies . H.workspace "chairman"
262257
]
263258

264259
H.note_ $ "Check to see if " <> utxoStakingVkey2 <> " was registered..."
265-
H.threadDelay 10000000
266260

267-
void $ H.execCli' execConfig
268-
[ "query", "stake-address-info"
269-
, "--address", utxostakingaddr
270-
, "--testnet-magic", show @Int testnetMagic
271-
, "--out-file", work </> "stake-address-info-utxo-staking-vkey-2.json"
272-
]
273-
274-
userStakeAddrInfoJSON <- H.leftFailM . H.readJsonFile $ work </> "stake-address-info-utxo-staking-vkey-2.json"
275-
delegsAndRewardsMapUser <- H.noteShowM $ H.jsonErrorFail $ J.fromJSON @DelegationsAndRewards userStakeAddrInfoJSON
276-
let delegsAndRewardsUser = mergeDelegsAndRewards delegsAndRewardsMapUser
277-
userStakeAddrInfo = filter (\(sAddr,_,_) -> utxostakingaddr == T.unpack (serialiseAddress sAddr)) delegsAndRewardsUser
278-
(userSAddr, _rewards, _poolId) = head userStakeAddrInfo
261+
userSAddr <- H.byDurationM 3 12 $ do
262+
void $ H.execCli' execConfig
263+
[ "query", "stake-address-info"
264+
, "--address", utxostakingaddr
265+
, "--testnet-magic", show @Int testnetMagic
266+
, "--out-file", work </> "stake-address-info-utxo-staking-vkey-2.json"
267+
]
279268

269+
userStakeAddrInfoJSON <- H.leftFailM . H.readJsonFile $ work </> "stake-address-info-utxo-staking-vkey-2.json"
270+
delegsAndRewardsMapUser <- H.noteShowM $ H.jsonErrorFail $ J.fromJSON @DelegationsAndRewards userStakeAddrInfoJSON
271+
delegsAndRewardsUser <- H.noteShow $ mergeDelegsAndRewards delegsAndRewardsMapUser
272+
userStakeAddrInfo <- H.noteShow $ filter (\(sAddr,_,_) -> utxostakingaddr == T.unpack (serialiseAddress sAddr)) delegsAndRewardsUser
273+
(userSAddr, _rewards, _poolId) <- H.headM userStakeAddrInfo
274+
return userSAddr
280275

281276
H.note_ $ "Check staking key: " <> show utxoStakingVkey2 <> " was registered"
282277
T.unpack (serialiseAddress userSAddr) === utxostakingaddr
@@ -295,7 +290,7 @@ hprop_kes_period_info = H.integration . H.runFinallies . H.workspace "chairman"
295290

296291
utxo2Json <- H.leftFailM . H.readJsonFile $ work </> "utxo-2.json"
297292
UTxO utxo2 <- H.noteShowM $ H.jsonErrorFail $ J.fromJSON @(UTxO AlonzoEra) utxo2Json
298-
txin2 <- H.noteShow $ head $ Map.keys utxo2
293+
txin2 <- H.noteShow =<< H.headM (Map.keys utxo2)
299294

300295
H.note_ "Create delegation certificate of pledger"
301296

@@ -337,22 +332,19 @@ hprop_kes_period_info = H.integration . H.runFinallies . H.workspace "chairman"
337332
, "--testnet-magic", show @Int testnetMagic
338333
]
339334

340-
if H.isLinux
341-
then H.threadDelay 5000000
342-
else H.threadDelay 20000000
343-
344-
void $ H.execCli' execConfig
345-
[ "query", "stake-pools"
346-
, "--testnet-magic", show @Int testnetMagic
347-
, "--out-file", work </> "current-registered.pools.json"
348-
]
335+
H.byDurationM 3 12 $ do
336+
void $ H.execCli' execConfig
337+
[ "query", "stake-pools"
338+
, "--testnet-magic", show @Int testnetMagic
339+
, "--out-file", work </> "current-registered.pools.json"
340+
]
349341

350-
currRegPools <- H.leftFailM . H.readJsonFile $ work </> "current-registered.pools.json"
351-
poolIds <- H.noteShowM $ H.jsonErrorFail $ J.fromJSON @(Set PoolId) currRegPools
352-
poolId <- H.noteShow $ head $ Set.toList poolIds
342+
currRegPools <- H.leftFailM . H.readJsonFile $ work </> "current-registered.pools.json"
343+
poolIds <- H.noteShowM $ H.jsonErrorFail $ J.fromJSON @(Set PoolId) currRegPools
344+
poolId <- H.noteShow =<< H.headM (Set.toList poolIds)
353345

354-
H.note_ "Check stake pool was successfully registered"
355-
T.unpack (serialiseToBech32 poolId) === stakePoolId
346+
H.note_ "Check stake pool was successfully registered"
347+
T.unpack (serialiseToBech32 poolId) === stakePoolId
356348

357349
H.note_ "Check pledge was successfully delegated"
358350
void $ H.execCli' execConfig
@@ -364,9 +356,10 @@ hprop_kes_period_info = H.integration . H.runFinallies . H.workspace "chairman"
364356

365357
pledgeStakeAddrInfoJSON <- H.leftFailM . H.readJsonFile $ work </> "pledge-stake-address-info.json"
366358
delegsAndRewardsMapPledge <- H.noteShowM $ H.jsonErrorFail $ J.fromJSON @DelegationsAndRewards pledgeStakeAddrInfoJSON
367-
let delegsAndRewardsPledge = mergeDelegsAndRewards delegsAndRewardsMapPledge
368-
pledgeStakeAddrInfo = filter (\(sAddr,_,_) -> poolownerstakeaddr == T.unpack (serialiseAddress sAddr)) delegsAndRewardsPledge
369-
(pledgeSAddr, _rewards, pledgerDelegPoolId) = head pledgeStakeAddrInfo
359+
delegsAndRewardsPledge <- H.noteShow $ mergeDelegsAndRewards delegsAndRewardsMapPledge
360+
pledgeStakeAddrInfo <- H.noteShow $ filter (\(sAddr,_,_) -> poolownerstakeaddr == T.unpack (serialiseAddress sAddr)) delegsAndRewardsPledge
361+
362+
(pledgeSAddr, _rewards, pledgerDelegPoolId) <- H.headM pledgeStakeAddrInfo
370363

371364
H.note_ "Check pledge has been delegated to pool"
372365
case pledgerDelegPoolId of
@@ -467,4 +460,3 @@ hprop_kes_period_info = H.integration . H.runFinallies . H.workspace "chairman"
467460
-- TODO: Linking to the node log file like this is fragile.
468461
spoLogFile <- H.note $ tempAbsPath </> "logs/node-pool1.stdout.log"
469462
prop_node_minted_block spoLogFile
470-

0 commit comments

Comments
 (0)