packages feed

hedgehog-extras-0.6.3.0: test/Hedgehog/Extras/Stock/IO/Network/PortSpec.hs

module Hedgehog.Extras.Stock.IO.Network.PortSpec
  ( hprop_randomPort
  ) where

import           Data.Function
import           Data.Semigroup
import           Hedgehog (Property)
import qualified Hedgehog as H
import qualified Hedgehog.Extras as H
import qualified Hedgehog.Extras.Stock.IO.Network.Port as IO
import qualified Network.Socket as N
import           Text.Show
import qualified Data.Time as D
import Control.Monad.IO.Class
import Control.Applicative

hprop_randomPort :: Property
hprop_randomPort =
  H.propertyOnce $ do
    let hostAddress = N.tupleToHostAddress (0, 0, 0, 0)

    pn <- H.evalIO $ IO.randomPort hostAddress

    H.note_ $ "Allocated port: " <> show pn

    -- retry binding for 5 seconds - seems that sometimes OS still marks port as unavailable for a while
    -- after 'randomPort' call
    deadline <- D.addUTCTime 5 <$> liftIO D.getCurrentTime
    H.byDeadlineM 0.2 deadline "try binding to allocated port" $ do
      -- Check that the port is available and can be bound to a socket.
      sock <- H.evalIO $ N.socket N.AF_INET N.Stream N.defaultProtocol
      H.evalIO $ N.bind sock $ N.SockAddrInet pn hostAddress
      H.evalIO $ N.close sock