Z-IO-0.6.1.0: test/Z/IO/Network/IPCSpec.hs
{-# LANGUAGE OverloadedStrings #-}
module Z.IO.Network.IPCSpec where
import Control.Concurrent
import Control.Monad
import Data.Bits
import Data.List as List
import Foreign.Marshal.Array
import Foreign.Ptr
import Test.HUnit
import Test.Hspec
import Z.Data.Vector as V
import Z.Data.Vector.Base as V
import Z.IO.Buffered
import Z.IO.Exception
import Z.IO.FileSystem (mkdtemp)
import Z.IO.Network
import Z.IO.Resource
spec :: Spec
spec = describe "IPC operations" $ do
it "roundtrip test" $ do
let testMsg = V.cycleN 256 "abc"
longMsg = V.cycleN 2048 "abcdefg"
tmpDir <- mkdtemp "z-io-test"
let addr = tmpDir <> "socket-file"
serverThread <- forkIO $ startIPCServer defaultIPCServerConfig{ ipcListenName = addr } echo
threadDelay 1000000 -- 1s
replicateM_ 10 . forkIO $
withResource (initIPCClient defaultIPCClientConfig{ipcTargetName = addr}) $ \ ipc -> do
i <- newBufferedInput ipc
o <- newBufferedOutput ipc
writeBuffer o testMsg >> flushBuffer o
testMsg' <- readAll' i
testMsg' @=? testMsg
writeBuffer o longMsg >> flushBuffer o
longMsg' <- readAll' i
longMsg' @=? longMsg
threadDelay 5000000 -- 5s
killThread serverThread