mockery-0.3.4: src/Test/Mockery/Environment.hs
module Test.Mockery.Environment (
withEnvironment
, withModifiedEnvironment
) where
import Control.Exception.Base
import Control.Monad
import System.Environment.Compat
-- |
-- Run the given action within the specified environment.
--
-- Before executing the action, `withEnvironment` backs up the current
-- environment, clears out the environment, and then applies the supplied
-- environment.
-- After the action has completed the original environment is restored.
--
-- __Note__: The environment is global to a process, so tests that modify the
-- environment can no longer be run in parallel.
withEnvironment :: [(String, String)] -> IO a -> IO a
withEnvironment environment action = bracketEnvironment $ do
setEnvironment environment
action
-- |
-- Run the given action within an augmented environment.
--
-- Before executing the action, `withModifiedEnvironment` backs up the current
-- environment and then augments it with the supplied values.
-- After the action has completed the original environment is restored.
--
-- __Note__: The environment is global to a process, so tests that modify the
-- environment can no longer be run in parallel.
withModifiedEnvironment :: [(String, String)] -> IO a -> IO a
withModifiedEnvironment environment action = bracketEnvironment $ do
modifyEnvironment environment
action
bracketEnvironment :: IO a -> IO a
bracketEnvironment = bracket getEnvironment setEnvironment . const
setEnvironment :: [(String, String)] -> IO ()
setEnvironment environment = do
clearEnvironment
modifyEnvironment environment
modifyEnvironment :: [(String, String)] -> IO ()
modifyEnvironment environment = forM_ environment $ uncurry setEnv
clearEnvironment :: IO ()
clearEnvironment = do
environment <- getEnvironment
forM_ environment (unsetEnv . fst)