stdio-0.2.0.0: test/Std/IO/UDPSpec.hs
{-# LANGUAGE OverloadedStrings #-}
module Std.IO.UDPSpec where
import Control.Concurrent
import Control.Monad
import Data.Bits
import Std.Data.Vector as V
import Std.Data.Vector.Base as V
import Data.List as List
import Foreign.Marshal.Array
import Foreign.Ptr
import Std.IO.Exception
import Std.IO.UDP
import Std.IO.Resource
import Std.IO.SockAddr
import Test.Hspec
import Test.HUnit
spec :: Spec
spec = describe "UDP operations" $ do
it "roundtrip test" $ do
let testMsg = V.replicate 256 48
longMsg = V.replicate 2048 48
addr = SockAddrInet 12345 inetLoopback
withResource (initUDP defaultUDPConfig{sendMsgSize = 2048}) $ \ c ->
withResource (initUDP defaultUDPConfig{localUDPAddr = Just (addr,UV_UDP_DEFAULT)}) $ \ s -> do
forkIO $ sendUDP c addr testMsg
[(_, partial, rcvMsg)]<- recvUDP s
partial @=? False
rcvMsg @=? testMsg
threadDelay 100000
forkIO $ sendUDP c addr longMsg
[(_, partial, rcvMsg)]<- recvUDP s
partial @=? True
it "UDP sending addr test" $ do
let testMsg = V.replicate 256 48
addr = SockAddrInet 12346 inetLoopback
addr' = SockAddrInet 12347 inetLoopback
withResource (initUDP defaultUDPConfig{localUDPAddr = Just (addr,UV_UDP_DEFAULT)}) $ \ c ->
withResource (initUDP defaultUDPConfig{localUDPAddr = Just (addr',UV_UDP_DEFAULT)}) $ \ s -> do
forkIO $ sendUDP c addr' testMsg
[(rcvAddr, _, _)]<- recvUDP s
Just addr @=? rcvAddr
it "overlong message exception" $ do
let testMsg = V.replicate 4096 48
addr = SockAddrInet 12348 inetLoopback
withResource (initUDP defaultUDPConfig) $ \ c ->
withResource (initUDP defaultUDPConfig) $ \ s -> do
sendUDP c addr testMsg `shouldThrow` anyException
{- This test need a local broadcast address, so it's disabled by default.
it "UDP sending addr test" $ do
let testMsg = V.replicate 256 48
addr = SockAddrInet 12349 (tupleToInetAddr (10,92,239,187))
addr' = SockAddrInet 12350 inetAny
broadcastAddr = SockAddrInet 12350 (tupleToInetAddr (10,92,239,255))
withResource (initUDP defaultUDPConfig{localUDPAddr = Just (addr,UV_UDP_DEFAULT)}) $ \ c ->
withResource (initUDP defaultUDPConfig{localUDPAddr = Just (addr',UV_UDP_DEFAULT)}) $ \ s -> do
setBroadcast c True
forkIO $ sendUDP c broadcastAddr testMsg
[(rcvAddr, _, rcvMsg)]<- recvUDP s
Just addr @=? rcvAddr
rcvMsg @=? testMsg
-}