@@ -10,70 +10,85 @@ import Test.Hspec
10
10
import Prelude
11
11
import qualified System.Environment
12
12
import qualified Data.ByteString.Char8 as B8
13
+ import Control.Concurrent.Async (race )
13
14
14
15
main = do
15
16
connectionSettings <- getConnectionSettings
16
17
hspec $ describe " " $ do
17
18
it " Releases a spot in the pool when there is a query error" $ do
18
- pool <- acquire 1 connectionSettings
19
+ pool <- acquire 1 Nothing connectionSettings
19
20
use pool badQuerySession `shouldNotReturn` (Right () )
20
21
use pool selectOneSession `shouldReturn` (Right 1 )
21
22
it " Simulation of connection error works" $ do
22
- pool <- acquire 3 connectionSettings
23
+ pool <- acquire 3 Nothing connectionSettings
23
24
res <- use pool $ closeConnSession >> selectOneSession
24
25
shouldSatisfy res $ \ case
25
26
Left (SessionUsageError (Session. QueryError _ _ (Session. ClientError _))) -> True
26
27
_ -> False
27
28
it " Connection errors cause eviction of connection" $ do
28
- pool <- acquire 3 connectionSettings
29
+ pool <- acquire 3 Nothing connectionSettings
29
30
res <- use pool $ closeConnSession >> selectOneSession
30
31
res <- use pool $ closeConnSession >> selectOneSession
31
32
res <- use pool $ closeConnSession >> selectOneSession
32
33
res <- use pool $ selectOneSession
33
34
shouldSatisfy res $ isRight
34
35
it " Connection gets returned to the pool after normal use" $ do
35
- pool <- acquire 3 connectionSettings
36
+ pool <- acquire 3 Nothing connectionSettings
36
37
res <- use pool $ selectOneSession
37
38
res <- use pool $ selectOneSession
38
39
res <- use pool $ selectOneSession
39
40
res <- use pool $ selectOneSession
40
41
res <- use pool $ selectOneSession
41
42
shouldSatisfy res $ isRight
42
43
it " Connection gets returned to the pool after non-connection error" $ do
43
- pool <- acquire 3 connectionSettings
44
+ pool <- acquire 3 Nothing connectionSettings
44
45
res <- use pool $ badQuerySession
45
46
res <- use pool $ badQuerySession
46
47
res <- use pool $ badQuerySession
47
48
res <- use pool $ badQuerySession
48
49
res <- use pool $ selectOneSession
49
50
shouldSatisfy res $ isRight
50
51
it " Getting and setting session variables works" $ do
51
- pool <- acquire 1 connectionSettings
52
+ pool <- acquire 1 Nothing connectionSettings
52
53
res <- use pool $ getSettingSession " testing.foo"
53
54
res `shouldBe` Right Nothing
54
55
res <- use pool $ do
55
56
setSettingSession " testing.foo" " hello world"
56
57
getSettingSession " testing.foo"
57
58
res `shouldBe` Right (Just " hello world" )
58
59
it " Session variables stay set when a connection gets reused" $ do
59
- pool <- acquire 1 connectionSettings
60
+ pool <- acquire 1 Nothing connectionSettings
60
61
res <- use pool $ setSettingSession " testing.foo" " hello world"
61
62
res `shouldBe` Right ()
62
63
res2 <- use pool $ getSettingSession " testing.foo"
63
64
res2 `shouldBe` Right (Just " hello world" )
64
65
it " Flushing the pool resets session variables" $ do
65
- pool <- acquire 1 connectionSettings
66
+ pool <- acquire 1 Nothing connectionSettings
66
67
res <- use pool $ setSettingSession " testing.foo" " hello world"
67
68
res `shouldBe` Right ()
68
69
flush pool
69
70
res <- use pool $ getSettingSession " testing.foo"
70
71
res `shouldBe` Right Nothing
71
72
it " Flushing a released pool leaves it dead" $ do
72
- pool <- acquire 1 connectionSettings
73
+ pool <- acquire 1 Nothing connectionSettings
73
74
release pool
74
75
flush pool
75
76
res <- use pool $ selectOneSession
76
77
res `shouldBe` Left PoolIsReleasedUsageError
78
+ it " Times out connection acquisition" $ do
79
+ pool <- acquire 1 (Just 1000 ) connectionSettings -- 1ms timeout
80
+ sleeping <- newEmptyMVar
81
+ t0 <- getCurrentTime
82
+ res <- race
83
+ (use pool $ liftIO $ do
84
+ putMVar sleeping ()
85
+ threadDelay 1000000 ) -- 1s
86
+ (do
87
+ takeMVar sleeping
88
+ use pool $ selectOneSession)
89
+ t1 <- getCurrentTime
90
+ res `shouldBe` Right (Left AcquisitionTimeout )
91
+ diffUTCTime t1 t0 `shouldSatisfy` (< 0.5 ) -- 0.5s
77
92
78
93
getConnectionSettings :: IO Connection. Settings
79
94
getConnectionSettings = B8. unwords . catMaybes <$> sequence
0 commit comments