8000 More testing fault scenarios when exception throwed in receiver thread · postgres-haskell/postgres-wire@2889f54 · GitHub
[go: up one dir, main page]

8000 Skip to content

Commit 2889f54

Browse files
More testing fault scenarios when exception throwed in receiver thread
1 parent f008189 commit 2889f54

File tree

2 files changed

+47
-15
lines changed

2 files changed

+47
-15
lines changed

postgres-wire.cabal

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -81,6 +81,8 @@ test-suite postgres-wire-test
8181
, bytestring
8282
, vector
8383
, tasty
84+
, socket
85+ 8000
, async
8486
, tasty-hunit
8587
ghc-options: -threaded -rtsopts -with-rtsopts=-N
8688
default-language: Haskell2010

tests/Fault.hs

Lines changed: 45 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -8,11 +8,17 @@ import Data.Either
88
import qualified Data.ByteString as B
99
import qualified Data.ByteString.Char8 as BS
1010
import qualified Data.Vector as V
11+
import System.Socket (SocketException(..))
12+
import System.Mem.Weak (Weak, deRefWeak)
13+
import Control.Concurrent (throwTo)
14+
import Control.Concurrent.Async
15+
import Control.Exception
1116

1217
import Test.Tasty
1318
import Test.Tasty.HUnit
1419

1520
import Database.PostgreSQL.Driver.Connection
21+
import Database.PostgreSQL.Driver.RawConnection
1622
import Database.PostgreSQL.Driver.StatementStorage
1723
import Database.PostgreSQL.Driver.Query
1824
import Database.PostgreSQL.Driver.Error
@@ -25,32 +31,56 @@ longQuery = Query "SELECT pg_sleep(5)" V.empty Text Text NeverCache
2531

2632
testFaults :: TestTree
2733
testFaults = testGroup "Faults"
28-
[ testCase "Single batch by waitReadyForQuery" testBatchReadyForQuery
29-
, testCase "Single batch by readNextData " testBatchNextData
34+
[ makeInterruptTest "Single batch by waitReadyForQuery"
35+
testBatchReadyForQuery
36+
, makeInterruptTest "Single batch by readNextData "
37+
testBatchNextData
38+
, makeInterruptTest "Simple Query"
39+
testSimpleQuery
3040
]
41+
where
42+
makeInterruptTest name action = testGroup name $
43+
map (\(caseName, interruptAction) ->
44+
testCase caseName $ action interruptAction)
45+
[ ("close", close)
46+
, ("close socket", closeSocket)
47+
, ("socket exception", throwSocketException)
48+
, ("other exception", throwOtherException)
49+
]
3150

32-
testBatchReadyForQuery :: IO ()
33-
testBatchReadyForQuery = withConnection $ \c -> do
51+
testBatchReadyForQuery :: (Connection -> IO ()) -> IO ()
52+
testBatchReadyForQuery interruptAction = withConnection $ \c -> do
3453
sendBatchAndSync c [longQuery]
35-
interruptConnection c
54+
interruptAction c
3655
r <- waitReadyForQuery c
3756
assertUnexpected r
3857

39-
testBatchNextData :: IO ()
40-
testBatchNextData = withConnection $ \c -> do
58+
testBatchNextData :: (Connection -> IO ()) -> IO ()
59+
testBatchNextData interruptAction = withConnection $ \c -> do
4160
sendBatchAndSync c [longQuery]
42-
interruptConnection c
61+
interruptAction c
4362
r <- readNextData c
4463
assertUnexpected r
4564

46-
-- testSimpleQuery :: IO ()
47-
-- testSimpleQuery = withConnection $ \c -> do
48-
-- r <- sendSimpleQuery c "SELECT pg_sleep(5)"
49-
-- interruptConnection c
50-
-- assertUnexpected r
65+
testSimpleQuery :: (Connection -> IO ()) -> IO ()
66+
testSimpleQuery interruptAction = withConnection $ \c -> do
67+
asyncVar <- async $ sendSimpleQuery c "SELECT pg_sleep(5)"
68+
interruptAction c
69+
r <- wait asyncVar
70+
assertUnexpected r
71+
72+
closeSocket :: Connection -> IO ()
73+
closeSocket = rClose . connRawConnection
74+
75+
throwSocketException :: Connection -> IO ()
76+
throwSocketException conn = do
77+
let exc = SocketException 2
78+
maybe (pure ()) (`throwTo` exc) =<< deRefWeak (connReceiverThread conn)
5179

52-
interruptConnection :: Connection -> IO ()
53-
interruptConnection = close
80+
throwOtherException :: Connection -> IO ()
81+
throwOtherException conn = do
82+
let exc = PatternMatchFail "custom exc"
83+
maybe (pure ()) (`throwTo` exc) =<< deRefWeak (connReceiverThread conn)
5484

5585
assertUnexpected :: Show a => Either Error a -> Assertion
5686
assertUnexpected (Left (UnexpectedError _)) = pure ()

0 commit comments

Comments
 (0)
0