Test.hs 1.6 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546
  1. {-# LANGUAGE OverloadedStrings #-}
  2. module Bricoleur.Commands.Test (runTest) where
  3. import Control.Monad (forM_)
  4. import qualified Data.ByteString.Lazy.Char8 as B
  5. import qualified GHC.IO.Exception as Exn
  6. import System.FilePath ((</>))
  7. import qualified System.FilePath as Sys
  8. import qualified System.Process as Sys
  9. import Bricoleur.Opts
  10. import Bricoleur.Config
  11. import Bricoleur.Utils
  12. runTest :: Config -> Options -> IO ()
  13. runTest conf opts = do
  14. let root = Sys.takeDirectory (optFile opts)
  15. cDebug ("running tests for " % shown) (confDocument conf)
  16. forM_ (confSources conf) $ \ samp -> do
  17. cDebug ("- running test for " % stext) (sourceName samp)
  18. runCommand root samp
  19. runCommand :: FilePath -> Source -> IO ()
  20. runCommand root src = do
  21. forM_ (sourceCommands src) $ \ln -> do
  22. let dir = root </> sourceDir src
  23. cDebug (" $ " % string % " (in '" % string % "')") ln dir
  24. (outH, inH) <- Sys.createPipe
  25. let process = (Sys.shell ln) { Sys.cwd = Just (root </> sourceDir src)
  26. , Sys.std_out = Sys.UseHandle inH
  27. , Sys.std_err = Sys.UseHandle inH
  28. }
  29. (_, _, _, p) <- Sys.createProcess process
  30. bufOutput <- B.hGetContents outH
  31. code <- Sys.waitForProcess p
  32. case code of
  33. Exn.ExitSuccess -> return ()
  34. Exn.ExitFailure n -> do
  35. let idtext = map (B.append " - ") (B.lines bufOutput)
  36. cError ("\nCommand '" % string %
  37. "' exited with error (" % shown %
  38. ")") ln n
  39. mapM_ bsErrorLn idtext