distributed-process-tests-0.4.1: src/Control/Distributed/Process/Tests/Internal/Utils.hs
-- | General testing support.
module Control.Distributed.Process.Tests.Internal.Utils where
#if ! MIN_VERSION_base(4,6,0)
import Prelude hiding (catch)
#endif
import Control.Concurrent.MVar
( MVar
, newEmptyMVar
, takeMVar
, putMVar
)
import Control.Distributed.Process
import Control.Distributed.Process.Node
import Control.Distributed.Process.Serializable ()
import Test.HUnit (Assertion)
import Test.HUnit.Base (assertBool)
-- these utilities have been cribbed from distributed-process-platform
-- we should really find a way to share them...
-- | A mutable cell containing a test result.
type TestResult a = MVar a
synchronisedAssertion :: Eq a
=> String
-> LocalNode
-> a
-> (TestResult a -> Process ())
-> MVar ()
-> Assertion
synchronisedAssertion note localNode expected testProc lock = do
result <- newEmptyMVar
_ <- forkProcess localNode $ do
acquire lock
finally (testProc result)
(release lock)
assertComplete note result expected
where acquire lock' = liftIO $ takeMVar lock'
release lock' = liftIO $ putMVar lock' ()
delayedAssertion :: Eq a
=> String
-> LocalNode
-> a
-> (TestResult a -> Process ())
-> Assertion
delayedAssertion note localNode expected testProc = do
result <- newEmptyMVar
_ <- forkProcess localNode $ testProc result
assertComplete note result expected
assertComplete :: Eq a => String -> MVar a -> a -> IO ()
assertComplete msg mv a = do
b <- takeMVar mv
assertBool msg (a == b)
stash :: TestResult a -> a -> Process ()
stash mvar x = liftIO $ putMVar mvar x