Safe Haskell | Safe-Inferred |
---|---|
Language | GHC2021 |
System.FS.BlockIO.Sim
Description
Simulated instances of HasBlockIO
and HasFS
.
Synopsis
- runSimHasBlockIO :: (MonadSTM m, PrimMonad m, MonadCatch m, MonadMVar m) => MockFS -> (HasFS m HandleMock -> HasBlockIO m HandleMock -> m a) -> m (a, MockFS)
- runSimErrorHasBlockIO :: (MonadSTM m, PrimMonad m, MonadCatch m, MonadMVar m) => MockFS -> Errors -> (HasFS m HandleMock -> HasBlockIO m HandleMock -> m a) -> m (a, MockFS, Errors)
- simHasBlockIO :: (MonadCatch m, MonadMVar m, PrimMonad m, MonadSTM m) => StrictTMVar m MockFS -> m (HasFS m HandleMock, HasBlockIO m HandleMock)
- simHasBlockIO' :: (MonadCatch m, MonadMVar m, PrimMonad m, MonadSTM m) => MockFS -> m (HasFS m HandleMock, HasBlockIO m HandleMock)
- simErrorHasBlockIO :: forall m. (MonadCatch m, MonadMVar m, PrimMonad m, MonadSTM m) => StrictTMVar m MockFS -> StrictTVar m Errors -> m (HasFS m HandleMock, HasBlockIO m HandleMock)
- simErrorHasBlockIO' :: (MonadCatch m, MonadMVar m, PrimMonad m, MonadSTM m) => MockFS -> Errors -> m (HasFS m HandleMock, HasBlockIO m HandleMock)
- unsafeFromHasFS :: forall m. (MonadCatch m, MonadMVar m, PrimMonad m) => HasFS m HandleMock -> m (HasBlockIO m HandleMock)
Implementation details
We include below some documentation about the effects of calling the interface
functions on the simulated instance of the HasBlockIO
interface.
- IO context
- For uniform behaviour across implementations, the simulation creates and stores a mocked IO context that has the open/closed behaviour that is specified by the interface.
close
- Close the mocked context
submitIO
- Submit a batch of I/O operations using serial I/O using a
HasFS
hSetNoCache
- No-op
hAdvise
- No-op
hAllocate
- No-op
tryLockFile
- Simulate a lock by putting the lock state into the file contents
hSynchronise
- No-op
synchroniseDirectory
- No-op
createHardLink
- Copy all file contents from the source path to the target path. Therefore, this is currently only correctly simulating hard links for immutable files.
Runners
runSimHasBlockIO :: (MonadSTM m, PrimMonad m, MonadCatch m, MonadMVar m) => MockFS -> (HasFS m HandleMock -> HasBlockIO m HandleMock -> m a) -> m (a, MockFS) Source #
runs an runSimHasBlockIO
mockFS actionaction
using a pair of
simulated HasFS
and HasBlockIO
.
The pair of interfaces share the same mocked file system. The initial state
of the mocked file system is set to mockFs
. The final state of the mocked
file system is returned with the result of action
.
If you want to have access to the current state of the mocked file system,
use simHasBlockIO
instead.
runSimErrorHasBlockIO :: (MonadSTM m, PrimMonad m, MonadCatch m, MonadMVar m) => MockFS -> Errors -> (HasFS m HandleMock -> HasBlockIO m HandleMock -> m a) -> m (a, MockFS, Errors) Source #
runs an runSimErrorHasBlockIO
mockFS errors actionaction
using a
pair of simulated HasFS
and HasBlockIO
that allow fault injection.
The pair of interfaces share the same mocked file system. The initial state
of the mocked file system is set to mockFs
. The final state of the mocked
file system is returned with the result of action
.
The pair of interfaces share the same stream of errors. The initial state of
the stream of errors is set to errors
. The final state of the stream of
errors is returned with the result of action
.
If you want to have access to the current state of the mocked file system
or stream of errors, use simErrorHasBlockIO
instead.
Initialisation
simHasBlockIO :: (MonadCatch m, MonadMVar m, PrimMonad m, MonadSTM m) => StrictTMVar m MockFS -> m (HasFS m HandleMock, HasBlockIO m HandleMock) Source #
creates a pair of simulated simHasBlockIO
mockFsVarHasFS
and
HasBlockIO
.
The pair of interfaces share the same mocked file system, which is stored in
mockFsVar
. The current state of the mocked file system can be accessed by
the user by reading mockFsVar
, but note that the user should not leave
mockFsVar
empty.
simHasBlockIO' :: (MonadCatch m, MonadMVar m, PrimMonad m, MonadSTM m) => MockFS -> m (HasFS m HandleMock, HasBlockIO m HandleMock) Source #
creates a pair of simulated simHasBlockIO
mockFsHasFS
and
HasBlockIO
that allow fault injection.
The pair of interfaces share the same mocked file system. The initial state
of the mocked file system is set to mockFs
.
If you want to have access to the current state of the mocked file system,
use simHasBlockIO
instead.
simErrorHasBlockIO :: forall m. (MonadCatch m, MonadMVar m, PrimMonad m, MonadSTM m) => StrictTMVar m MockFS -> StrictTVar m Errors -> m (HasFS m HandleMock, HasBlockIO m HandleMock) Source #
creates a pair of simulated
simErrorHasBlockIO
mockFsVar errorsVarHasFS
and HasBlockIO
that allow fault injection.
The pair of interfaces share the same mocked file system, which is stored in
mockFsVar
. The current state of the mocked file system can be accessed by
the user by reading mockFsVar
, but note that the user should not leave
mockFsVar
empty.
The pair of interfaces share the same stream of errors, which is stored in
errorsVar
. The current state of the stream of errors can be accessed by the
user by reading errorsVar
.
simErrorHasBlockIO' :: (MonadCatch m, MonadMVar m, PrimMonad m, MonadSTM m) => MockFS -> Errors -> m (HasFS m HandleMock, HasBlockIO m HandleMock) Source #
creates a pair of simulated simErrorHasBlockIO
mockFs errorsHasFS
and HasBlockIO
that allow fault injection.
The pair of interfaces share the same mocked file system. The initial state
of the mocked file system is set to mockFs
.
The pair of interfaces share the same stream of errors. The initial state of
the stream of errors is set to errors
.
If you want to have access to the current state of the mocked file system
or stream of errors, use simErrorHasBlockIO
instead.
Unsafe
unsafeFromHasFS :: forall m. (MonadCatch m, MonadMVar m, PrimMonad m) => HasFS m HandleMock -> m (HasBlockIO m HandleMock) Source #
Simulate a HasBlockIO
using the given HasFS
.
Unsafe
You will probably want to use one of the safe functions like
runSimHasBlockIO
or simErrorHasBlockIO
instead.
Only a simulated HasFS
, like the simHasFS
and simErrorHasFS
simulations, should be passed to unsafeFromHasFS
. Technically, one could
pass a HasFS
for the real file system, but then the resulting
HasBlockIO
would contain a mix of simulated functions and real functions,
which is probably not what you want.