mockery-0.3.3: src/Test/Mockery/Environment.hs
module Test.Mockery.Environment (withEnvironment) where
import Control.Exception.Base
import Control.Monad
import System.Environment.Compat
-- |
-- Run the given action with 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 for a process, so tests that depend on the
-- environment can no longer be run in parallel.
withEnvironment :: [(String, String)] -> IO a -> IO a
withEnvironment environment action = bracket saveEnv restoreEnv $ const action
where
saveEnv :: IO [(String, String)]
saveEnv = do
env <- clearEnv
forM_ environment $ uncurry setEnv
return env
restoreEnv :: [(String, String)] -> IO ()
restoreEnv env = do
_ <- clearEnv
forM_ env $ uncurry setEnv
clearEnv :: IO [(String, String)]
clearEnv = do
env <- getEnvironment
forM_ env (unsetEnv . fst)
return env