packages feed

hats-0.1.0.0: test/CallbackTests.hs

module CallbackTests
    ( callingCallbacks
    ) where

import Control.Concurrent.MVar
import Control.Monad (when)
import Data.Maybe (isNothing, isJust)
import System.Timeout (timeout)
import Test.HUnit

import Gnatsd
import Network.Nats

-- | Check that callbacks are called when needed at connection and
-- disconnection.
callingCallbacks :: Assertion
callingCallbacks = do
    connect    <- newEmptyMVar
    disconnect <- newEmptyMVar
    let settings = defaultSettings
                       { connectedTo      = connected connect
                       , disconnectedFrom = disconnected disconnect
                       }
    g1 <- startGnatsd
    withNats settings [defaultURI] $ \_nats -> do
        
        -- Wait for connection.
        c1 <- timeout oneSec $ takeMVar connect
        when (isNothing c1) $ do
            stopGnatsd g1
            assertFailure "Shall have connectedTo callback"

        -- Check that no disconnect has happen.
        d1 <- tryTakeMVar disconnect
        when (isJust d1) $ do
            stopGnatsd g1
            assertFailure "Shall have no disconnectedFrom callback"

        -- Shoot down gnatsd ...
        stopGnatsd g1

        -- Now a disconnect shall have happen.
        d2 <- timeout oneSec $ takeMVar disconnect
        when (isNothing d2) $
            assertFailure "Shall have disconnectedFrom callback"

        -- Start gnatsd again ...
        g2 <- startGnatsd

        -- Check that we have a new connect callback.
        c2 <- timeout oneSec $ takeMVar connect
        when (isNothing c2) $ do
            stopGnatsd g2
            assertFailure "Shall have connectedTo callback"

        -- Done. Close.
        stopGnatsd g2

oneSec :: Int
oneSec = 1000000

connected :: MVar () -> SockAddr -> IO ()
connected sync sockAddr = do
    putStrLn $ "Connected to: " ++ show sockAddr
    putMVar sync ()

disconnected :: MVar () -> SockAddr -> IO ()
disconnected sync sockAddr = do
    putStrLn $ "Disconnected from: " ++ show sockAddr
    putMVar sync ()