+1 to Dan's Changes but also +1 to Galen's suggestion. JPF looks like it might take a bit to run all the different states even for a small interleaving of code (maybe we can tune/configure it though). Or we can mark these as a different category and not run as a "UnitTest"
On Fri, Sep 15, 2017 at 2:22 PM Jacob Barrett <jbarr...@pivotal.io> wrote: > What? You don’t think Travis can run these fast? > > > On Sep 15, 2017, at 2:07 PM, Galen O'Sullivan <gosulli...@pivotal.io> > wrote: > > > > +1 This is great! I'll take a look at your PR when I get the time. > > > > We may want to think carefully about how often we run these tests, > because > > unlike regular unit tests, they will take forever to run. > > > > On Fri, Sep 15, 2017 at 1:42 PM, Michael William Dodge < > mdo...@pivotal.io> > > wrote: > > > >> +1 for unit tests for multithreaded code. > >> > >> High fives to Dan. > >> > >> Sarge > >> > >>> On 15 Sep, 2017, at 12:08, Dan Smith <dsm...@pivotal.io> wrote: > >>> > >>> Hi Geode devs, > >>> > >>> I've been messing around with an open source tool called Java > >>> Pathfinder for writing tests of multithreaded code. Java Pathfinder is > >>> a special JVM which among other things tries to execute your code > >>> using all possible thread interleavings. > >>> > >>> I'd like to propose two things: > >>> > >>> 1) We introduce a framework for writing unit tests of code that is > >>> supposed to be thread safe. This framework should let a developer > >>> easily write a test with multiple things going on in parallel. The > >>> framework can then take that code and try to run it with different > >>> thread interleavings. > >>> > >>> Here's an example of what this could look like: > >>> > >>> @RunWith(ConcurrentTestRunner.class) > >>> public class AtomicIntegerTest { > >>> > >>> @Test > >>> public void parallelIncrementReturns2(ParallelExecutor executor) > >>> throws ExecutionException, InterruptedException { > >>> AtomicInteger atomicInteger = new AtomicInteger(); > >>> executor.inParallel(() -> atomicInteger.incrementAndGet()); > >>> executor.inParallel(() -> atomicInteger.incrementAndGet()); > >>> executor.execute(); > >>> assertEquals(2, atomicInteger.get()); > >>> } > >>> > >>> > >>> 2) We implement this framework initially using Java Pathfinder, but > >>> allow for other methods of testing the code to be plugged in for > >>> example just running the test in the loop. Java pathfinder is cool > >>> because it can run the code with different interleavings but it does > >>> have some serious limitations. > >>> > >>> I've put together some code for this proposal which is available in > >>> this github PR: > >>> > >>> https://github.com/apache/geode/pull/787 > >>> > >>> What do you think? > >>> > >>> -Dan > >> > >> >