----------------------------------------------------------------------------- -- | -- Module : Main (linear-socket-spec) -- Copyright : Copyright (C) 2017 Allele Dev -- License : GPL-3 (see the file LICENSE) -- Maintainer : allele.dev@gmail.com -- Stability : provisional -- Portability : portable -- -- This is the primary test suite. ----------------------------------------------------------------------------- {-# OPTIONS_GHC -Wall #-} module Main where import Prelude (IO, ($)) import Control.Monad import Control.Concurrent import Test.Tasty.Hspec import Network.Typed.Socket import qualified Network.Socket as NS serverAddr :: SockAddr 'InetV4 serverAddr = SockAddrInet 2291 (NS.tupleToHostAddress (127,0,0,1)) serverTest :: SSocket 'InetV4 'Tcp 'Listening 'Available -> IO () serverTest server = do (client, _) <- accept server bs <- recv 32 client n <- send bs client n `shouldBe` 4 return () runServer :: SSocket 'InetV4 'Tcp 'Unconnected 'Available -> MVar () -> IO () runServer s serverWaitLock = makeAddrReusable s >>= bind serverAddr >>= listen 1 >>= (\server -> putMVar serverWaitLock () >> serverTest server) runClient :: SSocket 'InetV4 'Tcp 'Unconnected 'Available -> IO () runClient s = do client <- connect serverAddr s n <- send "fish" client bs <- recv 32 client n `shouldBe` 4 bs `shouldBe` "fish" main :: IO () main = hspec $ do describe "Network.Typed.Socket" $ do it "can open and close a tcp4 socket" $ do tcp4Socket >>= close >> return () it "can open and close a tcp6 socket" $ do tcp6Socket >>= close >> return () it "can open and close a udp4 socket" $ do udp4Socket >>= close >> return () it "can open and close a udp6 socket" $ do udp6Socket >>= close >> return () it "can echo server (TCP)" $ do withTcp4Socket $ \server -> do withTcp4Socket $ \client -> do serverWaitLock <- newEmptyMVar void (forkIO (runServer server serverWaitLock)) void (takeMVar serverWaitLock) runClient client