{-# LANGUAGE OverloadedStrings #-} {-# LANGUAGE StaticPointers #-} module Main where -------------------------------------------------------------------------------- import Control.Exception (try) import System.Posix.Process (getProcessID) import Test.Tasty import Test.Tasty.HUnit -------------------------------------------------------------------------------- import Control.Distributed.Fork import Control.Distributed.Fork.LocalProcessBackend -------------------------------------------------------------------------------- main :: IO () main = do initDistributedFork defaultMain tests tests :: TestTree tests = testGroup "Tests" [ testCase "localProcessBackend gives correct result" $ do ret <- await =<< fork localProcessBackend (static Dict) (static (return (42 :: Integer, "fortytwo" :: String, Just True))) ret @?= (42, "fortytwo", Just True) , testCase "localProcessBackend actually spawns" $ do localPid <- show <$> getProcessID remotePid <- await =<< fork localProcessBackend (static Dict) (static (show <$> getProcessID)) remotePid /= localPid @? "Spawned process should have a different PID." , testCase "localProcessBackend handles exceptions" $ do handle <- fork localProcessBackend (static Dict) (static (return (div 1 0) :: IO Int)) answer <- try $ await handle answer @?= Left (ExecutorFailedException "Exception from executor: divide by zero") ]