{-# LANGUAGE OverloadedStrings #-}
module Main where
import Control.Concurrent
import Control.Exception
import Control.Monad ( (<=<), replicateM )
import Network.Transport
import Network.Transport.ZMQ
import System.Exit
main :: IO ()
main = finish <=< trySome $ do
putStr "simple: "
Right (zmq, transport) <- createTransportEx defaultZMQParameters "127.0.0.1"
Right ep1 <- newEndPoint transport
Right ep2 <- newEndPoint transport
Right c1 <- connect ep1 (address ep2) ReliableOrdered defaultConnectHints
Right c2 <- connect ep2 (address ep1) ReliableOrdered defaultConnectHints
Right _ <- send c1 ["123"]
Right _ <- send c2 ["321"]
close c1
close c2
[ConnectionOpened 1 ReliableOrdered _, Received 1 ["321"], ConnectionClosed 1] <- replicateM 3 $ receive ep1
[ConnectionOpened 1 ReliableOrdered _, Received 1 ["123"], ConnectionClosed 1] <- replicateM 3 $ receive ep2
putStrLn "OK"
putStr "connection break: "
Right ep3 <- newEndPoint transport
Right c21 <- connect ep1 (address ep2) ReliableOrdered defaultConnectHints
Right c22 <- connect ep2 (address ep1) ReliableOrdered defaultConnectHints
Right c23 <- connect ep3 (address ep1) ReliableOrdered defaultConnectHints
ConnectionOpened 2 ReliableOrdered _ <- receive ep2
ConnectionOpened 2 ReliableOrdered _ <- receive ep1
ConnectionOpened 3 ReliableOrdered _ <- receive ep1
breakConnection zmq (address ep1) (address ep2)
ErrorEvent (TransportError (EventConnectionLost _ ) _) <- receive $ ep1
ErrorEvent (TransportError (EventConnectionLost _ ) _) <- receive $ ep2
Left (TransportError SendFailed _) <- send c21 ["test"]
Left (TransportError SendFailed _) <- send c22 ["test"]
Left (TransportError SendFailed _) <- send c23 ["test"]
ErrorEvent (TransportError (EventConnectionLost _) _ ) <- receive ep1
Right c24 <- connect ep3 (address ep1) ReliableOrdered defaultConnectHints
Right () <- send c24 ["final"]
ConnectionOpened 4 ReliableOrdered _ <- receive ep1
Received 4 ["final"] <- receive ep1
putStrLn "OK"
multicast transport
where
multicast transport = do
Right ep1 <- newEndPoint transport
Right ep2 <- newEndPoint transport
putStr "multicast: "
Right g1 <- newMulticastGroup ep1
multicastSubscribe g1
threadDelay 1000000
multicastSend g1 ["test"]
ReceivedMulticast _ ["test"] <- receive ep1
Right g2 <- resolveMulticastGroup ep2 (multicastAddress g1)
multicastSubscribe g2
threadDelay 100000
multicastSend g2 ["test-2"]
ReceivedMulticast _ ["test-2"] <- receive ep2
ReceivedMulticast _ ["test-2"] <- receive ep1
putStrLn "OK"
putStr "Auth:"
Right tr2 <- createTransport
defaultZMQParameters {authorizationType=ZMQAuthPlain "user" "password"}
"127.0.0.1"
Right ep3 <- newEndPoint tr2
Right ep4 <- newEndPoint tr2
Right c3 <- connect ep3 (address ep4) ReliableOrdered defaultConnectHints
Right _ <- send c3 ["4456"]
[ConnectionOpened 1 ReliableOrdered _, Received 1 ["4456"]] <- replicateM 2 $ receive ep4
Right c4 <- connect ep3 (address ep4) ReliableOrdered defaultConnectHints
Right _ <- send c4 ["5567"]
[ConnectionOpened 2 ReliableOrdered _, Received 2 ["5567"]] <- replicateM 2 $ receive ep4
putStrLn "OK"
putStr "Connect to non existing host: "
Left (TransportError ConnectFailed _) <- connect ep3 (EndPointAddress "tcp://128.0.0.1:7689") ReliableOrdered defaultConnectHints
putStrLn "OK"
finish (Left e) = print e >> exitWith (ExitFailure 1)
finish Right{} = exitWith ExitSuccess
trySome :: IO a -> IO (Either SomeException a)
trySome = try
forkTry :: IO () -> IO ThreadId
forkTry = forkIO