Skip to content

Commit d18f9e1

Browse files
committed
Display exceptions in state machine tests
Previously, converting a real exception to the model `ErrFsError` would lose information. This commit makes sure that an `ErrFsError` now has an additional string argument that can be used to put printed exceptions in. This string argument is ignored when comparing exceptions in the state machine tests.
1 parent e64ccd6 commit d18f9e1

File tree

2 files changed

+75
-12
lines changed

2 files changed

+75
-12
lines changed

test/Database/LSMTree/Model/Session.hs

Lines changed: 42 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -98,6 +98,7 @@ import Database.LSMTree.Model.Table (LookupResult (..),
9898
QueryResult (..), Range (..), ResolveSerialisedValue (..),
9999
Update (..), getResolve, noResolve)
100100
import qualified Database.LSMTree.Model.Table as Model
101+
import GHC.Show (appPrec)
101102

102103
{-------------------------------------------------------------------------------
103104
Model
@@ -232,7 +233,7 @@ runModelMWithInjectedErrors ::
232233
runModelMWithInjectedErrors Nothing onNoErrors _ st =
233234
runModelM onNoErrors st
234235
runModelMWithInjectedErrors (Just _) _ onErrors st =
235-
runModelM (onErrors >> throwError ErrFsError) st
236+
runModelM (onErrors >> throwError (ErrFsError "modelled FsError")) st
236237

237238
--
238239
-- Errors
@@ -245,11 +246,47 @@ data Err =
245246
| ErrSnapshotWrongType
246247
| ErrBlobRefInvalidated
247248
| ErrCursorClosed
248-
-- | Passed zero tables to 'unions'
249-
| ErrUnionsZeroTables
250249
-- | Some file system error occurred
251-
| ErrFsError
252-
deriving stock (Show, Eq)
250+
| ErrFsError String
251+
252+
instance Show Err where
253+
showsPrec d = \case
254+
ErrTableClosed ->
255+
showString "ErrTableClosed"
256+
ErrSnapshotExists ->
257+
showString "ErrSnapshotExists"
258+
ErrSnapshotDoesNotExist ->
259+
showString "ErrSnapshotDoesNotExist"
260+
ErrSnapshotWrongType ->
261+
showString "ErrSnapshotWrongType"
262+
ErrBlobRefInvalidated ->
263+
showString "ErrBlobRefInvalidated"
264+
ErrCursorClosed ->
265+
showString "ErrCursorCosed"
266+
ErrFsError s ->
267+
showParen (d > appPrec) $
268+
showString "ErrFsError " .
269+
showParen True (showString s)
270+
271+
instance Eq Err where
272+
(==) ErrTableClosed ErrTableClosed = True
273+
(==) ErrSnapshotExists ErrSnapshotExists = True
274+
(==) ErrSnapshotDoesNotExist ErrSnapshotDoesNotExist = True
275+
(==) ErrSnapshotWrongType ErrSnapshotWrongType = True
276+
(==) ErrBlobRefInvalidated ErrBlobRefInvalidated = True
277+
(==) ErrCursorClosed ErrCursorClosed = True
278+
(==) (ErrFsError _) (ErrFsError _) = True
279+
(==) _ _ = False
280+
where
281+
_coveredAllCases x = case x of
282+
ErrTableClosed{} -> ()
283+
ErrSnapshotExists{} -> ()
284+
ErrSnapshotDoesNotExist{} -> ()
285+
ErrSnapshotWrongType{} -> ()
286+
ErrBlobRefInvalidated{} -> ()
287+
ErrCursorClosed{} -> ()
288+
ErrFsError{} -> ()
289+
253290

254291
{-------------------------------------------------------------------------------
255292
Tables

test/Test/Database/LSMTree/StateMachine.hs

Lines changed: 33 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99
{-# LANGUAGE InstanceSigs #-}
1010
{-# LANGUAGE LambdaCase #-}
1111
{-# LANGUAGE MultiParamTypeClasses #-}
12+
{-# LANGUAGE MultiWayIf #-}
1213
{-# LANGUAGE NamedFieldPuns #-}
1314
{-# LANGUAGE OverloadedStrings #-}
1415
{-# LANGUAGE QuantifiedConstraints #-}
@@ -64,11 +65,14 @@ module Test.Database.LSMTree.StateMachine (
6465
, Action (..)
6566
) where
6667

68+
import Control.ActionRegistry (AbortActionRegistryError (..),
69+
CommitActionRegistryError (..))
6770
import Control.Concurrent.Class.MonadMVar.Strict
6871
import Control.Concurrent.Class.MonadSTM.Strict
6972
import Control.Monad (forM_, void, (<=<))
70-
import Control.Monad.Class.MonadThrow (Handler (..), MonadCatch (..),
71-
MonadThrow (..), catches)
73+
import Control.Monad.Class.MonadThrow (Exception (..), Handler (..),
74+
MonadCatch (..), MonadThrow (..), catches,
75+
displayException)
7276
import Control.Monad.IOSim
7377
import Control.Monad.Primitive
7478
import Control.Monad.Reader (ReaderT (..))
@@ -160,7 +164,7 @@ tests = testGroup "Test.Database.LSMTree.StateMachine" [
160164
Handler f -> do
161165
throwIO (dummyFsError s) `catch` \e -> do
162166
e' <- f e
163-
pure (e' QC.=== Just Model.ErrFsError)
167+
pure (e' QC.=== Just (Model.ErrFsError ("dummy: " ++ s)))
164168
]
165169

166170
labelledExamples :: IO ()
@@ -284,7 +288,11 @@ propLockstep_RealImpl_RealFS_IO tr =
284288
env :: RealEnv R.Table IO
285289
env = RealEnv {
286290
envSession = session
287-
, envHandlers = [realHandler @IO, fsErrorHandler]
291+
, envHandlers = [
292+
realHandler @IO
293+
, fsErrorHandler
294+
, actionRegistryErrorHandler
295+
]
288296
, envErrors = errsVar
289297
, envInjectFaultResults = faultsVar
290298
}
@@ -321,7 +329,11 @@ propLockstep_RealImpl_MockFS_IO tr =
321329
env :: RealEnv R.Table IO
322330
env = RealEnv {
323331
envSession = session
324-
, envHandlers = [realHandler @IO, fsErrorHandler]
332+
, envHandlers = [
333+
realHandler @IO
334+
, fsErrorHandler
335+
, actionRegistryErrorHandler
336+
]
325337
, envErrors = errsVar
326338
, envInjectFaultResults = faultsVar
327339
}
@@ -346,7 +358,11 @@ propLockstep_RealImpl_MockFS_IOSim tr actions =
346358
env :: RealEnv R.Table (IOSim s)
347359
env = RealEnv {
348360
envSession = session
349-
, envHandlers = [realHandler @(IOSim s), fsErrorHandler]
361+
, envHandlers = [
362+
realHandler @(IOSim s)
363+
, fsErrorHandler
364+
, actionRegistryErrorHandler
365+
]
350366
, envErrors = errsVar
351367
, envInjectFaultResults = faultsVar
352368
}
@@ -423,7 +439,17 @@ fsErrorHandler :: Monad m => Handler m (Maybe Model.Err)
423439
fsErrorHandler = Handler $ pure . handler'
424440
where
425441
handler' :: FsError -> Maybe Model.Err
426-
handler' _ = Just Model.ErrFsError
442+
handler' e = Just (Model.ErrFsError (displayException e))
443+
444+
actionRegistryErrorHandler :: Monad m => Handler m (Maybe Model.Err)
445+
actionRegistryErrorHandler = Handler $ \e -> pure $
446+
if
447+
| Just AbortActionRegistryError{} <- fromException e
448+
-> Just (Model.ErrFsError (displayException e))
449+
| Just CommitActionRegistryError{} <- fromException e
450+
-> Just (Model.ErrFsError (displayException e))
451+
| otherwise
452+
-> Nothing
427453

428454
createSystemTempDirectory :: [Char] -> IO (FilePath, HasFS IO HandleIO, HasBlockIO IO HandleIO)
429455
createSystemTempDirectory prefix = do

0 commit comments

Comments
 (0)