From 13b811e83ad9eb9c14d5fadd9964d437dc631502 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Markus=20L=C3=A4ll?= Date: Wed, 9 Nov 2022 17:27:07 +0200 Subject: [PATCH 01/11] Add fix and test for foldBlocks, backported to 1.35 release branch #4680 - Add hashes of genesis.json to node configuration - Add test for running foldBlocks on testnet --- cardano-testnet/cardano-testnet.cabal | 11 ++-- cardano-testnet/src/Testnet/Cardano.hs | 54 ++++++++++------ cardano-testnet/test/Main.hs | 3 + cardano-testnet/test/Test/FoldBlocks.hs | 84 +++++++++++++++++++++++++ 4 files changed, 130 insertions(+), 22 deletions(-) create mode 100644 cardano-testnet/test/Test/FoldBlocks.hs diff --git a/cardano-testnet/cardano-testnet.cabal b/cardano-testnet/cardano-testnet.cabal index eb65f1c3633..80ef948de65 100644 --- a/cardano-testnet/cardano-testnet.cabal +++ b/cardano-testnet/cardano-testnet.cabal @@ -33,6 +33,8 @@ library , bytestring , cardano-api , cardano-cli + , cardano-crypto-class + , cardano-ledger-byron , cardano-node , cardano-slotting , containers @@ -110,6 +112,7 @@ test-suite cardano-testnet-tests build-depends: cardano-testnet , aeson + , async , cardano-api , cardano-cli , containers @@ -123,16 +126,16 @@ test-suite cardano-testnet-tests , tasty-hedgehog , text , time + , transformers - other-modules: - Spec.Cli.Alonzo.LeadershipSchedule + other-modules: Spec.Cli.Alonzo.LeadershipSchedule Spec.Cli.Babbage.LeadershipSchedule Spec.Cli.KesPeriodInfo Spec.Node.Shutdown Spec.ShutdownOnSlotSynced - Testnet.Properties.Cli.KesPeriodInfo - + Test.FoldBlocks Test.Util + Testnet.Properties.Cli.KesPeriodInfo ghc-options: -threaded -rtsopts -with-rtsopts=-N -with-rtsopts=-T diff --git a/cardano-testnet/src/Testnet/Cardano.hs b/cardano-testnet/src/Testnet/Cardano.hs index cb8c90d1743..1431e9faa82 100644 --- a/cardano-testnet/src/Testnet/Cardano.hs +++ b/cardano-testnet/src/Testnet/Cardano.hs @@ -22,35 +22,28 @@ module Testnet.Cardano , testnet ) where -import Control.Applicative (pure) -import Control.Monad (Monad (..), fmap, forM, forM_, return, void, when, (=<<)) -import Control.Monad.IO.Class (liftIO) +import qualified Cardano.Crypto.Hash.Blake2b +import qualified Cardano.Crypto.Hash.Class +import Control.Monad +import Control.Monad.IO.Class (MonadIO, liftIO) +import Control.Monad.Trans.Except import Data.Aeson ((.=)) -import Data.Bool (Bool (..)) +import qualified Data.ByteString as BS import Data.ByteString.Lazy (ByteString) -import Data.Eq (Eq (..)) -import Data.Function (flip, id, ($), (.)) -import Data.Functor ((<$>), (<&>)) -import Data.Int (Int) +import Data.Functor ((<&>)) import Data.List ((\\)) -import Data.Maybe (Maybe (Just), fromJust) -import Data.Ord (Ord ((<=))) -import Data.Semigroup (Semigroup ((<>))) -import Data.String (IsString (fromString), String) -import GHC.Enum (Bounded, Enum) -import GHC.Float (Double) -import GHC.Num (Num ((+), (-))) -import GHC.Real (Integral (div), fromIntegral) +import Data.Maybe (fromJust) +import Data.String (IsString (fromString)) import Hedgehog.Extras.Stock.IO.Network.Sprocket (Sprocket (..)) import Hedgehog.Extras.Stock.Time (formatIso8601, showUTCTimeSeconds) import Ouroboros.Network.PeerSelection.LedgerPeers (UseLedgerAfter (..)) import Ouroboros.Network.PeerSelection.RelayAccessPoint (RelayAccessPoint (..)) +import Prelude import System.FilePath.Posix (()) import Test.Runtime (NodeLoggingFormat (..), PaymentKeyPair (..), PoolNode (PoolNode), PoolNodeKeys (..), TestnetNode (..), TestnetRuntime (..)) -import Text.Read (Read) -import Text.Show (Show (show)) +import Cardano.Chain.Genesis (GenesisHash (unGenesisHash), readGenesisData) import qualified Cardano.Node.Configuration.Topology as NonP2P import qualified Cardano.Node.Configuration.TopologyP2P as P2P import qualified Data.Aeson as J @@ -73,6 +66,7 @@ import qualified System.Directory as IO import qualified System.Info as OS import qualified System.IO as IO import qualified System.Process as IO + import qualified Test.Assert as H import qualified Test.Process as H import qualified Test.Runtime as TR @@ -732,6 +726,15 @@ testnet testnetOptions H.Conf {..} = do -- Generated a signed 'do it all' transaction: H.assertIO . IO.doesFileExist $ tempAbsPath "tx1.tx" + -- Add Byron, Shelley and Alonzo genesis hashes to node configuration + byronGenesisHash <- getByronGenesisHash $ tempAbsPath "byron/genesis.json" + shelleyGenesisHash <- getShelleyGenesisHash $ tempAbsPath "shelley/genesis.json" + alonzoGenesisHash <- getShelleyGenesisHash $ tempAbsPath "shelley/genesis.alonzo.json" + H.rewriteYamlFile (tempAbsPath "configuration.yaml") . J.rewriteObject + $ HM.insert "ByronGenesisHash" byronGenesisHash + . HM.insert "ShelleyGenesisHash" shelleyGenesisHash + . HM.insert "AlonzoGenesisHash" alonzoGenesisHash + -------------------------------- -- Launch cluster of three nodes @@ -863,3 +866,18 @@ testnet testnetOptions H.Conf {..} = do , wallets , delegators = [] -- TODO this should be populated } + +-- * Generate hashes for genesis.json files + +getByronGenesisHash :: (H.MonadTest m, MonadIO m) => FilePath -> m J.Value +getByronGenesisHash path = do + e <- runExceptT $ readGenesisData path + (_, genesisHash) <- H.leftFail e + let genesisHash' = J.toJSON $ unGenesisHash genesisHash + pure genesisHash' + +getShelleyGenesisHash :: (H.MonadTest m, MonadIO m) => FilePath -> m J.Value +getShelleyGenesisHash path = do + content <- liftIO $ BS.readFile path + let genesisHash = Cardano.Crypto.Hash.Class.hashWith id content :: Cardano.Crypto.Hash.Class.Hash Cardano.Crypto.Hash.Blake2b.Blake2b_256 BS.ByteString + pure $ J.toJSON genesisHash diff --git a/cardano-testnet/test/Main.hs b/cardano-testnet/test/Main.hs index e16bad434cc..e3e73d8ad17 100644 --- a/cardano-testnet/test/Main.hs +++ b/cardano-testnet/test/Main.hs @@ -15,6 +15,8 @@ import qualified Spec.ShutdownOnSlotSynced import qualified System.Environment as E import qualified Test.Tasty as T import qualified Test.Tasty.Ingredients as T + +import qualified Test.FoldBlocks import qualified Test.Util as H tests :: IO TestTree @@ -33,6 +35,7 @@ tests = pure $ T.testGroup "test/Spec.hs" -- TODO: Babbage temporarily ignored due to broken protocol-state query , H.disabled "kes-period-info" Spec.Cli.KesPeriodInfo.hprop_kes_period_info ] + , H.ignoreOnWindows "foldBlocks receives ledger state" Test.FoldBlocks.prop_foldBlocks ] ingredients :: [T.Ingredient] diff --git a/cardano-testnet/test/Test/FoldBlocks.hs b/cardano-testnet/test/Test/FoldBlocks.hs new file mode 100644 index 00000000000..8e2e1c92d37 --- /dev/null +++ b/cardano-testnet/test/Test/FoldBlocks.hs @@ -0,0 +1,84 @@ +{-# LANGUAGE OverloadedStrings #-} + +module Test.FoldBlocks where + +import qualified Control.Concurrent as IO +import Control.Concurrent.Async (async, link) +import Control.Exception (Exception, throw) +import Control.Monad (forever) +import Control.Monad.IO.Class (liftIO) +import Control.Monad.Trans.Except (runExceptT) +import qualified Data.Text as TS +import Prelude +import qualified System.Directory as IO +import System.FilePath (()) + +import qualified Hedgehog as H +import qualified Hedgehog.Extras.Stock.IO.Network.Sprocket as HE +import qualified Hedgehog.Extras.Test as HE +import qualified Hedgehog.Extras.Test.Base as H + +import qualified Cardano.Api as C +import qualified Test.Base as U +import qualified Test.Runtime as U +import qualified Testnet.Cardano as TN +import qualified Testnet.Conf as TC (Conf (..), ProjectBase (ProjectBase), + YamlFilePath (YamlFilePath), mkConf) + + +newtype FoldBlocksException = FoldBlocksException C.FoldBlocksError +instance Exception FoldBlocksException +instance Show FoldBlocksException where + show (FoldBlocksException a) = TS.unpack $ C.renderFoldBlocksError a + +-- | This test starts a testnet with wery short timing, then starts +-- `foldBlocks` in another thread to listen for ledger state, ledger +-- events and block, and on reception writes this to the `lock` `MVar` +-- that main thread blocks on. +prop_foldBlocks :: H.Property +prop_foldBlocks = U.integration . H.runFinallies . H.workspace "chairman" $ \tempAbsBasePath' -> do + + -- Start testnet + base <- HE.noteM $ liftIO . IO.canonicalizePath =<< HE.getProjectBase + configurationTemplate <- H.noteShow $ base "configuration/defaults/byron-mainnet/configuration.yaml" + conf <- HE.noteShowM $ + TC.mkConf (TC.ProjectBase base) (TC.YamlFilePath configurationTemplate) + (tempAbsBasePath' <> "/") + Nothing + + let options = TN.defaultTestnetOptions + -- NB! The `activeSlotsCoeff` value is very important for + -- chain extension for the two-node/one-pool testnet that + -- `defaultTestnetOptions` define. The default 0.2 often fails + -- to extend the chain in a reasonable time (< 90s, e.g as the + -- deadline is defined in Testnet.Cardano). + { TN.activeSlotsCoeff = 0.9 } + runtime <- TN.testnet options conf + + -- Get socketPath + socketPathAbs <- do + socketPath' <- HE.sprocketArgumentName <$> HE.headM (U.nodeSprocket <$> TN.bftNodes runtime) + H.note =<< liftIO (IO.canonicalizePath $ TC.tempAbsPath conf socketPath') + + configurationFile <- H.noteShow $ TC.tempAbsPath conf "configuration.yaml" + + -- Start foldBlocks in a separate thread + lock <- liftIO IO.newEmptyMVar + liftIO $ do + a <- async $ + -- The `forever` is here because `foldBlocks` drains blocks + -- until current slot and then quits -- even if there are no + -- permanent (= older than the k parameter) blocks created. In + -- that case we simply restart `foldBlocks` again. + forever $ do + let handler _env _ledgerState _ledgerEvents _blockInCardanoMode _ = IO.putMVar lock () + e <- runExceptT (C.foldBlocks configurationFile socketPathAbs C.QuickValidation () handler) + either (throw . FoldBlocksException) (\_ -> pure ()) e + link a -- Throw async thread's exceptions in main thread + + -- The `lock` is written to from within the `handler` above. It + -- tests that `foldBlocks` receives ledger state; once that happens, + -- handler is called, which then writes to the `lock` and allows the + -- test to finish. + _ <- liftIO $ IO.readMVar lock + H.assert True From 8e7b92f774a4337b06257b2dc6556125e2639af8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Markus=20L=C3=A4ll?= Date: Tue, 3 Jan 2023 18:22:04 +0200 Subject: [PATCH 02/11] Fix error `Illegal constraint: c NumberOfInputsPerTx` --- bench/tx-generator/src/Cardano/Benchmarking/Script/Setters.hs | 1 + 1 file changed, 1 insertion(+) diff --git a/bench/tx-generator/src/Cardano/Benchmarking/Script/Setters.hs b/bench/tx-generator/src/Cardano/Benchmarking/Script/Setters.hs index 8ebb63a0e3e..ab9e9af780f 100644 --- a/bench/tx-generator/src/Cardano/Benchmarking/Script/Setters.hs +++ b/bench/tx-generator/src/Cardano/Benchmarking/Script/Setters.hs @@ -7,6 +7,7 @@ {-# LANGUAGE MultiParamTypeClasses #-} {-# LANGUAGE ExistentialQuantification #-} {-# LANGUAGE StandaloneDeriving #-} +{-# LANGUAGE ConstraintKinds #-} module Cardano.Benchmarking.Script.Setters where From 5e8e63af870b086d1bafee65d1c325082afb65b6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Markus=20L=C3=A4ll?= Date: Tue, 3 Jan 2023 18:23:38 +0200 Subject: [PATCH 03/11] Run stylish-haskell --- .../src/Cardano/Benchmarking/Script/Setters.hs | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/bench/tx-generator/src/Cardano/Benchmarking/Script/Setters.hs b/bench/tx-generator/src/Cardano/Benchmarking/Script/Setters.hs index ab9e9af780f..8c58e63aed1 100644 --- a/bench/tx-generator/src/Cardano/Benchmarking/Script/Setters.hs +++ b/bench/tx-generator/src/Cardano/Benchmarking/Script/Setters.hs @@ -1,25 +1,25 @@ +{-# LANGUAGE ConstraintKinds #-} {-# LANGUAGE DeriveGeneric #-} +{-# LANGUAGE ExistentialQuantification #-} +{-# LANGUAGE FlexibleInstances #-} {-# LANGUAGE GADTs #-} +{-# LANGUAGE MultiParamTypeClasses #-} {-# LANGUAGE ScopedTypeVariables #-} +{-# LANGUAGE StandaloneDeriving #-} {-# LANGUAGE TemplateHaskell #-} {-# LANGUAGE TypeFamilies #-} -{-# LANGUAGE FlexibleInstances #-} -{-# LANGUAGE MultiParamTypeClasses #-} -{-# LANGUAGE ExistentialQuantification #-} -{-# LANGUAGE StandaloneDeriving #-} -{-# LANGUAGE ConstraintKinds #-} module Cardano.Benchmarking.Script.Setters where -import Prelude -import GHC.Generics import Data.Constraint.Extras.TH (deriveArgDict) -import Data.Dependent.Sum (DSum(..) , (==>) ) +import Data.Dependent.Sum (DSum (..), (==>)) import Data.GADT.Compare.TH (deriveGCompare, deriveGEq) import Data.GADT.Show.TH (deriveGShow) +import GHC.Generics +import Prelude -import Cardano.Api (SlotNo, Lovelace, NetworkId) +import Cardano.Api (Lovelace, NetworkId, SlotNo) import Cardano.Benchmarking.Types From 76a7879fbaab587d42e7783db763de4f4bda7a02 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Markus=20L=C3=A4ll?= Date: Wed, 4 Jan 2023 13:43:20 +0200 Subject: [PATCH 04/11] fixup! Fix error `Illegal constraint: c NumberOfInputsPerTx` --- .../src/Cardano/Benchmarking/Script/Store.hs | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/bench/tx-generator/src/Cardano/Benchmarking/Script/Store.hs b/bench/tx-generator/src/Cardano/Benchmarking/Script/Store.hs index 91ea22583e3..667a8cab74c 100644 --- a/bench/tx-generator/src/Cardano/Benchmarking/Script/Store.hs +++ b/bench/tx-generator/src/Cardano/Benchmarking/Script/Store.hs @@ -1,12 +1,13 @@ +{-# LANGUAGE ConstraintKinds #-} {-# LANGUAGE DeriveGeneric #-} +{-# LANGUAGE ExistentialQuantification #-} +{-# LANGUAGE FlexibleInstances #-} {-# LANGUAGE GADTs #-} +{-# LANGUAGE MultiParamTypeClasses #-} {-# LANGUAGE ScopedTypeVariables #-} +{-# LANGUAGE StandaloneDeriving #-} {-# LANGUAGE TemplateHaskell #-} {-# LANGUAGE TypeFamilies #-} -{-# LANGUAGE FlexibleInstances #-} -{-# LANGUAGE MultiParamTypeClasses #-} -{-# LANGUAGE ExistentialQuantification #-} -{-# LANGUAGE StandaloneDeriving #-} {-# LANGUAGE UndecidableInstances #-} module Cardano.Benchmarking.Script.Store @@ -22,10 +23,9 @@ import Cardano.Api as Cardano (Tx) import Cardano.Api.Shelley as Cardano (ProtocolParameters) import Cardano.Node.Protocol.Types (SomeConsensusProtocol) +import Cardano.Benchmarking.OuroborosImports as Cardano (LoggingLayer, PaymentKey, + ShelleyGenesis, SigningKey, StandardShelley) import Cardano.Benchmarking.Script.Setters as Setters -import Cardano.Benchmarking.OuroborosImports as Cardano - ( LoggingLayer, ShelleyGenesis, StandardShelley - , SigningKey, PaymentKey) import Cardano.Benchmarking.GeneratorTx as Core (AsyncBenchmarkControl) import qualified Cardano.Benchmarking.GeneratorTx.Tx as Core (Fund) From 020957034680620f50b54358cac6a02eec3dea37 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Markus=20L=C3=A4ll?= Date: Thu, 5 Jan 2023 15:26:54 +0200 Subject: [PATCH 05/11] trigger CI --- cardano-testnet/test/Test/FoldBlocks.hs | 1 - 1 file changed, 1 deletion(-) diff --git a/cardano-testnet/test/Test/FoldBlocks.hs b/cardano-testnet/test/Test/FoldBlocks.hs index 8e2e1c92d37..c0f265531b5 100644 --- a/cardano-testnet/test/Test/FoldBlocks.hs +++ b/cardano-testnet/test/Test/FoldBlocks.hs @@ -25,7 +25,6 @@ import qualified Testnet.Cardano as TN import qualified Testnet.Conf as TC (Conf (..), ProjectBase (ProjectBase), YamlFilePath (YamlFilePath), mkConf) - newtype FoldBlocksException = FoldBlocksException C.FoldBlocksError instance Exception FoldBlocksException instance Show FoldBlocksException where From 84deb7841d9918b083412cd387b02096d09b71a3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Markus=20L=C3=A4ll?= Date: Fri, 6 Jan 2023 15:03:51 +0200 Subject: [PATCH 06/11] trigger CI --- cardano-testnet/test/Test/FoldBlocks.hs | 1 + 1 file changed, 1 insertion(+) diff --git a/cardano-testnet/test/Test/FoldBlocks.hs b/cardano-testnet/test/Test/FoldBlocks.hs index c0f265531b5..8e2e1c92d37 100644 --- a/cardano-testnet/test/Test/FoldBlocks.hs +++ b/cardano-testnet/test/Test/FoldBlocks.hs @@ -25,6 +25,7 @@ import qualified Testnet.Cardano as TN import qualified Testnet.Conf as TC (Conf (..), ProjectBase (ProjectBase), YamlFilePath (YamlFilePath), mkConf) + newtype FoldBlocksException = FoldBlocksException C.FoldBlocksError instance Exception FoldBlocksException instance Show FoldBlocksException where From ac1507e7705796b4537659a0dc5dedd80d490c8e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Markus=20L=C3=A4ll?= Date: Mon, 9 Jan 2023 12:58:15 +0200 Subject: [PATCH 07/11] trigger CI --- cardano-testnet/test/Test/FoldBlocks.hs | 1 - 1 file changed, 1 deletion(-) diff --git a/cardano-testnet/test/Test/FoldBlocks.hs b/cardano-testnet/test/Test/FoldBlocks.hs index 8e2e1c92d37..c0f265531b5 100644 --- a/cardano-testnet/test/Test/FoldBlocks.hs +++ b/cardano-testnet/test/Test/FoldBlocks.hs @@ -25,7 +25,6 @@ import qualified Testnet.Cardano as TN import qualified Testnet.Conf as TC (Conf (..), ProjectBase (ProjectBase), YamlFilePath (YamlFilePath), mkConf) - newtype FoldBlocksException = FoldBlocksException C.FoldBlocksError instance Exception FoldBlocksException instance Show FoldBlocksException where From 9cb1acc47f08dc6ddcc3e1bd22b974200011beb6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Markus=20L=C3=A4ll?= Date: Mon, 9 Jan 2023 18:32:39 +0200 Subject: [PATCH 08/11] Remove nested folders for `workspace` in hedgehog-extras See: https://github.com/input-output-hk/hedgehog-extras/pull/18 --- cardano-node-chairman/test/Spec/Network.hs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/cardano-node-chairman/test/Spec/Network.hs b/cardano-node-chairman/test/Spec/Network.hs index 351bcb95976..6c58afae1df 100644 --- a/cardano-node-chairman/test/Spec/Network.hs +++ b/cardano-node-chairman/test/Spec/Network.hs @@ -33,7 +33,7 @@ import qualified System.Random as IO import qualified UnliftIO.Exception as IO hprop_isPortOpen_False :: Property -hprop_isPortOpen_False = H.propertyOnce . H.workspace "temp/network" $ \_ -> do +hprop_isPortOpen_False = H.propertyOnce . H.workspace "temp-network" $ \_ -> do -- Check multiple random ports and assert that one is closed. -- Multiple random ports are checked because there is a remote possibility a random -- port is actually open by another program @@ -42,7 +42,7 @@ hprop_isPortOpen_False = H.propertyOnce . H.workspace "temp/network" $ \_ -> do H.assert (False `L.elem` results) hprop_isPortOpen_True :: Property -hprop_isPortOpen_True = H.propertyOnce . H.workspace "temp/network" $ \_ -> do +hprop_isPortOpen_True = H.propertyOnce . H.workspace "temp-network" $ \_ -> do -- Check first random port from multiple possible ports to be successfully bound is open -- Multiple random ports are checked because there is a remote possibility a random -- port is actually open by another program From 3819f84bcc7d77d15c2bc73251fe7e23cc1d138d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Markus=20L=C3=A4ll?= Date: Fri, 13 Jan 2023 13:15:35 +0200 Subject: [PATCH 09/11] trigger CI --- cardano-testnet/test/Test/FoldBlocks.hs | 1 + 1 file changed, 1 insertion(+) diff --git a/cardano-testnet/test/Test/FoldBlocks.hs b/cardano-testnet/test/Test/FoldBlocks.hs index c0f265531b5..8e2e1c92d37 100644 --- a/cardano-testnet/test/Test/FoldBlocks.hs +++ b/cardano-testnet/test/Test/FoldBlocks.hs @@ -25,6 +25,7 @@ import qualified Testnet.Cardano as TN import qualified Testnet.Conf as TC (Conf (..), ProjectBase (ProjectBase), YamlFilePath (YamlFilePath), mkConf) + newtype FoldBlocksException = FoldBlocksException C.FoldBlocksError instance Exception FoldBlocksException instance Show FoldBlocksException where From dc5b793239d40b9894cade9cfdfb0ef3e3b1b7db Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Markus=20L=C3=A4ll?= Date: Fri, 13 Jan 2023 16:52:06 +0200 Subject: [PATCH 10/11] trigger CI --- cardano-testnet/test/Test/FoldBlocks.hs | 1 - 1 file changed, 1 deletion(-) diff --git a/cardano-testnet/test/Test/FoldBlocks.hs b/cardano-testnet/test/Test/FoldBlocks.hs index 8e2e1c92d37..c0f265531b5 100644 --- a/cardano-testnet/test/Test/FoldBlocks.hs +++ b/cardano-testnet/test/Test/FoldBlocks.hs @@ -25,7 +25,6 @@ import qualified Testnet.Cardano as TN import qualified Testnet.Conf as TC (Conf (..), ProjectBase (ProjectBase), YamlFilePath (YamlFilePath), mkConf) - newtype FoldBlocksException = FoldBlocksException C.FoldBlocksError instance Exception FoldBlocksException instance Show FoldBlocksException where From fe8aa12c7f25486ba92d19b596976a830fb17373 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Markus=20L=C3=A4ll?= Date: Fri, 20 Jan 2023 18:25:54 +0200 Subject: [PATCH 11/11] trigger CI --- cardano-testnet/test/Test/FoldBlocks.hs | 2 ++ 1 file changed, 2 insertions(+) diff --git a/cardano-testnet/test/Test/FoldBlocks.hs b/cardano-testnet/test/Test/FoldBlocks.hs index c0f265531b5..ca83b48a3a9 100644 --- a/cardano-testnet/test/Test/FoldBlocks.hs +++ b/cardano-testnet/test/Test/FoldBlocks.hs @@ -81,3 +81,5 @@ prop_foldBlocks = U.integration . H.runFinallies . H.workspace "chairman" $ \tem -- test to finish. _ <- liftIO $ IO.readMVar lock H.assert True + +