#!/usr/bin/env runhaskell \begin{code} import Control.Monad (unless) import Data.Maybe (listToMaybe, fromMaybe) import System.Directory (doesDirectoryExist, setCurrentDirectory) import System.Exit (ExitCode(..)) import System.FilePath (()) import System.Process (system) import Distribution.PackageDescription ( BuildInfo, PackageDescription, buildable, buildInfo , exeName, executables) import Distribution.Simple (Args, UserHooks, defaultMainWithHooks, simpleUserHooks, runTests) import Distribution.Simple.Build (build) import Distribution.Simple.LocalBuildInfo (LocalBuildInfo(buildDir)) import Distribution.Simple.PreProcess (knownSuffixHandlers) import Distribution.Simple.Setup (defaultBuildFlags) main :: IO () main = defaultMainWithHooks hooks hooks :: UserHooks hooks = simpleUserHooks { runTests = testHook } testBinaryProtocolZMQ :: a -> (BuildInfo -> a) -> PackageDescription -> a testBinaryProtocolZMQ dflt f pd = fromMaybe dflt $ listToMaybe [ f (buildInfo exe) | exe <- executables pd , exeName exe == "test-binary-protocol-zmq" ] testHook :: Args -> Bool -> PackageDescription -> LocalBuildInfo -> IO () testHook _ _ pd lbi = do let testDir = buildDir lbi "test-binary-protocol-zmq" t <- doesDirectoryExist testDir unless t $ do unless (testBinaryProtocolZMQ False buildable pd) $ fail $ "Reconfigure with 'cabal configure -ftests' or " ++ "'cabal install -ftests' and try again" putStrLn "Building tests" build pd lbi defaultBuildFlags knownSuffixHandlers putStrLn "Tests built" setCurrentDirectory testDir exitcode <- system "./test-binary-protocol-zmq" unless (exitcode == ExitSuccess) $ fail "Test failed" \end{code}