craze-0.1.2.0: test/Network/CrazeSpec.hs
{-# LANGUAGE OverloadedStrings #-}
module Network.CrazeSpec where
import Control.Concurrent
import Control.Monad.IO.Class
import Data.ByteString (ByteString, isInfixOf)
import Network.Craze
import Network.Curl
import Network.HTTP.Base hiding (port)
import Network.HTTP.Proxy.Server
import Test.Hspec
oneSecond :: Int
oneSecond = 1000000
runDelayedProxy :: Integer -> Int -> ByteString -> IO ()
runDelayedProxy port delay fixedBody = proxyMain (def :: Settings ByteString)
{ responseModifier = \_ res
-> threadDelay (delay * oneSecond)
>> return (res { rspBody = fixedBody})
, portnum = port
, hostname = Just "localhost"
}
racer :: Racer [(String, String)] ByteString ByteString
racer = Racer
{ racerHandler = pure . respBody
, racerChecker = not . isInfixOf "Something"
, racerProviders
= [simple [CurlProxy "localhost", CurlProxyPort 8082]
, simple [CurlProxy "localhost", CurlProxyPort 8083]
, simple [CurlProxy "localhost", CurlProxyPort 8084]
, delayed [CurlProxy "localhost", CurlProxyPort 8085] 2000000
]
, racerDebug = True
, racerReturnLast = False
}
failingRacer :: Racer [(String, String)] ByteString ByteString
failingRacer = racer
{ racerChecker = isInfixOf "OMG WHY"
, racerReturnLast = True
, racerProviders
= [simple [CurlProxy "localhost", CurlProxyPort 8086]
, simple [CurlProxy "localhost", CurlProxyPort 8087]
, simple [CurlProxy "localhost", CurlProxyPort 8088]
, delayed [CurlProxy "localhost", CurlProxyPort 8089] 2000000
]
}
spec :: Spec
spec = describe "Network.Craze" $
describe "raceGet" $ do
it "should race GET requests" $ do
proxies <- mapM (liftIO . forkIO)
[ runDelayedProxy 8082 5 "Hoogle"
, runDelayedProxy 8083 2 "Hayoo"
, runDelayedProxy 8084 1 "Something"
, runDelayedProxy 8085 1 "Slow"
]
liftIO $ threadDelay (1 * oneSecond) >> putStrLn "Waited 1 secs..."
response <- liftIO $ raceGet racer "http://www.google.com"
liftIO $ mapM_ killThread proxies
response `shouldSatisfy`
\x -> case x of
Just a -> "Hayoo" `isInfixOf` a
Nothing -> False
it "should return the last when requested" $ do
proxies <- mapM (liftIO . forkIO)
[ runDelayedProxy 8086 10 "Hoogle"
, runDelayedProxy 8087 2 "Hayoo"
, runDelayedProxy 8088 1 "Something"
, runDelayedProxy 8089 1 "Slow"
]
liftIO $ threadDelay (1 * oneSecond) >> putStrLn "Waited 1 secs..."
response <- liftIO $ raceGet failingRacer "http://www.google.com"
liftIO $ mapM_ killThread proxies
response `shouldSatisfy`
\x -> case x of
Just a -> "Hoogle" `isInfixOf` a
Nothing -> False