-
Notifications
You must be signed in to change notification settings - Fork 15
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
- Loading branch information
Showing
9 changed files
with
887 additions
and
0 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
150 changes: 150 additions & 0 deletions
150
cardano-cli/test/cardano-cli-test/Test/Cli/CheckNodeConfiguration.hs
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,150 @@ | ||
{-# LANGUAGE GADTs #-} | ||
{-# LANGUAGE ScopedTypeVariables #-} | ||
|
||
module Test.Cli.CheckNodeConfiguration where | ||
|
||
import Cardano.Api | ||
|
||
import qualified Cardano.CLI.Run.Debug.CheckNodeConfiguration as CNC | ||
|
||
import Control.Monad (forM_) | ||
import qualified Data.Aeson as Aeson | ||
import qualified Data.Aeson.Encode.Pretty as Aeson | ||
import qualified Data.Aeson.Key as Aeson | ||
import qualified Data.Aeson.KeyMap as Aeson | ||
import qualified Data.ByteString.Lazy as LBS | ||
import Data.List (isInfixOf) | ||
import qualified Data.Text as Text | ||
import qualified Data.Yaml as Yaml | ||
import GHC.IO.Exception (ExitCode (..)) | ||
import System.FilePath ((</>)) | ||
|
||
import Test.Cardano.CLI.Util (FileSem, bracketSem, execCardanoCLI, execDetailCardanoCLI, | ||
newFileSem) | ||
|
||
import Hedgehog (Property) | ||
import qualified Hedgehog as H | ||
import Hedgehog.Extras (propertyOnce) | ||
import qualified Hedgehog.Extras as H | ||
|
||
-- | Semaphore protecting against locked file error, when running properties concurrently. | ||
nodeConfigSem :: FileSem | ||
nodeConfigSem = newFileSem "test/cardano-cli-test/files/input/check-node-configuration/node-config.json" | ||
{-# NOINLINE nodeConfigSem #-} | ||
|
||
-- Execute this test with: | ||
-- @cabal test cardano-cli-test --test-options '-p "/check node configuration success/"'@ | ||
hprop_check_node_configuration_success :: Property | ||
hprop_check_node_configuration_success = | ||
propertyOnce $ do | ||
-- We test that the command doesn't crash, because otherwise | ||
-- execCardanoCLI would fail. | ||
bracketSem nodeConfigSem $ \nodeConfigFile -> do | ||
H.noteM_ $ | ||
execCardanoCLI | ||
[ "debug" | ||
, "check-node-configuration" | ||
, "--node-configuration-file" | ||
, nodeConfigFile | ||
] | ||
|
||
data FiddleKind | ||
= FiddleByron | ||
| FiddleNonByron | ||
deriving (Bounded, Enum) | ||
|
||
-- Execute this test with: | ||
-- @cabal test cardano-cli-test --test-options '-p "/check node configuration fiddle/"'@ | ||
hprop_check_node_configuration_fiddle :: Property | ||
hprop_check_node_configuration_fiddle = do | ||
let supplyValues :: [(FilePath, FiddleKind)] = | ||
[ (path, fiddleKind) | ||
| path <- | ||
[ "test/cardano-cli-test/files/input/check-node-configuration/node-config.json" | ||
, "test/cardano-cli-test/files/input/check-node-configuration/node-config.yaml" | ||
] | ||
, fiddleKind <- [minBound .. maxBound] | ||
] | ||
|
||
propertyOnce $ forM_ supplyValues $ \(nodeConfigPath, fiddleKind) -> H.moduleWorkspace "tmp" $ \tempDir -> | ||
bracketSem nodeConfigSem $ \_ -> do | ||
let finalInputConfig = tempDir </> "node-config-changed.json" | ||
-- TODO why is that writing to "AlonzoGenesisHash" writes one more 0 than specified here? (and hence the need for this hack) | ||
wrongHash = Text.pack $ replicate (case fiddleKind of FiddleByron -> 65; FiddleNonByron -> 64) '0' | ||
|
||
-- Install the genesis files in the sandbox | ||
forM_ | ||
[AnyCardanoEra ByronEra, AnyCardanoEra AlonzoEra, AnyCardanoEra ConwayEra, AnyCardanoEra ShelleyEra] | ||
$ \(AnyCardanoEra era) -> do | ||
let filename = Text.unpack $ "genesis." <> Text.toLower (CNC.eraToStringKey era) <> ".spec.json" | ||
genesisFile = "test/cardano-cli-test/files/input/check-node-configuration" </> filename | ||
H.copyFile genesisFile (tempDir </> filename) | ||
|
||
-- We make a hash value incorrect, and check that | ||
-- check-node-configuration finds the mistake. | ||
-- | ||
-- Then we call with --fix, and check that the command goes through | ||
|
||
nodeConfigValue :: Aeson.Value <- Yaml.decodeFileThrow nodeConfigPath | ||
nodeConfigObject :: Aeson.Object <- | ||
case nodeConfigValue of | ||
Aeson.Object obj -> pure obj | ||
_ -> | ||
do | ||
H.note_ "Expected an Object, but got something else" | ||
H.failure | ||
|
||
-- We make a hash value incorrect, and check that | ||
-- check-node-configuration finds the mistake. | ||
-- | ||
-- Then we call with --fix, and check that the command goes through | ||
-- when calling it again | ||
|
||
-- Prepare file with incorrect hash | ||
|
||
let fiddledEraKey = | ||
Aeson.fromText $ CNC.eraToGenesisHashKey $ case fiddleKind of | ||
FiddleByron -> AnyCardanoEra ByronEra | ||
FiddleNonByron -> AnyCardanoEra AlonzoEra | ||
finalConfigObject = | ||
Aeson.Object $ Aeson.insert fiddledEraKey (Aeson.String wrongHash) nodeConfigObject | ||
|
||
-- Write file with incorrect hash | ||
liftIO $ LBS.writeFile finalInputConfig $ Aeson.encodePretty finalConfigObject | ||
|
||
(exitCode, _stdout, stderr) <- | ||
H.noteShowM $ | ||
execDetailCardanoCLI | ||
[ "debug" | ||
, "check-node-configuration" | ||
, "--node-configuration-file" | ||
, finalInputConfig | ||
] | ||
|
||
H.assertWith exitCode (ExitSuccess /=) | ||
H.assertWith stderr ("Wrong genesis hash" `isInfixOf`) | ||
|
||
-- Fix the hashes | ||
H.noteM_ $ | ||
execCardanoCLI | ||
[ "debug" | ||
, "check-node-configuration" | ||
, "--node-configuration-file" | ||
, finalInputConfig | ||
, "--fix" | ||
] | ||
|
||
-- Now call without --fix, to check that the command goes through | ||
H.noteM_ $ | ||
execCardanoCLI | ||
[ "debug" | ||
, "check-node-configuration" | ||
, "--node-configuration-file" | ||
, finalInputConfig | ||
] | ||
|
||
-- Finally check that the fixed file is the same as the original | ||
|
||
reloadedNodeConfigValue :: Aeson.Value <- H.readJsonFileOk finalInputConfig | ||
|
||
reloadedNodeConfigValue H.=== nodeConfigValue |
194 changes: 194 additions & 0 deletions
194
...o-cli/test/cardano-cli-test/files/input/check-node-configuration/genesis.alonzo.spec.json
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,194 @@ | ||
{ | ||
"lovelacePerUTxOWord": 34482, | ||
"executionPrices": { | ||
"prSteps": { | ||
"numerator": 721, | ||
"denominator": 10000000 | ||
}, | ||
"prMem": { | ||
"numerator": 577, | ||
"denominator": 10000 | ||
} | ||
}, | ||
"maxTxExUnits": { | ||
"exUnitsMem": 10000000, | ||
"exUnitsSteps": 10000000000 | ||
}, | ||
"maxBlockExUnits": { | ||
"exUnitsMem": 50000000, | ||
"exUnitsSteps": 40000000000 | ||
}, | ||
"maxValueSize": 5000, | ||
"collateralPercentage": 150, | ||
"maxCollateralInputs": 3, | ||
"costModels": { | ||
"PlutusV1": { | ||
"sha2_256-memory-arguments": 4, | ||
"equalsString-cpu-arguments-constant": 1000, | ||
"cekDelayCost-exBudgetMemory": 100, | ||
"lessThanEqualsByteString-cpu-arguments-intercept": 103599, | ||
"divideInteger-memory-arguments-minimum": 1, | ||
"appendByteString-cpu-arguments-slope": 621, | ||
"blake2b-cpu-arguments-slope": 29175, | ||
"iData-cpu-arguments": 150000, | ||
"encodeUtf8-cpu-arguments-slope": 1000, | ||
"unBData-cpu-arguments": 150000, | ||
"multiplyInteger-cpu-arguments-intercept": 61516, | ||
"cekConstCost-exBudgetMemory": 100, | ||
"nullList-cpu-arguments": 150000, | ||
"equalsString-cpu-arguments-intercept": 150000, | ||
"trace-cpu-arguments": 150000, | ||
"mkNilData-memory-arguments": 32, | ||
"lengthOfByteString-cpu-arguments": 150000, | ||
"cekBuiltinCost-exBudgetCPU": 29773, | ||
"bData-cpu-arguments": 150000, | ||
"subtractInteger-cpu-arguments-slope": 0, | ||
"unIData-cpu-arguments": 150000, | ||
"consByteString-memory-arguments-intercept": 0, | ||
"divideInteger-memory-arguments-slope": 1, | ||
"divideInteger-cpu-arguments-model-arguments-slope": 118, | ||
"listData-cpu-arguments": 150000, | ||
"headList-cpu-arguments": 150000, | ||
"chooseData-memory-arguments": 32, | ||
"equalsInteger-cpu-arguments-intercept": 136542, | ||
"sha3_256-cpu-arguments-slope": 82363, | ||
"sliceByteString-cpu-arguments-slope": 5000, | ||
"unMapData-cpu-arguments": 150000, | ||
"lessThanInteger-cpu-arguments-intercept": 179690, | ||
"mkCons-cpu-arguments": 150000, | ||
"appendString-memory-arguments-intercept": 0, | ||
"modInteger-cpu-arguments-model-arguments-slope": 118, | ||
"ifThenElse-cpu-arguments": 1, | ||
"mkNilPairData-cpu-arguments": 150000, | ||
"lessThanEqualsInteger-cpu-arguments-intercept": 145276, | ||
"addInteger-memory-arguments-slope": 1, | ||
"chooseList-memory-arguments": 32, | ||
"constrData-memory-arguments": 32, | ||
"decodeUtf8-cpu-arguments-intercept": 150000, | ||
"equalsData-memory-arguments": 1, | ||
"subtractInteger-memory-arguments-slope": 1, | ||
"appendByteString-memory-arguments-intercept": 0, | ||
"lengthOfByteString-memory-arguments": 4, | ||
"headList-memory-arguments": 32, | ||
"listData-memory-arguments": 32, | ||
"consByteString-cpu-arguments-intercept": 150000, | ||
"unIData-memory-arguments": 32, | ||
"remainderInteger-memory-arguments-minimum": 1, | ||
"bData-memory-arguments": 32, | ||
"lessThanByteString-cpu-arguments-slope": 248, | ||
"encodeUtf8-memory-arguments-intercept": 0, | ||
"cekStartupCost-exBudgetCPU": 100, | ||
"multiplyInteger-memory-arguments-intercept": 0, | ||
"unListData-memory-arguments": 32, | ||
"remainderInteger-cpu-arguments-model-arguments-slope": 118, | ||
"cekVarCost-exBudgetCPU": 29773, | ||
"remainderInteger-memory-arguments-slope": 1, | ||
"cekForceCost-exBudgetCPU": 29773, | ||
"sha2_256-cpu-arguments-slope": 29175, | ||
"equalsInteger-memory-arguments": 1, | ||
"indexByteString-memory-arguments": 1, | ||
"addInteger-memory-arguments-intercept": 1, | ||
"chooseUnit-cpu-arguments": 150000, | ||
"sndPair-cpu-arguments": 150000, | ||
"cekLamCost-exBudgetCPU": 29773, | ||
"fstPair-cpu-arguments": 150000, | ||
"quotientInteger-memory-arguments-minimum": 1, | ||
"decodeUtf8-cpu-arguments-slope": 1000, | ||
"lessThanInteger-memory-arguments": 1, | ||
"lessThanEqualsInteger-cpu-arguments-slope": 1366, | ||
"fstPair-memory-arguments": 32, | ||
"modInteger-memory-arguments-intercept": 0, | ||
"unConstrData-cpu-arguments": 150000, | ||
"lessThanEqualsInteger-memory-arguments": 1, | ||
"chooseUnit-memory-arguments": 32, | ||
"sndPair-memory-arguments": 32, | ||
"addInteger-cpu-arguments-intercept": 197209, | ||
"decodeUtf8-memory-arguments-slope": 8, | ||
"equalsData-cpu-arguments-intercept": 150000, | ||
"mapData-cpu-arguments": 150000, | ||
"mkPairData-cpu-arguments": 150000, | ||
"quotientInteger-cpu-arguments-constant": 148000, | ||
"consByteString-memory-arguments-slope": 1, | ||
"cekVarCost-exBudgetMemory": 100, | ||
"indexByteString-cpu-arguments": 150000, | ||
"unListData-cpu-arguments": 150000, | ||
"equalsInteger-cpu-arguments-slope": 1326, | ||
"cekStartupCost-exBudgetMemory": 100, | ||
"subtractInteger-cpu-arguments-intercept": 197209, | ||
"divideInteger-cpu-arguments-model-arguments-intercept": 425507, | ||
"divideInteger-memory-arguments-intercept": 0, | ||
"cekForceCost-exBudgetMemory": 100, | ||
"blake2b-cpu-arguments-intercept": 2477736, | ||
"remainderInteger-cpu-arguments-constant": 148000, | ||
"tailList-cpu-arguments": 150000, | ||
"encodeUtf8-cpu-arguments-intercept": 150000, | ||
"equalsString-cpu-arguments-slope": 1000, | ||
"lessThanByteString-memory-arguments": 1, | ||
"multiplyInteger-cpu-arguments-slope": 11218, | ||
"appendByteString-cpu-arguments-intercept": 396231, | ||
"lessThanEqualsByteString-cpu-arguments-slope": 248, | ||
"modInteger-memory-arguments-slope": 1, | ||
"addInteger-cpu-arguments-slope": 0, | ||
"equalsData-cpu-arguments-slope": 10000, | ||
"decodeUtf8-memory-arguments-intercept": 0, | ||
"chooseList-cpu-arguments": 150000, | ||
"constrData-cpu-arguments": 150000, | ||
"equalsByteString-memory-arguments": 1, | ||
"cekApplyCost-exBudgetCPU": 29773, | ||
"quotientInteger-memory-arguments-slope": 1, | ||
"verifySignature-cpu-arguments-intercept": 3345831, | ||
"unMapData-memory-arguments": 32, | ||
"mkCons-memory-arguments": 32, | ||
"sliceByteString-memory-arguments-slope": 1, | ||
"sha3_256-memory-arguments": 4, | ||
"ifThenElse-memory-arguments": 1, | ||
"mkNilPairData-memory-arguments": 32, | ||
"equalsByteString-cpu-arguments-slope": 247, | ||
"appendString-cpu-arguments-intercept": 150000, | ||
"quotientInteger-cpu-arguments-model-arguments-slope": 118, | ||
"cekApplyCost-exBudgetMemory": 100, | ||
"equalsString-memory-arguments": 1, | ||
"multiplyInteger-memory-arguments-slope": 1, | ||
"cekBuiltinCost-exBudgetMemory": 100, | ||
"remainderInteger-memory-arguments-intercept": 0, | ||
"sha2_256-cpu-arguments-intercept": 2477736, | ||
"remainderInteger-cpu-arguments-model-arguments-intercept": 425507, | ||
"lessThanEqualsByteString-memory-arguments": 1, | ||
"tailList-memory-arguments": 32, | ||
"mkNilData-cpu-arguments": 150000, | ||
"chooseData-cpu-arguments": 150000, | ||
"unBData-memory-arguments": 32, | ||
"blake2b-memory-arguments": 4, | ||
"iData-memory-arguments": 32, | ||
"nullList-memory-arguments": 32, | ||
"cekDelayCost-exBudgetCPU": 29773, | ||
"subtractInteger-memory-arguments-intercept": 1, | ||
"lessThanByteString-cpu-arguments-intercept": 103599, | ||
"consByteString-cpu-arguments-slope": 1000, | ||
"appendByteString-memory-arguments-slope": 1, | ||
"trace-memory-arguments": 32, | ||
"divideInteger-cpu-arguments-constant": 148000, | ||
"cekConstCost-exBudgetCPU": 29773, | ||
"encodeUtf8-memory-arguments-slope": 8, | ||
"quotientInteger-cpu-arguments-model-arguments-intercept": 425507, | ||
"mapData-memory-arguments": 32, | ||
"appendString-cpu-arguments-slope": 1000, | ||
"modInteger-cpu-arguments-constant": 148000, | ||
"verifySignature-cpu-arguments-slope": 1, | ||
"unConstrData-memory-arguments": 32, | ||
"quotientInteger-memory-arguments-intercept": 0, | ||
"equalsByteString-cpu-arguments-constant": 150000, | ||
"sliceByteString-memory-arguments-intercept": 0, | ||
"mkPairData-memory-arguments": 32, | ||
"equalsByteString-cpu-arguments-intercept": 112536, | ||
"appendString-memory-arguments-slope": 1, | ||
"lessThanInteger-cpu-arguments-slope": 497, | ||
"modInteger-cpu-arguments-model-arguments-intercept": 425507, | ||
"modInteger-memory-arguments-minimum": 1, | ||
"sha3_256-cpu-arguments-intercept": 0, | ||
"verifySignature-memory-arguments": 1, | ||
"cekLamCost-exBudgetMemory": 100, | ||
"sliceByteString-cpu-arguments-intercept": 150000 | ||
} | ||
} | ||
} |
Oops, something went wrong.