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

Version all the things #934

Merged
merged 7 commits into from
Jun 21, 2023
Merged
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
1 change: 0 additions & 1 deletion hydra-cluster/hydra-cluster.cabal
Original file line number Diff line number Diff line change
Expand Up @@ -241,7 +241,6 @@ test-suite tests
, plutus-ledger-api
, process
, QuickCheck
, regex-tdfa
, say
, stm
, strict-containers
Expand Down
11 changes: 2 additions & 9 deletions hydra-cluster/test/Test/EndToEndSpec.hs
Original file line number Diff line number Diff line change
Expand Up @@ -97,11 +97,9 @@ import System.Directory (createDirectoryIfMissing, removeDirectoryRecursive)
import System.FilePath ((</>))
import System.IO (hGetLine)
import System.IO.Error (isEOFError)
import System.Process (CreateProcess (..), StdStream (..), proc, readCreateProcess, withCreateProcess)
import System.Process (CreateProcess (..), StdStream (..), proc, withCreateProcess)
import System.Timeout (timeout)
import Test.QuickCheck (generate, suchThat)
import Text.Regex.TDFA ((=~))
import Text.Regex.TDFA.Text ()
import qualified Prelude

allNodeIds :: [Int]
Expand Down Expand Up @@ -129,7 +127,7 @@ spec = around showLogsOnFailure $ do
withCardanoNodeDevnet (contramap FromCardanoNode tracer) tmpDir $ \node ->
publishHydraScriptsAs node Faucet
>>= canCloseWithLongContestationPeriod tracer tmpDir node
it "can submmit a timed tx" $ \tracer -> do
it "can submit a timed tx" $ \tracer -> do
withClusterTempDir "timed-tx" $ \tmpDir -> do
withCardanoNodeDevnet (contramap FromCardanoNode tracer) tmpDir $ \node ->
publishHydraScriptsAs node Faucet
Expand Down Expand Up @@ -398,11 +396,6 @@ spec = around showLogsOnFailure $ do
metrics `shouldSatisfy` ("hydra_head_events" `BS.isInfixOf`)

describe "hydra-node executable" $ do
it "display proper semantic version given it is passed --version argument" $ \_ ->
failAfter 5 $ do
version <- readCreateProcess (proc "hydra-node" ["--version"]) ""
version `shouldSatisfy` (=~ ("[0-9]+\\.[0-9]+\\.[0-9]+(-[a-zA-Z0-9]+)?" :: String))

it "logs its command line arguments" $ \tracer -> do
withClusterTempDir "logs-options" $ \dir -> do
withCardanoNodeDevnet (contramap FromCardanoNode tracer) dir $ \RunningNode{nodeSocket} -> do
Expand Down
1 change: 1 addition & 0 deletions hydra-node/hydra-node.cabal
Original file line number Diff line number Diff line change
Expand Up @@ -352,6 +352,7 @@ test-suite tests
, QuickCheck
, quickcheck-dynamic >=3.0.3
, quickcheck-instances
, regex-tdfa
, req
, silently
, text
Expand Down
2 changes: 2 additions & 0 deletions hydra-node/src/Hydra/Options.hs
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@
module Hydra.Options (
module Hydra.Options,
ParserResult (..),
renderFailure,
) where

