packages feed

angel-0.6.2: test/Angel/PidFileSpec.hs

{-# LANGUAGE ScopedTypeVariables #-}
module Angel.PidFileSpec (spec) where

import Angel.PidFile

import Control.Exception.Base ( try
                              , SomeException )
import Data.Char (isNumber)
import Data.IORef ( newIORef
                  , readIORef
                  , writeIORef )
import System.Process (proc)
import System.Posix.Files (fileExist)

import SpecHelper

spec :: TestTree
spec = testGroup "Angel.PidFile"
  [
    testGroup "startWithPidFile"
    [
      testCase "creates the pidfile and cleans up" $ do
        startWithPidFile procSpec fileName jogOn $ \_pHandle -> do
          fileShouldExist fileName
          pid <- readFile fileName
          null pid @?= False
          all isNumber pid @?= True
        fileShouldNotExist fileName
    , testCase "calls the error callback when pidfile can't be created and re-raises" $ do
        called <- newIORef False
        let onPidError = const $ writeIORef called True
        (res :: Either SomeException ()) <- try $ startWithPidFile procSpec badPidFile jogOn onPidError
        readIORef called `shouldReturn` True
        isLeft res @?= True
    ]
  ]
  where
    fileName = "temp.pid"
    badPidFile = "/bogus/path/to/pidfile"
    procSpec = proc "pwd" []
    fileShouldExist _name    = fileExist fileName `shouldReturn` True
    fileShouldNotExist _name = fileExist fileName `shouldReturn` False
    jogOn = const $ return ()
    isLeft (Left _) = True
    isLeft _        = False