Crimson and Clover

As part of work to do provide coverage reports for the TCK of JCache we had to add a coverage tool. As we are open source I spent some time playing with coverage tools.

We build with Maven 3. For reasons do with usage of the TCK, we have four standalone modules: jsr107soec, jsr107tck, RI and Demo. Within the jsr107tck and RI there is a parent pom and children with back references to their parents. To easily run the four top level modules we have an aggregate module which is not declared as a parent in the poms of the four top level modules. It looks like this.

<project 
     xmlns_xsi="http://www.w3.org/2001/XMLSchema-instance"
     xsi_schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
     <modelVersion>4.0.0</modelVersion>
         <groupId>javax.cache</groupId>
     <artifactId>jsr107-parent</artifactId>
     <version>0.12-SNAPSHOT</version>
     <packaging>pom</packaging>
    <build>
     <plugins>
     <plugin>
     <groupId>com.atlassian.maven.plugins</groupId>
     <artifactId>maven-clover2-plugin</artifactId>
     <version>3.2.0</version>
     <configuration>
         <cloverDatabase>${java.io.tmpdir}/clover/clover.db</cloverDatabase>
         <singleCloverDatabase>true</singleCloverDatabase>
         <generatePdf>false</generatePdf>
         <generateXml>false</generateXml>
         <generateHtml>true</generateHtml>
     </configuration>
     </plugin>
     </plugins>
     </build>
     <modules>
     <module>jsr107spec</module>
     <module>RI</module>
     <module>jsr107tck</module>
     <module>demo</module>
     </modules>
    </project>

An unusual aspect of this arrangements is that all tests for the RI are contained in the jsr107tck module. The RI itself has no tests.

My approach was to spend a few hours with first the open source coverage tools, Emma and Cobertura, and then to move on to Clover which I have used before, if needed.

Emma’s Maven plugin is old and needs a work around for Java 7. But got it basically working but could not get it to deal with our complicated structure.

Then I tried Cobertura. Version 2.6 of the Maven module was released just in August. It worked fine with Java 7. But once again I found it difficult to make progress with our complicated structure. I was thinking the best approach would be to give all modules the same coverage database location. In Cobertura you do this with a system property. e.g. -Dnet.sourceforge.cobertura.datafile=/path/cobertura.ser. I didn’t get this working.

I then tried Clover, and got up and running. I specified the same clover.db location for all modules. I needed to add this to the aggregate pom, and each top level pom. For those top level modules with children, defining it in the parent was sufficient. I added the following to each of those poms.

Then to run a build with clover instrumentation:

`mvn clean com.atlassian.maven.plugins:maven-clover2-plugin:setup install`

And to run the clover report:

`mvn com.atlassian.maven.plugins:maven-clover2-plugin:clover`

Note the wordy module definitions. You can use the short name of clover2 if you add the following to your settings.xml:

<pluginGroups>
    <pluginGroup>com.atlassian.maven.plugins</pluginGroup>
</pluginGroups>

The first example then becomes:

`mvn clean clover2:setup install`

It would be great if they could change the User Guide to point out this step as it mars what is otherwise a very smooth experience.