import Hydra.Prelude
Expand Down Expand Up @@ -63,6 +64,7 @@ import Options.Applicative (
option,
progDesc,
progDescDoc,
renderFailure,
short,
showDefault,
strOption,
Expand Down
14 changes: 10 additions & 4 deletions hydra-node/test/Hydra/OptionsSpec.hs
Original file line number Diff line number Diff line change
Expand Up @@ -22,11 +22,13 @@ import Hydra.Options (
defaultLedgerConfig,
maximumNumberOfParties,
parseHydraCommandFromArgs,
renderFailure,
toArgs,
validateRunOptions,
)
import Test.Aeson.GenericSpecs (roundtripAndGoldenSpecs)
import Test.QuickCheck (Property, chooseEnum, counterexample, forAll, property, vectorOf, (===))
import Text.Regex.TDFA ((=~))

spec :: Spec
spec = parallel $
Expand Down Expand Up @@ -71,7 +73,7 @@ spec = parallel $
`shouldParse` Run defaultRunOptions{port = 0}
shouldNotParse ["--port", "-42"]

-- TODO(SN): Move thes examples rather into a 'instance Read Host' test and
-- TODO(SN): Move these examples rather into a 'instance Read Host' test and
-- only check for correct format / wiring here using a single test case This
-- became evident when realizing that the 'hydra-tui' is also relying on this
-- Read instance for parsing, but in a different command line flag.
Expand All @@ -96,9 +98,13 @@ spec = parallel $
setFlags ["--monitoring-port", "65535"]
`shouldParse` Run defaultRunOptions{monitoringPort = Just 65535}

it "parses --version flag as a parse error" $
shouldNotParse ["--version"]

it "flag --version returns version with base version from cabal" $ do
case parseHydraCommandFromArgs ["--version"] of
Failure theFailure ->
let (v, _ExitCode) = renderFailure theFailure "test"
in v
pgrange marked this conversation as resolved.
Show resolved Hide resolved
`shouldSatisfy` (=~ ("[0-9]+\\.[0-9]+\\.[0-9]+(:?-[a-zA-Z0-9]+)" :: String))
_ -> failure "expected a version but did get something else"
it "parses --hydra-verification-key option as a filepath" $ do
setFlags ["--hydra-verification-key", "./alice.vk"]
`shouldParse` Run defaultRunOptions{hydraVerificationKeys = ["./alice.vk"]}
Expand Down
2 changes: 2 additions & 0 deletions hydra-tui/hydra-tui.cabal
Original file line number Diff line number Diff line change
Expand Up @@ -97,6 +97,7 @@ library
, optparse-applicative
, QuickCheck
, text
, th-env
, time
, vty
, websockets
Expand Down Expand Up @@ -136,6 +137,7 @@ test-suite tests
, hydra-tui
, io-classes
, optparse-applicative
, regex-tdfa
, temporary
, unix
, vty
Expand Down
43 changes: 31 additions & 12 deletions hydra-tui/src/Hydra/TUI/Options.hs
Original file line number Diff line number Diff line change
@@ -1,19 +1,20 @@
{-# LANGUAGE TemplateHaskell #-}

module Hydra.TUI.Options where

import Hydra.Prelude (
Applicative ((<*>)),
FilePath,
Semigroup ((<>)),
(<$>),
)
import Hydra.Prelude

import Data.Version (Version (Version), showVersion)
import Hydra.Cardano.Api (NetworkId)
import Hydra.Network (Host (Host))
import Hydra.Options (networkIdParser)
import Hydra.Version (gitRevision)
import Language.Haskell.TH.Env (envQ)
import Options.Applicative (
Parser,
auto,
help,
infoOption,
long,
metavar,
option,
Expand All @@ -22,21 +23,39 @@ import Options.Applicative (
strOption,
value,
)
import Paths_hydra_tui (version)

data Options = Options
{ hydraNodeHost :: Host
, cardanoNodeSocket :: FilePath
, cardanoNetworkId :: NetworkId
, cardanoSigningKey :: FilePath
}
deriving stock (Eq, Show)

parseOptions :: Parser Options
parseOptions =
Options
<$> parseNodeHost
<*> parseCardanoNodeSocket
<*> networkIdParser
<*> parseCardanoSigningKey
( Options
<$> parseNodeHost
<*> parseCardanoNodeSocket
<*> networkIdParser
<*> parseCardanoSigningKey
)
<**> versionInfo
where
versionInfo :: Parser (Options -> Options)
versionInfo =
infoOption
(showVersion ourVersion)
(long "version" <> help "Show version")

ourVersion =
version & \(Version semver _) -> Version semver revision

revision =
maybeToList $
($$(envQ "GIT_REVISION") :: Maybe String)
<|> gitRevision

parseCardanoNodeSocket :: Parser FilePath
parseCardanoNodeSocket =
Expand All @@ -55,7 +74,7 @@ parseNodeHost =
( long "connect"
<> short 'c'
<> help "Hydra-node to connect to in the form of <host>:<port>"
<> value (Host "0.0.0.0" 4001)
<> value (Host "127.0.0.1" 4001)
pgrange marked this conversation as resolved.
Show resolved Hide resolved
<> showDefault
)

Expand Down
36 changes: 27 additions & 9 deletions hydra-tui/test/Hydra/TUI/OptionsSpec.hs
Original file line number Diff line number Diff line change
Expand Up @@ -5,30 +5,48 @@ import Test.Hydra.Prelude

import Hydra.Cardano.Api (NetworkId (..), NetworkMagic (..))
import Hydra.Network (Host (Host))
import Hydra.Options (networkIdParser)
import Hydra.TUI.Options (
parseCardanoNodeSocket,
parseCardanoSigningKey,
parseNodeHost,
Options (..),
parseOptions,
)
import Options.Applicative (
Parser,
ParserResult (Success),
ParserResult (Failure, Success),
defaultPrefs,
execParserPure,
info,
renderFailure,
)
import Text.Regex.TDFA ((=~))

spec :: Spec
spec = parallel $ do
it "no arguments yield default options" $ do
shouldParseWith parseOptions [] defaultOptions
it "parses --connect option" $ do
shouldParseWith parseNodeHost ["--connect", "127.0.0.1:4002"] (Host "127.0.0.1" 4002)
shouldParseWith parseOptions ["--connect", "127.0.0.2:4002"] defaultOptions{hydraNodeHost = Host "127.0.0.2" 4002}
it "parses --testnet-magic option" $ do
shouldParseWith networkIdParser ["--testnet-magic", "123"] (Testnet $ NetworkMagic 123)
shouldParseWith parseOptions ["--testnet-magic", "123"] defaultOptions{cardanoNetworkId = Testnet $ NetworkMagic 123}
it "parses --cardano-signing-key option" $ do
shouldParseWith parseCardanoSigningKey ["--cardano-signing-key", "foo.sk"] "foo.sk"
shouldParseWith parseOptions ["--cardano-signing-key", "foo.sk"] defaultOptions{cardanoSigningKey = "foo.sk"}
it "parses --node-socket option" $ do
shouldParseWith parseCardanoNodeSocket ["--node-socket", "something.socket"] "something.socket"
shouldParseWith parseOptions ["--node-socket", "something.socket"] defaultOptions{cardanoNodeSocket = "something.socket"}
it "parses --version option" $ do
case execParserPure defaultPrefs (info parseOptions mempty) ["--version"] of
Failure theFailure ->
let (version, _exitCode) = renderFailure theFailure "test"
in version
`shouldSatisfy` (=~ ("[0-9]+\\.[0-9]+\\.[0-9]+(:?-[a-zA-Z0-9]+)" :: String))
_ -> failure "expected a version but did get something else"

defaultOptions :: Options
defaultOptions =
Options
{ hydraNodeHost = Host "127.0.0.1" 4001
pgrange marked this conversation as resolved.
Show resolved Hide resolved
, cardanoNetworkId = Testnet $ NetworkMagic 42
, cardanoNodeSocket = "node.socket"
, cardanoSigningKey = "me.sk"
}

shouldParseWith :: (Show a, Eq a) => Parser a -> [String] -> a -> Expectation
shouldParseWith parser args result =
Expand Down
18 changes: 12 additions & 6 deletions nix/hydra/project.nix
Original file line number Diff line number Diff line change
Expand Up @@ -56,12 +56,18 @@ let
}
# Inject the git revision into hydra-node --version
# (see hydra-node/src/Hydra/Options.hs)
{
packages.hydra-node.preBuild = ''
echo ======= PATCHING --version to ${gitRev} =======
export GIT_REVISION=${gitRev}
'';
}
(
let
patchGitRevision = ''
echo ======= PATCHING --version to ${gitRev} =======
export GIT_REVISION=${gitRev}
'';
in
{
packages.hydra-node.preBuild = patchGitRevision;
packages.hydra-tui.preBuild = patchGitRevision;
}
)
# Avoid plutus-tx errors in haddock (see also cabal.project)
{
packages.hydra-plutus.setupHaddockFlags = [ "--ghc-options='-fplugin-opt PlutusTx.Plugin:defer-errors'" ];
Expand Down
Loading