on master help sign in
Rewrite delayed cleanup tests using IORefs
60ee1abOleg Grenrus
servant-server/test/Servant/Server/Internal/RoutingApplicationSpec.hs+21−11
@@ -1,23 +1,33 @@
1module Servant.Server.Internal.RoutingApplicationSpec (spec) where
1module Servant.Server.Internal.RoutingApplicationSpec (spec) where
2
2
3+import Prelude ()
4+import Prelude.Compat
5+
3import Control.Exception hiding (Handler)
6import Control.Exception hiding (Handler)
4import Control.Monad.IO.Class
7import Control.Monad.IO.Class
8+import Data.Maybe (isJust)
9+import Data.IORef
5import Servant.Server
10import Servant.Server
6import Servant.Server.Internal.RoutingApplication
11import Servant.Server.Internal.RoutingApplication
7−import System.Directory
8import Test.Hspec
12import Test.Hspec
9
13
14+import System.IO.Unsafe (unsafePerformIO)
15+
10ok :: IO (RouteResult ())
16ok :: IO (RouteResult ())
11ok = return (Route ())
17ok = return (Route ())
12
18
19+-- Let's not write to the filesystem
20+delayedTestRef :: IORef (Maybe String)
21+delayedTestRef = unsafePerformIO $ newIORef Nothing
22+
13delayed :: DelayedIO () -> RouteResult (Handler ()) -> Delayed () (Handler ())
23delayed :: DelayedIO () -> RouteResult (Handler ()) -> Delayed () (Handler ())
14delayed body srv = Delayed
24delayed body srv = Delayed
15 { capturesD = \() -> DelayedIO $ \_req _cl -> ok
25 { capturesD = \() -> DelayedIO $ \_req _cl -> ok
16 , methodD = DelayedIO $ \_req_ _cl -> ok
26 , methodD = DelayedIO $ \_req_ _cl -> ok
17 , authD = DelayedIO $ \_req _cl -> ok
27 , authD = DelayedIO $ \_req _cl -> ok
18 , bodyD = do
28 , bodyD = do
19− liftIO (writeFile "delayed.test" "hia")
29+ liftIO (writeIORef delayedTestRef (Just "hia") >> putStrLn "garbage created")
20− addCleanup (removeFile "delayed.test" >> putStrLn "file removed")
30+ addCleanup (writeIORef delayedTestRef Nothing >> putStrLn "garbage collected")
21 body
31 body
22 , serverD = \() () _body _req -> srv
32 , serverD = \() () _body _req -> srv
23 }
33 }
@@ -35,17 +45,17 @@ spec = do
35 describe "Delayed" $ do
45 describe "Delayed" $ do
36 it "actually runs clean up actions" $ do
46 it "actually runs clean up actions" $ do
37 _ <- simpleRun $ delayed (return ()) (Route $ return ())
47 _ <- simpleRun $ delayed (return ()) (Route $ return ())
38− fileStillThere <- doesFileExist "delayed.test"
48+ cleanUpDone <- isJust <$> readIORef delayedTestRef
39− fileStillThere `shouldBe` False
49+ cleanUpDone `shouldBe` False
40 it "even with exceptions in serverD" $ do
50 it "even with exceptions in serverD" $ do
41 _ <- simpleRun $ delayed (return ()) (Route $ throw DivideByZero)
51 _ <- simpleRun $ delayed (return ()) (Route $ throw DivideByZero)
42− fileStillThere <- doesFileExist "delayed.test"
52+ cleanUpDone <- isJust <$> readIORef delayedTestRef
43− fileStillThere `shouldBe` False
53+ cleanUpDone `shouldBe` False
44 it "even with routing failure in bodyD" $ do
54 it "even with routing failure in bodyD" $ do
45 _ <- simpleRun $ delayed (delayedFailFatal err500) (Route $ return ())
55 _ <- simpleRun $ delayed (delayedFailFatal err500) (Route $ return ())
46− fileStillThere <- doesFileExist "delayed.test"
56+ cleanUpDone <- isJust <$> readIORef delayedTestRef
47− fileStillThere `shouldBe` False
57+ cleanUpDone `shouldBe` False
48 it "even with exceptions in bodyD" $ do
58 it "even with exceptions in bodyD" $ do
49 _ <- simpleRun $ delayed (liftIO $ throwIO DivideByZero) (Route $ return ())
59 _ <- simpleRun $ delayed (liftIO $ throwIO DivideByZero) (Route $ return ())
50− fileStillThere <- doesFileExist "delayed.test"
60+ cleanUpDone <- isJust <$> readIORef delayedTestRef
51− fileStillThere `shouldBe` False
61+ cleanUpDone `shouldBe` False