Z-IO-0.1.2.0: test/Z/IO/Network/TCPSpec.hs
{-# LANGUAGE OverloadedStrings #-}
module Z.IO.Network.TCPSpec where
import Control.Concurrent
import Control.Monad
import Data.Bits
import Z.Data.Vector as V
import Z.Data.Vector.Base as V
import Data.List as List
import Foreign.Marshal.Array
import Foreign.Ptr
import Z.IO.Exception
import Z.IO.Resource
import Z.IO.Buffered
import Z.IO.Network
import Test.Hspec
import Test.HUnit
spec :: Spec
spec = describe "TCP operations" $ do
it "roundtrip test" $ do
let testMsg = V.cycleN 256 "abc"
longMsg = V.cycleN 2048 "abcdefg"
addr = SocketAddrInet 12345 inetLoopback
serverThread <- forkIO $ startTCPServer defaultTCPServerConfig{
tcpListenAddr = addr
, tcpServerWorker = \ tcp -> do
i <- newBufferedInput defaultChunkSize tcp
o <- newBufferedOutput defaultChunkSize tcp
forever $ readBuffer i >>= writeBuffer o >> flushBuffer o
}
threadDelay 100000
replicateM_ 512 . forkIO $
withResource (initTCPClient defaultTCPClientConfig{tcpRemoteAddr = addr}) $ \ tcp -> do
i <- newBufferedInput defaultChunkSize tcp
o <- newBufferedOutput defaultChunkSize tcp
writeBuffer o testMsg >> flushBuffer o
testMsg' <- readExactly' (V.length testMsg) i
testMsg' @=? testMsg
writeBuffer o longMsg >> flushBuffer o
longMsg' <- readExactly' (V.length longMsg) i
longMsg' @=? longMsg
threadDelay 5000000
killThread serverThread