Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Restore onClusterStartup hook for cardano-testnet #1651

Draft
wants to merge 2 commits into
base: develop
Choose a base branch
from
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
38 changes: 19 additions & 19 deletions src/Internal/BalanceTx/ExUnitsAndMinFee.purs
Original file line number Diff line number Diff line change
Expand Up @@ -68,14 +68,7 @@ import Data.Foldable (foldMap)
import Data.Lens ((.~))
import Data.Lens.Getter ((^.))
import Data.Map (Map)
import Data.Map
( empty
, filterKeys
, fromFoldable
, lookup
, toUnfoldable
, union
) as Map
import Data.Map (empty, filterKeys, fromFoldable, lookup, toUnfoldable, union) as Map
import Data.Maybe (Maybe(Just, Nothing), fromMaybe, maybe)
import Data.Newtype (unwrap, wrap)
import Data.Set (Set)
Expand All @@ -84,6 +77,7 @@ import Data.Traversable (for, sum)
import Data.Tuple (snd)
import Data.Tuple.Nested (type (/\), (/\))
import Data.UInt as UInt
import Effect.Aff (attempt)
import Effect.Aff.Class (liftAff)
import Effect.Class (liftEffect)

Expand All @@ -104,19 +98,25 @@ evalTxExecutionUnits tx = do
worker :: Ogmios.AdditionalUtxoSet -> BalanceTxM Ogmios.TxEvaluationResult
worker additionalUtxos = do
queryHandle <- liftContract getQueryHandle
evalResult <-
unwrap <$> liftContract
(liftAff $ queryHandle.evaluateTx tx additionalUtxos)
case evalResult of
Right a -> pure a
Left (Ogmios.AdditionalUtxoOverlap overlappingUtxos) ->
-- Remove overlapping additional utxos and retry evaluation:
worker $ wrap $ Map.filterKeys (flip Array.notElem overlappingUtxos)
(unwrap additionalUtxos)
Left evalFailure | tx ^. _isValid ->
throwError $ ExUnitsEvaluationFailed tx evalFailure
evalResult' <-
map unwrap <$> liftContract
(liftAff $ attempt $ queryHandle.evaluateTx tx additionalUtxos)
case evalResult' of
Left err | tx ^. _isValid ->
liftAff $ throwError err
Left _ ->
pure $ wrap Map.empty
Right evalResult ->
case evalResult of
Right a -> pure a
Left (Ogmios.AdditionalUtxoOverlap overlappingUtxos) ->
-- Remove overlapping additional utxos and retry evaluation:
worker $ wrap $ Map.filterKeys (flip Array.notElem overlappingUtxos)
(unwrap additionalUtxos)
Left evalFailure | tx ^. _isValid -> do
throwError $ ExUnitsEvaluationFailed tx evalFailure
Left _ -> do
pure $ wrap Map.empty

-- Calculates the execution units needed for each script in the transaction
-- and the minimum fee, including the script fees.
Expand Down
7 changes: 2 additions & 5 deletions src/Internal/Contract/Hooks.purs
Original file line number Diff line number Diff line change
Expand Up @@ -6,11 +6,11 @@ module Ctl.Internal.Contract.Hooks

import Prelude

import Cardano.Types.PrivateKey (PrivateKey)
import Cardano.Types.Transaction (Transaction)
import Data.Maybe (Maybe(Nothing))
import Effect (Effect)
import Effect.Exception (Error)
import Node.Path (FilePath)

type Hooks =
{ beforeSign :: Maybe (Effect Unit)
Expand All @@ -22,10 +22,7 @@ type Hooks =
}

type ClusterParameters =
{ privateKeys :: Array PrivateKey
, nodeSocketPath :: String
, nodeConfigPath :: String
, privateKeysDirectory :: String
{ nodeSocketPath :: FilePath
}

emptyHooks :: Hooks
Expand Down
7 changes: 6 additions & 1 deletion src/Internal/Testnet/Contract.purs
Original file line number Diff line number Diff line change
Expand Up @@ -77,8 +77,8 @@ import Ctl.Internal.Testnet.Utils
import Data.Array (concat, fromFoldable, zip) as Array
import Data.Bifunctor (lmap)
import Data.Map (values) as Map
import Effect.Aff (apathize, try)
import Effect.Aff (bracket) as Aff
import Effect.Aff (try)
import Effect.Exception (error)
import Effect.Ref (Ref)
import Effect.Ref (new, read, write) as Ref
Expand Down Expand Up @@ -246,6 +246,11 @@ startTestnetContractEnv cfg distr cleanupRef = do
{ env, printLogs, clearLogs } <- makeClusterContractEnv cleanupRef cfg
let env' = env { networkId = TestnetId }
wallets <- mkWallets env' cluster
apathize $ liftEffect $
for_ env.hooks.onClusterStartup \onClusterStartup ->
onClusterStartup
{ nodeSocketPath: (unwrap cluster).paths.nodeSocketPath
}
pure
{ cluster
, env: env'
Expand Down
3 changes: 2 additions & 1 deletion test/Testnet.purs
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,7 @@ import Mote.Monad (mapTest)
import Mote.TestPlanM as Utils
import Test.Ctl.BalanceTx.ChangeGeneration as ChangeGeneration
import Test.Ctl.QueryM.AffInterface as QueryM.AffInterface
import Test.Ctl.Testnet.ClusterParameters (runTest) as ClusterParameters
import Test.Ctl.Testnet.Contract as Contract
import Test.Ctl.Testnet.Contract.Assert as Assert
import Test.Ctl.Testnet.Contract.Mnemonics as Mnemonics
Expand Down Expand Up @@ -63,7 +64,7 @@ main = interruptOnSignal SIGINT =<< launchAff do
UtxoDistribution.suite
testTestnetContracts config OgmiosMempool.suite
runTestnetTestPlan config SameWallets.suite
-- FIXME: ClusterParameters.runTest
ClusterParameters.runTest

{-
configWithMaxExUnits :: PlutipConfig
Expand Down
43 changes: 43 additions & 0 deletions test/Testnet/ClusterParameters.purs
Original file line number Diff line number Diff line change
@@ -0,0 +1,43 @@
module Test.Ctl.Testnet.ClusterParameters
( mkSuite
, runTest
) where

import Prelude

import Contract.Log (logDebug')
import Contract.Test (ContractTest, withWallets)
import Contract.Test.Mote (TestPlanM)
import Contract.Test.Testnet (defaultTestnetConfig, testTestnetContracts)
import Ctl.Internal.Contract.Hooks (ClusterParameters)
import Data.Maybe (Maybe(Just))
import Effect.Aff (Aff)
import Effect.Class (liftEffect)
import Effect.Ref (Ref)
import Effect.Ref as Ref
import Mote (group, test)
import Test.Spec.Assertions (shouldNotEqual)

runTest :: TestPlanM (Aff Unit) Unit
runTest = do
clusterParamsRef <-
liftEffect $ Ref.new
{ nodeSocketPath: mempty
}
testTestnetContracts
defaultTestnetConfig
{ hooks = defaultTestnetConfig.hooks
{ onClusterStartup = Just (flip Ref.write clusterParamsRef)
}
}
(mkSuite clusterParamsRef)

mkSuite :: Ref ClusterParameters -> TestPlanM ContractTest Unit
mkSuite ref = do
group "ClusterParameters" do
test "Reading cardano-testnet cluster parameters" do
withWallets unit \_ -> do
clusterParams <- liftEffect $ Ref.read ref
clusterParams.nodeSocketPath `shouldNotEqual` mempty
logDebug' $ "ClusterParameters: " <> show clusterParams
pure unit