Systematic concurrency testing meets Haskell.
Go to file
Michael Walker 8b28633f20 Implement shrinking, and shrink test output.
Shrinking attempts to find a "maximally simple" trace which
exhibits the same bug as the original. Typically, this means that
the results are equal. Shrinking is implemented in terms of
recursively trying to find the simplest variant of the original
trace, where simplest in particular means:

1. A trace with fewer pre-emptions is simpler.
2. A trace with fewer non-pre-emptive context switches is simpler.
3. A trace lexicographically smaller is simpler.

These three criteria are applied in that order in order to determine
which the simplest trace out of a collection is.

For test output, there is a final set of simplification done at the end.
Shrinking attempts to reduce individual traces to their simplest variant,
which can result in multiple test failures having the same shrunk trace.
Thus, the test runner then filters out duplicate failures by only keeping
the simplest trace for a given result.
2015-01-30 15:31:40 +00:00
Control Implement shrinking, and shrink test output. 2015-01-30 15:31:40 +00:00
Data/List Implement shrinking, and shrink test output. 2015-01-30 15:31:40 +00:00
tests Move CVars into Control.Concurrent 2015-01-28 17:59:17 +00:00
.gitignore Initial commit: a class for monads providing concurrency. 2014-12-18 11:03:17 +00:00
.travis.yml Only put the master branch through travis 2015-01-15 07:37:28 +00:00
LICENSE Initial commit: a class for monads providing concurrency. 2014-12-18 11:03:17 +00:00
monad-conc.cabal Implement shrinking, and shrink test output. 2015-01-30 15:31:40 +00:00
README.markdown Update documentation 2015-01-12 14:24:12 +00:00
Setup.hs Initial commit: a class for monads providing concurrency. 2014-12-18 11:03:17 +00:00

monad-conc Build Status

Concurrency is nice, deadlocks and race conditions not so much. The Par monad family, as defined in abstract-par provides deterministic parallelism, but sometimes we can tolerate a bit of nondeterminism.

This package provides a family of monads for potentially nondeterministic concurrency, with an interface very much in the spirit of Par, but slightly more relaxed. Specifically, Conc's IVar equivalent, CVars, can be written to multiple times.

The documentation of the latest developmental version is available online.

Conc and IO

The intention of the Conc monads is to provide concurrency where any apparent nondeterminism arises purely from the scheduling behaviour. To put it another way, a given Conc computation, parametrised with a fixed set of scheduling decisions, is deterministic. This assumption is used by the testing functionality provided by Control.Monad.Conc.SCT.

Whilst this assumption may not hold in general when IO is involved, you should strive to produce test cases where it does.

Contributing

Bug reports, pull requests, and comments are very welcome!

Feel free to contact me on GitHub, through IRC (#haskell on freenode), or email (mike@barrucadu.co.uk).