Cabal-1.24.0.0: tests/PackageTests/TestSuiteTests/ExeV10/Check.hs
module PackageTests.TestSuiteTests.ExeV10.Check (tests) where
import qualified Control.Exception as E (IOException, catch)
import Control.Monad (forM_, liftM4, when)
import Data.Maybe (catMaybes)
import System.FilePath
import Test.Tasty.HUnit (testCase)
import Distribution.Compiler (CompilerFlavor(..), CompilerId(..))
import Distribution.PackageDescription (package)
import Distribution.Simple.Compiler (compilerId)
import Distribution.Simple.LocalBuildInfo (compiler, localPkgDescr, localCompatPackageKey)
import Distribution.Simple.Hpc
import Distribution.Simple.Program.Builtin (hpcProgram)
import Distribution.Simple.Program.Db
( emptyProgramDb, configureProgram, requireProgramVersion )
import Distribution.Text (display)
import qualified Distribution.Verbosity as Verbosity
import Distribution.Version (Version(..), orLaterVersion)
import PackageTests.PackageTester
tests :: SuiteConfig -> TestTreeM ()
tests config = do
-- TODO: hierarchy and subnaming is a little unfortunate
tc "Test" "Default" $ do
cabal_build ["--enable-tests"]
-- This one runs both tests, including the very LONG Foo
-- test which prints a lot of output
cabal "test" ["--show-details=direct"]
groupTests "WithHpc" $ hpcTestMatrix config
groupTests "WithoutHpc" $ do
-- Ensures that even if -fhpc is manually provided no .tix file is output.
tc "NoTix" "NoHpcNoTix" $ do
dist_dir <- distDir
cabal_build
[ "--enable-tests"
, "--ghc-option=-fhpc"
, "--ghc-option=-hpcdir"
, "--ghc-option=" ++ dist_dir ++ "/hpc/vanilla" ]
cabal "test" ["test-Short", "--show-details=direct"]
lbi <- liftIO $ getPersistBuildConfig dist_dir
let way = guessWay lbi
shouldNotExist $ tixFilePath dist_dir way "test-Short"
-- Ensures that even if a .tix file happens to be left around
-- markup isn't generated.
tc "NoMarkup" "NoHpcNoMarkup" $ do
dist_dir <- distDir
let tixFile = tixFilePath dist_dir Vanilla "test-Short"
withEnv [("HPCTIXFILE", Just tixFile)] $ do
cabal_build
[ "--enable-tests"
, "--ghc-option=-fhpc"
, "--ghc-option=-hpcdir"
, "--ghc-option=" ++ dist_dir ++ "/hpc/vanilla" ]
cabal "test" ["test-Short", "--show-details=direct"]
shouldNotExist $ htmlDir dist_dir Vanilla "test-Short" </> "hpc_index.html"
where
tc :: String -> String -> TestM a -> TestTreeM ()
tc name subname m
= testTree' $ testCase name
(runTestM config "TestSuiteTests/ExeV10" (Just subname) m)
hpcTestMatrix :: SuiteConfig -> TestTreeM ()
hpcTestMatrix config = forM_ (choose4 [True, False]) $
\(libProf, exeProf, exeDyn, shared) -> do
let name | null suffixes = "Vanilla"
| otherwise = intercalate "-" suffixes
where
suffixes = catMaybes
[ if libProf then Just "LibProf" else Nothing
, if exeProf then Just "ExeProf" else Nothing
, if exeDyn then Just "ExeDyn" else Nothing
, if shared then Just "Shared" else Nothing
]
opts = catMaybes
[ enable libProf "library-profiling"
, enable exeProf "profiling"
, enable exeDyn "executable-dynamic"
, enable shared "shared"
]
where
enable cond flag
| cond = Just $ "--enable-" ++ flag
| otherwise = Nothing
-- Ensure that both .tix file and markup are generated if coverage
-- is enabled.
testUnless ((exeDyn || shared) && not (hasSharedLibraries config)) $
tc name ("WithHpc-" ++ name) $ do
isCorrectVersion <- liftIO $ correctHpcVersion
when isCorrectVersion $ do
dist_dir <- distDir
cabal_build ("--enable-tests" : "--enable-coverage" : opts)
cabal "test" ["test-Short", "--show-details=direct"]
lbi <- liftIO $ getPersistBuildConfig dist_dir
let way = guessWay lbi
CompilerId comp version = compilerId (compiler lbi)
subdir
| comp == GHC && version >= Version [7, 10] [] =
localCompatPackageKey lbi
| otherwise = display (package $ localPkgDescr lbi)
mapM_ shouldExist
[ mixDir dist_dir way "my-0.1" </> subdir </> "Foo.mix"
, mixDir dist_dir way "test-Short" </> "Main.mix"
, tixFilePath dist_dir way "test-Short"
, htmlDir dist_dir way "test-Short" </> "hpc_index.html"
]
where
tc :: String -> String -> TestM a -> TestTreeM ()
tc name subname m
= testTree' $ testCase name
(runTestM config "TestSuiteTests/ExeV10" (Just subname) m)
choose4 :: [a] -> [(a, a, a, a)]
choose4 xs = liftM4 (,,,) xs xs xs xs
-- | Checks for a suitable HPC version for testing.
correctHpcVersion :: IO Bool
correctHpcVersion = do
let programDb' = emptyProgramDb
let verbosity = Verbosity.normal
let verRange = orLaterVersion (Version [0,7] [])
programDb <- configureProgram verbosity hpcProgram programDb'
(requireProgramVersion verbosity hpcProgram verRange programDb
>> return True) `catchIO` (\_ -> return False)
where
-- Distribution.Compat.Exception is hidden.
catchIO :: IO a -> (E.IOException -> IO a) -> IO a
catchIO = E.catch