Skip to content

Commit ffd68e0

Browse files
committed
add more tests for multiAsset whitelist
1 parent 13c1ece commit ffd68e0

File tree

17 files changed

+203
-195
lines changed

17 files changed

+203
-195
lines changed

Diff for: cardano-chain-gen/cardano-chain-gen.cabal

+1-1
Original file line numberDiff line numberDiff line change
@@ -61,6 +61,7 @@ library
6161
build-depends: base >= 4.14 && < 5
6262
, async
6363
, aeson
64+
, base16-bytestring
6465
, bytestring
6566
, cardano-binary
6667
, cardano-crypto-class
@@ -198,7 +199,6 @@ test-suite cardano-chain-gen
198199
, stm
199200
, strict-stm
200201
, tasty
201-
, tasty-expected-failure
202202
, tasty-quickcheck
203203
, text
204204
, transformers

Diff for: cardano-chain-gen/src/Cardano/Mock/Forging/Tx/Alonzo/ScriptsExamples.hs

+11
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@ module Cardano.Mock.Forging.Tx.Alonzo.ScriptsExamples (
2323
alwaysMintScriptHash,
2424
alwaysMintScriptAddr,
2525
alwaysMintScriptStake,
26+
alwaysMintScriptHashRandomPolicyVal,
2627
scriptHash,
2728
assetNames,
2829
plutusData2,
@@ -47,6 +48,7 @@ import Codec.Serialise
4748
import Codec.Serialise.Encoding
4849
import Data.ByteString.Short
4950
import Data.Maybe
51+
import Numeric.Natural (Natural)
5052
import Ouroboros.Consensus.Cardano.Block (StandardAlonzo)
5153
import qualified PlutusCore.Data as Plutus
5254
import qualified PlutusLedgerApi.Test.Examples as Plutus
@@ -103,6 +105,15 @@ alwaysMintScriptStake = ScriptHashObj alwaysMintScriptHash
103105
mkPlutusScriptEra :: AlonzoEraScript era => PlutusBinary -> AlonzoScript era
104106
mkPlutusScriptEra sh = PlutusScript $ fromJust $ mkBinaryPlutusScript PlutusV1 sh
105107

108+
alwaysMintScriptHashRandomPolicyVal :: Natural -> ScriptHash StandardCrypto
109+
alwaysMintScriptHashRandomPolicyVal n = scriptHash @StandardAlonzo $ alwaysMintRandomScript n
110+
111+
alwaysMintRandomScript :: AlonzoEraScript era => Natural -> AlonzoScript era
112+
alwaysMintRandomScript n = mkPlutusScriptEra $ alwaysMintRandomPlutusBinary n
113+
114+
alwaysMintRandomPlutusBinary :: Natural -> PlutusBinary
115+
alwaysMintRandomPlutusBinary n = PlutusBinary $ Plutus.alwaysFailingNAryFunction n
116+
106117
scriptHash ::
107118
forall era.
108119
( EraCrypto era ~ StandardCrypto

Diff for: cardano-chain-gen/src/Cardano/Mock/Query.hs

+10
Original file line numberDiff line numberDiff line change
@@ -6,10 +6,13 @@ module Cardano.Mock.Query (
66
queryNullTxDepositExists,
77
queryMultiAssetCount,
88
queryTxMetadataCount,
9+
queryMultiAssetMetadataPolicy,
910
) where
1011

1112
import qualified Cardano.Db as Db
1213
import Cardano.Prelude hiding (from)
14+
import qualified Data.ByteString.Base16 as Base16
15+
import Data.ByteString.Short (ShortByteString, toShort)
1316
import Database.Esqueleto.Experimental
1417
import Prelude ()
1518

@@ -68,3 +71,10 @@ queryTxMetadataCount = do
6871
pure countRows
6972

7073
pure $ maybe 0 unValue res
74+
75+
queryMultiAssetMetadataPolicy :: MonadIO io => ReaderT SqlBackend io (Maybe ShortByteString)
76+
queryMultiAssetMetadataPolicy = do
77+
res <- selectOne $ do
78+
metadataPolicy <- from $ table @Db.MultiAsset
79+
pure $ metadataPolicy ^. Db.MultiAssetPolicy
80+
pure $ toShort . Base16.encode . unValue <$> res

Diff for: cardano-chain-gen/test/Test/Cardano/Db/Mock/Config.hs

+11
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,7 @@ module Test.Cardano.Db.Mock.Config (
4242
withCustomConfigAndLogs,
4343
withFullConfig',
4444
replaceConfigFile,
45+
expectFailSilent,
4546
) where
4647

4748
import Cardano.Api (NetworkMagic (..))
@@ -84,6 +85,9 @@ import Ouroboros.Consensus.Shelley.Node (ShelleyLeaderCredentials)
8485
import System.Directory (createDirectoryIfMissing, removePathForcibly)
8586
import System.FilePath.Posix (takeDirectory, (</>))
8687
import System.IO.Silently (hSilence)
88+
import Test.Tasty.HUnit (Assertion, testCase, assertFailure)
89+
import Control.Exception (catch)
90+
import Test.Tasty (TestTree)
8791

8892
data Config = Config
8993
{ topLevelConfig :: TopLevelConfig CardanoBlock
@@ -516,3 +520,10 @@ replaceConfigFile newFilename dbSync@DBSyncEnv {..} = do
516520
configDir = mkConfigDir . takeDirectory . unConfigFile . enpConfigFile $ dbSyncParams
517521
newParams =
518522
dbSyncParams {enpConfigFile = ConfigFile $ configDir </> newFilename}
523+
524+
expectFailSilent :: String -> Assertion -> TestTree
525+
expectFailSilent name action = testCase name $ do
526+
result <- catch (Right <$> action) (\(_ :: SomeException) -> pure $ Left ())
527+
case result of
528+
Left _ -> pure () -- Test failed as expected, do nothing
529+
Right _ -> assertFailure "Expected test to fail but it succeeded"

Diff for: cardano-chain-gen/test/Test/Cardano/Db/Mock/Unit/Babbage.hs

+5-5
Original file line numberDiff line numberDiff line change
@@ -9,9 +9,9 @@ module Test.Cardano.Db.Mock.Unit.Babbage (
99
import Cardano.Mock.ChainSync.Server (IOManager)
1010
import Data.Text (Text)
1111
import Test.Tasty (TestTree, testGroup)
12-
import Test.Tasty.ExpectedFailure (expectFail)
1312
import Test.Tasty.HUnit (Assertion, testCase)
1413

14+
import Test.Cardano.Db.Mock.Config (expectFailSilent)
1515
import qualified Test.Cardano.Db.Mock.Unit.Babbage.CommandLineArg.ConfigFile as ConfigFile
1616
import qualified Test.Cardano.Db.Mock.Unit.Babbage.CommandLineArg.EpochDisabled as EpochDisabled
1717
import qualified Test.Cardano.Db.Mock.Unit.Babbage.CommandLineArg.ForceIndex as ForceIndex
@@ -45,9 +45,9 @@ unitTests iom knownMigrations =
4545
, test "no pruning and rollback" MigrateConsumedPruneTxOut.noPruneAndRollBack
4646
, test "prune same block" MigrateConsumedPruneTxOut.pruneSameBlock
4747
, test "no pruning same block" MigrateConsumedPruneTxOut.noPruneSameBlock
48-
, expectFail $ test "restart with new consumed set to false" MigrateConsumedPruneTxOut.migrateAndPruneRestart
49-
, expectFail $ test "set prune flag, restart missing prune flag" MigrateConsumedPruneTxOut.pruneRestartMissingFlag
50-
, expectFail $ test "set bootstrap flag, restart missing bootstrap flag" MigrateConsumedPruneTxOut.bootstrapRestartMissingFlag
48+
, expectFailSilent "restart with new consumed set to false" $ MigrateConsumedPruneTxOut.migrateAndPruneRestart iom knownMigrations
49+
, expectFailSilent "set prune flag, restart missing prune flag" $ MigrateConsumedPruneTxOut.pruneRestartMissingFlag iom knownMigrations
50+
, expectFailSilent "set bootstrap flag, restart missing bootstrap flag" $ MigrateConsumedPruneTxOut.bootstrapRestartMissingFlag iom knownMigrations
5151
]
5252
]
5353
, testGroup
@@ -63,7 +63,7 @@ unitTests iom knownMigrations =
6363
"Command Line Arguments"
6464
[ testGroup
6565
"config"
66-
[ expectFail $ test "fails if incorrect config file given" ConfigFile.checkConfigFileArg
66+
[ expectFailSilent "fails if incorrect config file given" $ ConfigFile.checkConfigFileArg iom knownMigrations
6767
]
6868
, testGroup
6969
"disable-epoch"

Diff for: cardano-chain-gen/test/Test/Cardano/Db/Mock/Unit/Conway.hs

+6-17
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ module Test.Cardano.Db.Mock.Unit.Conway (unitTests) where
22

33
import Cardano.Mock.ChainSync.Server (IOManager ())
44
import Cardano.Prelude
5+
import Test.Cardano.Db.Mock.Config (expectFailSilent)
56
import qualified Test.Cardano.Db.Mock.Unit.Conway.CommandLineArg.ConfigFile as ConfigFile
67
import qualified Test.Cardano.Db.Mock.Unit.Conway.CommandLineArg.EpochDisabled as EpochDisabled
78
import qualified Test.Cardano.Db.Mock.Unit.Conway.CommandLineArg.ForceIndex as ForceIndex
@@ -16,7 +17,6 @@ import qualified Test.Cardano.Db.Mock.Unit.Conway.Simple as Simple
1617
import qualified Test.Cardano.Db.Mock.Unit.Conway.Stake as Stake
1718
import qualified Test.Cardano.Db.Mock.Unit.Conway.Tx as Tx
1819
import Test.Tasty (TestTree (), testGroup)
19-
import Test.Tasty.ExpectedFailure (expectFail)
2020
import Test.Tasty.HUnit (Assertion (), testCase)
2121
import Prelude (String ())
2222

@@ -44,18 +44,9 @@ unitTests iom knownMigrations =
4444
, test "no pruning and rollback" MigrateConsumedPruneTxOut.noPruneAndRollBack
4545
, test "prune same block" MigrateConsumedPruneTxOut.pruneSameBlock
4646
, test "no pruning same block" MigrateConsumedPruneTxOut.noPruneSameBlock
47-
, expectFail $
48-
test
49-
"restart with new consumed set to false"
50-
MigrateConsumedPruneTxOut.migrateAndPruneRestart
51-
, expectFail $
52-
test
53-
"set prune flag, restart missing prune flag"
54-
MigrateConsumedPruneTxOut.pruneRestartMissingFlag
55-
, expectFail $
56-
test
57-
"set bootstrap flag, restart missing bootstrap flag"
58-
MigrateConsumedPruneTxOut.bootstrapRestartMissingFlag
47+
, expectFailSilent "restart with new consumed set to false" $ MigrateConsumedPruneTxOut.migrateAndPruneRestart iom knownMigrations
48+
, expectFailSilent "set prune flag, restart missing prune flag" $ MigrateConsumedPruneTxOut.pruneRestartMissingFlag iom knownMigrations
49+
, expectFailSilent "set bootstrap flag, restart missing bootstrap flag" $ MigrateConsumedPruneTxOut.bootstrapRestartMissingFlag iom knownMigrations
5950
]
6051
]
6152
, testGroup
@@ -71,10 +62,7 @@ unitTests iom knownMigrations =
7162
"Command Line Arguments"
7263
[ testGroup
7364
"config"
74-
[ expectFail $
75-
test
76-
"fails if incorrect config file given"
77-
ConfigFile.checkConfigFileArg
65+
[ expectFailSilent "fails if incorrect config file given" $ ConfigFile.checkConfigFileArg iom knownMigrations
7866
]
7967
, testGroup
8068
"disable-epoch"
@@ -174,6 +162,7 @@ unitTests iom knownMigrations =
174162
, test "mint many multi assets" Plutus.mintMultiAssets
175163
, test "swap many multi assets" Plutus.swapMultiAssets
176164
, test "swap with multi assets disabled" Plutus.swapMultiAssetsDisabled
165+
, test "add multi assets with whitelist" Plutus.addTxMultiAssetsWhitelist
177166
]
178167
, testGroup
179168
"Pools and smash"

Diff for: cardano-chain-gen/test/Test/Cardano/Db/Mock/Unit/Conway/Plutus.hs

+130-32
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
{-# LANGUAGE NumericUnderscores #-}
2+
{-# LANGUAGE OverloadedStrings #-}
23
{-# LANGUAGE TypeApplications #-}
34

45
module Test.Cardano.Db.Mock.Unit.Conway.Plutus (
@@ -28,10 +29,13 @@ module Test.Cardano.Db.Mock.Unit.Conway.Plutus (
2829
mintMultiAssets,
2930
swapMultiAssets,
3031
swapMultiAssetsDisabled,
32+
addTxMultiAssetsWhitelist,
3133
) where
3234

3335
import Cardano.Crypto.Hash.Class (hashToBytes)
3436
import qualified Cardano.Db as DB
37+
import Cardano.DbSync.Config (SyncNodeConfig (..))
38+
import Cardano.DbSync.Config.Types (MultiAssetConfig (..), SyncInsertOptions (..))
3539
import Cardano.DbSync.Era.Shelley.Generic.Util (renderAddress)
3640
import Cardano.Ledger.Coin (Coin (..))
3741
import Cardano.Ledger.Mary.Value (MaryValue (..), MultiAsset (..), PolicyID (..))
@@ -42,8 +46,10 @@ import Cardano.Mock.Forging.Interpreter (withConwayLedgerState)
4246
import qualified Cardano.Mock.Forging.Tx.Alonzo.ScriptsExamples as Examples
4347
import qualified Cardano.Mock.Forging.Tx.Conway as Conway
4448
import Cardano.Mock.Forging.Types
45-
import Cardano.Mock.Query (queryMultiAssetCount)
49+
import Cardano.Mock.Query (queryMultiAssetCount, queryMultiAssetMetadataPolicy)
4650
import Cardano.Prelude hiding (head)
51+
import Data.ByteString.Short (toShort)
52+
import Data.List.NonEmpty (fromList)
4753
import qualified Data.Map as Map
4854
import Data.Maybe.Strict (StrictMaybe (..))
4955
import Ouroboros.Consensus.Shelley.Eras (StandardConway ())
@@ -763,41 +769,133 @@ swapMultiAssets =
763769
testLabel = "conwaySwapMultiAssets"
764770

765771
swapMultiAssetsDisabled :: IOManager -> [(Text, Text)] -> Assertion
766-
swapMultiAssetsDisabled =
767-
withCustomConfig args Nothing cfgDir testLabel $ \interpreter mockServer dbSync -> do
768-
startDBSync dbSync
772+
swapMultiAssetsDisabled ioManager metadata = do
773+
syncNodeConfig <- mksNodeConfig
774+
withCustomConfig cmdlArgs (Just syncNodeConfig) cfgDir testLabel action ioManager metadata
775+
where
776+
action = \interpreter mockServer dbSync -> do
777+
startDBSync dbSync
778+
779+
-- Forge a block with multiple multi-asset scripts
780+
void $ Api.withConwayFindLeaderAndSubmit interpreter mockServer $ \state' -> do
781+
let policy = PolicyID Examples.alwaysMintScriptHash
782+
assets = Map.singleton (Prelude.head Examples.assetNames) 1
783+
mintedValue = MultiAsset $ Map.singleton policy assets
784+
outValue = MaryValue (Coin 20) (MultiAsset $ Map.singleton policy assets)
785+
786+
-- Forge a multi-asset script
787+
tx0 <-
788+
Conway.mkMultiAssetsScriptTx
789+
[UTxOIndex 0]
790+
(UTxOIndex 1)
791+
[(UTxOAddress Examples.alwaysSucceedsScriptAddr, outValue)]
792+
[]
793+
mintedValue
794+
True
795+
100
796+
state'
769797

770-
-- Forge a block with multiple multi-asset scripts
771-
void $ Api.withConwayFindLeaderAndSubmit interpreter mockServer $ \state' -> do
772-
let policy = PolicyID Examples.alwaysMintScriptHash
773-
assets = Map.singleton (Prelude.head Examples.assetNames) 1
774-
mintedValue = MultiAsset $ Map.singleton policy assets
775-
outValue = MaryValue (Coin 20) (MultiAsset $ Map.singleton policy assets)
798+
pure [tx0]
776799

777-
-- Forge a multi-asset script
778-
tx0 <-
779-
Conway.mkMultiAssetsScriptTx
780-
[UTxOIndex 0]
781-
(UTxOIndex 1)
782-
[(UTxOAddress Examples.alwaysSucceedsScriptAddr, outValue)]
783-
[]
784-
mintedValue
785-
True
786-
100
787-
state'
800+
-- Wait for it to sync
801+
assertBlockNoBackoff dbSync 1
802+
-- Verify multi-assets
803+
assertEqBackoff dbSync queryMultiAssetCount 0 [] "Unexpected multi-assets"
788804

789-
pure [tx0]
805+
cmdlArgs = initCommandLineArgs {claFullMode = False}
790806

791-
-- Wait for it to sync
792-
assertBlockNoBackoff dbSync 1
793-
-- Verify multi-assets
794-
assertEqBackoff dbSync queryMultiAssetCount 0 [] "Unexpected multi-assets"
795-
where
796-
args =
797-
initCommandLineArgs
798-
{ claConfigFilename = "test-db-sync-config-no-multi-assets.json"
799-
, claFullMode = False
800-
}
807+
mksNodeConfig :: IO SyncNodeConfig
808+
mksNodeConfig = do
809+
initConfigFile <- mkSyncNodeConfig cfgDir cmdlArgs
810+
let dncInsertOptions' = dncInsertOptions initConfigFile
811+
pure $
812+
initConfigFile
813+
{ dncInsertOptions = dncInsertOptions' {sioMultiAsset = MultiAssetDisable}
814+
}
801815

802816
testLabel = "conwayConfigMultiAssetsDisabled"
803817
cfgDir = conwayConfigDir
818+
819+
addTxMultiAssetsWhitelist :: IOManager -> [(Text, Text)] -> Assertion
820+
addTxMultiAssetsWhitelist ioManager metadata = do
821+
syncNodeConfig <- mksNodeConfig
822+
withCustomConfig args (Just syncNodeConfig) cfgDir testLabel action ioManager metadata
823+
where
824+
action = \interpreter mockServer dbSync -> do
825+
startDBSync dbSync
826+
-- Forge a block with multiple multi-asset scripts
827+
void $ Api.withConwayFindLeaderAndSubmit interpreter mockServer $ \state' -> do
828+
let assetsMinted =
829+
Map.fromList [(head Examples.assetNames, 10), (Examples.assetNames !! 1, 4)]
830+
policy0 = PolicyID $ Examples.alwaysMintScriptHashRandomPolicyVal 1
831+
policy1 = PolicyID $ Examples.alwaysMintScriptHashRandomPolicyVal 2
832+
mintValue =
833+
MultiAsset $
834+
Map.fromList [(policy0, assetsMinted), (policy1, assetsMinted)]
835+
assets =
836+
Map.fromList [(head Examples.assetNames, 5), (Examples.assetNames !! 1, 2)]
837+
outValue =
838+
MaryValue (Coin 20) $
839+
MultiAsset $
840+
Map.fromList [(policy0, assets), (policy1, assets)]
841+
842+
-- Forge a multi-asset script
843+
tx0 <-
844+
Conway.mkMultiAssetsScriptTx
845+
[UTxOIndex 0]
846+
(UTxOIndex 1)
847+
[ (UTxOAddress Examples.alwaysSucceedsScriptAddr, outValue)
848+
, (UTxOAddress Examples.alwaysMintScriptAddr, outValue)
849+
]
850+
[]
851+
mintValue
852+
True
853+
100
854+
state'
855+
856+
-- Consume the outputs from tx0
857+
let utxos = Conway.mkUTxOConway tx0
858+
tx1 <-
859+
Conway.mkMultiAssetsScriptTx
860+
[UTxOPair (head utxos), UTxOPair (utxos !! 1), UTxOIndex 2]
861+
(UTxOIndex 3)
862+
[ (UTxOAddress Examples.alwaysSucceedsScriptAddr, outValue)
863+
, (UTxOAddress Examples.alwaysMintScriptAddr, outValue)
864+
, (UTxOAddressNew 0, outValue)
865+
, (UTxOAddressNew 0, outValue)
866+
]
867+
[]
868+
mintValue
869+
True
870+
200
871+
state'
872+
pure [tx0, tx1]
873+
874+
-- Verify script counts
875+
assertBlockNoBackoff dbSync 1
876+
assertAlonzoCounts dbSync (2, 4, 1, 2, 4, 2, 0, 0)
877+
-- create 4 multi-assets but only 2 should be added due to the whitelist
878+
assertEqBackoff dbSync queryMultiAssetCount 2 [] "Expected 2 multi-assets"
879+
-- do the policy match the whitelist
880+
assertEqBackoff dbSync queryMultiAssetMetadataPolicy (Just policyShortBs) [] "Expected correct policy in db"
881+
882+
args = initCommandLineArgs {claFullMode = False}
883+
testLabel = "conwayConfigMultiAssetsWhitelist"
884+
885+
cfgDir = conwayConfigDir
886+
887+
policyShortBs = toShort "4509cdddad21412c22c9164e10bc6071340ba235562f1575a35ded4d"
888+
889+
mksNodeConfig :: IO SyncNodeConfig
890+
mksNodeConfig = do
891+
initConfigFile <- mkSyncNodeConfig cfgDir args
892+
let dncInsertOptions' = dncInsertOptions initConfigFile
893+
pure $
894+
initConfigFile
895+
{ dncInsertOptions =
896+
dncInsertOptions'
897+
{ sioMultiAsset =
898+
MultiAssetPolicies $
899+
fromList [policyShortBs]
900+
}
901+
}

0 commit comments

Comments
 (0)