packages feed

poolboy-0.3.0.0: test/Spec.hs

module Main (main) where

import Control.Concurrent
import Control.Exception (Exception (..), throw)
import Control.Monad
import Data.IORef
import Data.Maybe
import Data.Poolboy
import System.TimeIt
import System.Timeout
import Test.Hspec

main :: IO ()
main = hspec spec

spec :: Spec
spec =
  describe "Poolboy" $ do
    replicateM_ 1 $
      it "threadDelay should be absorbed in mulitple threads" $ do
        (duration, computations) <-
          timeItT $
            timeout 250000 $
              withPoolboy (poolboySettingsWith 100) waitingStopFinishWorkers $ \wq -> do
                replicateM_ 100 $ enqueue wq $ threadDelay 1000
        computations `shouldSatisfy` isJust
        duration `shouldSatisfy` (< 20000)
    replicateM_ 1 $
      it "should be resilient to errors and Exceptions" $ do
        witness <- newIORef False
        (duration, computations) <-
          timeItT $
            timeout 1000000 $
              withPoolboy (poolboySettingsWith 5) waitingStopFinishWorkers $ \wq -> do
                mapM_ (enqueue wq) [error "an error", throw RandomException, writeIORef witness True]
        computations `shouldSatisfy` isJust
        duration `shouldSatisfy` (< 20000)
        readIORef witness `shouldReturn` True
    replicateM_ 1 $
      it "enqueueing when working on a stopping work queue should run all jobs" $ do
        counter <- newIORef @Int 0
        let incr = do
              threadDelay 100
              atomicModifyIORef' counter (\n -> (n + 1, ()))
        (duration, computations) <-
          timeItT $
            timeout 100000000 $
              withPoolboy (poolboySettingsWith 10) waitingStopFinishWorkers $ \wq -> do
                replicateM_ 10 $
                  enqueueAfter wq incr $
                    replicate 10 incr
        computations `shouldSatisfy` isJust
        duration `shouldSatisfy` (< 2000)
        readIORef counter `shouldReturn` 110

data RandomException = RandomException
  deriving (Show)

instance Exception RandomException