cabal-install-1.22.0.0: tests/PackageTests.hs
-- | Groups black-box tests of cabal-install and configures them to test
-- the correct binary.
--
-- This file should do nothing but import tests from other modules and run
-- them with the path to the correct cabal-install binary.
module Main
where
-- Modules from Cabal.
import Distribution.Simple.Program.Builtin (ghcPkgProgram)
import Distribution.Simple.Program.Db
(defaultProgramDb, requireProgram, setProgramSearchPath)
import Distribution.Simple.Program.Find
(ProgramSearchPathEntry(ProgramSearchPathDir), defaultProgramSearchPath)
import Distribution.Simple.Program.Types
( Program(..), simpleProgram, programPath)
import Distribution.Simple.Utils ( findProgramVersion )
import Distribution.Verbosity (normal)
-- Third party modules.
import qualified Control.Exception.Extensible as E
import System.Directory
( canonicalizePath, getCurrentDirectory, setCurrentDirectory
, removeFile, doesFileExist )
import System.FilePath ((</>))
import Test.Framework (Test, defaultMain, testGroup)
import Control.Monad ( when )
-- Module containing common test code.
import PackageTests.PackageTester ( TestsPaths(..)
, packageTestsDirectory
, packageTestsConfigFile )
-- Modules containing the tests.
import qualified PackageTests.Exec.Check
import qualified PackageTests.Freeze.Check
import qualified PackageTests.MultipleSource.Check
-- List of tests to run. Each test will be called with the path to the
-- cabal binary to use.
tests :: PackageTests.PackageTester.TestsPaths -> [Test]
tests paths =
[ testGroup "Freeze" $ PackageTests.Freeze.Check.tests paths
, testGroup "Exec" $ PackageTests.Exec.Check.tests paths
, testGroup "MultipleSource" $ PackageTests.MultipleSource.Check.tests paths
]
cabalProgram :: Program
cabalProgram = (simpleProgram "cabal") {
programFindVersion = findProgramVersion "--numeric-version" id
}
main :: IO ()
main = do
buildDir <- canonicalizePath "dist/build/cabal"
let programSearchPath = ProgramSearchPathDir buildDir : defaultProgramSearchPath
(cabal, _) <- requireProgram normal cabalProgram
(setProgramSearchPath programSearchPath defaultProgramDb)
(ghcPkg, _) <- requireProgram normal ghcPkgProgram defaultProgramDb
canonicalConfigPath <- canonicalizePath $ "tests" </> packageTestsDirectory
let testsPaths = TestsPaths {
cabalPath = programPath cabal,
ghcPkgPath = programPath ghcPkg,
configPath = canonicalConfigPath </> packageTestsConfigFile
}
putStrLn $ "Using cabal: " ++ cabalPath testsPaths
putStrLn $ "Using ghc-pkg: " ++ ghcPkgPath testsPaths
cwd <- getCurrentDirectory
let confFile = packageTestsDirectory </> "cabal-config"
removeConf = do
b <- doesFileExist confFile
when b $ removeFile confFile
let runTests = do
setCurrentDirectory "tests"
removeConf -- assert that there is no existing config file
-- (we want deterministic testing with the default
-- config values)
defaultMain $ tests testsPaths
runTests `E.finally` do
-- remove the default config file that got created by the tests
removeConf
-- Change back to the old working directory so that the tests can be
-- repeatedly run in `cabal repl` via `:main`.
setCurrentDirectory cwd