{-# LANGUAGE OverloadedStrings #-} module Data.Streaming.NetworkSpec where import Control.Concurrent.Async (withAsync) import Control.Exception (bracket) import Control.Monad (forever, replicateM_) import Data.Array.Unboxed (elems) import qualified Data.ByteString.Char8 as S8 import Data.Char (toUpper) import Data.Streaming.Network import Network.Socket (sClose) import Test.Hspec import Test.Hspec.QuickCheck spec :: Spec spec = do describe "getUnassignedPort" $ do it "sanity" $ replicateM_ 100000 $ do port <- getUnassignedPort (port `elem` elems unassignedPorts) `shouldBe` True describe "bindRandomPortTCP" $ do modifyMaxSuccess (const 5) $ prop "sanity" $ \content -> bracket (bindRandomPortTCP "*4") (sClose . snd) $ \(port, socket) -> do let server ad = forever $ appRead ad >>= appWrite ad . S8.map toUpper client ad = do appWrite ad bs appRead ad >>= (`shouldBe` S8.map toUpper bs) bs | null content = "hello" | otherwise = S8.pack $ take 1000 content withAsync (runTCPServer (serverSettingsTCPSocket socket) server) $ \_ -> do runTCPClient (clientSettingsTCP port "127.0.0.1") client