To make our tests robust against timing problems and eventual consistent stores, we need to do more spin & wait for state.
We have some code in GenericTestUtils.waitFor to await a condition being met, but the predicate it calls doesn't throw exceptions, there's no way for a probe to throw an exception, and all you get is the eventual "timed out" message.
We can do better, and in closure-ready languages (scala & scalatest, groovy and some slider code) we've examples to follow. Some of that work has been reimplemented slightly in S3ATestUtils.eventually
I propose adding a class in the test tree, Eventually to be a successor/replacement for these.
- has an eventually/waitfor operation taking a predicate that throws an exception
- has an "evaluate" exception which tries to evaluate an answer until the operation stops raising an exception. (again, from scalatest)
- plugin backoff strategies (from Scalatest; lets you do exponential as well as linear)
- option of adding a special handler to generate the failure exception (e.g. run more detailed diagnostics for the exception text, etc).
- be Java 8 lambda expression friendly
- be testable and tested itself.