snap-0.9.0: test/suite/TestSuite.hs
{-# LANGUAGE OverloadedStrings #-}
{-# LANGUAGE ScopedTypeVariables #-}
module Main where
------------------------------------------------------------------------------
import Control.Concurrent
import Control.Exception
import Control.Monad
import qualified Data.ByteString.Lazy.Char8 as L
import qualified Data.ByteString.Char8 as S
import qualified Network.HTTP.Conduit as HTTP
import Prelude hiding (catch)
import Snap.Http.Server.Config
import Snap.Snaplet
import System.IO
import System.Posix.Process
import System.Posix.Signals
import System.Posix.Types
import Test.Framework
import Test.Framework.Providers.HUnit
import Test.HUnit hiding (Test, path)
------------------------------------------------------------------------------
import Blackbox.App
import qualified Blackbox.Tests
import Snap.Http.Server (simpleHttpServe)
import qualified Snap.Snaplet.Internal.Lensed.Tests
import qualified Snap.Snaplet.Internal.LensT.Tests
import qualified Snap.Snaplet.Internal.RST.Tests
import qualified Snap.Snaplet.Internal.Tests
import Snap.TestCommon
import SafeCWD
------------------------------------------------------------------------------
main :: IO ()
main = do
Blackbox.Tests.remove
"non-cabal-appdir/snaplets/heist/templates/bad.tpl"
Blackbox.Tests.remove
"non-cabal-appdir/snaplets/heist/templates/good.tpl"
Blackbox.Tests.removeDir "non-cabal-appdir/snaplets/foosnaplet"
(tid, mvar) <- inDir False "non-cabal-appdir" startServer
defaultMain [tests] `finally` killThread tid
putStrLn "waiting for termination mvar"
takeMVar mvar
where tests = mutuallyExclusive $
testGroup "snap" [ internalServerTests
, testDefault
, testBarebones
, testTutorial
]
------------------------------------------------------------------------------
internalServerTests :: Test
internalServerTests =
mutuallyExclusive $
testGroup "internal server tests"
[ Blackbox.Tests.tests
, Snap.Snaplet.Internal.Lensed.Tests.tests
, Snap.Snaplet.Internal.LensT.Tests.tests
, Snap.Snaplet.Internal.RST.Tests.tests
, Snap.Snaplet.Internal.Tests.tests
]
------------------------------------------------------------------------------
startServer :: IO (ThreadId, MVar ())
startServer = do
mvar <- newEmptyMVar
t <- forkIO $ serve mvar (setPort 9753 defaultConfig) app
threadDelay $ 2*10^(6::Int)
return (t, mvar)
where
serve mvar config initializer =
flip finally (putMVar mvar ()) $
handle handleErr $ do
hPutStrLn stderr "initializing snaplet"
(_, handler, doCleanup) <- runSnaplet Nothing initializer
flip finally doCleanup $ do
(conf, site) <- combineConfig config handler
hPutStrLn stderr "bringing up server"
simpleHttpServe conf site
hPutStrLn stderr "server killed"
handleErr :: SomeException -> IO ()
handleErr e = hPutStrLn stderr $ "startServer exception: " ++ show e
------------------------------------------------------------------------------
testBarebones :: Test
testBarebones = testCase "snap/barebones" go
where
go = testGeneratedProject "barebonesTest"
"barebones"
""
port
testIt
port = 9990 :: Int
testIt = do
body <- HTTP.simpleHttp $ "http://127.0.0.1:"++(show port)
assertEqual "server not up" "hello world" body
------------------------------------------------------------------------------
testDefault :: Test
testDefault = testCase "snap/default" go
where
go = testGeneratedProject "defaultTest"
""
""
port
testIt
port = 9991 :: Int
testIt = do
body <- liftM (S.concat . L.toChunks) $
HTTP.simpleHttp $ "http://127.0.0.1:"++(show port)
assertBool "response contains phrase 'Snap Example App Login'"
$ "Snap Example App Login" `S.isInfixOf` body
------------------------------------------------------------------------------
testTutorial :: Test
testTutorial = testCase "snap/tutorial" go
where
go = testGeneratedProject "tutorialTest"
"tutorial"
""
port
testIt
port = 9992 :: Int
testIt = do
body <- HTTP.simpleHttp $ "http://127.0.0.1:"++(show port)++"/hello"
assertEqual "server not up" "hello world" body