@@ -10,7 +10,7 @@ import Network.Transport.TCP (createTransport, encodeEndPointAddress)
1010import Data.Int (Int32)
1111import Control.Concurrent (threadDelay)
1212import Control.Concurrent.MVar (MVar, newEmptyMVar, putMVar, takeMVar, readMVar, isEmptyMVar)
13−import Control.Monad (replicateM, guard, forM_)
13+import Control.Monad (replicateM, guard, forM_, replicateM_)
1414import Control.Applicative ((<$>))
1515import Control.Exception (throw)
1616import Network.Transport.TCP ( ControlHeader(..)
@@ -27,6 +27,8 @@ import qualified Network.Socket as N ( sClose
2727import Network.Socket.ByteString (sendMany)
2828import Data.String (fromString)
2929import Traced
30+import GHC.IO.Exception (ioe_errno)
31+import Foreign.C.Error (Errno(..), eADDRNOTAVAIL)
3032
3133instance Traceable ControlHeader where
3234 trace = traceShow
@@ -465,11 +467,33 @@ testUnnecessaryConnect nextPort = do
465467 forkTry $ do
466468 let ourAddress = EndPointAddress "ourAddress"
467469 Right (_, ConnectionRequestAccepted) <- readMVar serverAddr >>= socketToEndPoint ourAddress
468− Right (_, ConnectionRequestEndPointInvalid) <- readMVar serverAddr >>= socketToEndPoint ourAddress
470+ Right (_, ConnectionRequestCrossed) <- readMVar serverAddr >>= socketToEndPoint ourAddress
469471 putMVar clientDone ()
470472
471473 takeMVar clientDone
472474
475+-- | Test that we can create "many" transport instances
476+testMany :: IO N.ServiceName -> IO ()
477+testMany nextPort = do
478+ Right masterTransport <- nextPort >>= createTransport "127.0.0.1"
479+ Right masterEndPoint <- newEndPoint masterTransport
480+
481+ replicateM_ 20 $ do
482+ mTransport <- nextPort >>= createTransport "127.0.0.1"
483+ threadDelay 2000000
484+ case mTransport of
485+ Left ex -> do
486+ putStrLn $ "IOException: " ++ show ex ++ "; errno = " ++ show (ioe_errno ex)
487+ case (ioe_errno ex) of
488+ Just no | Errno no == eADDRNOTAVAIL -> putStrLn "(ADDRNOTAVAIL)"
489+ _ -> return ()
490+ throw ex
491+ Right transport ->
492+ replicateM_ 3 $ do
493+ Right endpoint <- newEndPoint transport
494+ Right _ <- connect endpoint (address masterEndPoint) ReliableOrdered defaultConnectHints
495+ return ()
496+
473497main :: IO ()
474498main = do
475499 portMVar <- newEmptyMVar
@@ -483,5 +507,6 @@ main = do
483507 , ("TestUnnecessaryConnect", testUnnecessaryConnect nextPort)
484508 , ("InvalidAddress", testInvalidAddress nextPort)
485509 , ("InvalidConnect", testInvalidConnect nextPort)
510+ , ("TestMany", testMany nextPort)
486511 ]
487512 testTransport (either (Left . show) (Right) <$> nextPort >>= createTransport "127.0.0.1")