packages feed

socket-0.6.0.0: tests/IPV6_V6ONLY.hs

{-# LANGUAGE OverloadedStrings #-}
module Main where

import Data.Bits
import Data.Monoid
import Control.Monad
import Control.Exception
import Control.Concurrent
import Control.Concurrent.Async
import System.Socket
import System.Socket.Family.Inet
import System.Socket.Family.Inet6
import System.Socket.Type.Datagram
import System.Socket.Protocol.UDP
import System.Exit

main :: IO ()
main = do
  t0001
  t0002

t0001 :: IO ()
t0001 =
  bracket
    ( do
        server <- socket                              `onException` p 0 :: IO (Socket Inet6 Datagram UDP)
        client <- socket                              `onException` p 1 :: IO (Socket Inet  Datagram UDP)
        return (server, client)
    )
    (\(server,client)-> do
        close server                                  `onException` p 2
        close client                                  `onException` p 3
    )
    (\(server,client)-> do
        setSocketOption server (V6Only True)                `onException` p 4
        bind server (SocketAddressInet6 inet6Any 7777 0 0) `onException` p 5

        threadDelay 1000000 -- wait for the listening socket being set up
        sendTo client "PING" mempty (SocketAddressInet inetLoopback 7777)
                                                            `onException` p 6
        eith <- race
          ( receiveFrom server 4096 mempty `onException` p 7 >> return () )
          ( threadDelay 1000000 )
        case eith of
          Left  () -> e 8        -- we didn't expect receiving a msg
          Right () -> return ()  -- timeout is the expected behaviour
    )
  where
    e i  = error ("t0001." ++ show i)
    p i  = print ("t0001." ++ show i)

t0002 :: IO ()
t0002 =
  bracket
    ( do
        server <- socket                              `onException` p 0 :: IO (Socket Inet6 Datagram UDP)
        client <- socket                              `onException` p 1 :: IO (Socket Inet  Datagram UDP)
        return (server, client)
    )
    (\(server,client)-> do
        close server                                  `onException` p 2
        close client                                  `onException` p 3
    )
    (\(server,client)-> do
        setSocketOption server (V6Only False)              `onException` p 4
        bind server (SocketAddressInet6 inet6Any 7778 0 0) `onException` p 5

        threadDelay 1000000 -- wait for the listening socket being set up
        sendTo client "PING" mempty (SocketAddressInet inetLoopback 7778) `onException` p 6
        eith <- race
          ( receiveFrom server 4096 mempty `onException` p 7 >> return ())
          ( threadDelay 1000000 )
        case eith of
          Left  () -> return ()  -- we received the expected msg
          Right () -> e 8        -- timeout occured
    )
  where
    e i  = error ("t0002." ++ show i)
    p i  = print ("t0002." ++ show i)