packages feed

courier-0.1.0.4: tests/TestTCP.hs

module TestTCP (tests) where

-- local imports

import Network.Endpoints
import Network.Transport.TCP

-- external imports

import Control.Concurrent
import Control.Exception

import Data.Serialize

import System.Log.Logger

import Test.Framework
import Test.HUnit
import Test.Framework.Providers.HUnit
-- import Test.Framework.Providers.QuickCheck2

-----------------------------------------------------------------------------
-----------------------------------------------------------------------------

_log :: String
_log = "test.transport.tcp"

tests :: [Test.Framework.Test]
tests = 
  [
    testCase "tcp-endpoints+transport" testEndpointTransport,
    testCase "tcp-bind-unbind" testEndpointBindUnbind,
    testCase "tcp-send-receive" testEndpointSendReceive,
    testCase "tcp-send-receive-reply" testEndpointSendReceiveReply
  ] 
  
testEndpointTransport :: Assertion  
testEndpointTransport = do  
  let name1 = "endpoint1"
      name2 = "endpoint2"
  let resolver = resolverFromList [(name1,"localhost:2000"),
                               (name2,"localhost:2001")]
  transport <- newTCPTransport resolver
  _ <- newEndpoint [transport]
  return ()
  
testEndpointBindUnbind :: Assertion
testEndpointBindUnbind = do  
  let name1 = "endpoint1"
      name2 = "endpoint2"
  let resolver = resolverFromList [(name1,"localhost:2000"),
                               (name2,"localhost:2001")]
  transport <- newTCPTransport resolver
  endpoint <- newEndpoint [transport]
  Right () <- bindEndpoint endpoint name1
  unbound <- unbindEndpoint endpoint name1
  case unbound of
    Left err -> assertFailure $ "Unbind failed: " ++ err
    Right () -> assertBool "Unbind succeeded" True
  return ()
  
testEndpointSendReceive :: Assertion
testEndpointSendReceive = do
  let name1 = "endpoint1"
      name2 = "endpoint2"
  let resolver = resolverFromList [(name1,"localhost:2000"),
                               (name2,"localhost:2001")]
  bracket (newTCPTransport resolver)
    (\transport1 -> shutdown transport1)
    (\transport1 -> 
        bracket (newTCPTransport resolver)
          (\transport2 -> shutdown transport2)
          (\transport2 -> do 
              endpoint1 <- newEndpoint [transport1]
              endpoint2 <- newEndpoint [transport2]
              Right () <- bindEndpoint endpoint1 name1
              Right () <- bindEndpoint endpoint2 name2
              threadDelay $ 1 * 1000000
              _ <- sendMessage endpoint1 name2 $ encode "hello!"
              Just msg <- receiveMessageTimeout endpoint2 (2 * 1000000)
              assertEqual "Received message not same as sent" (Right "hello!") (decode msg)
              return ()))
  
testEndpointSendReceiveReply :: Assertion
testEndpointSendReceiveReply = do
  let name1 = "endpoint1"
      name2 = "endpoint2"
  let resolver = resolverFromList [(name1,"localhost:2002"),
                                   (name2,"localhost:2003")]
  bracket (newTCPTransport resolver)
    shutdown
    (\transport1 -> 
        bracket (newTCPTransport resolver)
          shutdown
          (\transport2 -> do 
              endpoint1 <- newEndpoint [transport1]
              endpoint2 <- newEndpoint [transport2]
              Right () <- bindEndpoint endpoint1 name1
              Right () <- bindEndpoint endpoint2 name2
              threadDelay $ 1 * 1000000
              
              infoM _log "Sending message from 1 to 2"
              _ <- sendMessage endpoint1 name2 $ encode "hello!"
              Just msg1 <- receiveMessageTimeout endpoint2 (1 * 1000000)
              assertEqual "Received message not same as sent" (Right "hello!") (decode msg1)
                
              infoM _log "Sending message from 2 to 1"
              _ <- sendMessage endpoint2 name1 $ encode "hi!"
              Just msg2 <- receiveMessageTimeout endpoint1 (1 * 1000000)
              assertEqual "Received message not same as sent" (Right "hi!") (decode msg2)
                
              return ()))