packages feed

io-capture-1.0.0: tests/Spec.hs

{-# LANGUAGE LambdaCase        #-}
{-# LANGUAGE OverloadedStrings #-}

import System.IO.Capture

import Control.Concurrent
import Control.Monad
import System.IO
import System.Posix.Process
import System.Posix.Signals
import System.Timeout
import Test.Hspec
import Test.Hspec.Core.Runner

import qualified Data.ByteString.Streaming as S

main :: IO ()
main = hspecWith config $ do
  describe "capture" $ do
    it "captures everything" $ do
      (out, err, exc, _) <- capture (putStr "foo" >> hPutStr stderr "bar" >> undefined)
      out `shouldBe` "foo"
      err `shouldBe` "bar"
      exc `shouldBe` "Prelude.undefined"

  describe "captureStream" $ do
    it "streams output" $ do
      (out, _, _, pid) <- captureStream (forever (putStrLn "foo" >> threadDelay (1*sec)))

      timeout (2*sec) (S.uncons out) >>= \case
        Just (Just _) -> do
          signalProcess sigKILL pid
          _ <- getProcessStatus True True pid
          pure ()
        _ -> expectationFailure "expected a byte, found nothing"


 where
  -- hspec in color mode messes with stdout
  config = defaultConfig
    { configColorMode = ColorNever }

sec :: Int
sec = 1000000