packages feed

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"