1 {-# LANGUAGE NoMonomorphismRestriction #-}
2 module Hspec.Client.Server where
4 import Control.Concurrent (ThreadId, forkIO, killThread)
5 import Control.Monad (Monad(..))
6 import Data.Function (($))
7 import Data.Maybe (fromJust)
9 import qualified Network.HTTP.Client as Client
10 import qualified Network.Socket as Net
11 import qualified Network.Wai as Wai
12 import qualified Network.Wai.Handler.Warp as Warp
16 -- * Type 'TestServer'
17 data TestServer = TestServer
19 , socket :: Net.Socket
23 runTestServer :: Wai.Application -> IO TestServer
24 runTestServer waiApp = do
25 let baseURI = fromJust $ parseURI "http://localhost:8080"
26 (port, socket) <- openTestSocket
28 Warp.runSettingsSocket
29 (Warp.setPort port $ Warp.defaultSettings)
31 manager <- Client.newManager Client.defaultManagerSettings
33 { env = clientEnv manager baseURI
36 killTestServer :: TestServer -> IO ()
37 killTestServer TestServer{..} = do
41 openTestSocket :: IO (Warp.Port, Net.Socket)
43 sock <- Net.socket Net.AF_INET Net.Stream Net.defaultProtocol
44 Net.setSocketOption sock Net.ReuseAddr 1
45 Net.bind sock (Net.SockAddrInet port host)
49 host = Net.tupleToHostAddress (127, 0, 0, 1)