on master help sign in
More test improvements
commita231406ab4d69ee04ac09f7430dea5fce64abca3 authorMichael Snoyman <michael@snoyman.com> dateTue 11 Dec 2012, 18:43 (14 years ago) parent1184d09
1 file changed+13−3
warp/test/RunSpec.hs+13−3
warp/test/RunSpec.hs+13−3
@@ -1,4 +1,5 @@
11{-# LANGUAGE OverloadedStrings #-}
2+{-# LANGUAGE ScopedTypeVariables #-}
23
34module RunSpec (main, spec) where
45
@@ -19,7 +20,9 @@ import System.IO (hFlush, hClose)
1920import System.IO.Unsafe (unsafePerformIO)
2021import Test.Hspec
2122import Control.Concurrent.MVar (newEmptyMVar, takeMVar, putMVar)
22−import Control.Exception (bracket)
23+import Control.Exception (bracket, try, IOException, onException)
24+import Data.Conduit.Network (bindPort)
25+import Network.Socket (sClose)
2326
2427main :: IO ()
2528main = hspec spec
@@ -68,7 +71,14 @@ nextPort :: I.IORef Int
6871nextPort = unsafePerformIO $ I.newIORef 5000
6972
7073getPort :: IO Int
71−getPort = I.atomicModifyIORef nextPort $ \p -> (p + 1, p)
74+getPort = do
75+ port <- I.atomicModifyIORef nextPort $ \p -> (p + 1, p)
76+ esocket <- try $ bindPort port HostIPv4
77+ case esocket of
78+ Left (_ :: IOException) -> getPort
79+ Right socket -> do
80+ sClose socket
81+ return port
7282
7383withApp :: Settings -> Application -> (Int -> IO a) -> IO a
7484withApp settings app f = do
@@ -78,7 +88,7 @@ withApp settings app f = do
7888 (forkIO $ runSettings settings
7989 { settingsPort = port
8090 , settingsBeforeMainLoop = putMVar baton ()
81− } app)
91+ } app `onException` putMVar baton ())
8292 killThread
8393 (const $ takeMVar baton >> f port)
8494