module Testlib.Options (getOptions, TestOptions (..)) where import Data.List.Split (splitOn) import Options.Applicative import System.Environment (lookupEnv) import Prelude data TestOptions = TestOptions { TestOptions -> [String] includeTests :: [String], TestOptions -> [String] excludeTests :: [String], TestOptions -> Bool listTests :: Bool, TestOptions -> Maybe String xmlReport :: Maybe FilePath, TestOptions -> String configFile :: String } parser :: Parser TestOptions parser :: Parser TestOptions parser = [String] -> [String] -> Bool -> Maybe String -> String -> TestOptions TestOptions ([String] -> [String] -> Bool -> Maybe String -> String -> TestOptions) -> Parser [String] -> Parser ([String] -> Bool -> Maybe String -> String -> TestOptions) forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b <$> Parser String -> Parser [String] forall a. Parser a -> Parser [a] forall (f :: * -> *) a. Alternative f => f a -> f [a] many ( Mod OptionFields String -> Parser String forall s. IsString s => Mod OptionFields s -> Parser s strOption ( String -> Mod OptionFields String forall (f :: * -> *) a. HasName f => String -> Mod f a long String "include" Mod OptionFields String -> Mod OptionFields String -> Mod OptionFields String forall a. Semigroup a => a -> a -> a <> Char -> Mod OptionFields String forall (f :: * -> *) a. HasName f => Char -> Mod f a short Char 'i' Mod OptionFields String -> Mod OptionFields String -> Mod OptionFields String forall a. Semigroup a => a -> a -> a <> String -> Mod OptionFields String forall (f :: * -> *) a. HasMetavar f => String -> Mod f a metavar String "PATTERN" Mod OptionFields String -> Mod OptionFields String -> Mod OptionFields String forall a. Semigroup a => a -> a -> a <> String -> Mod OptionFields String forall (f :: * -> *) a. String -> Mod f a help String "Include tests matching PATTERN (simple substring match). This flag can be provided multiple times. This flag can also be provided via the TEST_INCLUDE environment variable." ) ) Parser ([String] -> Bool -> Maybe String -> String -> TestOptions) -> Parser [String] -> Parser (Bool -> Maybe String -> String -> TestOptions) forall a b. Parser (a -> b) -> Parser a -> Parser b forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b <*> Parser String -> Parser [String] forall a. Parser a -> Parser [a] forall (f :: * -> *) a. Alternative f => f a -> f [a] many ( Mod OptionFields String -> Parser String forall s. IsString s => Mod OptionFields s -> Parser s strOption ( String -> Mod OptionFields String forall (f :: * -> *) a. HasName f => String -> Mod f a long String "exclude" Mod OptionFields String -> Mod OptionFields String -> Mod OptionFields String forall a. Semigroup a => a -> a -> a <> Char -> Mod OptionFields String forall (f :: * -> *) a. HasName f => Char -> Mod f a short Char 'x' Mod OptionFields String -> Mod OptionFields String -> Mod OptionFields String forall a. Semigroup a => a -> a -> a <> String -> Mod OptionFields String forall (f :: * -> *) a. HasMetavar f => String -> Mod f a metavar String "PATTERN" Mod OptionFields String -> Mod OptionFields String -> Mod OptionFields String forall a. Semigroup a => a -> a -> a <> String -> Mod OptionFields String forall (f :: * -> *) a. String -> Mod f a help String "Exclude tests matching PATTERN (simple substring match). This flag can be provided multiple times. This flag can also be provided via the TEST_EXCLUDE environment variable." ) ) Parser (Bool -> Maybe String -> String -> TestOptions) -> Parser Bool -> Parser (Maybe String -> String -> TestOptions) forall a b. Parser (a -> b) -> Parser a -> Parser b forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b <*> Mod FlagFields Bool -> Parser Bool switch (String -> Mod FlagFields Bool forall (f :: * -> *) a. HasName f => String -> Mod f a long String "list" Mod FlagFields Bool -> Mod FlagFields Bool -> Mod FlagFields Bool forall a. Semigroup a => a -> a -> a <> Char -> Mod FlagFields Bool forall (f :: * -> *) a. HasName f => Char -> Mod f a short Char 'l' Mod FlagFields Bool -> Mod FlagFields Bool -> Mod FlagFields Bool forall a. Semigroup a => a -> a -> a <> String -> Mod FlagFields Bool forall (f :: * -> *) a. String -> Mod f a help String "Only list tests.") Parser (Maybe String -> String -> TestOptions) -> Parser (Maybe String) -> Parser (String -> TestOptions) forall a b. Parser (a -> b) -> Parser a -> Parser b forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b <*> Parser String -> Parser (Maybe String) forall (f :: * -> *) a. Alternative f => f a -> f (Maybe a) optional ( Mod OptionFields String -> Parser String forall s. IsString s => Mod OptionFields s -> Parser s strOption ( String -> Mod OptionFields String forall (f :: * -> *) a. HasName f => String -> Mod f a long String "xml" Mod OptionFields String -> Mod OptionFields String -> Mod OptionFields String forall a. Semigroup a => a -> a -> a <> String -> Mod OptionFields String forall (f :: * -> *) a. HasMetavar f => String -> Mod f a metavar String "FILE" Mod OptionFields String -> Mod OptionFields String -> Mod OptionFields String forall a. Semigroup a => a -> a -> a <> String -> Mod OptionFields String forall (f :: * -> *) a. String -> Mod f a help String "Generate XML report for the tests" ) ) Parser (String -> TestOptions) -> Parser String -> Parser TestOptions forall a b. Parser (a -> b) -> Parser a -> Parser b forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b <*> Mod OptionFields String -> Parser String forall s. IsString s => Mod OptionFields s -> Parser s strOption ( String -> Mod OptionFields String forall (f :: * -> *) a. HasName f => String -> Mod f a long String "config" Mod OptionFields String -> Mod OptionFields String -> Mod OptionFields String forall a. Semigroup a => a -> a -> a <> Char -> Mod OptionFields String forall (f :: * -> *) a. HasName f => Char -> Mod f a short Char 'c' Mod OptionFields String -> Mod OptionFields String -> Mod OptionFields String forall a. Semigroup a => a -> a -> a <> String -> Mod OptionFields String forall (f :: * -> *) a. HasMetavar f => String -> Mod f a metavar String "FILE" Mod OptionFields String -> Mod OptionFields String -> Mod OptionFields String forall a. Semigroup a => a -> a -> a <> String -> Mod OptionFields String forall (f :: * -> *) a. String -> Mod f a help String "Use configuration FILE" Mod OptionFields String -> Mod OptionFields String -> Mod OptionFields String forall a. Semigroup a => a -> a -> a <> String -> Mod OptionFields String forall (f :: * -> *) a. HasValue f => a -> Mod f a value String "services/integration.yaml" ) optInfo :: ParserInfo TestOptions optInfo :: ParserInfo TestOptions optInfo = Parser TestOptions -> InfoMod TestOptions -> ParserInfo TestOptions forall a. Parser a -> InfoMod a -> ParserInfo a info (Parser TestOptions parser Parser TestOptions -> Parser (TestOptions -> TestOptions) -> Parser TestOptions forall (f :: * -> *) a b. Applicative f => f a -> f (a -> b) -> f b <**> Parser (TestOptions -> TestOptions) forall a. Parser (a -> a) helper) ( InfoMod TestOptions forall a. InfoMod a fullDesc InfoMod TestOptions -> InfoMod TestOptions -> InfoMod TestOptions forall a. Semigroup a => a -> a -> a <> String -> InfoMod TestOptions forall a. String -> InfoMod a progDesc String "Run integration tests" InfoMod TestOptions -> InfoMod TestOptions -> InfoMod TestOptions forall a. Semigroup a => a -> a -> a <> String -> InfoMod TestOptions forall a. String -> InfoMod a header String "integration - wire-server integration test suite" ) getOptions :: IO TestOptions getOptions :: IO TestOptions getOptions = do [String] defaultsInclude <- [String] -> (String -> [String]) -> Maybe String -> [String] forall b a. b -> (a -> b) -> Maybe a -> b maybe [] (String -> String -> [String] forall a. Eq a => [a] -> [a] -> [[a]] splitOn String ",") (Maybe String -> [String]) -> IO (Maybe String) -> IO [String] forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b <$> String -> IO (Maybe String) lookupEnv String "TEST_INCLUDE" [String] defaultsExclude <- [String] -> (String -> [String]) -> Maybe String -> [String] forall b a. b -> (a -> b) -> Maybe a -> b maybe [] (String -> String -> [String] forall a. Eq a => [a] -> [a] -> [[a]] splitOn String ",") (Maybe String -> [String]) -> IO (Maybe String) -> IO [String] forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b <$> String -> IO (Maybe String) lookupEnv String "TEST_EXCLUDE" Maybe String defaultsXMLReport <- String -> IO (Maybe String) lookupEnv String "TEST_XML" TestOptions opts <- ParserInfo TestOptions -> IO TestOptions forall a. ParserInfo a -> IO a execParser ParserInfo TestOptions optInfo TestOptions -> IO TestOptions forall a. a -> IO a forall (f :: * -> *) a. Applicative f => a -> f a pure TestOptions opts { includeTests = includeTests opts `orFromEnv` defaultsInclude, excludeTests = excludeTests opts `orFromEnv` defaultsExclude, xmlReport = xmlReport opts `orFromEnv` defaultsXMLReport } where orFromEnv :: t a -> t a -> t a orFromEnv t a fromArgs t a fromEnv = if t a -> Bool forall a. t a -> Bool forall (t :: * -> *) a. Foldable t => t a -> Bool null t a fromArgs then t a fromEnv else t a fromArgs