content: ------------------------------------------------------------
  -- Copyright : Erik de Castro Lopo <erikd@mega-nerd.com>
  -- License : BSD3
  ------------------------------------------------------------
  
  module Test.ServerDef
      ( PortsDef (..)
      , portsDef
      ) where
  
  import Data.List (sort)
  import System.IO.Unsafe (unsafePerformIO)
  import System.Random
  
  data PortsDef = PortsDef
      { httpTestPort :: Int
      , httpsTestPort :: Int
      }
      deriving Show
  
  
  -- Yeah, yeah, unsafePerformIO! Worst thing that can happen is that the tests
  -- fail.
  {-# NOINLINE portsDef #-}
  portsDef :: PortsDef
  portsDef = unsafePerformIO getPortsDef
  
  
  -- Grab three unique Ints in the range (30000, 60000) and stick them in a
  -- PortsDef constructor.
  getPortsDef :: IO PortsDef
  getPortsDef = do
      vals <- randomRL []
      case sort vals of
          [a, b] -> return $ PortsDef a b
          _ -> getPortsDef
    where
      randomRL :: [Int] -> IO [Int]
      randomRL xs
          | length xs == 2 = return $ sort xs
          | otherwise = do
              x <- randomRIO portRange
              if x `elem` xs
                  then randomRL xs
                  else randomRL (x:xs)
  
  portRange :: (Int, Int)
  portRange = (30000, 60000)
  