Fix tests

This commit is contained in:
Chris Done 2015-02-24 12:08:37 +01:00
parent fc613b248d
commit 246f992569

View File

@ -1,3 +1,4 @@
{-# LANGUAGE CPP #-}
{-# LANGUAGE RecordWildCards #-} {-# LANGUAGE RecordWildCards #-}
{-# LANGUAGE FlexibleInstances #-} {-# LANGUAGE FlexibleInstances #-}
{-# LANGUAGE TypeSynonymInstances #-} {-# LANGUAGE TypeSynonymInstances #-}
@ -19,6 +20,7 @@ import Stackage.PackageDescription
import Stackage.PerformBuild (PerformBuild(..),copyBuiltInHaddocks,renameOrCopy) import Stackage.PerformBuild (PerformBuild(..),copyBuiltInHaddocks,renameOrCopy)
import Stackage.Prelude (unFlagName,unExeName) import Stackage.Prelude (unFlagName,unExeName)
import Data.Char
import Control.Concurrent import Control.Concurrent
import Control.Concurrent.STM import Control.Concurrent.STM
import Control.Exception import Control.Exception
@ -109,7 +111,7 @@ shakePlan env@Env{..} = do
\(name,version) -> \(name,version) ->
let fp = targetForPackage envShake name version let fp = targetForPackage envShake name version
in target fp (makeTargetFile fp) in target fp (makeTargetFile fp)
void $ forM normalPackages $ builds <- forM normalPackages $
\(name,plan) -> \(name,plan) ->
target (targetForPackage envShake name (ppVersion plan)) $ target (targetForPackage envShake name (ppVersion plan)) $
do need [db, fetched] do need [db, fetched]
@ -120,7 +122,14 @@ shakePlan env@Env{..} = do
target (targetForDocs envShake name (ppVersion plan)) $ target (targetForDocs envShake name (ppVersion plan)) $
do need [targetForPackage envShake name (ppVersion plan)] do need [targetForPackage envShake name (ppVersion plan)]
packageDocs env plan name packageDocs env plan name
want haddockTargets tests <- forM normalPackages $
\(name,plan) ->
target (targetForTest envShake name (ppVersion plan)) $
do need (haddockTargets <> [db, fetched])
testTarget env name plan
if pbEnableTests envPB
then want tests
else want haddockTargets
where versionMappings = M.toList (M.map ppVersion (bpPackages (pbPlan envPB))) where versionMappings = M.toList (M.map ppVersion (bpPackages (pbPlan envPB)))
corePackages = M.keys $ siCorePackages $ bpSystemInfo $ pbPlan envPB corePackages = M.keys $ siCorePackages $ bpSystemInfo $ pbPlan envPB
normalPackages = filter (not . (`elem` corePackages) . fst) $ normalPackages = filter (not . (`elem` corePackages) . fst) $
@ -141,6 +150,13 @@ targetForPackage shakeDir name version = Target $
FP.decodeString (nameVer name version) FP.decodeString (nameVer name version)
<> "dist" <> "shake-build" <> "dist" <> "shake-build"
-- | Get the target file for a package.
targetForTest :: FilePath -> PackageName -> Version -> Target
targetForTest shakeDir name version = Target $
shakeDir <> "packages" <>
FP.decodeString (nameVer name version)
<> "dist" <> "shake-test"
-- | Get the target file for a package. -- | Get the target file for a package.
targetForDocs :: FilePath -> PackageName -> Version -> Target targetForDocs :: FilePath -> PackageName -> Version -> Target
targetForDocs shakeDir name version = Target $ targetForDocs shakeDir name version = Target $
@ -162,11 +178,29 @@ nameVer :: PackageName -> Version -> String
nameVer name version = display name ++ "-" ++ display version nameVer name version = display name ++ "-" ++ display version
-- | Default environment for running commands. -- | Default environment for running commands.
defaultEnv :: PerformBuild -> FilePath -> [(String, String)] defaultEnv :: PerformBuild -> FilePath -> [(String, String)] -> [(String, String)]
defaultEnv pb pwd = defaultEnv pb pwd env = sandbox ++ rest
[( "HASKELL_PACKAGE_SANDBOX" where sandbox = [( "HASKELL_PACKAGE_SANDBOX"
, FP.encodeString (pwd <> buildDatabase pb)) , FP.encodeString
| pbGlobalInstall pb] (pwd <> buildDatabase pb)) | not (pbGlobalInstall pb)]
rest = map addPath env
where
addPath (key,val)
| map toUpper key == "PATH" =
( key
, FP.encodeString
(pbBinDir pb) <>
pathSep <>
val)
| otherwise = (key,val)
-- | Platform-independent PATH environment separator.
pathSep :: String
#ifdef mingw32_HOST_OS
pathSep = ";"
#else
pathSep = ":"
#endif
-- | Database location. -- | Database location.
buildDatabase :: PerformBuild -> FilePath buildDatabase :: PerformBuild -> FilePath
@ -190,6 +224,11 @@ pkgLogFile :: Env -> PackageName -> Version -> FilePath
pkgLogFile env@Env{..} name version = pkgDir env name version <> pkgLogFile env@Env{..} name version = pkgDir env name version <>
"dist" <> "stackage-log.txt" "dist" <> "stackage-log.txt"
-- | The package directory.
testLogFile :: Env -> PackageName -> Version -> FilePath
testLogFile env@Env{..} name version = pkgDir env name version <>
"dist" <> "stackage-test-log.txt"
-- | Installation paths. -- | Installation paths.
pbBinDir, pbLibDir, pbDataDir, pbDocDir :: PerformBuild -> FilePath pbBinDir, pbLibDir, pbDataDir, pbDocDir :: PerformBuild -> FilePath
pbBinDir root = (pbInstallDest root) <> "bin" pbBinDir root = (pbInstallDest root) <> "bin"
@ -384,6 +423,26 @@ packageTarget env@Env{..} name plan = do
let pkgCabal :: (MonadIO m) => Verbosity -> [String] -> m () let pkgCabal :: (MonadIO m) => Verbosity -> [String] -> m ()
pkgCabal verbosity = succeed . cabal env verbosity prefix logFile dir pkgCabal verbosity = succeed . cabal env verbosity prefix logFile dir
pkgCabal Normal ["build","--ghc-options=" <> pbGhcOptions envPB] pkgCabal Normal ["build","--ghc-options=" <> pbGhcOptions envPB]
pkgCabal Verbose ["copy"]
liftIO (withMVar envRegLock
(const (pkgCabal Verbose ["register"])))
makeTargetFile (targetForPackage envShake name version)
where logFile = pkgLogFile env name version
dir = pkgDir env name version
version = ppVersion plan
versionMappings = M.toList (M.map ppVersion (bpPackages (pbPlan envPB)))
-- | Build, test and generate documentation for the package.
testTarget :: Env -> PackageName -> PackagePlan -> Action ()
testTarget env@Env{..} name plan = do
need $
map (\(pname,pver) -> targetForPackage envShake pname pver) $
mapMaybe (\p -> find ((==p) . fst) versionMappings) $
M.keys $ sdPackages $ ppDesc plan
unpack env name version
liftIO (do exists <- FP.isFile logFile
when exists (FP.removeFile logFile))
prefix <- packageCmdPrefix name
when (pbEnableTests envPB && pcTests (ppConstraints plan) /= Don'tBuild) when (pbEnableTests envPB && pcTests (ppConstraints plan) /= Don'tBuild)
(do configure env name logFile dir plan True (do configure env name logFile dir plan True
result <- cabal env Normal prefix logFile dir ["test"] result <- cabal env Normal prefix logFile dir ["test"]
@ -394,11 +453,8 @@ packageTarget env@Env{..} name plan = do
(ExitSuccess,ExpectFailure) -> (ExitSuccess,ExpectFailure) ->
logLn env Normal (prefix <> "Unexpected test suite success!") logLn env Normal (prefix <> "Unexpected test suite success!")
_ -> return ()) _ -> return ())
pkgCabal Verbose ["copy"] makeTargetFile (targetForTest envShake name version)
liftIO (withMVar envRegLock where logFile = testLogFile env name version
(const (pkgCabal Verbose ["register"])))
makeTargetFile (targetForPackage envShake name version)
where logFile = pkgLogFile env name version
dir = pkgDir env name version dir = pkgDir env name version
version = ppVersion plan version = ppVersion plan
versionMappings = M.toList (M.map ppVersion (bpPackages (pbPlan envPB))) versionMappings = M.toList (M.map ppVersion (bpPackages (pbPlan envPB)))
@ -518,7 +574,7 @@ packageCmdPrefix name =
cabal :: MonadIO m => Env -> Verbosity -> Text -> FilePath -> FilePath -> [String] -> m ExitCode cabal :: MonadIO m => Env -> Verbosity -> Text -> FilePath -> FilePath -> [String] -> m ExitCode
cabal env verbosity prefix logfile cwd args = do cabal env verbosity prefix logfile cwd args = do
pwd <- liftIO FP.getWorkingDirectory pwd <- liftIO FP.getWorkingDirectory
envmap <- liftIO $ fmap (++ defaultEnv (envPB env) pwd) $ getEnvironment envmap <- liftIO $ fmap (defaultEnv (envPB env) pwd) $ getEnvironment
logLn env verbosity (prefix <> T.pack (fromMaybe "" (listToMaybe args))) logLn env verbosity (prefix <> T.pack (fromMaybe "" (listToMaybe args)))
logLn env Verbose (prefix <> T.pack (unwords (cmd' : map show args))) logLn env Verbose (prefix <> T.pack (unwords (cmd' : map show args)))
liftIO (FP.createTree (FP.directory logfile)) liftIO (FP.createTree (FP.directory logfile))