zeromq4-patterns-0.3.0.0: test/Test/System/ZMQ4/Patterns/RequestReply.hs
{-# LANGUAGE DeriveGeneric #-}
{-# LANGUAGE FunctionalDependencies #-}
module Test.System.ZMQ4.Patterns.RequestReply (tests) where
import Control.Concurrent.Async
import Control.Monad (replicateM)
import Data.Binary
import GHC.Generics (Generic)
import System.ZMQ4.Patterns.RequestReply
import Test.Framework (Test, testGroup)
import Test.Framework.Providers.QuickCheck2 (testProperty)
import Test.QuickCheck
tests :: Test
tests = testGroup "System.ZMQ4.PAtterns.RequestReply" [
testProperty "server client" prop_server_client
]
data Request = ReqA | ReqB deriving (Eq, Generic, Show)
instance Binary Request
instance Arbitrary Request where
arbitrary = elements [ReqA, ReqB]
data Response = RepA | RepB deriving (Eq, Generic, Show)
instance Binary Response
instance RequestReply Request Response
reply :: Request -> IO Response
reply ReqA = return RepA
reply ReqB = return RepB
newtype TestSetup = TestSetup [Request] deriving (Show)
instance Arbitrary TestSetup where
arbitrary = TestSetup <$> replicateM 10 arbitrary
prop_server_client :: TestSetup -> Property
prop_server_client (TestSetup reqs) = within (10*1000*1000) $ ioProperty $
withAsync (responder addr reply) $ \_ ->
checkAll reqs
where
checkAll :: [Request] -> IO Property
checkAll [] = return (property True)
checkAll (x:xs) = do
y <- request addr x
let flag = case x of ReqA -> (y == RepA)
ReqB -> (y == RepB)
if flag then
checkAll xs
else
return (property False)
addr = "ipc:///tmp/zeromq4-patterns-test-req-rep.socket"