This is the home of Distributed Execution Minimizer (DEMi), a fuzzing and test case reducing tool for distributed systems. Currently we only support applications built on top of Akka, but adapting another RPC library to call into DEMi shouldn't be too difficult.
- Blog post covering how DEMi does fuzz testing, and the bugs we found in a Raft implementation using DEMi.
- Our NSDI 2016 paper describing the system in detail.
- Example applications tested with DEMi can be found here.
Although DEMi's features are fairly well fleshed out (e.g., we've used it to test Spark), so far it has only been used by us. That is to say, there isn't a whole lot of documentation.
If you're interested in using DEMi, we'd be more than happy to write up documentation, and help you iron out any issues you run into. We'd love to see DEMi applied more broadly!
For now, a whirwind tour:
- this repository contains the tool itself
- an application pulls in DEMi by having it as a git subtree, located at
interposition/
. See the various branches of this repository for examples. - in the application's Build.scala (or build.sbt), we need to include AspectJ, through the sbt-aspectj plugin. Here is an example: https://github.com/NetSys/demi-applications/blob/raft-45/project/Build.scala#L3. When we run
sbt build
from the application's top-level directory, AspectJ interposition will be automatically weaved in. The AspectJ code itself is here. It mostly weaves interfaces within Akka, and should hopefully work on most versions of higher than 2.0. - In the application's Main method, we need to configure DEMi . For now, here is very verbose example. That example contains a whole bunch of cruft that is needed for minimization (+ other auxiliary stuff like recording the execution, writing it to disk, and replaying it later), but is not needed for simple fuzz testing. For just fuzz testing, you should be able to do it in a few lines of code. I'd be glad to come up with an example if you're interested.