redis-0.10: Test/Lock.hs
module Test.Lock where
import Control.Monad.Reader
import Control.Exception
import Control.Concurrent.MVar
import Test.HUnit
import Data.Maybe
import System.Time
import Database.Redis.Redis
import Database.Redis.Utils.Lock
import Test.Setup
import Test.Utils
tests = TestList [TestLabel "acquire and release" test_acquire_release,
TestLabel "acquire timeout" test_acquire_timeout]
test_acquire_release = TestCase $ testRedis2 $
do r1 <- ask
r2 <- ask2
liftIO $ do acquire r1 "lock" 1000 50 >>= assertBool ""
acquire r2 "lock" 1000 50 >>= assertEqual "" False
release r1 "lock"
acquire r2 "lock" 1000 50 >>= assertBool ""
test_acquire_timeout = TestCase $ testRedis2 $
let act v r = do acquire r "lock" 2000 50 >>= assertBool ""
putMVar v "done"
in do v <- liftIO newEmptyMVar
r1 <- ask
r2 <- ask2
liftIO $ do acquire r1 "lock" 1000 50 >>= assertBool ""
v2 <- later 500 $ do res <- tryTakeMVar v
release r1 "lock"
return res
act v r2
takeMVar v2 >>= assertEqual "" Nothing