packages feed

shake-0.15.6: src/Test/Parallel.hs

module Test.Parallel(main) where

import Development.Shake
import Test.Type
import Data.Tuple.Extra
import Control.Monad
import Control.Concurrent.Extra
import Data.IORef


main = shakenCwd test $ \args obj -> do
    want args

    phony "cancel" $ do
        writeFile' (obj "cancel") ""
        done <- liftIO $ newIORef 0
        lock <- liftIO newLock
        void $ parallel $ replicate 5 $ liftIO $ do
            x <- atomicModifyIORef done $ dupe . succ
            when (x == 3) $ do sleep 0.1; fail "boom"
            withLock lock $ appendFile (obj "cancel") "x"

    phony "parallel" $ do
        active <- liftIO $ newIORef 0
        peak <- liftIO $ newIORef 0    
        void $ parallel $ replicate 8 $ liftIO $ do
            now <- atomicModifyIORef active $ dupe . succ
            atomicModifyIORef peak $ dupe . max now
            sleep 0.1
            atomicModifyIORef active $ dupe . pred
        peak <- liftIO $ readIORef peak
        writeFile' (obj "parallel") $ show peak


test build obj = do
    assertException ["boom"] $ build ["cancel","-j1","--quiet"]
    assertContents (obj "cancel") "xx"
    build ["parallel","-j1"]
    assertContents (obj "parallel") "1"
    build ["parallel","-j5"]
    assertContents (obj "parallel") "5"