Skip to content

Commit

Permalink
Add unit tests which verify that we can use latest Plutus primitives …
Browse files Browse the repository at this point in the history
…(readbit, writebit) in mockchain.
  • Loading branch information
koslambrou committed Nov 12, 2024
1 parent 11f0a75 commit ca6c23c
Show file tree
Hide file tree
Showing 6 changed files with 369 additions and 89 deletions.
27 changes: 19 additions & 8 deletions src/devnet/convex-devnet.cabal
Original file line number Diff line number Diff line change
Expand Up @@ -88,32 +88,43 @@ library
, contra-tracer
, iohk-monitoring

other-modules:
Paths_convex_devnet
autogen-modules:
Paths_convex_devnet
other-modules:
Paths_convex_devnet
autogen-modules:
Paths_convex_devnet

test-suite convex-devnet-test
import: lang
type: exitcode-stdio-1.0
main-is: Spec.hs
ghc-options: -threaded -rtsopts
other-modules:
Devnet.Test.LatestEraTransitionSpec
Devnet.Test.LatestEraTransitionSpec.PV2
Devnet.Test.LatestEraTransitionSpec.PV3
hs-source-dirs:
test
build-depends:
base >= 4.14.0
, tasty
, tasty-hunit
, convex-devnet
, convex-base
, convex-node-client
, convex-wallet
, convex-coin-selection
, convex-mockchain
build-depends:
, plutus-tx
, plutus-tx-plugin
, ouroboros-consensus-cardano
, plutus-core
, ouroboros-consensus-protocol
, cardano-api
, contra-tracer
, cardano-ledger-api
, cardano-ledger-core -any
build-depends:
base >= 4.14.0
, tasty
, tasty-hunit
, contra-tracer
, lens
, mtl
, aeson
Expand Down
100 changes: 100 additions & 0 deletions src/devnet/test/Devnet/Test/LatestEraTransitionSpec.hs
Original file line number Diff line number Diff line change
@@ -0,0 +1,100 @@
{-# LANGUAGE DataKinds #-}
{-# LANGUAGE DeriveAnyClass #-}
{-# LANGUAGE DeriveGeneric #-}
{-# LANGUAGE DerivingStrategies #-}
{-# LANGUAGE GADTs #-}
{-# LANGUAGE LambdaCase #-}
{-# LANGUAGE NamedFieldPuns #-}
{-# LANGUAGE OverloadedStrings #-}
{-# LANGUAGE TemplateHaskell #-}
{-# LANGUAGE TypeApplications #-}

module Devnet.Test.LatestEraTransitionSpec
( tests
) where

import qualified Cardano.Api as C
import qualified Cardano.Api.Ledger as L
import Control.Lens ((&), (.~))
import Convex.BuildTx (execBuildTx,
mintPlutus)
import Convex.Class (MonadMockchain)
import Convex.CoinSelection (ChangeOutputPosition (TrailingChange))
import Convex.MockChain.CoinSelection (tryBalanceAndSubmit)
import qualified Convex.MockChain.Defaults as Defaults
import Convex.MockChain.Utils (mockchainFails,
mockchainFailsWith,
mockchainSucceeds)
import qualified Convex.NodeParams as Params
import Convex.Utils (failOnError)
import qualified Convex.Wallet.MockWallet as Wallet
import qualified Devnet.Test.LatestEraTransitionSpec.PV2 as LatestEraTransitionSpec.PV2
import qualified Devnet.Test.LatestEraTransitionSpec.PV3 as LatestEraTransitionSpec.PV3
import qualified PlutusTx.Builtins as BI
import Test.Tasty (TestTree, testGroup)
import Test.Tasty.HUnit (testCase)

tests :: TestTree
tests = do
testGroup "Latest era and protocol version tests"
[ testCase "usingReadBitInPlutusV2AndProtVer9ShouldFailSpec" usingReadBitInPlutusV2AndProtVer9ShouldFailSpec
, testCase "usingWriteBitInPlutusV2AndProtVer9ShouldFailSpec" usingWriteBitInPlutusV2AndProtVer9ShouldFailSpec
, testCase "usingReadBitInPlutusV3AndProtVer9ShouldFailSpec" usingReadBitInPlutusV3AndProtVer9ShouldFailSpec
, testCase "usingWriteBitInPlutusV3AndProtVer9ShouldFailSpec" usingWriteBitInPlutusV3AndProtVer9ShouldFailSpec
, testCase "usingReadBitInPlutusV2AndLatestProtVerShouldPassSpec" usingReadBitInPlutusV2AndLatestProtVerShouldPassSpec
, testCase "usingWriteBitInPlutusV2AndLatestProtVerShouldPassSpec" usingWriteBitInPlutusV2AndLatestProtVerShouldPassSpec
, testCase "usingReadBitInPlutusV3AndLatestProtVerShouldPassSpec" usingReadBitInPlutusV3AndLatestProtVerShouldPassSpec
, testCase "usingWriteBitInPlutusV3AndLatestProtVerShouldPassSpec" usingWriteBitInPlutusV3AndLatestProtVerShouldPassSpec
]

pv9NodeParams :: Params.NodeParams C.ConwayEra
pv9NodeParams =
Defaults.nodeParams
& Params.ledgerProtocolParameters . Params.protocolParameters . L.ppProtocolVersionL .~ L.ProtVer (toEnum 9) 0

usingReadBitInPlutusV2AndProtVer9ShouldFailSpec :: IO ()
usingReadBitInPlutusV2AndProtVer9ShouldFailSpec = do
mockchainFailsWith pv9NodeParams (mintTokenScriptTest (LatestEraTransitionSpec.PV2.readBitTestMintingPolicyScriptPV2 $ BI.mkB "0xF4")) (const $ pure ())

usingWriteBitInPlutusV2AndProtVer9ShouldFailSpec :: IO ()
usingWriteBitInPlutusV2AndProtVer9ShouldFailSpec = do
mockchainFailsWith pv9NodeParams (mintTokenScriptTest (LatestEraTransitionSpec.PV2.writeBitTestMintingPolicyScriptPV2 $ BI.mkB "0xFF")) (const $ pure ())

usingReadBitInPlutusV3AndProtVer9ShouldFailSpec :: IO ()
usingReadBitInPlutusV3AndProtVer9ShouldFailSpec = do
mockchainFailsWith pv9NodeParams (mintTokenScriptTest (LatestEraTransitionSpec.PV3.readBitTestMintingPolicyScriptPV3 $ BI.mkB "0xF4")) (const $ pure ())

usingWriteBitInPlutusV3AndProtVer9ShouldFailSpec :: IO ()
usingWriteBitInPlutusV3AndProtVer9ShouldFailSpec = do
mockchainFailsWith pv9NodeParams (mintTokenScriptTest (LatestEraTransitionSpec.PV3.writeBitTestMintingPolicyScriptPV3 $ BI.mkB "0xFF")) (const $ pure ())

usingReadBitInPlutusV2AndLatestProtVerShouldPassSpec :: IO ()
usingReadBitInPlutusV2AndLatestProtVerShouldPassSpec = do
mockchainFails (mintTokenScriptTest (LatestEraTransitionSpec.PV2.readBitTestMintingPolicyScriptPV2 $ BI.mkB "0xF4")) (const $ pure ())

usingWriteBitInPlutusV2AndLatestProtVerShouldPassSpec :: IO ()
usingWriteBitInPlutusV2AndLatestProtVerShouldPassSpec = do
mockchainFails (mintTokenScriptTest (LatestEraTransitionSpec.PV2.writeBitTestMintingPolicyScriptPV2 $ BI.mkB "0xFF")) (const $ pure ())

usingReadBitInPlutusV3AndLatestProtVerShouldPassSpec :: IO ()
usingReadBitInPlutusV3AndLatestProtVerShouldPassSpec = do
mockchainSucceeds (mintTokenScriptTest (LatestEraTransitionSpec.PV3.readBitTestMintingPolicyScriptPV3 $ BI.mkB "0xF4"))

usingWriteBitInPlutusV3AndLatestProtVerShouldPassSpec :: IO ()
usingWriteBitInPlutusV3AndLatestProtVerShouldPassSpec = do
mockchainSucceeds (mintTokenScriptTest (LatestEraTransitionSpec.PV3.writeBitTestMintingPolicyScriptPV3 $ BI.mkB "0xFF"))

mintTokenScriptTest ::
( MonadMockchain era m
, C.IsPlutusScriptLanguage lang
, C.HasScriptLanguageInEra lang era
, C.IsBabbageBasedEra era
, MonadFail m
)
=> C.PlutusScript lang
-> m (C.Tx era)
mintTokenScriptTest script = do
let txb =
execBuildTx $
mintPlutus script () (C.AssetName "ProtVer10Test") 1
failOnError $ tryBalanceAndSubmit mempty Wallet.w1 txb TrailingChange []
53 changes: 53 additions & 0 deletions src/devnet/test/Devnet/Test/LatestEraTransitionSpec/PV2.hs
Original file line number Diff line number Diff line change
@@ -0,0 +1,53 @@
{-# LANGUAGE BangPatterns #-}
{-# LANGUAGE DataKinds #-}
{-# LANGUAGE DeriveAnyClass #-}
{-# LANGUAGE DeriveGeneric #-}
{-# LANGUAGE DerivingStrategies #-}
{-# LANGUAGE GADTs #-}
{-# LANGUAGE LambdaCase #-}
{-# LANGUAGE NamedFieldPuns #-}
{-# LANGUAGE OverloadedStrings #-}
{-# LANGUAGE TemplateHaskell #-}
{-# LANGUAGE TypeApplications #-}

{-# OPTIONS_GHC -fplugin-opt PlutusTx.Plugin:target-version=1.0.0 #-}
{-# OPTIONS_GHC -fplugin-opt PlutusTx.Plugin:preserve-logging #-}

module Devnet.Test.LatestEraTransitionSpec.PV2
( readBitTestMintingPolicyScriptPV2
, writeBitTestMintingPolicyScriptPV2
) where

import qualified Cardano.Api as C
import Convex.PlutusTx (compiledCodeToScript)
import qualified PlutusCore.Version as Version
import PlutusTx (CompiledCode)
import qualified PlutusTx
import qualified PlutusTx.Builtins.Internal as BI
import qualified PlutusTx.Prelude as PlutusTx

{-# INLINABLE readBitTestMintingPolicy #-}
readBitTestMintingPolicy :: PlutusTx.BuiltinData -> PlutusTx.BuiltinData -> PlutusTx.BuiltinData -> PlutusTx.BuiltinUnit
readBitTestMintingPolicy d _ _ =
if PlutusTx.readBit (BI.unsafeDataAsB d) 2 then BI.unitval else PlutusTx.error ()

readBitTestMintingPolicyScriptPV2 :: PlutusTx.BuiltinData -> C.PlutusScript C.PlutusScriptV2
readBitTestMintingPolicyScriptPV2 = compiledCodeToScript . readBitTestMintingPolicyCompiled
where
readBitTestMintingPolicyCompiled :: PlutusTx.BuiltinData -> CompiledCode (PlutusTx.BuiltinData -> PlutusTx.BuiltinData -> PlutusTx.BuiltinUnit)
readBitTestMintingPolicyCompiled str =
$$(PlutusTx.compile [|| \str' r c -> readBitTestMintingPolicy str' r c ||])
`PlutusTx.unsafeApplyCode` PlutusTx.liftCode Version.plcVersion100 str

{-# INLINABLE writeBitTestMintingPolicy #-}
writeBitTestMintingPolicy :: PlutusTx.BuiltinData -> PlutusTx.BuiltinData -> PlutusTx.BuiltinData -> PlutusTx.BuiltinUnit
writeBitTestMintingPolicy d _ _ =
let !_ = PlutusTx.writeBits (BI.unsafeDataAsB d) [0] False in BI.unitval

writeBitTestMintingPolicyScriptPV2 :: PlutusTx.BuiltinData -> C.PlutusScript C.PlutusScriptV2
writeBitTestMintingPolicyScriptPV2 = compiledCodeToScript . writeBitTestMintingPolicyCompiled
where
writeBitTestMintingPolicyCompiled :: PlutusTx.BuiltinData -> CompiledCode (PlutusTx.BuiltinData -> PlutusTx.BuiltinData -> PlutusTx.BuiltinUnit)
writeBitTestMintingPolicyCompiled str =
$$(PlutusTx.compile [|| \str' r c -> writeBitTestMintingPolicy str' r c ||])
`PlutusTx.unsafeApplyCode` PlutusTx.liftCode Version.plcVersion100 str
53 changes: 53 additions & 0 deletions src/devnet/test/Devnet/Test/LatestEraTransitionSpec/PV3.hs
Original file line number Diff line number Diff line change
@@ -0,0 +1,53 @@
{-# LANGUAGE BangPatterns #-}
{-# LANGUAGE DataKinds #-}
{-# LANGUAGE DeriveAnyClass #-}
{-# LANGUAGE DeriveGeneric #-}
{-# LANGUAGE DerivingStrategies #-}
{-# LANGUAGE GADTs #-}
{-# LANGUAGE LambdaCase #-}
{-# LANGUAGE NamedFieldPuns #-}
{-# LANGUAGE OverloadedStrings #-}
{-# LANGUAGE TemplateHaskell #-}
{-# LANGUAGE TypeApplications #-}

{-# OPTIONS_GHC -fplugin-opt PlutusTx.Plugin:target-version=1.1.0 #-}
{-# OPTIONS_GHC -fplugin-opt PlutusTx.Plugin:preserve-logging #-}

module Devnet.Test.LatestEraTransitionSpec.PV3
( readBitTestMintingPolicyScriptPV3
, writeBitTestMintingPolicyScriptPV3
) where

import qualified Cardano.Api as C
import Convex.PlutusTx (compiledCodeToScript)
import qualified PlutusCore.Version as Version
import PlutusTx (CompiledCode)
import qualified PlutusTx
import qualified PlutusTx.Builtins.Internal as BI
import qualified PlutusTx.Prelude as PlutusTx

{-# INLINABLE readBitTestMintingPolicy #-}
readBitTestMintingPolicy :: PlutusTx.BuiltinData -> PlutusTx.BuiltinData -> PlutusTx.BuiltinUnit
readBitTestMintingPolicy d _ =
if PlutusTx.readBit (BI.unsafeDataAsB d) 2 then BI.unitval else PlutusTx.error ()

readBitTestMintingPolicyScriptPV3 :: PlutusTx.BuiltinData -> C.PlutusScript C.PlutusScriptV3
readBitTestMintingPolicyScriptPV3 = compiledCodeToScript . readBitTestMintingPolicyCompiled
where
readBitTestMintingPolicyCompiled :: PlutusTx.BuiltinData -> CompiledCode (PlutusTx.BuiltinData -> PlutusTx.BuiltinUnit)
readBitTestMintingPolicyCompiled str =
$$(PlutusTx.compile [|| \str' c -> readBitTestMintingPolicy str' c ||])
`PlutusTx.unsafeApplyCode` PlutusTx.liftCode Version.plcVersion110 str

{-# INLINABLE writeBitTestMintingPolicy #-}
writeBitTestMintingPolicy :: PlutusTx.BuiltinData -> PlutusTx.BuiltinData -> PlutusTx.BuiltinUnit
writeBitTestMintingPolicy d _ =
let !_ = PlutusTx.writeBits (BI.unsafeDataAsB d) [0] False in BI.unitval

writeBitTestMintingPolicyScriptPV3 :: PlutusTx.BuiltinData -> C.PlutusScript C.PlutusScriptV3
writeBitTestMintingPolicyScriptPV3 = compiledCodeToScript . writeBitTestMintingPolicyCompiled
where
writeBitTestMintingPolicyCompiled :: PlutusTx.BuiltinData -> CompiledCode (PlutusTx.BuiltinData -> PlutusTx.BuiltinUnit)
writeBitTestMintingPolicyCompiled str =
$$(PlutusTx.compile [|| \str' c -> writeBitTestMintingPolicy str' c ||])
`PlutusTx.unsafeApplyCode` PlutusTx.liftCode Version.plcVersion110 str
Loading

0 comments on commit ca6c23c

Please sign in to comment.