@@ -10,7 +10,7 @@ import Network.Transport.TCP (createTransport, encodeEndPointAddress)
10import Data.Int (Int32)
10import Data.Int (Int32)
11import Control.Concurrent (threadDelay)
11import Control.Concurrent (threadDelay)
12import Control.Concurrent.MVar (MVar, newEmptyMVar, putMVar, takeMVar, readMVar, isEmptyMVar)
12import Control.Concurrent.MVar (MVar, newEmptyMVar, putMVar, takeMVar, readMVar, isEmptyMVar)
13−import Control.Monad (replicateM, guard, forM_)
13+import Control.Monad (replicateM, guard, forM_, replicateM_)
14import Control.Applicative ((<$>))
14import Control.Applicative ((<$>))
15import Control.Exception (throw)
15import Control.Exception (throw)
16import Network.Transport.TCP ( ControlHeader(..)
16import Network.Transport.TCP ( ControlHeader(..)
@@ -27,6 +27,8 @@ import qualified Network.Socket as N ( sClose
27import Network.Socket.ByteString (sendMany)
27import Network.Socket.ByteString (sendMany)
28import Data.String (fromString)
28import Data.String (fromString)
29import Traced
29import Traced
30+import GHC.IO.Exception (ioe_errno)
31+import Foreign.C.Error (Errno(..), eADDRNOTAVAIL)
31instance Traceable ControlHeader where
33instance Traceable ControlHeader where
32 trace = traceShow
34 trace = traceShow
@@ -465,11 +467,33 @@ testUnnecessaryConnect nextPort = do
465 forkTry $ do
467 forkTry $ do
466 let ourAddress = EndPointAddress "ourAddress"
468 let ourAddress = EndPointAddress "ourAddress"
467 Right (_, ConnectionRequestAccepted) <- readMVar serverAddr >>= socketToEndPoint ourAddress
469 Right (_, ConnectionRequestAccepted) <- readMVar serverAddr >>= socketToEndPoint ourAddress
468− Right (_, ConnectionRequestEndPointInvalid) <- readMVar serverAddr >>= socketToEndPoint ourAddress
470+ Right (_, ConnectionRequestCrossed) <- readMVar serverAddr >>= socketToEndPoint ourAddress
469 putMVar clientDone ()
471 putMVar clientDone ()
471 takeMVar clientDone
473 takeMVar clientDone
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
482+ mTransport <- nextPort >>= createTransport "127.0.0.1"
486+ putStrLn $ "IOException: " ++ show ex ++ "; errno = " ++ show (ioe_errno ex)
487+ case (ioe_errno ex) of
488+ Just no | Errno no == eADDRNOTAVAIL -> putStrLn "(ADDRNOTAVAIL)"
493+ Right endpoint <- newEndPoint transport
494+ Right _ <- connect endpoint (address masterEndPoint) ReliableOrdered defaultConnectHints
473main :: IO ()
497main :: IO ()
475 portMVar <- newEmptyMVar
499 portMVar <- newEmptyMVar
@@ -483,5 +507,6 @@ main = do
483 , ("TestUnnecessaryConnect", testUnnecessaryConnect nextPort)
507 , ("TestUnnecessaryConnect", testUnnecessaryConnect nextPort)
484 , ("InvalidAddress", testInvalidAddress nextPort)
508 , ("InvalidAddress", testInvalidAddress nextPort)
485 , ("InvalidConnect", testInvalidConnect nextPort)
509 , ("InvalidConnect", testInvalidConnect nextPort)
510+ , ("TestMany", testMany nextPort)
487 testTransport (either (Left . show) (Right) <$> nextPort >>= createTransport "127.0.0.1")
512 testTransport (either (Left . show) (Right) <$> nextPort >>= createTransport "127.0.0.1")