packages feed

glue-core-0.7.0: test/Glue/TimeoutSpec.hs

module Glue.TimeoutSpec (spec) where

import           Control.Concurrent (threadDelay)
import           Glue.Timeout
import           Test.Hspec
import           Test.QuickCheck

timeoutOptions :: TimeoutOptions
timeoutOptions = defaultTimeoutOptions { timeoutLimitMs = 10 }

spec :: Spec
spec = do
  describe "addTimeout" $ do
    it "Services taking too long should fail with a timeout" $
      property $ \request ->
        let service req    = (if req > 0 then pure () else threadDelay (50 * 1000)) >> pure (req + 100)
            timeoutService = addTimeout timeoutOptions service
            successCase    = timeoutService request `shouldReturn` (request + 100)
            failureCase    = timeoutService request `shouldThrow` (== TimeoutException (timeoutDescription timeoutOptions))
        in  if request > (0 :: Int) then successCase else failureCase